一个简单的演示用的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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: linux 里面装windows下一篇: LVM磁盘管理技术案例讲解
关于一个简单的演示用的Linux字符设备驱动程序的所有评论