今天參照<天嵌科技出品-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表示遞歸查找子目錄。
別笑哦,我今天才學會用這個命令查找 ,用着特爽...