天天看點

移植uboot到JZ2440的筆記

移植的是u-boot-2012.04.01

    下面基本上都是東山老師移植uboot視訊的實驗筆記,移植中出現的很多問題,下面可能都會有你想要的答案。

雖然下面這個筆記對着實驗按部就班,沒有什麼深度,但我覺得很有用,解決問題的過程中,不懂的地方也就懂了,

實踐是學習的好方法,既檢驗理論知識,遇到問題又促進思考,互相作用,效果很好。

uboot配置、編譯:

兩條指令搞定:

1、make smdk2410_config //為什麼能夠執行這條指令?頂層Makefile中找不到smdk2410_config及相類似的目标。

//依賴頂層目錄boards.cfg檔案,其他單闆的配置項也來自這裡/

2、make

現象:arm-linux-gcc3.4.5工具鍊版本太低導緻make 編譯u-boot-2012.04.01失敗;使用 4.3.2版本解決問題

顯示環境變量echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/tools/gcc-3.4.5-glibc-2.3.6/bin

安裝arm-linux-gcc.4.3.2 //發現已經安裝arm-linux-gcc 4.3.2 

擴充環境變量: //臨時擴充

export PATH=/usr/local/arm/4.3.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

或者寫環境變量檔案永久修改:vi /etc/environment

用新工具重新編譯一次:

make distclean

make smdk2410_config

make

發現編譯成功

//這個版本的uboot已經有部分代碼支援2440,隻是不齊全。

把u-boot.bin燒寫,啟動,發現沒有任何輸出。

 修改U-BOOT代碼支援2440:

1、建一個單闆

cd board/samsung/

cp smdk2410 smdk2440 -rf

cd ../../include/configs/

cp smdk2410.h smdk2440.h

修改頂層目錄boards.cfg:

仿照

smdk2410                     arm         arm920t     -                   samsung        s3c24x0

添加:

smdk2440                     arm         arm920t     -                   samsung        s3c24x0

     閱讀代碼發現不足:UBOOT裡先以60MHZ的時鐘計算參數來設定記憶體控制器,但是MPLL還未設定

處理措施: 把MPLL的設定放到start.S裡,取消board_early_init_f裡對MPLL的設定,如下面注釋掉下面兩行

 //writel(0xFFFFFF, &clk_power->locktime);

 //writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,&clk_power->mpllcon);

/

    p[0] = 0x22011110;     //BWSCON

    p[1] = 0x00000700;     //BANKCON0

    p[2] = 0x00000700;     //BANKCON1

    p[3] = 0x00000700;     //BANKCON2

    p[4] = 0x00000700;     //BANKCON3  

    p[5] = 0x00000700;     //BANKCON4

    p[6] = 0x00000700;     //BANKCON5

    p[7] = 0x00018005;     //BANKCON6

    p[8] = 0x00018005;     //BANKCON7

    p[9]  = 0x008C04F4;

    p[10] = 0x000000B1;     //BANKSIZE

    p[11] = 0x00000030;     //MRSRB6

    p[12] = 0x00000030;     //MRSRB7

再編譯,編出的uboot400多kb,nandfalsh uboot分區裝不下。為不破壞nandflash分區,把uboot下載下傳在SDRAM,在複制到

norflash 0位址前面512k執行看看:(這裡會破壞掉nor flash 上原來的uboot)

tftp 30000000 u-boot.bin;

protect off all //擦除nor flash寫保護

erase 0 7ffff //擦除512k内容

cp.b 30000000 0 80000  //複制到nor的0-80000

這樣再次啟動就有亂碼的東西出來了。

亂碼解決辦法:

 亂碼,檢視序列槽波特率的設定,發現在speed.c:get_HCLK裡沒有定義CONFIG_S3C2440

    處理措施:include/configs/smdk2440.h: 去掉CONFIG_S3C2410,同時也去掉#define CONFIG_CMD_NAND

                                          //#define CONFIG_S3C2440

                                          //#define CONFIG_CMD_NAND

    或者直接這樣處理:在speed.c get_HCLK()函數裡傳回HCLK的頻率也可以:

  return get_FCLK() / 2;   //200/2

重新編譯燒寫,輸出正常,但卡住了:

CPUID: 32440001

FCLK:      400 MHz

HCLK:      100 MHz

PCLK:       50 MHz

DRAM:  64 MiB

WARNING: Caches not enabled

Flash: *** failed ***

### ERROR ### Please RESET the board ###

下面解決nand啟動的問題

修改u-boot支援nand啟動:

    u-boot2012源碼中重定位代碼之前的代碼大于4K則不能nand啟動,為了支援nand啟動,使用自己寫BootLoader那種方法,

在前4K代碼中并盡可能早地初始化記憶體和nand flash以重定位代碼,然後跳到重定位後的代碼中執行。

    原來的代碼在連結時加了"-pie"選項, 使得u-boot.bin裡多了"*(.rel*)", "*(.dynsym)"

    使得程式非常大,不利于從NAND啟動(重定位之前的啟動代碼應該少于4K)

1 去掉 "-pie"選項

      arch/arm/config.mk:75:LDFLAGS_u-boot += -pie 去掉這行

2 參考"畢業班第1課"的start.S, init.c來修改代碼

      把init.c放入board/samsung/smdk2440目錄, 修改Makefile,添加init.o

      修改include/configs/smdk2440.h:CONFIG_SYS_TEXT_BASE為0x33f80000 

      要修改board.c裡面的addr值,注釋掉這兩句:

      //addr -= gd->mon_len;

      //addr &= ~(4096 - 1);

      添加:

      addr = CONFIG_SYS_TEXT_BASE //或 *addr = _TEXT_BASE  ,addr指定為0x33f00000

      修改start.S,用init.c裡面的函數初始化nand,重定位代碼,

      複制代碼的指令改為:(原來的僞彙編指令 ldr r1,=_start可能會存在問題,當_start值比較複雜時,不知道會存在哪裡)

        mov r0, #0

// ldr r1, =_TEXT_BASE //應改為沒有=的

//ldr r2, =__bss_start

//sub r2, r2, r1

ldr r1,_TEXT_BASE

ldr r2,_bss_start_ofs

bl copy_code_to_sdram

bl clear_bss

ldr pc,= call_board_init_f

删除原來的relocate 和清除bss的代碼。

      第二階段void board_init_r(gd_t *id, ulong dest_addr)函數的參數意義:dest_addr:程式的連結位址,

      id:僅有的那個gd結構體

      start.S裡bl board_init_f緊接着 bl board_init_r,在board_init_f裡面設定bl board_init_r所需的參數 id

   3 修改arch/arm/lib/board.c:board_init_f, 把relocate_code去掉,傳回id,把id存在r0寄存器,為board_init_r設定第一個參數

      修改board_init_f()函數的傳回值類型 為 unsigned int,include/common.h中對其的聲明也要修改,并修改common.h中board_init_f 函數的noreturn 屬性。

4 修改連結腳本: 把start.S, init.c, lowlevel.S等檔案放在最前面(連結腳本應該是自動生成的,卻又可以直接修改其内容?)

      ./arch/arm/cpu/u-boot.lds 中start.o (.text)下面添加:

      board/samsung/smdk2440/libsmdk2440.o (.text) //  目錄/board/samsung/smdk2440下面的檔案被連結成庫

至此可以nand啟動了,不過和nor 啟動一樣,輸出一下資訊就卡主了:

U-Boot 2012.04.01 (Dec 22 2017 - 10:20:33)

CPUID: 32440001

FCLK:      400 MHz

HCLK:      100 MHz

PCLK:       50 MHz

DRAM:  64 MiB

WARNING: Caches not enabled

Flash: *** failed ***

### ERROR ### Please RESET the board ###

還沒重新設定棧,可能會出現問題。      

先記錄到這裡,休息一下,下一篇繼續。