本文转自:http://www.arm32.com/post/11019.html
上接: [Linux学习内核移植相关笔记第3部分
=======================
下面有关内核网卡的驱动的移植完善
=======================
第14步:网卡驱动移植
1)驱动源码获取
在 内 核 里 面 网 卡 驱 动 是 相 当 完 善 的 , 这 里 需 要 注 意 一 件 事 情 , 从 2.6.25 开 始 的 内 核 的“drivers/net/dm9000.c”这个文件对应的 DM9000 的驱动(版本为 1.3 版)并不适合 DM9000E 这 颗 芯 片 ,
而在 SKY2440 和 TQ2440 开发板上面用的是 DM9000E 这颗芯片,所以我们需要更换“dm9000.c”这个驱动程序,我们只要找到 1.2 版的 DM9000 的驱动就可以支持 DM9000E 这颗芯片了,下载一个 linux-2.6.24.tar.bz2 的源码包,然后解压,提取“drivers/net/dm9000.c”这个文件,打开看一下,您可以发现这个
驱动文件是 1.2 版本的,我们用它去替换掉 2.6.25.8 里面的对应源码即可开始进行我们的移植操作。
注意: 上面讲的是 2.6.25.8 版的 dm9000 的驱动,而在 2.6.30.4 中的 dm9000 的驱动却是能直接使用的 。(我的是 2.6.30.4 ,所以可以直接使用)
我们只需要进行简单的修改就可以成功的驱动上 SKY2440 或 TQ2440 上面的 DM9000 的网卡芯片。
(下面只说明在 Linux-2.6.30.4 内核的部分,如果是想知道Linux-2.6.25.8 内核的部分修改方法可以参考天嵌linux手册的P51)
修改 Linux-2.6.30.4 内核源码的“arch/arm/mach-s3c2440/mach-smdk2440.c”文件:
在 50 行添加头文件内容如下;
#include
在 151行添加如下红色内容所示:
static struct s3c2410fb_mach_info tq2440_fb_info __initdata = {
.displays = &tq2440_lcd_cfg,
.num_displays = 1,
.default_display = 0,
#if 0
/* currently setup by downloader */
.gpccon = 0xaa940659,
.gpccon_mask = 0xffffffff,
.gpcup = 0x0000ffff,
.gpcup_mask = 0xffffffff,
.gpdcon = 0xaa84aaa0,
.gpdcon_mask = 0xffffffff,
.gpdup = 0x0000faff,
.gpdup_mask = 0xffffffff,
#endif
// .lpcsel = ((0xCE6) & ~7) | 1<<4,
};
/* DM9000 */
static struct resource s3c_dm9k_resource[] = {
[0] = {
.start= S3C2410_CS4,
.end = S3C2410_CS4 + 3,
.flags = IORESOURCE_MEM,
},
[1] = {
.start= S3C2410_CS4 + 4,
.end = S3C2410_CS4 + 4 + 3,
.flags = IORESOURCE_MEM,
},
[2] = {
.start= IRQ_EINT7,
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,
}
};
static struct dm9000_plat_data s3c_dm9k_platdata = {
.flags = DM9000_PLATF_16BITONLY,
};
struct platform_device s3c_device_dm9000 = {
.name = "dm9000",
.id = 0,
.num_resources = ARRAY_SIZE(s3c_dm9k_resource),
.resource = s3c_dm9k_resource,
.dev ={
.platform_data = &s3c_dm9k_platdata,
}
};
在 194 行添加如下红色内容所示:
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
&s3c_device_dm9000,
};
在 Linux-2.6.30.4 中“drivers/net/dm9000.c”文件中修改如下:
在 42 行添加的头文件内容如下:
#if defined(CONFIG_ARCH_S3C2410)
#include
#endif
在 1194行添加内容如下所示:
#if defined(CONFIG_ARCH_S3C2410)
unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
#endif
在1209 行添加如下内容:
#if defined(CONFIG_ARCH_S3C2410)
*((volatile unsigned int *)S3C2410_BWSCON) = (oldval_bwscon & ~(3<<16)) |
S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
#endif
修改 1378 (天嵌上是1278是错的)行开始的内容如下所示: (红色部分(注意下面还有
#endif)为修改内容,主要是添加 mac 值)
#if defined(CONFIG_ARCH_S3C2410)
printk("Now use the default MAC address: 10:23:45:67:89:ab\n");
mac_src = "Qinziqiang";
ndev->dev_addr[0] = 0x10;
ndev->dev_addr[1] = 0x23;
ndev->dev_addr[2] = 0x45;
ndev->dev_addr[3] = 0x67;
ndev->dev_addr[4] = 0x89;
ndev->dev_addr[5] = 0xab;
#else
mac_src = "eeprom";
/* try reading the node address from the attached EEPROM */
for (i = 0; i < 6; i += 2)
dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i);
if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {
mac_src = "platform data";
memcpy(ndev->dev_addr, pdata->dev_addr, 6);
}
if (!is_valid_ether_addr(ndev->dev_addr)) {
/* try reading from mac */
mac_src = "chip";
for (i = 0; i < 6; i++)
ndev->dev_addr[i] = ior(db, i+DM9000_PAR);
}
if (!is_valid_ether_addr(ndev->dev_addr))
dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "
"set using ifconfig\n", ndev->name);
#endif
在 1423 行添加如下内容:
#if defined(CONFIG_ARCH_S3C2410)
*(volatile unsigned int *)S3C2410_BWSCON = oldval_bwscon;
*(volatile unsigned int *)S3C2410_BANKCON4 = oldval_bankcon4;
#endif
2) 配置并编译内核
修改完以上的内容之后,输入:#make menuconfig,进入配置单,然后添加上对 DM9000 网卡的配置
[*] Networking support --->
--- Networking support
Networking options --->
< > Packet socket
<*> Unix domain sockets
< > PF_KEY sockets
[*] TCP/IP networking
[] IP: multicasting
[] IP: advanced router
[*] IP: kernel level autoconfiguration
[*] IP: DHCP support
[] IP: BOOTP support
[] IP: RARP support
Device Drivers --->
[*] Network device support --->
[*] Ethernet (10 or 100Mbit) --->
-*- Generic Media Independent Interface device support
<*> DM9000 support
(4) DM9000 maximum debug level
配置好后,保存配置单,然后编译出镜像,烧写到开发板中。
3) DM9000 网卡配置
然后还需要修改文件系统的“/etc/init.d/rcS”文件下面列出修改的内容(红色部分所示)
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
ifconfig lo 127.0.0.1
#(设置本地回环设备 IP 地址,缺省值)
net_set & #(调用网络配置文件)
/bin/hostname -F /etc/sysconfig/HOSTNAME
然后我们在文件系统的“/sbin/”目录下新建一个可执行文件“net_set”(需要设置权限为可执行) ,然后内容如下:
#!/bin/sh
echo Try to bring eth0 interface up ...>/dev/tq2440_serial0
if [ -f /etc/net.conf ] ; then
source /etc/net.conf
ifconfig eth0 down
ifconfig eth0 hw ether $MAC
echo ifconfig eth0 hw ether $MAC >/dev/tq2440_serial0
ifconfig eth0 $IPADDR netmask $NETMASK up
echo ifconfig eth0 $IPADDR netmask $NETMASK up >/dev/tq2440_serial0
route add default gw $GATEWAY
echo add default gw $GATEWAY >/dev/tq2440_serial0
else
ifconfig eth0 hw ether 10:23:45:67:89:ab
ifconfig eth0 192.168.1.6 netmask 255.255.255.0 up
route add default gw 192.168.1.2
echo ifconfig eth0 hw ether 10:23:45:67:89:ab >/dev/tq2440_serial0
echo ifconfig eth0 192.168.1.6 netmask 255.255.255.0 up >/dev/tq2440_serial0
echo route add default gw 192.168.1.2 >/dev/tq2440_serial0
fi
echo Done > /dev/tq2440_serial0
然后在文件系统的“/etc/”目录下新建“net.conf”文件用于存放网络配置的相关信息,内容如下:
IPADDR=192.168.1.6
NETMASK=255.255.255.0
GATEWAY=192.168.1.2
MAC=10:23:45:67:89:ab
修改完毕文件系统后,重新制作为 yaffs 文件系统,烧写到开发板中,然后在启动开发板时就会完成
对网卡 IP 等信息的设置。
当您需要修改网卡的 IP 等的时候,只需要在修改“/etc/net.conf”文件的内容后执行一下 net_set 命令
即可。
下面我们添加 web 服务器到文件系统中, 在前面制作文件系统时, 已经将 web 服务器的相关文件添加到文件系统了, 这里, 我们只需要在系统启动时加载 web 服务器的进程即可, 修改文件系统的“/etc/init.d/rcS”
文件,添加上对 web 服务器的调用即可: (红色部分所示)
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
ifconfig lo 127.0.0.1
net_set &
/etc/rc.d/init.d/httpd start
#启动 web 服务器的代理
/bin/hostname -F /etc/sysconfig/HOSTNAME
完成后,重新制作文件系统的镜像,烧写到开发板中,在开发板的终端输入:$ifconfig,你可以看到设置的网络的信息和 Web 服务器启动的信息,如下所示:
(下面是我开发板运行后的部分结果(得到下面,其实相当的不顺利,不过有什么问题,在天嵌的论坛资料下载页面都有,在这个网卡的驱动移植过程中,编译缺少的,或错误的文件,我直接就从root_2.6.25.8_qt_1.7.0_tp.tar.bz2的相应文件中得到):
........
yaffs_read_super: isCheckpointed 0
VFS: Mounted root (yaffs filesystem) on device 31:2.
Freeing init memory: 120K
eth0: link down
Done
[01/Jan/1970:00:00:07 +0000] boa: server version Boa/0.94.13
[01/Jan/1970:00:00:07 +0000] boa: server built Aug 19 2007 at 17:40:00.
[01/Jan/1970:00:00:07 +0000] boa: starting server pid=905, port 80
Please press Enter to activate this console.
\[root@Qinziqiang /]# ls
bin home lost+found proc sys
dev lib mnt root tmp
etc linuxrc opt sbin usr
[root@Qinziqiang /]#
......