快速业务通道

一个简单的演示用的Linux字符设备驱动程序

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-06
_INC_USE_COUNT;

return 0;
}
这里演示了次设备号的作用,它让我们知道用户操作的是哪一个"次设备",是/dev/char8139_0还是/dev/char8139_3,对不同的"次设备",具体的操作方法可能是不一样的,这样就为一个驱动程序控制多个类似的设备提供了可能.

我们根据次设备号的不同,在buffer中填入不同的字符(次设备号的16进制表示).

接着驱动程序中的read()函数会被调用,cat程序的实现就是读取文件中的内容.

ssize_t char8139_read (struct file *filp, char *buf, size_t count, loff_t *f_pos)
{
ssize_t ret=0;

PDBG("copy to user. count=%d, f_pos=%ldn", (int)count, (long)*f_pos);
if(*f_pos>= data_size)
return ret;
if(*f_pos count > data_size)
count = data_size-*f_pos;
if(copy_to_user(buf, p_buf, count))
{
PDBG("OOps, copy to user error.n");
return -EFAULT;
}

p_buf = count;
*f_pos = count;
ret=count;

return ret;
}

要正确的实现一个read()调用,你得想一想一个应用程序是如何调用read()从文件中读取数据的.
如果你想明白了就很简单,驱动程序所要做的就是把恰当的数据传递给应用程序,这是使用
copy_to_user()函数完成的.

另外,我们得意识到,这里只是一个很简单的演示.还有很多复杂的问题有待考虑,比如两个
应用程序可能同时打开我们设备,我们的设备应该怎样反应(这取决于具体的设备应有的行为),还有
互斥的问题.

然后我们看看I/O端口和I/O内存的操作.这里使用8139网卡作为一个硬件实例来演示I/O端口和
I/O内存的操作.没有什么特别的,都是标准的步骤.在使用时需要注意,如果你的系统中已经有
8139网卡的驱动程序,先关掉网络设备,卸载驱动,然后再使用本驱动程序.

使用程序包的步骤:(在我的Debian系统上如此,你的可能不同)
1. 解压
2. 编译(/usr/src/linux处要有内核源代码)
3. ifconfig eth0 down 关掉网络设备
rmmod 8139too 卸载原来的8139网卡驱动
insmod char8139.o 插入我们的模块
(insmod会出错, 如果你现在运行的linux版本不是你编译本驱动程序时使用的内
核源代码的版本,insmod时会报告模块版本与内核版本不一致.这时,你得看看
内核源代码中/include/linux/version.h文件,这个文件中的UTS_RELEASE
定义了内核的版本号,你可以在驱动程序中预先定义这个宏为当前运行的内核的
版本号,这样就能避免上述错误.)

4. mknode(见本文前述)
5. 试试我们的设备
./readtest
或者
cat /dev/char8139_0或
cat /dev/char8139_1或
cat /dev/char8139_2或
cat /dev/char8139_3
6. 恢复系统
rmmod char8139
modprobe 8139too
ifconfig eth0 up
如果你使用dhcp可能还需要运行dhclient ======================================================================= 国外接私活网站(编程,linux系统管理员):

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号