Chinaunix首页 | 论坛 | 博客

分类: LINUX

2009-11-09 10:05:38

特征告诫
驱动函数和用户程序牵扯到的系统调用可能失败或部分成功. 你的程序需要考虑到这一点以避让不愉快的惊奇. 看下下面的通常的缺陷:
1. open()调用由于某些原因可能会失败. 一些字符驱动同时只支持一个用户访问,如果程序试图打开一个正在使用的设备就会以-EBUSY失败返回. 如果打印机没有纸张,在调用设备的open()时驱动就以-ENOSPC失败返回.
2. read()和write()成功返回1字节到请求字节数之间的数, 因此你的程序需要足够的逻辑来处理这个.
3. 尽管只有单字节数据准备被读写, select()也会成功返回.
4. 一些字符设备如鼠标和触摸屏只能输入的,所以它们的驱动不支持写函数系列(write()/aio_write()/fsync()). 其他设备如打印机是只能输出的,它们的驱动不支持度函数系列(read()/aio_read()). 还有一些字符驱动函数是可选的,所以所有函数并不会在所有驱动中出现.当某一函数缺失了,则相应的系统调用就会失败.

查看源码
字符驱动并不完全在drivers/char/目录下,下面是一些超级自负驱动的例子,它们有很特殊的处理和目录:
1. 串行驱动是管理电脑上串口的字符驱动,但它们更像是简单的字符驱动,代码在drivers/serial/目录下.
2. 输入驱动负责如键盘,鼠标和摇杆等设备. 代码位于drivers/input/目录下.
3. 帧缓冲(/dev/fb/*)提供了访问显存的通道, /dev/mem导出了访问系统内存的函数.
4. 一些设备类支持少量的处理字符接口的硬件. 例如SCSI设备通常是块设备,但是SCSI磁带则是字符设备.
5. 一些子系统导出了额外的代表原始设备模型的字符接口到用户空间. MTD子系统通常用来仿真各种flash内存上的磁盘,但如果它提供底层flash内存的原始视角则可能更好的服务于某些应用程序. 这个是通过MTD字符驱动drivers/mtd/mtdchar.c做到的.
6. 某些内核层提供了通过导出适量字符接口来实现用户空间设备驱动的钩子. 应用程序可以通过这些接口直接访问设备. 一个例子是通用SCSI驱动drivers/scsi/sg.c,它用来为SCSI扫描仪驱动和CD驱动实现用户空间的设备驱动.另外一个例子就是I2C设备接口i2c-dev.
阅读(1004) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~