BOOT ROM 初始化內容、啓動設備、鏡像燒寫

  

  
  
I.MX6U 支持多種啓動方式以及啓動設備,比如可以從 SD/EMMC、NAND Flash、QSPI Flash等啓動

1 啓動方式

  在 I.MX6U 芯片上電以後,根據 BOOT_MODE[1:0]的設置來選擇 BOOT 方式,BOOT_MODE[1:0]有兩種方式更改:
 ① 改寫 eFUSE(熔絲),只能修改一次
 ② 修改相應的 GPIO 高低電平(默認爲0,引腳BOOT_MODE1 和 BOOT_MODE0 )

  共有四種 BOOT 模式,一般情況下只會用到串行下載和內部BOOT模式

1.1 串行下載

  通過 USB 或者UART 將代碼下載到板子上的外置存儲設備中,使用 OTG1這個USB口向開發板上的 SD/EMMC、NAND 等存儲設備下載代碼,需要用到 NXP 提供的軟件(通過串口將boot、內核鏡像、設備樹、文件系統下載到SD/EMMC、NAND等存儲設備上)

1.2 內部 BOOT 模式

  芯片會執行內部的 boot ROM 代碼,這段 boot ROM 代碼會進行硬件初始化(一部分外設),初始化參數在燒錄的bin 文件前面添加的數據頭,然後從 boot 設備(就是存放代碼的設備、比如 SD/EMMC、NAND)中將代碼拷貝出來複製到指定的 RAM 中,一般是 DDR

1.3 BOOT ROM 初始化內容

① 初始化時鐘,內核時鐘(主頻): 396Mhz

② 使能mmu和cache
  內部 boot ROM 爲了加快執行速度會打開 MMU 和 Cache,下載鏡像的時候 L1 ICache 會打開,驗證鏡像的時候 L1 DCache、L2 Cache 和 MMU 都會打開。一旦鏡像驗證完成,boot ROM就會關閉 L1 DCache、L2 Cache 和 MMU

③ 從SD/EMMC、NAND將代碼複製到指定的RAM中

④ 重置中斷向量表
  中斷向量偏移會被設置到 boot ROM 的起始位置,當 boot ROM 啓動了用戶代碼以後就可以重新設置中斷向量偏移了。一般是重新設置到我們用戶代碼的開始地方


2 啓動設備

  • 接到 EIM 接口的 CS0 上的 16 位 NOR Flash
  • 接到 EIM 接口的 CS0 上的 OneNAND Flash
  • 接到 GPMI 接口上的 MLC/SLC NAND Flash,NAND Flash 頁大小支持 2KByte、4KByte和 8KByte,8 位寬
  • Quad SPI Flash
  • 接到 USDHC 接口上的 SD/MMC/eSD/SDXC/eMMC 等設備
  • SPI 接口的 EEPROM

兩種方式更改:
① 改寫 eFUSE(熔絲),只能修改一次
② 通過配置24個 IO 來實現選擇:
BOOT_CFG1[7:0]、BOOT_CFG2[7:0]、BOOT_CFG4[7:0]

  通過上圖可以知道,24個配置 IO分別對應的是LCD 的 24 根數據線 LCD_DATA0~LCDDATA23,當啓動完成以後這 24 個 IO 就可以作爲 LCD 的數據線使用;這 24 根線和 BOOT_MODE1、BOOT_MODE0 共同組成了 I.MX6U的啓動選擇引腳

  大部分的 IO 都是接地,BOOT_CFG4[7:0]這 8 個 IO 都 10K 電阻下拉接地,可以先不關注 BOOT_CFG4[7:0]

  在撥碼開關中,除 了 BOOT_MODE1 和 BOOT_MODE0 ,還有LCD_DATA3~ LCDDATA7、LCD_DATA11 這 6 個 IO,其中LCD_DATA11 就是 BOOT_CFG2[3],LCD_DATA3~ LCD_DATA7 就是 BOOT_CFG1[3]~ BOOT_CFG1[7]

總結如下:8個撥碼開關中對應的設備選擇


3 鏡像燒寫

.bin 文件不能直接在 I.MX6U 運行,需要在.bin 文件前面添加一些頭信息構成滿足 I.MX6U 需求的最終可燒寫文件,構成如下:

  • Image vector table,簡稱 IVT,IVT 裏面包含了一系列的地址信息,這些地址信息在 ROM中按照固定的地址存放着
  • Boot data,啓動數據,包含了鏡像要拷貝到哪個地址,拷貝的大小是多少等等
  • Device configuration data,簡稱 DCD,設備配置信息,重點是 DDR3 的初始化配置
  • 用戶代碼可執行文件,比如 led.bin

1、 .bin 通過imxdownload生成 .imx(.imx = IVT + Boot data + DCD + .bin)

2、內部 Boot ROM 將 .imx 拷貝到 DDR ,用戶代碼從鏈接地址地址開始,比如 0X87800000 ,.imx 在 DDR 中的起始地址爲:(鏈接地址 - 3KB )比如0X87800000-3072=0X877FF400

  

3.1 IVT 和 Boot Data 數據

  IVT 包含了鏡像程序的入口點、指向 DCD 的指針和一些用作其它用途的指針,不同的啓動設備內部 Boot ROM 要求 IVT的存放位置不同(IVT在最前面,相當於要求 load.imx 在燒寫的時候應該燒寫到存儲設備的指定位置去)

  以 SD/EMMC 爲例,IVT 偏移爲 1Kbyte,IVT + Boot data + DCD 的總大小爲 4KByte - 1KByte = 3KByte

① IVT 數據格式

header(頭)格式如下:

Tag 爲一個字節長度,固定爲 0XD1,Length 是兩個字節,保存着 IVT 長度,爲大端格式,也就是高字節保存在低內存中。最後的 Version 是一個字節,爲 0X40 或者0X41

② Boot Data 的數據格式

  

3.2 DCD 數據

  DCD 就是 I.MX6U 寄存器地址和對應的配置信息集合,Boot ROM 會使用這些寄存器地址和配置集合來初始化相應的寄存器,比如開啓某些外設的時鐘、初始化 DDR 等等

DCD 區域不能超過 1768Byte,區域結構如下:

其header 和 IVT 的 header 類似,結構如圖

其中 Tag 是單字節,固定爲 0XD2,Length 爲兩個字節,表示 DCD 區域的大小,包含 header,同樣是大端模式,Version 是單字節,固定爲 0X40 或者 0X41

CMD 就是要初始化的寄存器地址和相應的寄存器值,CMD 命令格式如下:

Tag 爲一個字節,固定爲 0XCC。Length 是兩個字節,包含寫如的命令數據的長度,包含 header,同樣是大端模式。Parameter 爲一個字節,這個字節的每個位含義如圖

bytes 表示是目標位置寬度,單位爲 byte,可以選擇 1、2、和 4 字節。flags是命令控制標誌位

Address 和 Vlalue/Mask 就是要初始化的寄存器地址和相應的寄存器值,注意採用的是大端模式

復位以後,I.MX6U 片內的所有寄存器都會復位爲默認值,但是這些默認值往往不是我們想要的值,而且有些外設我們必須在使用之前初始化它。使用DCD(Device Config Data)即可解決此問題

  

總結:

DCD 裏面的初始化配置主要包括三方面

①、設置 CCGR0~CCGR6 這 7 個外設時鐘使能寄存器,默認打開所有的外設時鐘
②、配置 DDR3 所用的所有 IO
③、配置 MMDC 控制器,初始化 DDR3 I.MX6U MMDC 控制器簡介

  
  

4 結束

如有錯誤,還望指正🤞

  
  
  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章