基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通
2016-10-26 16:35
796 查看
基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通
最近有个学生毕业设计需要实现基于ARM的DM9000网卡通信,但是linux2.6.30.4内核已经把DM9000网卡封装好了,这样我们只能将其拿出编译成模块也就是.ko文件进行加载调试。下面讲解下编译步骤和关于DM9000网卡的一些信息。
因为我们从内核中看了dm9000的驱动源代码(/drivers/net/dm9000.c),在最后模块加载函数时候dm9000网卡驱动程序最后加载到了platform虚拟总线驱动上了,所以刚开始我直接编译dm9000驱动,加载没有效果,结果就查资料后来知道了,dm9000是依赖于plagform驱动之上,所以我们单独编译驱动的时候还要注册dm9000在platform之上的设备。
图1 未修改之前的dm9000.c的加载函数
1199 static int __init
1200 dm9000_init(void)
1201 {
1202 printk(KERN_INFO "%s
Ethernet Driver\n", CARDNAME);
1203
1204 return platform_driver_register(&dm9000_driver); /*
search board and register */
1205 }
platform是一个虚拟的地址总线,它主要用于描述SOC上的片上资源。
platform所描述的资源有一个共同点,就是在CPU的总线上直接取址。
因为内核只是封装了platform_driver,所以单独编译DM9000.c网卡还是不可用的。
我们需要注册platform_device,即注册platform设备就可以使用DM9000网卡工作了。
在linux2.6.30.4/include/linux/platform_device.h:
在 linux+v2.6.30.4/include/linux/ioport.h:
图2 DM9000的芯片
对于DM9000 的resource资源,我们需要知道一下信息:
(1) DM9000的访问基地址:即为nLAN_CS2的基地址。注意要是物理地址。
(2) DM9000只用到一条地址线:LADDR2。
对于DM9000的CMD引脚:当CMD为低电平时,LDATA0~LDATA15线上传输的是地址信号。
当CMD为高电平时,LDATA0~LDATA15线上传输的是数据信号。
(3) DM9000的中断引脚: ENT7。
(4) 总线位宽:这里是16位。
在linux2.6.30.4/driver/net/dm9000.h 添加如下资源
在 linux2.6.17/drivers/net/dm9000.c添加注册platform设备:
在加载DM9000.ko之前需要mii接口模块和crc32模块。
在linux-2.6.30.4/lib目录下有crc32.ko。
在linux-2.6.30.4/drivers/net/目录下有mii.c。可以将此编译为模块加入到内核。
经过查看这两个模块默认都被编译到内核里面去了,要是没有的话可以编译下。
DM9000的重要驱动是内核提供的源代码。
这里只是简单的增加设备的硬件资源。
下面回到linux内核根目录make menuconfig 将默认的dm9000前面的* 改成M
如图:
回到linux内核根目录make zImage 编译成功会在当前目录下生成一个zImage.bin 文件
make SUBDIR=drivers/net/ modules 将dm9000.c编译成一个dm9000.ko文件
将dm9000.ko拷贝到ARM开发板上加权限 chmod +x dm9000.ko
加载dm9000网卡 insmod dm9000.ko 他会有一个提示语,并且会打印出eth0 相关的信息,这就代表驱动模块加载成功了。
将新添加的网卡挂载起来
ifconfig eth0 up 设定IP 就能ping通了。
希望能帮到您!
最近有个学生毕业设计需要实现基于ARM的DM9000网卡通信,但是linux2.6.30.4内核已经把DM9000网卡封装好了,这样我们只能将其拿出编译成模块也就是.ko文件进行加载调试。下面讲解下编译步骤和关于DM9000网卡的一些信息。
因为我们从内核中看了dm9000的驱动源代码(/drivers/net/dm9000.c),在最后模块加载函数时候dm9000网卡驱动程序最后加载到了platform虚拟总线驱动上了,所以刚开始我直接编译dm9000驱动,加载没有效果,结果就查资料后来知道了,dm9000是依赖于plagform驱动之上,所以我们单独编译驱动的时候还要注册dm9000在platform之上的设备。
图1 未修改之前的dm9000.c的加载函数
1199 static int __init
1200 dm9000_init(void)
1201 {
1202 printk(KERN_INFO "%s
Ethernet Driver\n", CARDNAME);
1203
1204 return platform_driver_register(&dm9000_driver); /*
search board and register */
1205 }
platform是一个虚拟的地址总线,它主要用于描述SOC上的片上资源。
platform所描述的资源有一个共同点,就是在CPU的总线上直接取址。
因为内核只是封装了platform_driver,所以单独编译DM9000.c网卡还是不可用的。
我们需要注册platform_device,即注册platform设备就可以使用DM9000网卡工作了。
在linux2.6.30.4/include/linux/platform_device.h:
16struct platform_device { //这个结构直接和硬件交互 17 const char * name; 18 u32 id; 19 struct device dev; 20 u32 num_resources; 21 struct resource * resource; //所描述的设备的硬件资源 22}; |
16 struct resource { 17 const char *name; 18 unsigned long start, end; 19 unsigned long flags; 20 struct resource *parent, *sibling, *child; 21 }; //挂在CPU上的每个独立的设备单元,都需要一段线性的地址空间来描述-查看memory map. //resource->start描述设备实体在cpu总线上的线性起始物理地址; //resource->end -描述设备实体在cpu总线上的线性结尾物理地址; //resource->name 描述这个设备实体的名称,这个名字开发人员可以随意起,但最好贴切; // resource->flag 描述这个设备实体的一些共性和特性的标志位; |
对于DM9000 的resource资源,我们需要知道一下信息:
(1) DM9000的访问基地址:即为nLAN_CS2的基地址。注意要是物理地址。
(2) DM9000只用到一条地址线:LADDR2。
对于DM9000的CMD引脚:当CMD为低电平时,LDATA0~LDATA15线上传输的是地址信号。
当CMD为高电平时,LDATA0~LDATA15线上传输的是数据信号。
(3) DM9000的中断引脚: ENT7。
(4) 总线位宽:这里是16位。
在linux2.6.30.4/driver/net/dm9000.h 添加如下资源
在 linux2.6.17/drivers/net/dm9000.c添加注册platform设备:
static int __init dm9000_init(void) { printk(KERN_INFO "%s Ethernet Driver\n", CARDNAME); platform_driver_register(&dm9000_driver); /* search board and register */ platform_device_register(&s3c_device_dm9000); //注册设备 return 0; } static void __exit dm9000_cleanup(void) { platform_driver_unregister(&dm9000_driver); //注销驱动 platform_device_unregister(&s3c_device_dm9000); //注销设备 } |
在linux-2.6.30.4/lib目录下有crc32.ko。
在linux-2.6.30.4/drivers/net/目录下有mii.c。可以将此编译为模块加入到内核。
经过查看这两个模块默认都被编译到内核里面去了,要是没有的话可以编译下。
DM9000的重要驱动是内核提供的源代码。
这里只是简单的增加设备的硬件资源。
下面回到linux内核根目录make menuconfig 将默认的dm9000前面的* 改成M
如图:
回到linux内核根目录make zImage 编译成功会在当前目录下生成一个zImage.bin 文件
make SUBDIR=drivers/net/ modules 将dm9000.c编译成一个dm9000.ko文件
将dm9000.ko拷贝到ARM开发板上加权限 chmod +x dm9000.ko
加载dm9000网卡 insmod dm9000.ko 他会有一个提示语,并且会打印出eth0 相关的信息,这就代表驱动模块加载成功了。
将新添加的网卡挂载起来
ifconfig eth0 up 设定IP 就能ping通了。
希望能帮到您!
相关文章推荐
- 基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响—linux2.4单独编译驱动模块
- Linux2.6 DM9000驱动模编译为模块
- 将LED驱动模块编译到Linux3.10.17内核
- Linux编译内核kernel解决USB、网卡驱动等问题【suse enterprise linux】
- Linux 驱动开发之内核模块开发 (二)—— 内核模块编译 Makefile 入门
- linux 内核模块的编译(用于驱动开发)
- linux启动时对编译进内核驱动模块的加载
- 【ZYNQ_LINUX】如何把自己的驱动编译进内核或模块(Kconfig和Makefile
- (Linux 技术)Fedora 16下编译无线网卡驱动成功
- 转:linux启动时对编译进内核驱动模块的加载
- linux下编译新内核,解决无法找到eth0设备问题,安装eth0网卡驱动
- rhel/linux下如何找出网卡驱动的内核模块名称
- linux驱动学习--第六天:第四章 Linux 内核模块 之 Linux 内核模块编译
- 【Linux驱动】TQ2440 DM9000E网卡驱动移植(Linux-2.6.30.4)
- linux启动时对编译进内核驱动模块的加载
- linux驱动开发内核模块编译——Makefile入门
- Linux 驱动开发之内核模块开发 (二)—— 内核模块编译 Makefile 入门
- linux(gentoo)内核编译-intel无线网卡驱动
- boadcom x86_64 431*系列无线网卡驱动在linux 3.10以上内核编译问题的解决