基于$3C2410的DM9000网卡驱动移植
2020-04-30
来源:好走旅游网
2011年10月 第5期(总第37期) 天津市经理学院学报 Journal of Tianjin Manager College August 2011 No.5(Oct No.37) 基于¥3C2410的DM9000网卡驱动移植 徐宝玺 (天津中德职业技术学院,天津,300350) 摘要:设备驱动是嵌入式开发中的重要部分,是硬件和系统之间通信的桥梁。虽然Linux内 核提供了相应的接口,极大地简化了设备驱动的开发,但是不同的设备之间仍然存在一定的差异, 我们需要针对这些差异修改或是编写对应的驱动。 关键词:嵌入式;Linux;S3C2410;DM9000 中图分类号:G642.0 文献标识码:A 文章编号:1009—3877(2011)05—81—03 在嵌入式开发中,我们经常接触到各种各样的设备,一 中,如下: Struct platformdevice{ _个好的嵌入式系统对设备需要有较强的支持,所以针对不同 的设备、不同的设备连接情况,需在充分了解设备电路结构 的前提下,为该设备编写对应的驱动程序。本文以DM9000 网络驱动移植为例,讲述基于¥3C2410的设备驱动开发和移 植的步骤,为嵌入式系统中的设备驱动开发提供参考案例。 一Const char name; U32 id: Struct device dev; U32 num_resources; 、开发环境 Struct resource*resource; 本文使用的开发板为Embest Edukit—IV,使用Linux内 核为Linux一2.6.14.1,Bootloader为U—Boot一2010.09,交叉编译 GCC为Gcc一3.4.4,Glibc为Gilbc一2.3.5。 }; 要定义一个设备(plaftorm_device)般需要初始化设备 所占用的资源resource(包括I/O端口、控制端口、IRQ中断等 资源)和设备的私有数据dev.platform_data,其中最重要的是 resource。Struct platform_DM9000外部连接的D0 15为CPU的数据总线。RX+、 RX一、 Ⅸ+和Tx一为与网口相连用于传输数据的4根线。WE 和OE为CPU的写信号和读信号。NETCS为通过CPLD和 data则是赋值给’struct device中的 platform_data指针成员,该指针为void类型。内核不使用该指 CPU相连,CMD为CPU的A20地址信号。通过CPLD编码 后,DM9000的INDEX端口的地址为0X20000000,其数据 DATA端口地址为0X20100000。IRQNET为连接到103的中 断,也是通过CPLD来控制的。 CPLD处理DM9000产生的中断是将该中断送到CPU外 部中断EINT9,然后将EINT9送给EINT8_23,进而进人网络 处理过程。在设置中需将EINT9设置为边沿触发,如设为电 平触发,将会一直产生中断,导致系统无法处理其它事情。 二、移植过程 针,而由驱动自己来完成定义及使用工作。对于DM9000,对 应的platform_data定义在头文件include/linux/dm9000.h中。 如下: Struct dm9000 platdata{ _Unsigned in lfages; allow replacement IO routines | Void(*inblk)(void_iomem reg,void data,int len); Void( outblk)(void—iomem reg,void data,int len); Void(( dumpblk)(void_iomem reg,int len); }; 1.定义DM9000平台设备 Linux通过platform_device结构体定义硬件设备,struct platform_因此,对于描述完整的DM9000设备需要定义struct resource、struct dm9000plat data和struct platfromdevice三 _device定义在头文件includelfinux/r)latform_device.h _收稿日期:2011-06—28 作者简介:徐宝玺(1982一),男,天津中德职业技术学院教师。 81 2011年10月 天津市经理学院学报 Journal of Tianjin Manager College August 2011 第5期(总第37期) No.5(Oct No.37) 个结构体变量。 2.注册DM9000平台设备 定义好DM9000平台设备后,需将DM9000平台设备变 量的地址添加到资源列表中去。即在arch/arm/mach—s3c2410/ mach—smdk2410.C把设备地址添加到*smdk2410_devices[1 一initdata数组中去,完成对DM9000平台设备的注册,如下: Stagic struct platform_device smdk2410_devices[] _initdata={ I{.-・ &s3cdevice dm9000,Hadd din9000 —}; 3.定义DM9000设备驱动 定义并注册好DM9000平台设备后,还需要定义 DM9000设备的驱动,从而使系统能够正常地初始化、调用、 卸载设备。在Linux一2.6.14.1中已经添加了对DM9000的支 持,在文件drivers/net/dm9000.C中定义了DM9000的驱动结 构: Static struct device—driver dm9000一driver-={ .name=’’dmi000”. .bus=&plafform_bus_type, .probe=din9000probe, 一.remove=dm9000dryremove, 一—.suspend=din9000 drvsuspend, —.resume=dm9000dryresume, 一—}; 4.注册DM9000设备驱动 由于Linux的设备模型只负责设备的检测、启动和移除, 并不负责数据的访问,故只需使用方法module—init注册驱 动,然后使用module—exit移除驱动,在drivers/net/dm9000.C 中定义如下: Static int_init dm9000_init(void){ Printk fKERN_INFO “%sEthermnet Driver ̄n”, CARDNAME); Return driver register(&dm9000_driver); } Module—init(dm9000一init); Module—exit(dm9000_cleanup); 5.DM9000中断处理 DM9000网卡驱动设计中最重要的部分便是中断处理, 由于本文所选用平台中的DM9000的中断是由CPLD进行控 制的,并且在中断过程中CPLD会产生莫名的中断,所以在 中断处理函数dm9000_interrupt)中需对是否为网卡中断进 82 行判断,一般只需检测CPLD的中断状态寄存器的最高位是 否为0即可,为0则表示为网卡中断,非0则为其它中断,退 出中断处理函数即可。 在Linux中有两种映射添加方式:一为静态映射,二为动 态映射。静态映射是在arch/arm/mach—s3c2410/mach— smdk2410.c的struct map—desc smdk2410_iodexc[]一initdata数 组中加入如下映射: Static stnrct map—desc smdk2410_iodesc[]一imitdata={ /*nothing here yet / {0XE0000000,¥3C2410_CS4,128 SZ一1M,MT_DEVICE}, }; 动态映射,即用ioremap或ioremap—nocache来实现。由 于以太网中断发生频繁,为了效率,本文采用静态映射。 为了让DM9000能够获取到中断,并对中断作出响应, 还需对EINTMASK、EXTINT1、INTMSK、CPLD控制等寄存器 进行如下设置: a.GPGGCON(56000060)GPG1【3:2]置10,功能设置为 EINT9。 b.EXTINT1(5600008c)[6:4】置010下降沿触发中断,一 定要设置为边沿触发,否则会一直产生中断。 C.EINTMASK(560000a4)[9]置0使能EINT9。 d.INTMASK(4A000008)【5】置0使能EINT8—23。 e.CPLD控制寄存器(0X22600000)[7] ̄0开中断,在置 0之前需先置1。 具体的设计过程为将外部中断屏蔽(EINTMASK)、外部 中断方式(EXZTINT1)、中断屏蔽(INTMSK)和CPLD控制 (CPLDContro1)四个寄存器的值分别设为:0X560000a4, 0X5600008c,0X4A000008,0X22600000。 三、DM9000编译、测试 按照以上的方法对代码进行修改后便可以重新配置内 核将DM9000的驱动添加到Linux内核中,编译并下载到实 验平台中运行,查看其运行结果。 首先,从控制台进入Linux源码目录,然后运行命令 “make menuconifg”,进入Linux内核配置选项界面,然后依次 选中如下必选项,开启Linux对网络的支持,并将DM9000网 卡驱动添加至内核中: Networkin > ]Networking support Device Drivers_> Netowrk device support> _]Network device suppo ̄ Ethem(10 or 100Mbit)> (下转第84页) 2011年10月 天津市经理学院学报 Journal of Tianjin Manager College August 2011 第5期(总第37期) No.5(Oct No.37) 教与学生的学处于最优化的统一状态,达到最佳的教学效 果。教师可以通过学生的邮件和实验报告心得和QQ聊天, 面发现学生身上的闪光点,激发学生的学习兴趣,调动学生 学习的积极性和主动性。教师要保护学生的好奇心,开阔学 生的视野,开发智力、培养能力,培养学生良好的学习和生活 习惯。作为教师,应客观而清醒地分析学生的个性,做到因人 施教,因异施教。 从中发现高职院校学生的思想问题,以便教师及时对所讲内 容进行适当调整和改进,对学生还不懂的内容,下次上课时 会再讲一遍;对于学生有疑问的问题教师要及时作出解答。 教师要鼓励学生多看看外面的世界,多去站酷、68design 等知名设计网站去了解设计师的发展动态,尽量把案例与工 作情境接轨,以弥补教材本身的局限与不足。 在和谐的师生关系氛围中,因为师生相互信任和尊重, 故可以让学生打开心扉,把他们的困难与问题说出来,即使 问题不可能很快得到解决,至少可以得到一些精神上的抒发 教师要学会自觉地充实自己的知识。知识匮乏的教师对 学生毫无吸引力,学生总是喜欢那些知识渊博,说话风趣幽 默的教师,这样的教师能给学生带来一股新鲜的风气;像学 生的朋友,与学生的共同语言多,容易与学生打成一片,让学 生深切地感受到教师的爱。 教师要学会热爱学生。“教育不能没有爱,没有爱就没有 教育”,爱是教育的灵魂。要让学生当主人,引导学生自主学 和心灵上的慰藉,教师就可以给学生更有针对性地指导。 建立和谐的师生关系教师是主体,所以,在这种和谐关 系中教师首先要做到: 教师要学会走进学生的内心世界。教师和学生既是师生 习。知识和技能最终要靠学生自己去把握,做人最终要学生 自己去做,这是学生的主体地位决定的。教师应该让学生主 动参与实践,学会自我教育、自我治理、自我成才,让学生的 个性充分得到展示。良好的教育离不开良好和谐的教育引 关系,又是朋友关系、伙伴关系,地位是平等的。既然平等,就 应该相互理解和尊重。这就要求教师放下架子,学会沟通。沟 通是教育的一条捷径,通向学生的内心世界。只有沟通,师生 之间才能说心里话,才能彼此了解,增进感情。教师可以充分 利用现代网络技术,通过发邮件、QQ群上聊天等办法加入学 生所在班级的QQ群中,建立与学生课下沟通的桥梁。 教师要善于学习。名师出高徒。教师必须要及时更新自 己的知识结构,多了解教学改革的新动向,随时随地教育学 生,用自己的智慧和经验为学生做好榜样。学习的本质是互 相的,从来就不是单向的,所以教师要善于从学生身上学到 更多的东西。 导。教师的责任不在教,而在教学生学。现代教育理论强调, 学生是课堂的主体,教育应充分体现学生为主体的教育思 想。因此教师应在以学生为主体的教学活动中培养学生的自 主学习能力,积极主动地学习知识,热情自觉地参与学习实 践;让学生成为真正的教学主体。口 参考文献: [1】任绪斌.略论教学过程中师生人际关系的功能.解放 军艺术学院学报,2002,2. [2】周作云,罗好裕,刘笃诚.教师心理学概论.成都科技 大学出版社,1988. 教师要学会欣赏学生,发现学生的闪光点。教育学生不 是灌给学生一桶水,而是点燃一把火。教师要善于从多个方 (上接第82页) . ....——[3】张大均主编.教育心理学.人民出版社,2002. [ ]Ethernet(10 or 100 Mbit) Generic Media Independent Interface device suppoa 接收到该应答信息,所以不能ping通主机。经过分析发现,原 来是DM9000的数据接收中断并没有注册成功,在修改了其 中断注册过程后,终于能够成功获取到主机的应答信息, DM9000网卡驱动的移植也算是大功告成!口 参考文献: 【1】DM9OOOA一17-DS—FO1 Data Sheet【S].Davicom Semiconductor lnc,2006. < >DM9000 support 退出并保存配置选项,运行命令“make zImage”编译内 核,编译成功后使用U—Boot工具mkimage将zImage转移为 uImage,并启动开发板,通过开发板中的U—Boot将新编译好 的Linux镜像文件uImage下载到RAM中(这里并未烧写 uImage镜像,可以在测试成功后再烧写,以减少对NAND Flash的烧写次数,延长其寿命)。 在测试过程中可以结合Linux下的一款开源软件 Wireshark网络抓包工具进行抓包分析。在刚开始的实验中, 目标机总是不能ping通主机,后来通过抓包发现,其能够正 常发送ARP包,主机也返回了应答信息,但是目标机并没能 84 [2基于¥3C2410嵌入式Li2Jnux开发实验与实践[S】.深 圳市英蓓特信息技术有限公司,2008. [3】贺金平.嵌入式linux下DM9000网卡驱动的移植与 实现[J]_电脑知识与技术,2009,5. [4】周敬琼,周凤星.基于ARM的Linux网络设备驱动程 序开发 计算机工程与设计,2009,30.