Windows 驱动程序<-&燃气轮机;操作系统/应用程序如何工作?一个例子

Windows 驱动程序<-&燃气轮机;操作系统/应用程序如何工作?一个例子,windows,linux,ipc,device-driver,Windows,Linux,Ipc,Device Driver,假设我想制作一个应用程序、一些硬件和一个与之通信的驱动程序。假设设备连接到主板或通过USB。该设备将是一个带有8LED的板。我想要的界面是 bool lock() //true if success void unlock() //each bit is matched up to an LED and set means the led is on. //Return value is <0 on error. 0 on success. >0 on noncritical er

假设我想制作一个应用程序、一些硬件和一个与之通信的驱动程序。假设设备连接到主板或通过USB。该设备将是一个带有8LED的板。我想要的界面是

bool lock() //true if success
void unlock()
//each bit is matched up to an LED and set means the led is on. 
//Return value is <0 on error. 0 on success. >0 on noncritical error
int  set(char v)
bool lock()//如果成功则为true
无效解锁()
//每个位与一个LED匹配,设置表示LED亮起。
//非关键错误的返回值为0
整数集(字符v)

假设非关键错误意味着您发送了中的最后一个命令,因为您要求使用Windows和linux,我将回答您的两个问题

Linux: 在linux世界中,几乎所有东西都是一个文件。通过将输出从一个二进制源重定向到接收器(文件或设备文件),或将输出从一个二进制文件传输到另一个二进制文件,所有内容都可以从A到B。 最简单的示例是字符设备,最简单的字符设备示例是串行驱动程序

以下命令:

echo ciao > /dev/ttyS0
是如何将用户空间连接到内核空间的完美示例

注:/dev/ttyS0是串行端口的标准术语,相当于Windows中的COM1

我已向字符设备/dev/ttyS0发送了至少4个字节。 代码执行从内核空间开始,因此调用函数open()(在驱动程序中定义)来初始化串行端口,该端口直到现在都处于关闭状态

在linux中进行此初始化,不仅准备串行端口,而且打开一条TTY线。TTY代表电传打字机,它透明地管理将“ciao”字符串移动到硬件设备

以下是步骤:

  • 准备串行线路(或gpio或其他)
  • 在RAM中创建数据缓冲区以将数据放入
  • 将硬件地址的内存映射到内核可访问的内存空间
  • 将数据从RAM缓冲区复制到内存映射硬件地址
  • 然后,硬件设备将执行其设计用于处理该数据的任何操作:即调制和传输RS232数据或设置GPIO高或低
  • 窗户: 在Windows中,设备通常不表示为文件,因此这需要通过编程实现。系统调用实际上是相同的,通常用户空间到内核空间的接口通常由以下类型的函数提供: 打开()、读取()、写入()和关闭()

    两者: 这些调用通常用于所有类型的驱动程序,包括图形和声音驱动程序。在我的linux示例中,我描述了如何将字符串回显到字符设备中,但我也可以将表示特定音调或频率的十六进制值回显到我的音频设备中,该设备可以在/dev/audio0中找到

    对于GPIO,过程类似: 打开(随机文件或缓冲区),写入(1)或写入(0),copyfromuserspacetohwbuffer()

    同样对于GPIO,linux提供了一种从用户空间访问和操作GPIO的简单方法。查找proc文件系统。它导出像/proc/gpio/gpio1/value这样的路径,您可以很容易地从shell或应用程序中回显0或回显1

    我希望这澄清了你的疑问


    -Vittorio

    Hi@acidzombie24,在Linux中,您可以编写一个简单的设备驱动程序来访问这些指示灯。如何访问指示灯取决于设备所在的总线(GPIO、USB、PCI)。请看一下@dien,我浏览了其中的许多章节。他们讨论了用于注册设备的linux API及其工作原理。我确信我可以找到如何与硬件通信,但我不知道应用程序如何与驱动程序通信。嗨@acidzombie24,你的应用程序可以通过多种方式与内核通信:procfs和sysfs(请查看此链接示例);对“设备文件”进行读、写和ioctl操作(有关更多详细信息,请查阅LDD 3rd第3章和第6章)