smdk210 内核移植
一.掌握:
.tar.bz2
解压:tar jxvfFileName.tar.bz2
压缩:tar jcvfFileName.tar.bz2 DirName
第一部分:基本移植
1.1、内核编译体验
修改Makefile
cp android_kernel_2.6.35_smdkv210.tar.bz2
解压之, # tar -jxvf android_kernel_2.6.35_smdkv210.tar.bz2
重命名, # mv android-kernel-samsung-dev gxa210-kernel-2.6.35.7
修改Makefile,添加以下两行以指定平台和交叉编译工具链。
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
ARCH = arm
CROSS_COMPILE =arm-linux-
# Architecture as present in compile.h
UTS_MACHINE := $(ARCH)
SRCARCH := $(ARCH)
配置, # makesmdkv210_android_defconfig
进一步配置, # make menuconfig
编译 # make zImage
经过漫长(机器好点三五分钟,差的十来分钟)时间的编译,完成后在 arch/arm/boot/目录下即会生成zImage文件,这个压缩内核就是我们的目标了。
将之copy到/tftpboot目录下(要根据你的ubuntu中tftp服务器的搭建来确定,我这里tftp服务器的下载目录就是/tftpboot),然后从uboot中下载,运行:
# tftp 0x20008000 zImage
#bootm 0x20008000
二.
可以看到内核并未启动起来。其实这时内核已经运行了,只是因为配置中串口选择不对造成的,于是乎我们对其进行必要修改。
1.2、make menuconfig中基本选项
1.2.1、串口配置,选择串口0
System Type --->
(0) S3C UART to use for low-level messages
Kernel hacking --->
(0) S3C UART to use for low-level debug
1.3、确定机器码
vi arch/arm/tools/mach-types
在2443行可以看出,SMDKV210评估板的机器码是2456(16进制是0x998):
2443 smdkv210 MACH_SMDKV210 SMDKV210 2456
该机器码与uboot中使用的相同,因此不需修改。
1.4、确定内核的加载地址与参数地址
vi arch/arm/mach-s5pv210/Makefile.boot
可以看出,内核的加载地址和参数地址分别为0x20008000和0x20000100,bootloader启动内核前应该将内核拷贝到0x20008000,并将参数放到0x20000100。
zreladdr-y +=0x20008000
params_phys-y := 0x20000100
1.5、修改Nand分区
drivers\mtd\nand\s3c_nand.c定义好了NandFlash的分区表,需要修改drivers\mtd\nand\s3c_nand.c文件:
vi drivers/mtd/nand/s3c_nand.c
struct mtd_partition s3c_partition_info[] ={
{
.name = "uboot",
.offset = 0, /* for bootloader */
.size = (1*SZ_1M),
.mask_flags = MTD_CAP_NANDFLASH,
},
{
.name = "recovery",
.offset = MTDPART_OFS_APPEND,
.size = (5*SZ_1M),
},
{
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = (5*SZ_1M),
},
{
.name = "ramdisk",
.offset = MTDPART_OFS_APPEND,
.size = (3*SZ_1M),
},
{
.name = "root",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
},
};
我们把512MB的分成了以下几个区,每个分区用于存放不同的内容:
分区名 起始地址 结束地址 大小
1.6、编译
直接make -j4以得到zImage,
1.7、zImage下载启动
首先复制文件到tftp下载目录, # cp arch/arm/boot/zImage /tftpboot/ –f
然后开发板端启动uboot,首先设置内核传参, setenv bootargs root=/dev/mtdblock4console=ttySAC0,115200 rootfstype=yaffs rw
然后tftp下载内核 # tftp0x20008000 zImage
待下载完成后启动之, # bootm0x20008000
看到如下启动信息。(当然,最终内核启动是失败的,那是因为我们并未提供对应的根文件系统。当提供了相应的根文件系统后启动即会成功
仔细查看以上错误信息,可以看到一些关键字如“LR is at max8698_pmic_probe+0x150/0x32c”可以,内核崩溃发生在max8698相关部分。
一。
Max8698是SMDKV210开发板上使用的电源管理芯片,而我们的开发板上并未使用。因此之前在移植uboot时我们屏蔽了该PMIC相关代码,现在移植kernel,也需要做相应处理,即在makemenuconfig中去掉max8698模块。
Device Drivers --->
[*]Voltage and Current Regulator Support --->
<> Maxim 8698 voltage regulator
[*]Multifunction device drivers --->
[ ] Maxim SemiconductorMAX8698 PMIC Support
重新make zImage,tftp下载运行。
这回内核终于可以正常运行了。不过因为我们并没有下载根文件系统,因此最终挂载根文件系统时发生还是会发生错误。
第二部分:加入开发板GXA210
经过以上的移植,我们已经借助SMDKV210的在内核中的bsp编译了一个可以在我们的开发板上跑起来的内核了。但是我们的开发板GXA210和三星官方的
1、在KBuild系统中增加GXA210开发板的配置菜单
vi arch/arm/mach-s5pv210/Kconfig
在MACH_SMDKV210修改:
config MACH_GXA210
bool"GXA210"
select CPU_S5PV210
select ARCH_SPARSEMEM_ENABLE
select S3C_DEV_WDT
select HAVE_S3C2410_WATCHDOG
select S3C_DEV_I2C1
select S3C_DEV_I2C2
select HAVE_PWM
select S3C_DEV_HSMMC
select S3C_DEV_HSMMC1 if !S5PV210_SD_CH0_8BIT
select S3C_DEV_HSMMC3 if !S5PV210_SD_CH2_8BIT
select S5PV210_SETUP_SDHCI
select S5PV210_POWER_DOMAIN
help
Machine support for GXA210
2、配置内核,加入GXA210开发板的支持
make menuconfig
选上下面一项,加入GXA210开发板的支持:
System Type --->
Board selection(SMDKV210) --->
[*] GXA210
SMDKV210毕竟有很多不同存在,因此直接在SMDKV210上移植有诸多不便,比较普遍的做法是在内核中添加GXA210进去。
3、加入了GXA210开发板的支持
修改arch/arm/mach-s5pv210/Makefile文件
vi arch/arm/mach-s5pv210/Makefile
在“# machine support”下面加入:
obj-$(CONFIG_MACH_GXA210) += mach-gxa210.o smdkc110-rtc.o
如果在配置内核时加入了GXA210开发板的支持,则CONFIG_MACH_GXA210=y, mach-gxa210.c和smdkc110-rtc.c文件会被编译进内核。
4、创建开发板源文件
复制mach-smdkc110.c为mach-gxa210.c
cp arch/arm/mach-s5pv210/mach-smdkc110.carch/arm/mach-s5pv210/mach-gxa210.c
5、修改开发板型号
将arch/arm/mach-s5pv210/mach-gxa210.c文件的末尾
修改成如下(就是将SMDKV210改成GXA210):
#ifdef CONFIG_MACH_SMDKC110
MACHINE_START(SMDKC110,"SMDKC110")
#elif CONFIG_MACH_GXA210
MACHINE_START(GXA210,"GXA210")
#endif
/*Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
.phys_io = S3C_PA_UART & 0xfff00000,
.io_pg_offst = (((u32)S3C_VA_UART) >> 18) &0xfffc,
.boot_params = S5P_PA_SDRAM + 0x100,
.init_irq = s5pv210_init_irq,
.map_io = smdkc110_map_io,
.init_machine = smdkc110_machine_init,
.timer = &s5p_systimer,
MACHINE_END
2.1关闭蜂鸣器
struct s3c_pwm_data pwm_data[] = {
{
.gpio_no = S5PV210_GPD0(0),
.gpio_name = "GPD",
.gpio_set_value = 0,//S5PV210_GPD_0_0_TOUT_0,
},
6、添加GXA210的机器码
在arch/arm/tools/mach-types中添加GXA210的机器码。在这里我们暂时自己分配一个临时编码给GXA210,注意尽量不要和既有的编码冲突。
即,在文件末尾添加一行:
gxa210 MACH_GXA210GXA210 9999
7、在uboot中修改机器码。
由于内核的机器码由SMDKV210(2456)修改为GXA210(9999),因此uboot端也需要修改机器码,否则引导过程会校验机器码错误。修改方法有两种:
第一,可以修改uboot源码。在配置文件gxa210.h中修改机器码的配置,再重新配置编译。这种方法比较彻底,但是相对麻烦。而且每更换一个机器码不同的kernel就得重新编译一次uboot,不够灵活。
vi arch/arm/mach-s5pv210/include/mach/memory.h
修改第16行为:
#if defined(CONFIG_MACH_SMDKV210) || defined(CONFIG_MACH_GXA210)
#define PHYS_OFFSET UL(0x20000000)
#else
#define PHYS_OFFSET UL(0x30000000)
#endif
7、修改内存映射
vi arch/arm/mach-s5pv210/include/mach/map.h
修改第156行,增加GXA210
#if defined(CONFIG_MACH_SMDKV210) || defined(CONFIG_MACH_GXA210)
#define S5PV210_PA_SDRAM (0x20000000)
#else
#define S5PV210_PA_SDRAM (0x30000000)
#endif
10、添加LCD支持(如果不添加会导致启动时内核OOPS错误)
vi drivers/video/samsung/Kconfig
修改第77行,增加MACH_GXA210
config FB_S3C_LTE480WV
bool "LTE480WV"
depends on (MACH_SMDKV210 || MACH_SMDKC110 ||MACH_GXA210)
---help---
This enables support for Samsung LTE480WV 4.8\" WVGA LCD panel
然后 make menuconfig,确认driver中LTE480WV被选中。
Device Drivers --->
Graphicssupport --->
<*>Support for frame buffer devices --->
SelectLCD Type (LTE480WV) --->
11、重新编译,下载内核
make –j4
重新下载运行后,包含了GXA210专用bsp的内核便在开发板上跑起来了。
至此,内核基本移植已经完成。
1、DM9000驱动移植
GXA210核心板板载了DM9000网卡芯片,只要内核中增加了相应的驱动,即可实现有线上网。对于linux内核来说,网络功能极其重要,只有开发板有了网络连接能力,才能与主开发机进行通信。后面我们要进行的根文件系统制作、驱动编写调试、应用程序开发调试等均依赖于网络功能。
GXA210上的DM9000网卡移植很容易,主要原因有二:
第一,我们移植的起点,三星的SMDKV210中也使用了DM9000网卡,因此很多配置信息都是现成的。第二,linux的总线驱动模型实现了驱动和设备的分离,因此DM9000的驱动本身是可以复用的(uboot中使用的DM9000驱动就来自于linux中)。
基于以上两点,因此我们的移植工作主要在于设备端。移植的方法是根据GXA210与SMDKV210开发板的DM9000网卡硬件接线的不同,修改必要的设备信息即可。
上图是GXA210原理图中DM9000网卡芯片的部分原理图。重要的信息如下:
1、CS(37脚)连接了Xm0CSn1
2、CMD(32脚)连接了Xm0ADDR2
3、INT(34脚)连接了XEINT7
相应的代码部分修改如下:
(1)修改网卡物理地址,对应上面1
vi arch/arm/mach-s5pv210/include/mach/map.h
//#define S5PV210_PA_DM9000 (0xA8000000)
#define S5PV210_PA_DM9000 (0x88000000)
(2)修改命令线和外部中断配置,分别对应上面2和3。
Arch/arm/plat-s5p/devs.c
static struct resources5p_dm9000_resources[] = {
[0]= {
.start= S5P_PA_DM9000,
.end = S5P_PA_DM9000,
.flags= IORESOURCE_MEM,
},
[1]= {
#if defined(CONFIG_DM9000_16BIT)
//.start = S5P_PA_DM9000 + 2,
//.end =S5P_PA_DM9000 + 2,
.start = S5P_PA_DM9000 + 8,
.end =S5P_PA_DM9000 + 8,
.flags= IORESOURCE_MEM,
#else
.start= S5P_PA_DM9000 + 1,
.end = S5P_PA_DM9000 + 1,
.flags= IORESOURCE_MEM,
#endif
},
[2]= {
//.start = IRQ_EINT9,
//.end =IRQ_EINT9,
.start = IRQ_EINT7,
.end =IRQ_EINT7,
.flags= IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
}
};
重新make,下载运行,可以看到如下启动信息:
Ifconfig查看并设置网卡地址,然后ping主机测试,结果如下:
可见,网络已经工作起来了,网卡移植成功!
第三部分:启用NFS文件系统
为调试方便:使能内核支持nfs作为rootfs
内核中默认配置并未使能nfs作为根文件系统,这导致我们只能将做好的根文件系统镜像烧录到Nand中启动,很麻烦。因此我们将对内核做适当配置,使其支持从nfs挂载根文件系统。
未配置前从NFS启动的报错信息如下:
(1)、配置网络部分,主要是使能CONFIG_IP_PNP以在2中能够看到Root file system onNFS选项
[*] Networking support
Networkingoptions
[*]TCP/IP networking
[*]IP: kernel level autoconfiguration
[*]IP: DHCP support
[*]IP: BOOTP support
(2)、配置开启nfs服务
File systems --->
NetworkFile Systems --->
<*>NFS client support
[*]NFS client support for NFS version 3
[*] NFS clientsupport for the NFSv3 ACL protocol extension
[*]NFS client support for NFS version 4 (EXPERIMENTAL)
[*]NFS client support for NFSv4.1 (DEVELOPER ONLY)
[*]Root file system on NFS
一.掌握:
.tar.bz2
解压:tar jxvfFileName.tar.bz2
压缩:tar jcvfFileName.tar.bz2 DirName
第一部分:基本移植
1.1、内核编译体验
修改Makefile
cp android_kernel_2.6.35_smdkv210.tar.bz2
解压之, # tar -jxvf android_kernel_2.6.35_smdkv210.tar.bz2
重命名, # mv android-kernel-samsung-dev gxa210-kernel-2.6.35.7
修改Makefile,添加以下两行以指定平台和交叉编译工具链。
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
ARCH = arm
CROSS_COMPILE =arm-linux-
# Architecture as present in compile.h
UTS_MACHINE := $(ARCH)
SRCARCH := $(ARCH)
配置, # makesmdkv210_android_defconfig
进一步配置, # make menuconfig
编译 # make zImage
经过漫长(机器好点三五分钟,差的十来分钟)时间的编译,完成后在 arch/arm/boot/目录下即会生成zImage文件,这个压缩内核就是我们的目标了。
将之copy到/tftpboot目录下(要根据你的ubuntu中tftp服务器的搭建来确定,我这里tftp服务器的下载目录就是/tftpboot),然后从uboot中下载,运行:
# tftp 0x20008000 zImage
#bootm 0x20008000
二.
可以看到内核并未启动起来。其实这时内核已经运行了,只是因为配置中串口选择不对造成的,于是乎我们对其进行必要修改。
1.2、make menuconfig中基本选项
1.2.1、串口配置,选择串口0
System Type --->
(0) S3C UART to use for low-level messages
Kernel hacking --->
(0) S3C UART to use for low-level debug
1.3、确定机器码
vi arch/arm/tools/mach-types
在2443行可以看出,SMDKV210评估板的机器码是2456(16进制是0x998):
2443 smdkv210 MACH_SMDKV210 SMDKV210 2456
该机器码与uboot中使用的相同,因此不需修改。
1.4、确定内核的加载地址与参数地址
vi arch/arm/mach-s5pv210/Makefile.boot
可以看出,内核的加载地址和参数地址分别为0x20008000和0x20000100,bootloader启动内核前应该将内核拷贝到0x20008000,并将参数放到0x20000100。
zreladdr-y +=0x20008000
params_phys-y := 0x20000100
1.5、修改Nand分区
drivers\mtd\nand\s3c_nand.c定义好了NandFlash的分区表,需要修改drivers\mtd\nand\s3c_nand.c文件:
vi drivers/mtd/nand/s3c_nand.c
struct mtd_partition s3c_partition_info[] ={
{
.name = "uboot",
.offset = 0, /* for bootloader */
.size = (1*SZ_1M),
.mask_flags = MTD_CAP_NANDFLASH,
},
{
.name = "recovery",
.offset = MTDPART_OFS_APPEND,
.size = (5*SZ_1M),
},
{
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = (5*SZ_1M),
},
{
.name = "ramdisk",
.offset = MTDPART_OFS_APPEND,
.size = (3*SZ_1M),
},
{
.name = "root",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
},
};
我们把512MB的分成了以下几个区,每个分区用于存放不同的内容:
分区名 起始地址 结束地址 大小
分区名 | 起始地址 | 结束地址 | 大小 |
uboot | 0x000000000000 | 0x000000100000 | 0x000000100000 1MB |
recovery | 0x000000100000 | 0x000000600000 | 0x000000500000 5MB |
kernel | 0x000000600000 | 0x000000b00000 | 0x000000500000 5MB |
ramdisk | 0x000000b00000 | 0x000000e00000 | 0x000000300000 3MB |
root | 0x000000e00000 | 0x000020000000 | 0x00001F200000 498MB |
1.6、编译
直接make -j4以得到zImage,
1.7、zImage下载启动
首先复制文件到tftp下载目录, # cp arch/arm/boot/zImage /tftpboot/ –f
然后开发板端启动uboot,首先设置内核传参, setenv bootargs root=/dev/mtdblock4console=ttySAC0,115200 rootfstype=yaffs rw
然后tftp下载内核 # tftp0x20008000 zImage
待下载完成后启动之, # bootm0x20008000
看到如下启动信息。(当然,最终内核启动是失败的,那是因为我们并未提供对应的根文件系统。当提供了相应的根文件系统后启动即会成功
仔细查看以上错误信息,可以看到一些关键字如“LR is at max8698_pmic_probe+0x150/0x32c”可以,内核崩溃发生在max8698相关部分。
一。
Max8698是SMDKV210开发板上使用的电源管理芯片,而我们的开发板上并未使用。因此之前在移植uboot时我们屏蔽了该PMIC相关代码,现在移植kernel,也需要做相应处理,即在makemenuconfig中去掉max8698模块。
Device Drivers --->
[*]Voltage and Current Regulator Support --->
<> Maxim 8698 voltage regulator
[*]Multifunction device drivers --->
[ ] Maxim SemiconductorMAX8698 PMIC Support
重新make zImage,tftp下载运行。
这回内核终于可以正常运行了。不过因为我们并没有下载根文件系统,因此最终挂载根文件系统时发生还是会发生错误。
第二部分:加入开发板GXA210
经过以上的移植,我们已经借助SMDKV210的在内核中的bsp编译了一个可以在我们的开发板上跑起来的内核了。但是我们的开发板GXA210和三星官方的
1、在KBuild系统中增加GXA210开发板的配置菜单
vi arch/arm/mach-s5pv210/Kconfig
在MACH_SMDKV210修改:
config MACH_GXA210
bool"GXA210"
select CPU_S5PV210
select ARCH_SPARSEMEM_ENABLE
select S3C_DEV_WDT
select HAVE_S3C2410_WATCHDOG
select S3C_DEV_I2C1
select S3C_DEV_I2C2
select HAVE_PWM
select S3C_DEV_HSMMC
select S3C_DEV_HSMMC1 if !S5PV210_SD_CH0_8BIT
select S3C_DEV_HSMMC3 if !S5PV210_SD_CH2_8BIT
select S5PV210_SETUP_SDHCI
select S5PV210_POWER_DOMAIN
help
Machine support for GXA210
2、配置内核,加入GXA210开发板的支持
make menuconfig
选上下面一项,加入GXA210开发板的支持:
System Type --->
Board selection(SMDKV210) --->
[*] GXA210
SMDKV210毕竟有很多不同存在,因此直接在SMDKV210上移植有诸多不便,比较普遍的做法是在内核中添加GXA210进去。
3、加入了GXA210开发板的支持
修改arch/arm/mach-s5pv210/Makefile文件
vi arch/arm/mach-s5pv210/Makefile
在“# machine support”下面加入:
obj-$(CONFIG_MACH_GXA210) += mach-gxa210.o smdkc110-rtc.o
如果在配置内核时加入了GXA210开发板的支持,则CONFIG_MACH_GXA210=y, mach-gxa210.c和smdkc110-rtc.c文件会被编译进内核。
4、创建开发板源文件
复制mach-smdkc110.c为mach-gxa210.c
cp arch/arm/mach-s5pv210/mach-smdkc110.carch/arm/mach-s5pv210/mach-gxa210.c
5、修改开发板型号
将arch/arm/mach-s5pv210/mach-gxa210.c文件的末尾
修改成如下(就是将SMDKV210改成GXA210):
#ifdef CONFIG_MACH_SMDKC110
MACHINE_START(SMDKC110,"SMDKC110")
#elif CONFIG_MACH_GXA210
MACHINE_START(GXA210,"GXA210")
#endif
/*Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
.phys_io = S3C_PA_UART & 0xfff00000,
.io_pg_offst = (((u32)S3C_VA_UART) >> 18) &0xfffc,
.boot_params = S5P_PA_SDRAM + 0x100,
.init_irq = s5pv210_init_irq,
.map_io = smdkc110_map_io,
.init_machine = smdkc110_machine_init,
.timer = &s5p_systimer,
MACHINE_END
2.1关闭蜂鸣器
struct s3c_pwm_data pwm_data[] = {
{
.gpio_no = S5PV210_GPD0(0),
.gpio_name = "GPD",
.gpio_set_value = 0,//S5PV210_GPD_0_0_TOUT_0,
},
6、添加GXA210的机器码
在arch/arm/tools/mach-types中添加GXA210的机器码。在这里我们暂时自己分配一个临时编码给GXA210,注意尽量不要和既有的编码冲突。
即,在文件末尾添加一行:
gxa210 MACH_GXA210GXA210 9999
7、在uboot中修改机器码。
由于内核的机器码由SMDKV210(2456)修改为GXA210(9999),因此uboot端也需要修改机器码,否则引导过程会校验机器码错误。修改方法有两种:
第一,可以修改uboot源码。在配置文件gxa210.h中修改机器码的配置,再重新配置编译。这种方法比较彻底,但是相对麻烦。而且每更换一个机器码不同的kernel就得重新编译一次uboot,不够灵活。
第二,不修改uboot源码,增加一个环境变量machid即可(# set machid 0x270f)。查看uboot的源码,在do_bootm_linux函数中可以看到,uboot启动kernel时传递的机器码为machid局部变量,该局部变量会被环境变量machid所覆盖。
8、修改内存物理地址vi arch/arm/mach-s5pv210/include/mach/memory.h
修改第16行为:
#if defined(CONFIG_MACH_SMDKV210) || defined(CONFIG_MACH_GXA210)
#define PHYS_OFFSET UL(0x20000000)
#else
#define PHYS_OFFSET UL(0x30000000)
#endif
7、修改内存映射
vi arch/arm/mach-s5pv210/include/mach/map.h
修改第156行,增加GXA210
#if defined(CONFIG_MACH_SMDKV210) || defined(CONFIG_MACH_GXA210)
#define S5PV210_PA_SDRAM (0x20000000)
#else
#define S5PV210_PA_SDRAM (0x30000000)
#endif
10、添加LCD支持(如果不添加会导致启动时内核OOPS错误)
vi drivers/video/samsung/Kconfig
修改第77行,增加MACH_GXA210
config FB_S3C_LTE480WV
bool "LTE480WV"
depends on (MACH_SMDKV210 || MACH_SMDKC110 ||MACH_GXA210)
---help---
This enables support for Samsung LTE480WV 4.8\" WVGA LCD panel
然后 make menuconfig,确认driver中LTE480WV被选中。
Device Drivers --->
Graphicssupport --->
<*>Support for frame buffer devices --->
SelectLCD Type (LTE480WV) --->
11、重新编译,下载内核
make –j4
重新下载运行后,包含了GXA210专用bsp的内核便在开发板上跑起来了。
至此,内核基本移植已经完成。
第三部分:常用设备驱动的移植
1、DM9000驱动移植
GXA210核心板板载了DM9000网卡芯片,只要内核中增加了相应的驱动,即可实现有线上网。对于linux内核来说,网络功能极其重要,只有开发板有了网络连接能力,才能与主开发机进行通信。后面我们要进行的根文件系统制作、驱动编写调试、应用程序开发调试等均依赖于网络功能。
GXA210上的DM9000网卡移植很容易,主要原因有二:
第一,我们移植的起点,三星的SMDKV210中也使用了DM9000网卡,因此很多配置信息都是现成的。第二,linux的总线驱动模型实现了驱动和设备的分离,因此DM9000的驱动本身是可以复用的(uboot中使用的DM9000驱动就来自于linux中)。
基于以上两点,因此我们的移植工作主要在于设备端。移植的方法是根据GXA210与SMDKV210开发板的DM9000网卡硬件接线的不同,修改必要的设备信息即可。
上图是GXA210原理图中DM9000网卡芯片的部分原理图。重要的信息如下:
1、CS(37脚)连接了Xm0CSn1
2、CMD(32脚)连接了Xm0ADDR2
3、INT(34脚)连接了XEINT7
相应的代码部分修改如下:
(1)修改网卡物理地址,对应上面1
vi arch/arm/mach-s5pv210/include/mach/map.h
//#define S5PV210_PA_DM9000 (0xA8000000)
#define S5PV210_PA_DM9000 (0x88000000)
(2)修改命令线和外部中断配置,分别对应上面2和3。
Arch/arm/plat-s5p/devs.c
static struct resources5p_dm9000_resources[] = {
[0]= {
.start= S5P_PA_DM9000,
.end = S5P_PA_DM9000,
.flags= IORESOURCE_MEM,
},
[1]= {
#if defined(CONFIG_DM9000_16BIT)
//.start = S5P_PA_DM9000 + 2,
//.end =S5P_PA_DM9000 + 2,
.start = S5P_PA_DM9000 + 8,
.end =S5P_PA_DM9000 + 8,
.flags= IORESOURCE_MEM,
#else
.start= S5P_PA_DM9000 + 1,
.end = S5P_PA_DM9000 + 1,
.flags= IORESOURCE_MEM,
#endif
},
[2]= {
//.start = IRQ_EINT9,
//.end =IRQ_EINT9,
.start = IRQ_EINT7,
.end =IRQ_EINT7,
.flags= IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
}
};
重新make,下载运行,可以看到如下启动信息:
Ifconfig查看并设置网卡地址,然后ping主机测试,结果如下:
可见,网络已经工作起来了,网卡移植成功!
第三部分:启用NFS文件系统
为调试方便:使能内核支持nfs作为rootfs
内核中默认配置并未使能nfs作为根文件系统,这导致我们只能将做好的根文件系统镜像烧录到Nand中启动,很麻烦。因此我们将对内核做适当配置,使其支持从nfs挂载根文件系统。
未配置前从NFS启动的报错信息如下:
(1)、配置网络部分,主要是使能CONFIG_IP_PNP以在2中能够看到Root file system onNFS选项
[*] Networking support
Networkingoptions
[*]TCP/IP networking
[*]IP: kernel level autoconfiguration
[*]IP: DHCP support
[*]IP: BOOTP support
(2)、配置开启nfs服务
File systems --->
NetworkFile Systems --->
<*>NFS client support
[*]NFS client support for NFS version 3
[*] NFS clientsupport for the NFSv3 ACL protocol extension
[*]NFS client support for NFS version 4 (EXPERIMENTAL)
[*]NFS client support for NFSv4.1 (DEVELOPER ONLY)
[*]Root file system on NFS