移植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);
 /* configure MPLL */
 //writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,&clk_power->mpllcon);

//* 要先正確配置內存控制器,纔會有亂碼輸出。把原來對內存控制器寄存器組全部替換成二期之前的裸板內存寄存器數組
//* 這個寄存器組在lowlevel_init.S裏面設置。
/* 存儲控制器13個寄存器的值 */
    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
    
                                            /* REFRESH,
                                             * HCLK=12MHz:  0x008C07A3,
                                             * HCLK=100MHz: 0x008C04F4
                                             */ 
    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 ###
還沒重新設置棧,可能會出現問題。      
   
先記錄到這裏,休息一下,下一篇繼續。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章