天天看點

AM335x U-Boot User's Guide

刷機上電必備操作

AM335x U-Boot User's Guide

Ti原文位址

U-Boot

對于AM335x,他的ROM code就好比bootloader的第一階段。第二和第三階段都是基于U-Boot實作的。在本篇文檔的下文中,第二階段的二進制檔案指的是SPL,第三階段的二進制檔案僅代表U-Boot。SPL是一個非互動性的loader,是一個特定版本的U-Boot。當編譯U-Boot的時候,它也同時被build。 

ROM代碼可以從任何以下裝置中加載SPL image

  • Memory devices non XIP (NAND/SDMMC) 

    image 必須擁有image header.Image header 必須是8個Byte的大小,包括加載位址(入口點)以及要被copy的image的大小資訊。RBL會copy image,它的大小在image header中已經給定,在Image header的load address字段定義了裝置位址到加載進内部記憶體位址。

  • 外圍裝置(UART) 

    RBL加載image到記憶體位址0x402f0400并執行它。不提供image header。

Two stage U-Boot design

這部分簡要介紹适用于AM335X的two stage U-Boot 的方法。 AM335X的内部RAM為128KB ,其中結尾的18KB被ROM code使用。此外,開頭的1KB(0x402f0000 - 0x402f0400)被保護了,不允許操作。是以U-Boot的binary隻能使用有限的109KB,在DRAM初始化前,ROM code可以轉移到内部RAM中作為初始化堆棧。 在預留一些空間給堆、棧後,要在小于109KB的空間内擠下所有的功能是不可能的,是以two stage方法被采用了。第一階段僅裝載一些必須的啟動裝置(NAND, MMC, I2C 等等),第二階段裝載所有其他的裝置(ethernet, timers, clocks 等等)第一階生成MLO,第二階段生成u-boot.img。

注意:當使用記憶體裝置(NAND)加載的時候,a header 必須綁定到SPL的binary上,以表明加載位址和image的容量大小。SPI 啟動在燒寫image的時候,需要額外的位元組轉換。
當使用外圍裝置(UART)啟動的時候,因為加載位址是固定的,就不需要header了。
           

Updated Toolchain

Sitara Linux SDK 6.0的toolchain的位址被改變了,此外對于非Arm 9 的裝置一個新的基于Linaro的toolchain就派上用場了。toolchain位址變更的詳細資訊參看 here,變更Linaro的詳細資訊在這裡可以找到 here AM18x的使用者切換到Linaro不會受到影響。是以,任何引用Linaro toolchain的字首"arm-linux-gnueabihf-" 都應該替換為"arm-arago-linux-gnueabi-"

Building U-Boot

Prerequisite

針對Arm裝置的GNU toolchain比較推薦的是來自Arago的。Arago toolchain在SDK here的linux-devkit 目錄下可以找到.

以下步驟假定release package在名為$AM335x-PSP-DIR的路徑下解壓
           

首先,切換到U-Boot的根目錄。

$ cd ./AM335x-LINUX-PSP-MM.mm.pp.bb/src/u-boot/u-boot-MM.mm.pp.bb
           

強烈推薦使用"O=" 參數編譯到單獨的目錄中。

Commands
$ [ -d ./am335x ] && rm -rf ./am335x
$ make O=am335x CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm am335x_evm      

這會在am335x的目錄下生成兩個binary,MLO and u-boot.img 以及在某些情況下用到的其他的臨時性的binary。

Host configuration

Serial port configuration

将序列槽線連接配接到EVM 的序列槽(serial port is next to the power switch)和電腦的COM Port,電腦系統可以是Windows也可以是Linux。 電腦上序列槽終端軟體的配置如下:

*Baud rate: 115,200
*Data bits: 8
*Parity: None
*Stop bits: 1
*Flow control: None
           

注意:如果Teraterm 被使用了,確定安裝的是最新的軟體版本(寫作本文時最新版本号為4.67 ),在Teraterm 中Kermit protocol 的實作是不要使用舊版本。最新版Terate從這裡下載下傳 hereTeraterm 最近的更新會導緻用UART傳輸較慢。是以使用Windows内置的超級終端較好。

Target configuration

Boot Switch Settings

這項配置僅在Am335x EVM開發闆上有效。切換開關SW3選擇啟動模式。此外,單獨的DIP Switch(SW8)也可以選擇不同的Profiles。 具體配置圖檔,參看 here

Flashing U-Boot with CCS

注意U-Boot的兩個檔案都必須燒寫到同一個media上。
           

在PSP release中提供了工具燒寫SPL & U-Boot 到NAND flash(for NAND boot) 參考AM335x Flashing Tools Guide了解如何借助NAND flash writer燒寫pre-built (or compiled)binary到NAND Flash(or the recompiled one) 中去。 完成兩個階段的燒寫後,确定開發闆已經上電并且boot mode 選中了NAND。

Boot Modes

NAND 

注意以下操作都是針對AM335X EVM開發闆,關于EVM Switch Settings 的更多資訊,你可以參考 here 以下簡要描述U-Boot中對于NAND的支援,此外,還會介紹針對NAND如何儲存kernel image,RAMDISK或者是UBIFS filesystem 確定能夠無需網絡上電就可讓核心啟動并工作。

OverView

Micron NAND parts (page size 2KB, block size 128KB) are supported on AM335XEVM platforms

NAND Layout

EVM開發闆的NAND按照如下方式配置,這裡提及的位址後續NAND指令會用到。

+------------+-->0x00000000-> SPL start         (SPL copy on 1st block)
|            |
|            |-->0x0001FFFF-> SPL end 
|            |-->0x00020000-> SPL.backup1 start (SPL copy on 2nd block)
|            |
|            |-->0x0003FFFF-> SPL.backup1 end 
|            |-->0x00040000-> SPL.backup2 start (SPL copy on 3rd block)
|            |
|            |-->0x0005FFFF-> SPL.backup2 end 
|            |-->0x00060000-> SPL.backup3 start (SPL copy on 4th block)
|            |
|            |-->0x0007FFFF-> SPL.backup3 end
|            |-->0x00080000-> U-Boot start
|            |                                    
|            |-->0x002BFFFF-> U-Boot end 
|            |-->0x00260000-> ENV start
|            |
|            |
|            |-->0x0027FFFF-> ENV end
|            |-->0x00280000-> Linux Kernel start
|            |
|            |
|            |
|            |
|            |-->0x0077FFFF-> Linux Kernel end
|            |-->0x00780000-> File system start
|            |
|            |
|            |
|            |
|            |
|            |
|            |
|            |
|            |
|            |
|            |
|            |
+------------+-->0x10000000-> NAND end (Free end)
           
Writing to NAND

To write len bytes of data from a memory buffer located at addr to the NAND block offset:

U-Boot# nand write <addr> <offset> <len>
注意:Offset & len應該對齊到 0x800 (2048) bytes. On writing 3000 (0xbb8) bytes, len field can be aligned to 0x1000 ie 4096 bytes. Offset 字段應該對齊到page start address, multiple of 2048 bytes.
           

如果在寫操作的時候遇到了bad block,會被跳過直到遇到下一個'good' block。舉例來說,要将位址在0x80000000 共 0x40000 bytes 寫到NAND starting at block 32 (offset 0x400000):

U-Boot# nand write 0x80000000 0x400000 0x40000
           
Reading from NAND

To read len bytes of data from NAND block at a particular offset to the memory buffer in DDR located at addr:

U-Boot# nand read <addr> <offset> <len>
           

如果在讀操作時候遇到了bad block,他會跳過直到遇上下一個'good' block。例如,要從NAND讀取0x40000 bytes-從block 32 (offset 0x400000)開始到記憶體緩沖區的0x80000000:

U-Boot# nand read 0x80000000 0x400000 0x40000
           
Marking a bad block

有些NAND Block使用一段時間後會損壞,是以明智做法是将它們标記出來,以免造成寫入的image損壞。

U-Boot# nand markbad <offset>
           

例如,标記 block 32 (assuming erase block size of 128Kbytes)為bad block。offset = blocknum * 128 * 1024

U-Boot# nand markbad 0x400000
           
Viewing bad blocks

檢視bad block的清單

U-Boot# nand bad
           

注意:使用者标記的bad block 重新開機後才能看到。

Erasing NAND

擦除特定位址範圍的NAND blocks 或指定number的block

U-Boot# nand erase <start offset addr> <len>
           

注意 start offset addr & len fields 應該對齊到 0x20000 (64*2048) bytes, 也即對應 block size 128KB. 這個指令會跳過bad blocks(both factory and user marked)。例如,擦除blocks 32 through 34

U-Boot# nand erase 0x00400000 0x40000
           
NAND ECC algorithm selection

繼續閱讀