linux2.6.22.6移植并添加DM9000支持

2019-07-13 04:16发布

今天参照<天嵌科技出品-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表示递归查找子目录。
别笑哦,我今天才学会用这个命令查找 ,用着特爽...