Linux 2.6.30内核移植到S3C2440——CS8900网卡移植(一)

2014-11-24 08:57:10 · 作者: · 浏览: 6

交叉编译器:arm-linux-3.4.1


一、说明:


本CS8900网卡驱动移植是基于之前内核版本的,实际上是从扬创开发板附送光盘上拷贝下来的CS8900源文件移植而来。


移植好的CS8900网卡驱动在扬创ubu2440-F开发板上已验证通过。


CS8900网卡驱动移植到基于linux2.6.30内核版本的S3C2440中,主要关注其中几点:


1. 基于旧的CS8900网卡驱动;


2. CS8900网卡驱动的BSP信息构造;


2. 头文件的变化;


3. linux2.6.30的struct net_device有变化,主要是没有了priv这个成员变量;


本文要用到的相关文件在Linux公社的1号FTP服务器里,下载地址:


密码:www.muu.cc


在 2011年LinuxIDC.com\6月\Linux 2.6.30内核移植到S3C2440——CS8900网卡移植


下载方法见 http://www.linuxidc.net/thread-1187-1-1.html


1. 在drivers/net/arm/ 目录下添加 cs8900.c,cs8900.h两个文件。


如果是你自己重新移植的话,这两文件可从Linux公社FTP上下载;如果使用本人移植好的驱动(可以省略一些步骤)。


2. 修改drivers/net/arm/目录下的Kconfig文件,在最后添加如下内容:



3. 修改drivers/net/arm/Makefile文件,添加:
obj-$(CONFIG_ARM_CS8900) += cs8900.o


4. 编译配置内核,进入配置菜单,添加CS8900驱动到内核:
# make menuconfig


Device Drivers --->


[*] Network device support --->


[*] Ethernet (10 or 100Mbit) --->


<*> CS8900 support


5. 添加BSP关于CS8900网卡驱动信息:


如果是移植到2410,则打开arch/arm/mach-s3c2410/mach-smdk2410.c文件;如果是移植到2440,则打开arch/arm/mach-s3c2440/mach-smdk2440.c。本人使用自己创建的BSP文件,即arch/arm/mach-s3c2440/mach-reille2440.c,在static struct map_desc smdk2410_iodesc[] __initdata (对2410而言)或static struct map_desc smdk2440_iodesc[] __initdata(对2440而言)最后添加:



6. 修改arch/arm/mach-s3c2410/include/mach/map.h文件,在最后添加:



7. 编译内核:


如果是使用我移植好的CS8900驱动,则不会有问题,如果是使用从网上下载或从我博客资源上下载的未移植好的C8900驱动,则编译时会出现很多错误,包括头文件、宏定义、priv成员等错误,如下所示:


drivers/net/arm/cs8900.c:56:26: asm/hardware.h: No such file or directory


drivers/net/arm/cs8900.c:71:30: asm/arch/bit-map.h: No such file or directory


drivers/net/arm/cs8900.c:72:31: asm/arch/regs-mem.h: No such file or directory


drivers/net/arm/cs8900.c:96: error: unknown field `init' specified in initializer


drivers/net/arm/cs8900.c:97: warning: missing braces around initializer


drivers/net/arm/cs8900.c:97: warning: (near initialization for `cs8900_dev.name')


drivers/net/arm/cs8900.c:97: warning: initialization makes integer from pointer without a cast


drivers/net/arm/cs8900.c:97: error: initializer element is not computable at load time


drivers/net/arm/cs8900.c:97: error: (near initialization for `cs8900_dev.name[0]')


drivers/net/arm/cs8900.c:97: error: initializer element is not constant


drivers/net/arm/cs8900.c:97: error: (near initialization for `cs8900_dev.name')


drivers/net/arm/cs8900.c:117: error: variable `cs8900_eeprom_fops' has initializer but incomplete type


drivers/net/arm/cs8900.c:118: error: unknown field `owner' specified in initializer


drivers/net/arm/cs8900.c:118: warning: excess elements in struct initializer


drivers/net/arm/cs8900.c:118: warning: (near initialization for `cs8900_eeprom_fops')


drivers/net/arm/cs8900.c:119: error: unknown field `open' specified in initializer


drivers/net/arm/cs8900.c:119: warning: excess elements in struct initializer


drivers/net/arm/cs8900.c:119: warning: (near initialization for `cs8900_eeprom_fops')


drivers/net/arm/cs8900.c:120: error: unknown field `release' specified in initializer


drivers/net/arm/cs8900.c:120: warning: excess elements in struct initializer


drivers/net/arm/cs8900.c:120: warning: (near initialization for `cs8900_eeprom_fops')


drivers/net/arm/cs8900.c:121: error: unknown field `llseek' specified in initializer


drivers/net/arm/cs8900.c:121: warning: excess elements in struct initializer


drive