Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> uboot移植

uboot移植

編輯:關於Android編程

1.windows共享文件夾裡 下載、解壓三星官方uboot源碼

 

2.復制到linux下的目錄

 

3.在共享文件夾裡面建立SourceInsight 工程

3.1 修改start.S文件 開發板並沒有電源管理模塊

 

3.2時鐘和DDR的配置移植

3.2.1確認時鐘部分的配置

(1)時鐘部分的運行結果本來就是對的,時鐘部分的代碼在lowlevel_init.S中的bl system_clock_init調用的這個函數中。函數的代碼部分是沒任何問題的,根本不需要改動,要改動的是寄存器寫入的值,這些值都在配置頭文件(smdkv210single.h)中用宏定義定義出來了。如果時鐘部分要更改,關鍵是去更改頭文件中的宏定義。


(2)三星移植時已經把210常用的各種時鐘配置全都計算好用宏開關來控制了。只要打開相應的宏開關就能將系統配置為各種不同的頻率。

 

3.2.2 DDR配置信息的更改 (smdkv210single.h)

(1)從運行信息以及bdinfo命令看到的結果,顯示DRAM bank0和1的size值都設置錯了。
(2)使用md和mw命令測試內存,發現20000000和40000000開頭的內存都是可以用的,說明代碼中DDR初始化部分是正確的,只是size錯了。
(3)內存部分配置成:


#define CONFIG_NR_DRAM_BANKS 2 /* we have 2 bank of DRAM */
//#define SDRAM_BANK_SIZE 0x20000000 /* 512 MB */
#define SDRAM_BANK_SIZE 0x10000000 /* 256 MB */


#define PHYS_SDRAM_1 MEMORY_BASE_ADDRESS /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE SDRAM_BANK_SIZE
//#define PHYS_SDRAM_2 (MEMORY_BASE_ADDRESS + SDRAM_BANK_SIZE) /* SDRAM Bank #2 */
#define PHYS_SDRAM_2 0x40000000
#define PHYS_SDRAM_2_SIZE SDRAM_BANK_SIZE

 

3.2.3DDR地址另外配置(smdkv210single.h)

(1)目標:將DDR端口0地址配置為30000000開頭

更改有2個目的:第一是讓大家體驗內存配置的更改過程;第二是3開頭的地址和DRAM bank1上40000000開頭的地址就連起來了。這樣我們就得到了地址連續的512MB內存,而原來我們得到的512MB內存地址是斷續的。

(2)根據裸機中講DDR初始化部分的課程,和uboot前面分析uboot中DDR初始化部分的代碼的課程,得出結論就是:DDR的初始化代碼部分是在lowlevel_init.S中寫的,是不動的。代碼部分就是對相應寄存器做相應值的初始化;要動的是值,而uboot為了具有可移植性把值都宏定義在include/configs/xxx.h中了。因此我們只需要去這個配置頭文件中更改配置值即可。


更改內容是:#define DMC0_MEMCONFIG_0 0x20E01323改為:
#define DMC0_MEMCONFIG_0 0x30F01323 //注意20改為30 、 E改為F 。

3.2.4smdkv210single.h中相關宏定義修改

(1)寄存器的值改了後相當於是硬件配置部分做了更改。但是uboot中DDR相關的一些軟件配置值還沒更改,還在原來位置,所以要去更改。

(2)#define MEMORY_BASE_ADDRESS 0x20000000改為:
#define MEMORY_BASE_ADDRESS 0x30000000

3.2.5虛擬地址映射表中相應修改

(1)uboot中開啟了MMU對內存進行了段式映射,有一張內存映射表。之前課程中分析過,分析方法是一樣的。
(2)經過實際分析,發現這個內存映射只是把20000000開始的256MB映射到C0000000開頭的256MB。我們更改方法是將2改成3.
(3)為了安全起見,再去配置頭文件smdkv210single.h中查一遍,看看有沒有其他的宏定義值和內存配置有關聯的。
//後面還有修改

(1)修改 lowlevel_init.S 中的 。set_base ,0x200 改為0x300

(2)修改uboot/board/samsung/smdkc110/smdkc110.c中的virt_to_phy_smdkc110,將其中的20000000改為30000000即可。

(3)修改uboot/board/samsung/smdkc110/smdkc110.c中的virt_to_phy_smdkc110,將其中的20000000改為30000000即可。

4. 同步改過的文件到 linux 中

4.1 sshsecureshell

http://www.cnblogs.com/mliudong/p/4094519.html

http://blog.sina.com.cn/s/blog_5f435c130102v6pv.html

4.2 腳本

5. 重新配置編譯,燒錄運行查看結果。

uboot/sd_fusing目錄下有sd_fusing.sh腳本,用來燒錄

 

6.inand驅動問題的解決(driver/mmc/mmc.c)

(1)初步的解決方案是自己先浏覽一遍這個問題點周邊代碼上下文。通過浏覽代碼上下文,發現這個函數是在讀取SD/iNand的ext_csd寄存器的值。通過浏覽代碼結合出錯地方,可以判斷出:從卡端讀取ext_csd寄存器是成功的,並且從讀取結果中拿到了卡的版本號信息。然後代碼對版本號進行了判斷,並且如果版本號大於5就會報錯並且函數錯誤退出。這就是問題所正。
(2)問題就是:我們使用的iNand卡的版本號大於5,而uboot代碼本身不處理版本號大於5的卡,因此出錯了。

(3)解決方法就是修改uboot中的代碼,把判斷的5改成更大ls的數字。譬如8,然後跳過這個錯誤。

7.一些小問題的修補

7.1、控制台串口更換為串口0
//修改串口 smdkc110.h 文件
#define CONFIG_SERIAL2 1 /* we use UART2 on SMDKC110 */

7.2修改默認網絡地址設置

(1)修改配置頭文件smdkv210single.h中的CONFIG_IPADDR等宏,則可以修改uboot的默認環境變量。
(2)更改完成後如果環境變量還是原來的,正常。因為原來uboot執行過saveenv,因此環境變量已經被保存到iNand中的ENV分區中去了。uboot啟動後校驗時iNand的ENV分區中的環境變量是正確的,因此會優先加載。我們在uboot源代碼中修改的只是默認的環境變量。解決方案是擦除掉iNand中的那一份環境變量,然後迫使uboot啟動時使用uboot代碼中自帶的默認的這一份環境變量,就可以看到了。
(3)可以使用mmc write 0 30000000 11# 32(表示將DDR的0x30000000開頭的一段內存中的內容寫入iNand中的第17個扇區開始的32個扇區內,寫入長度是32個扇區長度(16KB))

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved