日期:2014-05-16  浏览次数:20612 次

Writing device drivers in Linux: A brief tutorial(五)

一个并口驱动程序:并行接口的描述

         我将继续修改我之前创建的那个驱动程序从而使它可以在真正的设备上执行真正的任务。我将使用常见计算机的并口,并将这个驱动命名为“parleport”

         并口是允许数字信息输入和输出的高效设备。更具体地说,它是D-25针母座。在内部,在CPU看来,它使用了三个字节的存储空间。在PC上,并口的基址(设备的第一个字节)通常都是0x378。在我们这个基本的例子中,我将使用它的第一个字节,这个字节由所有的数字输出组成。

         以上提到的那个字节(第一个字节)和外部接口针脚的对应关系如下图所示:

 

图  并口的第一个字节和与它相对应的D-25母座外部接口

 

一个并口驱动程序:初始化模块

         之前的memory_init函数需要做修改——改变RAM存储的分配以为并口预留存储地址(0x378)。为了达到这个目的,我们需要使用到检查内存区域是否可以获取的函数(check_region)和为设备预留空间的函数(request_region)。两个函数都使用内存区域的基址以及它的长度作为参数。request_region函数同时也接收一个描述模块的字符串。

 

<parlelport modified init module> =

/* Registeringport */

port =check_region(0x378, 1);

if(port) {

printk("<1>parlelport: cannot reserve 0x378\n");

result = port;

goto fail;

}

request_region(0x378,1, "parlelport");

 

一个并口驱动程序:卸载模块

卸载模块的处理和之前“memory”模块的卸载处理差不多,只是这里是释放之前为并口预留的内存,而不是释放内存。这个工作由release_region函数来完成,这个函数需要和check_region相同的参数。

 

<parlelport modified exit module> =

/* Make portfree! */

if(!port) {

release_region(0x378,1);

}

 

一个并口驱动程序:读设备

         在本例中,我们需要添加一个真正的设备读取动作来完成将信息传递到用户空间。inb函数可以达到以上目的;它的参数是并口地址,它的返回值是端口的内容。

 

<parlelport inport> =

/* Reading port*/

parlelport_buffer= inb(0x378);

 

下表展示了这些新的函数

 

Events

Kernel functions

Read data

inb

Write data

 

表  设备驱动程序事件和与之相关联的介于内核空间和硬件设备之间的函数

 

一个并口驱动程序:写设备

         同样,你需要添加“写设备”的函数来完成将之后的数据传输到用户空间(译者:是否是应该表述为将数据从用户空间传输到设备?)。函数outb完成了这个功能;它有两个参数,一个是要写的内容,另一个是要写的地址。

 

<