驱动程序< - > OS / App它是如何工作的?一个例子

时间:2012-03-06 15:16:55

标签: 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 error
int  set(char v)

让我们说非关键错误意味着您在&lt; 200ms内发送最后一个命令,因此它被忽略,因为设备不想快速打开/关闭LED。

让我们说应用程序接收一串文本并使用设备闪烁字母/单词的莫尔斯电码。操作系统不知道设备如何工作。应用程序如何与驱动程序通信?我不相信使用DLL / SO,因为驱动程序在它自己的进程中。

应用程序如何与Windows或Linux中的设备驱动程序通信?我对如何编写设备驱动程序不感兴趣。应用程序和内核如何与之通信。

1 个答案:

答案 0 :(得分:0)

由于您要求使用Windows和Linux,我将回答您的两个问题。

Linux的:

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

以下命令:

echo ciao > /dev/ttyS0

是如何将用户空间连接到内核空间的完美示例。

注意:/ dev / ttyS0是串行端口的标准命名法,相当于Windows中的COM1。

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

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

以下是步骤:

  1. 准备串行线(或gpio或其他)
  2. 在RAM中创建数据缓冲区以将数据放入
  3. 将硬件地址的内存映射到内核可访问的内存空间
  4. 将数据从RAM缓冲区复制到内存映射的硬件地址中。
  5. 然后,硬件设备将执行与该数据相关的任何操作:即调制和传输RS232数据或将GPIO设置为高或低。
  6. 视窗:

    在Windows中,设备通常不表示为文件,因此需要以编程方式完成。系统调用实际上是相同的,通常用户空间到内核空间接口通常由类型的函数提供: open(),read(),write()和close()。

    两个

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

    对于GPIO,过程类似: open(随机文件或缓冲区),write(1)或write(0),copyfromuserspacetohwbuffer()。

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

    我希望这澄清了你的疑问!

    -Vittorio