1. 程式人生 > >OK335XD uboot移植(一)

OK335XD uboot移植(一)

先說說基本情況;

板子使用的是飛凌的OK335XD,晶片是TI公司的AM335X;(飛凌只提供kernel的程式碼,沒提供Uboot原始碼)

Nandflash為K9F2G08UOC(飛凌原理圖給的是MT29F2G08ABBE,2G nandflash memory,懷疑是錯的),下面為具體的資訊:

size: 256Mib,共1024個block

page: 2K=2048 bytes

oob: 64 bytes

block: 128K = 64page

所移植的uboot是TI公司官網下載的:u-boot-2011.09-psp04.06.00.08

移植步驟如下:

1. 安裝交叉編譯器。飛凌提供的cross-tools-am335x-4.5.3.tar這個編譯器能相容uboot2011。或者下載最新版本的。

2. 去除eeprom功能

飛凌的OK335XD沒有eeprom,而Ti公司uboot原始碼有eeprom,如果不去除eeprom功能會報錯。eeprom程式碼在board/ti/am335x/board.c  read_eeprom()函式裡面。

我們要修改的程式碼,在707行:

if (read_eeprom()) {
printf("read_eeprom() failure. continuing with ddr3\n");
}

這個程式碼的功能就是,如果識別不到eeprom,系統就會報錯。我們要把程式碼都註釋掉:

//if (read_eeprom()) {
//printf("read_eeprom() failure. continuing with ddr3\n");


//}

3. 燒寫檔案到Nandflash指定位置

TI uboot原始碼,所實現的功能,是從SD卡啟動,燒錄到指定位置,再從nandflash啟動;uboot的地址,但和飛凌的Linux分割槽不符合,所以思路是根據Linux分割槽修改uboot即可。


修改程式碼位置:include\configs\am335x_evm.h

在#define CONFIG_EXTRA_ENV_SETTINGS 下面,修改程式碼:

原為:    "nand_src_addr=0x280000\0" \

改為:"nand_src_addr=0xc00000\0" \

再在下面增加程式碼:

"updatesys= nand scrub;nand erase.chip; mmc rescan;" \
"fatload mmc 0 82000000 MLO; nand erase 0 200000;nandecc hw 2; nand write.i 82000000 0 ${filesize};"\
"fatload mmc 0 82000000 logo.bmp; nand erase 600000 200000; nandecc hw 2 ;nand write.i 82000000 600000 ${filesize};"\
"fatload mmc 0 82000000 u-boot.img; nand erase 800000 200000; nandecc hw 2; nand write.i 82000000 800000 ${filesize};"\
"fatload mmc 0 82000000 uImage; nand erase c00000 500000; nandecc hw 2; nand write.i 82000000 c00000 ${filesize};"\
"fatload mmc 0 82000000 ubi.img; nand erase 1400000 ec00000; nandecc hw 2; nand write.i 82000000 1400000 ${filesize};"\
"update_MLO=nand erase 0 200000;mmc rescan;"\
                "fatload mmc 0 82000000 MLO;nandecc hw 2;nand write.i 82000000 0 ${filesize}; \0"\
        "update_u-boot=nand erase 800000 200000;mmc rescan; "\
                "fatload mmc 0 82000000 u-boot.img;nandecc hw 2;nand write.i 82000000 800000 ${filesize}; \0"\
        "update_uImage=nand erase c00000 500000;mmc rescan;"\
                "fatload mmc 0 82000000 uImage;nandecc hw 2;nand write.i 82000000 c00000 ${filesize}; \0"\
        "update_ubi=nand erase 1400000 ec00000;mmc rescan;"\
                "fatload mmc 0 82000000 ubi.img;nandecc sw;nand write.i 82000000 1400000 ${filesize}; \0"\
        "update_logo=nand erase 600000 200000;mmc rescan;"\
                "fatload mmc 0 82000000 ubi.img;nand write.i 82000000 600000 ${filesize}; \0"

updatesys是把所有SD卡的檔案,拷貝到nandflash的指定位置,其他update是單個更新的(方便除錯),這裡不詳細介紹了。

刪除bootcommand的程式碼:

原始碼:

#define CONFIG_BOOTCOMMAND \
"if mmc rescan; then " \
"echo SD/MMC found on device ${mmc_dev};" \
"if run loadbootenv; then " \
"echo Loaded environment from ${bootenv};" \
"run importbootenv;" \
"fi;" \
"if test -n $uenvcmd; then " \
"echo Running uenvcmd ...;" \
"run uenvcmd;" \
"fi;" \
"if run mmc_load_uimage; then " \
"run mmc_args;" \
"bootm ${kloadaddr};" \
"fi;" \
"fi;" \
"run nand_boot;" \

刪除後:

#define CONFIG_BOOTCOMMAND \
"run nand_boot;" \

這裡刪除的目的,是我們這裡通過命令列燒寫Linux系統,不需要SD卡啟動。

3. SD卡分割槽,根據飛凌的使用者手冊操作就行了,分成FAT32,不詳細介紹

4. 拷貝相關檔案,MLO,uboot.img等。注意,這裡我們使用的MLO為飛凌提供的MLO,不是自己編譯出來的,如果自己編譯的MLO,會卡在reading MLO前面,不知道為什麼,連Hit any key to stop autoboot:  3 這個都不出現的。可能和本來初始化有關,還待檢視。我們只修改uboot.img檔案,其他都用飛凌提供的。

5. 把OK335XD撥碼開關到ON,上電,按任意鍵盤鍵,實現命令列燒寫程式碼功能。這裡直接輸入run updatesys就可以了,或者你想更新什麼檔案就單獨更新,上面有程式碼。然後等待,燒錄完成。

6. 斷電。把撥碼開關撥到OFF,上電。即可正常啟動。成功移植。

7. 遇到的問題和分析

之前遇到一個很頭疼的問題,就是啟動kernel的時候顯示

NAND read: device 0 offset 0xc00000, size 0x500000

ECC: uncorrectable.

。。。

。。。

.。。。//很多個ECC: uncorrectable.

NAND read from offset c00000 failed -74

kernel啟動一段就會卡住,進入不了頁面。還以為是燒寫位置有錯誤,printf出來都沒問題,再慢慢檢視ECC,才發現了關鍵。


從目前u-boot命令可知,u-boot在燒寫nandflash時,MLO、U-boot、Linux、Rootfs都採用了BCH8(nandecc hw 2),而EVM和Log採用了Hamming(nandecc hw 0)。我在燒寫檔案到nandflash的時候,沒有加上nandecc hw 2這句話,才導致了ECC錯誤。

另外啟動後螢幕的解析度大小不對,也需要修改一下kernel或者uboot,這些晚點再更新。