【移植驱动到Linux3.4.2内核之一】移植DM9000C网卡驱动
2018-01-28 02:19
453 查看
之前已经把uboot,内核,文件系统,都移植好了,今天开始我们把第二期写的Linux2.6.22.6内核的驱动程序全部移植到我们新3.4.2内核中去。首先移植网卡驱动程序吧,因为,我们后面需要用到网络文件系统来更简便的学习。
1. 编译
2. 解决错误
2.1 头文件不对:去掉或改名
2.2 宏不对:改名使用新的宏
2.3 有些函数没有了:改名使用新函数
进入到入口函数,找到结构体:
一般是通过.name这个成员进行匹配的,搜索字符串“dm9000”,找到如下结构体(在平台文件中:arch\arm\mach-s3c24xx\Mach-mini2440.c):
然后搜索结构体mini2440_device_eth,找到:
然后再搜索:mini2440_devices,找到:
这就是把结构体mini2440_devices添加到内核,里面的关于网卡的结构在里面,最终匹配驱动程序,就可以使用驱动程序了。
(这就是所谓的平台设备平台驱动的东西了,把可变的东西抽象出来放到平台相关的文件中定义,而我们的驱动程序,基本上是不需要改变的,它是稳定的内容,我们移植的时候,只需要把平台层可变的相关结构体加上,需要修改的资源,进行修改就可以了)。
而我们用的是smdk2440(对应的机器ID为:set machid 16a),然后我在Mach-smdk2440.c中添加以下函数:
在结构体smdk2440_devices中添加网卡成员:
添加头文件:
然后重新编译内核。成功。烧写新内核:
nfs 30000000 192.168.1.101:/work/nfs_root/uImage_net_new; bootm 30000000
然后挂载网络文件系统(挂载之前设置ip,我的是自动设置ip了,所以就shenglve):
mount -t nfs -o nolock,vers=2 192.168.1.101:/work/nfs_root/fs_mini_mdev_new /mnt
成功挂载网络文件系统。
首先,移植的步骤就主要是改错误的过程,错误较多,这里就不一一列出了(如若需要该网卡驱动程序,可以加最底下我的联系方式),假设我们已经改好的网卡驱动程序为:dm9dev9000c.c,编译也没有错误。我们将它拷贝到内核相关目录:
cp dm9dev9000c.c /work/system/linux-3.4.2/drivers/net/ethernet/davicom/
修改该目录Makefile文件:
然后重新编译内核。烧写,看看网卡是否可以正常使用,以及是否可以挂载网络根文件系统。
nfs 30000000 192.168.1.101:/work/nfs_root/uImage_net_new; bootm 30000000
mount -t nfs -o nolock,vers=2 192.168.1.101:/work/nfs_root/fs_mini_mdev_new /mnt
可以成功挂载网络根文件系统,所以网卡移植是成功的。
ip=192.168.1.104:为单板ip,192.168.1.101:为服务器ip,192.168.1.1为网关,255.255.255.0为子网掩码
然后启动内核:nfs 30000000 192.168.1.101:/work/nfs_root/uImage_net_new; bootm 30000000
这样就可以直接开机启动网络根文件系统了。以后开发就更加方便了。
想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。
1移植DM9000网卡驱动程序概览
一.移植的步骤:1. 编译
2. 解决错误
2.1 头文件不对:去掉或改名
2.2 宏不对:改名使用新的宏
2.3 有些函数没有了:改名使用新函数
2.移植内核自带的网卡驱动程序
在移植之前,首先我们来看一下mini2440(对应的机器ID为:set machid 7CF)中,是如何支持dm9000网卡的。进入到入口函数,找到结构体:
static struct platform_driver dm9000_driver = { .driver = { .name = "dm9000", .owner = THIS_MODULE, .pm = &dm9000_drv_pm_ops, }, .probe = dm9000_probe, .remove = __devexit_p(dm9000_drv_remove), };
一般是通过.name这个成员进行匹配的,搜索字符串“dm9000”,找到如下结构体(在平台文件中:arch\arm\mach-s3c24xx\Mach-mini2440.c):
static struct platform_device mini2440_device_eth = { .name = "dm9000", .id = -1, .num_resources = ARRAY_SIZE(mini2440_dm9k_resource), .resource = mini2440_dm9k_resource, .dev = { .platform_data = &mini2440_dm9k_pdata, }, };
然后搜索结构体mini2440_device_eth,找到:
static struct platform_device *mini2440_devices[] __initdata = { &s3c_device_ohci, &s3c_device_wdt, &s3c_device_i2c0, &s3c_device_rtc, &s3c_device_usbgadget, &mini2440_device_eth, //在这里 &mini2440_led1, &mini2440_led2, &mini2440_led3, &mini2440_led4, &mini2440_button_device, &s3c_device_nand, &s3c_device_sdi, &s3c_device_iis, &uda1340_codec, &mini2440_audio, &samsung_asoc_dma, };
然后再搜索:mini2440_devices,找到:
platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));
这就是把结构体mini2440_devices添加到内核,里面的关于网卡的结构在里面,最终匹配驱动程序,就可以使用驱动程序了。
(这就是所谓的平台设备平台驱动的东西了,把可变的东西抽象出来放到平台相关的文件中定义,而我们的驱动程序,基本上是不需要改变的,它是稳定的内容,我们移植的时候,只需要把平台层可变的相关结构体加上,需要修改的资源,进行修改就可以了)。
而我们用的是smdk2440(对应的机器ID为:set machid 16a),然后我在Mach-smdk2440.c中添加以下函数:
/* lyy 以下为添加 * The DM9000 has no eeprom, and it's MAC address is set by * the bootloader before starting the kernel. */ /* DM9000AEP 10/100 ethernet controller */ #define MACH_SMDK2440_DM9K_BASE (S3C2410_CS4 + 0x300) static struct resource smdk2440_dm9k_resource[] = { [0] = { .start = MACH_SMDK2440_DM9K_BASE, .end = MACH_SMDK2440_DM9K_BASE + 3, .flags = IORESOURCE_MEM }, [1] = { .start = MACH_SMDK2440_DM9K_BASE + 4, .end = MACH_SMDK2440_DM9K_BASE + 7, .flags = IORESOURCE_MEM }, [2] = { .start = IRQ_EINT7, .end = IRQ_EINT7, .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, } }; static struct dm9000_plat_data smdk2440_dm9k_pdata = { .flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM), }; static struct platform_device smdk2440_device_eth = { .name = "dm9000", .id = -1, .num_resources = ARRAY_SIZE(smdk2440_dm9k_resource), .resource = smdk2440_dm9k_resource, .dev = { .platform_data = &smdk2440_dm9k_pdata, }, }; /* lyy:以上为添加 */
在结构体smdk2440_devices中添加网卡成员:
static struct platform_device *smdk2440_devices[] __initdata = { &s3c_device_ohci, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c0, &s3c_device_iis, &smdk2440_device_eth, /* lyy:添加 */ };
添加头文件:
#include <linux/dm9000.h> /* lyy:添加 */
然后重新编译内核。成功。烧写新内核:
nfs 30000000 192.168.1.101:/work/nfs_root/uImage_net_new; bootm 30000000
然后挂载网络文件系统(挂载之前设置ip,我的是自动设置ip了,所以就shenglve):
mount -t nfs -o nolock,vers=2 192.168.1.101:/work/nfs_root/fs_mini_mdev_new /mnt
成功挂载网络文件系统。
3.移植最新网卡驱动程序(自己写的网卡驱动程序)的步骤
有时候,内核自带的网卡驱动程序比较老,而我们的硬件有可能比较新,那么我们就不能使用内核的网卡驱动程序了,就需要去移植最新的网卡驱动程序,那么这种类型的,又该如何移植呢?首先,移植的步骤就主要是改错误的过程,错误较多,这里就不一一列出了(如若需要该网卡驱动程序,可以加最底下我的联系方式),假设我们已经改好的网卡驱动程序为:dm9dev9000c.c,编译也没有错误。我们将它拷贝到内核相关目录:
cp dm9dev9000c.c /work/system/linux-3.4.2/drivers/net/ethernet/davicom/
修改该目录Makefile文件:
# # Makefile for the Davicom device drivers. # #obj-$(CONFIG_DM9000) += dm9000.o obj-$(CONFIG_DM9000) += dm9dev9000c.o
然后重新编译内核。烧写,看看网卡是否可以正常使用,以及是否可以挂载网络根文件系统。
nfs 30000000 192.168.1.101:/work/nfs_root/uImage_net_new; bootm 30000000
mount -t nfs -o nolock,vers=2 192.168.1.101:/work/nfs_root/fs_mini_mdev_new /mnt
可以成功挂载网络根文件系统,所以网卡移植是成功的。
4.最后,我们来设置一下开机直接挂载网络根文件系统:
uboot中设置:set bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.1.101:/work/nfs_root/fs_mini_mdev_new ip=192.168.1.104:192.168.1.101:192.168.1.1:255.255.255.0::eth0:offip=192.168.1.104:为单板ip,192.168.1.101:为服务器ip,192.168.1.1为网关,255.255.255.0为子网掩码
然后启动内核:nfs 30000000 192.168.1.101:/work/nfs_root/uImage_net_new; bootm 30000000
这样就可以直接开机启动网络根文件系统了。以后开发就更加方便了。
想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。
相关文章推荐
- 移植Linux3.4.2版本内核到mini2440(二)--添加网卡、UVC摄像头、LCD驱动
- 移植Linux3.4.2版本内核到mini2440(二)--添加网卡、UVC摄像头、LCD驱动
- 05-S3C2440学习之内核(移植)linux3.4.2移植(3)之支持DM9000C网卡及修改支持串口2
- 【移植驱动到Linux3.4.2内核之二】LCD,触摸屏,按键,USB等驱动程序的移植心得总结
- 05-S3C2440学习之内核(移植)linux3.4.2移植(4)支持LED驱动、按键驱动
- linux-2.6.35内核移植—网卡驱动的移植
- 【转】 linux内核移植和网卡驱动(二)
- linux-2.6.35内核移植—网卡驱动的移植
- linux-2.6.35内核移植—网卡驱动的添加
- FL2440移植LINUX-3.4.2 (七)--驱动移植LCD(移植自己写的和移植内核自带的)
- 11-S3C2440驱动学习(五)嵌入式linux-网络设备驱动(二)移植DM9000C网卡驱动程序
- FL2440移植LINUX-3.4.2 -- 内核自带的触摸屏驱动移植
- Linux下ME3760_v2驱动移植方式,中兴4G网卡移植
- S5PC100芯片的linux-lcd驱动移植(基于2.6.35.13内核)
- Linux-2.6.32.2内核在mini2440上的移植(十六)---基于中断的按键驱动移植
- Linux-2.6.32.2内核在mini2440上的移植(十八)---将UART2更成普通串口驱动
- Linux2.6内核驱动移植参考
- Linux-2.6.32.2内核在mini2440上的移植(七)---LCD驱动移植
- 【引用】Linux-2.6.32.2内核在mini2440上的移植(五)---激活RTC驱动
- 【引用】Linux-2.6.32.2内核在mini2440上的移植(十五)---移植LED驱动