今天参照<天嵌科技出品-Linux移植文档 >和韦东山的<嵌入式linux应用开发完全手册>一书成功移植成了linux2.6.22.6并添加了DM9000的支持(其实linux在我板子上早就跑起来了,可那时用的内核不是我配置的,是用的别人配置好的,我直接编译下载就运行 了,今天自己亲自上阵,呵呵...)。天嵌文档下载地址http://bbs.embedsky.net/viewthread.php?tid=630&extra=page%3D1
移植过程网上多的是,天嵌的文档介绍的也很棒,我就不再写了。下面主要记录我在移植linux和DM9000过程中遇到的问题及解决方法。
1、在移植linux时遇到了如下问题:
Starting kernel ...
Uncompressing Linux.........................................................................................................
Error: unrecognized/unsupported machine ID (r1 = 0x0000030e).
Available machine support:
ID (hex) NAME
000000c1 SMDK2410
00000454 QT2410
000003fe SMDK2413
000003f1 SMDK2412
00000377 S3C2413
00000474 VSTMS
0000016a SMDK2440
0000043c SMDK2443
Please check your kernel config and/or bootloader.
解决:这是machine ID设置与uboot传来的ID不匹配造成的,可以通过 修改match_types中相应的宏定义来解决此问题。
machine ID位置:
linux:arch/arm/tools/match_types中
uboot:include/asm-arm/match_types中
至于需要更那一行的ID,可查看 “arch/arm/mach-s3c2440/mach-smdk2440.c ” 文 件,在函数MACHINE_START(S3C2440, "YC2440")这行中的 S3C2440,这个就是关键字了,S3C2440是当你的内核启动时选用的ID。
2、移植DM9000遇到的问题1(我已参照相关资料介绍添加了DM9000的驱动):
前期移植是参照<嵌入式linux应用开发完全手册>441页来改的,
错误1:
编译内核,下载内核启动后出现“IP-Config: Device `eth0' not found.”信息。
分析与解决:此错误说明dm9000未工作。可我确认已经添加驱动了呀,在这晕了半天,后来查资料得知可能是DM9000基地址设置有问题,原来我在移植时书上介绍的说是片选CS4的基地址就是DM9000的基地址。经查资料我的阳初2440开发板DM9000基地址为0x19000300与CS4基地址0x20000000不同哦.问题根源找到了,修改结构体s3c_dm9k_resource中的DM9000的基址址即可.... 这个结构体可能在arch/arm/plat-s3c24xx/common-smdk.c中(我的是这个位置,可用grep命令进行搜索)。
错误2:
上面问题解决后又出现了“NETDEV WATCHDOG: eth0: transmit timed out”错误(网卡已工作了),
分析与解决:刚开始怀疑是NETDEV WATCHDOG的问题,于是把它关了,关后网卡就不工作了,更惨.....
于是就上网查找书查也没解决,后来想到我以前用别人配置的内核能运行 成功的,于是就拿来参照着看,原来是中断号设置有误,晕呀...
把中断改成IRQ_EINT9,OK啦哈! 通过 nfs挂我制作好的根文件系统 ,成功啦,好高兴,毕竟这次是我自己配置的哦。
下面是以上两个问题修改的数据结构s3c_dm9k_resource:
/* DM9000 */
static struct resource s3c_dm9k_resource[] = {
[0] = {
.start = S3C2410_CS4, /* ADDR2=0,发送地址时使用这个地址 */
.end = S3C2410_CS4 + 3,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = S3C2410_CS4 + 4, /* ADDR2=1,传输数据时使用这个地址 */
.end = S3C2410_CS4 + 4 + 3,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_EINT9, /* 中断号 */
.end = IRQ_EINT9,
.flags = IORESOURCE_IRQ,
}
};
我已把S3C2410_CS4改为0x19000300了。
附加:
S3C2410_CS4在内核中的位置可通过 grep命令来查找.
方法:在终端通过cd命令进到内核目录,然后执行如下命令即可找到包含该字样的所有文件。
$grep "S3C2410_CS4" * -R //*表示查找当前目录下的所有文件、目录,-R表示递归查找子目录。
别笑哦,我今天才学会用这个命令查找 ,用着特爽...