Linux学习内核移植相关笔记第4部分

本文转自: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 /]#

......

你可能感兴趣的:(Linux内核移植)