- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux系统设备驱动设计和实现
Linux系统设备驱动设计和实现
摘 要: 设备驱动程序在Linux中占有很重要的位置,这些底层驱动程序为用户程序屏蔽了硬件设备工作的具体细节,本文通过对Linux设备驱动结构,设备驱动特点的研究,最终实现了RTL8019网卡驱动的设计与实现。
关键词: Linux;内核;设备驱动;RTL8019
文章编号:1007-0745(2009)12-0070-02
1引言
Linux通过设备驱动程序为应用程序提供了统一抽象的接口,从而隐藏了大量不同设备之间的区别和细节,在Linux中对硬件设备的操作和通常的文件一样,利用标准的文件操作可以对设备上进行打开、关闭、读取或者写入操作。
2Linux设备驱动结构
在系统内部,I/O设备的存/取通过一组固定的入口点来进行,这组入口点是由每个设备的驱动程序提供的[21]。定义于Linux/fs.h文件中的file_operation结构就是这样一组入口点[22],在Linux-2.6.13中它的定义如下:
struct file_operations {
struct module *owner
/*指向拥有本结构的module,用于内核维护模块的引用计数*/
ssize_t(*read)(struct file*,char*,size_t,loff_t*)
ssize_t(*write)(struct file*,const char*,size_t,loff_t*)
/*向字符设备写数据,返回的非负数表示成功写入的字节数,需要提供所写 内容指针*/
int(*readdir)(struct file*,void*,filldir_t)
unsigned int*poll)(struct file*,struct poll_table_struct*)
int(*ioctl)(struct inode*,struct file*,unsigned int,unsigned long)
int(*mmap)(struct file*,struct vm_area_struct?*)
/*将设备内存映射到进程地址空间,通常只有块设备驱动程序使用*/
int (*open)(struct inode*,struct file*)
int(*release)(struct inode*,struct file*)
/*关闭设备,释放资源。只有当设备文件的所有备份都被释放时,才进行release调用,而不是每次调用close时都执行*/
int(*lock)(struct file*,int,struct file_lock*)
ssize_t(*readv)(struct file*,const struct iovec*,unsigned long,loff_t*)
ssize_t(*writev)(struct file*,const struct iovec*,unsigned long,loff_t* ) }
3Linux驱动开发方法
驱动开发的流程基本上可以归纳为以下几步:
(1)定义主、次设备号或动态获取;
(2)实现初始化和相应清除函数;
(3)填充file_operations结构;
(4)注册中断并实现中断服务程序;
(5)静态编译进内核或是编译为模块来动态加载;
(6)生成设备节点文件。
实际开发中,在调试阶段往往会先将驱动以模块方式来编译加载,这样方便了调试,加快了开发效率。
4 RTL8019网卡驱动设计
基于S3C2410的RTL8019驱动程序实现:
(1)此驱动程序基于Linux2.6.13.4内核,首先,在内核中增加对RTL8019支持的功能子菜单,方法如下:
修改Linux 2.6.13.4./drivers/net/Kconfig文件。
(2)在/arch/arm/mach-s3c2410创建smdk2410.h文件,部分内容说明如下:
在本开发板上,网卡占用的是CPU的nGCS3片选信号,也就是在Bank3,根据处理器的地址空间定义,这个地址是0具体定义如下:
#define pSMDK2410_ETH_IO 0
由于本系统采用的是2.6内核,所以内核中的虚拟地址为0xe000000,具体定义如下:
#define vSMDK2410_ETH_IO 0xe0000000
(3)修改/arch/arm/mac
原创力文档


文档评论(0)