




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实现如下的功能:-字符设备驱动程序的结构及驱动程序需要实现的系统调用-可以使用cat命令或者自编的readtest命令读出设备里的内容-以8139网卡为例,演示了I/O端口和I/O内存的使用本文中的大部分内容在Linux Device Driver这本书中都可以找到,这本书是Linux驱动开发者的唯一圣经。= =先来看看整个驱动程序的入口,是char8139_init(这个函数如果不指定MODULE_LICENSE(GPL, 在模块插入内核的时候会出错,因为将非GPL的模块插入内核就沾污了内核的GPL属性。module_init(char8139_init;module_exit(char8139_exit;MODULE_LICENSE(GPL;MODULE_AUTHOR(ypixunil;MODULE_DESCRIPTION(Wierd char device driver for Realtek 8139 NIC;接着往下看char8139_init(static int _init char8139_init(voidint result;PDBG(hello. init.n;/* register our char device */result=register_chrdev(char8139_major, char8139, &char8139_fops;if(resulti_rdev4;int num = MINOR(node-i_rdev & 0x0F;/* put some char in buffer to reflect the minor device number */*buffer=(unsigned char(0;*(buffer+1=(unsigned char(x;*(buffer+2=(unsigned char(0+type;*(buffer+3=(unsigned char(0+num;*(buffer+4=(unsigned char(n;data_size+=5;PDBG(Ok. Find treasure! 8139 I/O port base: %xn, detect_8139_io_port(; PDBG(OK. Find treasure! 8139 I/O memory base address: %lxn,detect_8139_io_mem(;MOD_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, (intcount, (long*f_pos;if(*f_pos= data_sizereturn ret;if(*f_pos + count data_sizecount = data_size-*f_pos;if(copy_to_user(buf, p_buf, countPDBG(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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 趣味参观指南课件
- 临水电安全培训
- 课件模板使用
- 神奇的眼镜课件
- 物理统计方法
- 产科异位妊娠课件
- 课件最后一次
- 凉山支教考试题及答案
- 教师招聘之《幼儿教师招聘》能力提升试题打印含答案详解(预热题)
- 客店理论考试题及答案
- 【课件】角的平分线+课时1+角平分线的性质+课件+2025-2026学年人教版八年级数学上册
- 【课件】轴对称及其性质+课件2025-2026学年人教版八年级数学上册
- 2024年司法考试历年真题及答案
- 2025年贵州省中考英语真题含答案
- 护理人员同理心
- 肿瘤科常见药物及注意事项
- 2025-2030水务工程行业并购重组机会及投融资战略研究咨询报告
- 2025年呼伦贝尔农垦集团有限公司招聘笔试参考题库含答案解析
- 象棋入门教学课件
- 风雨操场调研报告
- 2025年重庆市中考数学试卷真题(含标准答案)
评论
0/150
提交评论