嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。
一、移植环境
- 主 机:VMWare--Fedora 9
- 开发板:Mini2440--64MB Nand
- 编译器:arm-linux-gcc-4.3.2
二、移植步骤
1. 创建DM9000E设备IO资源到内核虚拟地址的映射,红色部分
#gedit arch/arm/mach-s3c2440/mach-smdk2440.c
|
static struct map_desc smdk2440_iodesc[] __initdata = { /* ISA IO Space map (memory space selected by A24) */ { .virtual = (u32)S3C24XX_VA_ISA_WORD, .pfn = __phys_to_pfn(S3C2410_CS2), .length = 0x10000, .type = MT_DEVICE, }, { .virtual = (u32)S3C24XX_VA_ISA_WORD + 0x10000, .pfn = __phys_to_pfn(S3C2410_CS2 + (1<<24)), .length = SZ_4M, .type = MT_DEVICE, }, { .virtual = (u32)S3C24XX_VA_ISA_BYTE, .pfn = __phys_to_pfn(S3C2410_CS2), .length = 0x10000, .type = MT_DEVICE, }, { .virtual = (u32)S3C24XX_VA_ISA_BYTE + 0x10000, .pfn = __phys_to_pfn(S3C2410_CS2 + (1<<24)), .length = SZ_4M, .type = MT_DEVICE, }, { .virtual = (u32)S3C2410_ADDR(0x02100300), .pfn = __phys_to_pfn(0x20000300), .length = SZ_1M,
.type = MT_DEVICE, } };
|
2. 在设备初始化列表中添加对DM9000E设备的支持,红色部分
#gedit arch/arm/mach-s3c2440/mach-smdk2440.c
|
static struct platform_device *smdk2440_devices[] __initdata = { &s3c_device_usb, &s3c_device_lcd, &s3c_device_wdt, &s3c_device_i2c0, &s3c_device_iis, &s3c_device_rtc, &s3c_device_dm9000, };
|
3. 在内核中注册DM9000E设备,添加如下内容
#gedit arch/arm/plat-s3c24xx/devs.c
|
/* DM9000 registrations */ #include <linux/dm9000.h> #define DM9000_BASE 0x20000300 static struct resource s3c_dm9000_resource[] = { [0] = { .start = DM9000_BASE, .end = DM9000_BASE + 0x03, .flags = IORESOURCE_MEM, }, [1] = { .start = DM9000_BASE + 0x04, .end = DM9000_BASE + 0x04 + 0x7c, .flags = IORESOURCE_MEM, }, [2] = { .start = IRQ_EINT7, .end = IRQ_EINT7, .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, } };
static struct dm9000_plat_data s3c_device_dm9000_platdata = { .flags = DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM, };
struct platform_device s3c_device_dm9000 = { .name= "dm9000", .id= 0, .num_resources= ARRAY_SIZE(s3c_dm9000_resource), .resource= s3c_dm9000_resource, .dev= { .platform_data = &s3c_device_dm9000_platdata, } };
EXPORT_SYMBOL(s3c_device_dm9000);
|
4. 在头文件中声明第三步中定义的
s3c_device_dm9000
#gedit arch/arm/plat-s3c/include/plat/devs.h
|
5. 修改DM9000驱动源码,注意驱动是1.31版本。图片蓝色部分为添加或修改的内容
#gedit drivers/net/dm9000.c
|
6. 配置内核选项,使内核支持DM9000网卡。配置完后编译内核烧写到开发板上
Device Drivers ---> [*] Network device support ---> [*] Ethernet (10 or 100Mbit) ---> -*- Generic Media Independent Interface device support < > ASIX AX88796 NE2000 clone support < > SMC 91C9x/91C1xxx support <*> DM9000 support (4) DM9000 maximum debug level [ ] Force simple NSR based PHY polling
|
7. 在文件系统中添加网络配置文件,使系统在开机过程中自动完成对网卡的配置
1)在文件系统/etc/net.conf文件中添加内容
IPADDR=192.168.1.105 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 MAC=10:23:45:67:89:ab
|
2)在文件系统/sbin/目录下新建一个可执行的脚本文件net_config,注意文件的权限(可执行)
#!/bin/sh echo Try to bring eth0 interface up ...>/dev/s3c2410_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/s3c2410_serial0 ifconfig eth0 $IPADDR netmask $NETMASK up echo ifconfig eth0 $IPADDR netmask $NETMASK up >/dev/s3c2410_serial0 route add default gw $GATEWAY echo add default gw $GATEWAY >/dev/s3c2410_serial0 else ifconfig eth0 hw ether 10:23:45:67:89:ab ifconfig eth0 192.168.1.105 netmask 255.255.255.0 up route add default gw 192.168.1.1 echo ifconfig eth0 hw ether 10:23:45:67:89:ab >/dev/s3c2410_serial0 echo ifconfig eth0 192.168.1.105 netmask 255.255.255.0 up >/dev/s3c2410_serial0 echo route add default gw 192.168.1.1 >/dev/s3c2410_serial0 fi echo Done > /dev/s3c2410_serial0
|
3)在文件系统/etc/init.d/rcS文件中添加网络配置语句
/sbin/ifconfig lo 127.0.0.1 #设置本地回环设备的IP地址 net_config& #执行上面的net_config文件对网卡进行设置
|
8. 在文件系统中添加完上述网卡配置信息后重新编译文件系统下载到开发板,系统上电启动后就会对网卡自动配置,并执行#ifconfig命令可以看到网卡的配置信息
9. 测试与主机的通信,开发板的IP地址可以在/etc/net.conf中修改
阅读(482) | 评论(0) | 转发(0) |