1. 程式人生 > >SPI Nor Flash多核程序燒寫

SPI Nor Flash多核程序燒寫

運行 mil 參數 分享圖片 文件名 正常 row 進行 編譯

經過一段時間的研究終於把TMS320C6657單核和雙核的SPI Nor Flash的程序燒寫調通了。工具都是前輩的工作,有需要的可以留下郵箱,我有空可以發。

原理參考錢豐的《TI c66x 系列DSP 多核BOOT 的研究》論文。

通過Nor flash 燒寫加載程序的全部流程:(在no-boot模式下)

技術分享圖片

一、首先講講工具鏈:

技術分享圖片技術分享圖片

hex6x 配合.rmd文件(有幾個.out文件就需要幾個.rmd文件,描述輸出控制、引導選項、存儲器選項等內容)生成片上引導加載器加載程序所需的引導表,輸出文件為*.btbl

mergebtbl將*.btbl按照一定的順序鏈接起來

b2i2c

將*.btbl轉換成i2c/spi格式,把boot表劃分成0x80字節塊並附加長度(length)和校驗碼(checksum)

b2ccs將*.btbl.i2c轉換成.i2c.ccs,CCSV5 IDE接收的.dat格式,加載到DDR3中去。手動i2crom.ccs中的第951改為00

romparse 合並boot表和boot參數表,參數配置表文件*.map作為輸入。

byteswapccs將.dat轉換成ROM Bootloader代碼能夠識別的大端模式

二、將工具鏈寫成批處理文件

1.單核.dat文件生成

hex6x simple.rmd

b2i2c simple.btbl simple.btbl.i2c

b2ccs simple.btbl.i2c simple.i2c.ccs

romparse nysh.spi.map

pause //暫停時,將i2crom.ccs中的第951改為00

byteswapccs i2crom.ccs spirom_le.dat

2.雙核.dat文件生成

hex6x core0.rmd

hex6x core1.rmd

mergebtbl core0.btblcore1.btbl multi_core.btbl

b2i2c multi_core.btbl simple.btbl.i2c

b2ccs simple.btbl.i2c simple.i2c.ccs

romparse nysh.spi.map

pause //暫停時,將i2crom.ccs中的第951改為00

byteswapccs i2crom.ccs spirom_le.dat

藍色與單核.dat文件生成不同,其他相同。

三、*.dat燒寫過程

技術分享圖片技術分享圖片

1. 2個led測試工程,成功編譯並生成2個.out文件,生成.out 文件必須命名為core0.out 、core1.out

2. 將2個.out文件拷貝到SPI_Bootloader工具鏈路徑下,雙擊spibootMulticore.bat批處理文件,開始生成文件,得到spirom_le.dat

3. 將evm板調成no-boot 模式,撥碼開關對應 SW3~SW5 1000 0000 0000 0000 (0 對應on 1對應off)

4. 打開MCSDK自帶的nor-writer工程,將工程bin文件夾下的nor_writer_input.txt 打開,修改輸入文件名為spirom_le.dat 並將spirom_le.dat拷貝到mcsdk_xxxx\tools\writer\nor\evmc667xl\bin路徑下

5. 鏈接工程,等PC指針停在main函數入口,打開view--memory browser,輸入0x80000000,load memory 選擇spirom_le.dat,(自動)勾上Use the header... 再次確認start address 為0x80000000,length為spirom_le.dat的長度(單位是word) 開始往DDR裏灌數。

6. 燒寫工程run,註意console輸出 顯示與length長度大小相同的文件燒入flash,則燒寫成功,此時單位是字節。

7. 最後撥碼開關撥到ROM SPI boot模式下,SW3~SW5 1011 0000 0010 0000,斷電重啟

四、多核啟動過程

C66x DSP 內部有一個固化的ROM,裏面存放著boot 代碼(ROM bootloader)。每當DSP 啟動時,會自動從這裏讀取代碼並執行。這裏執行的代碼是固化的不可更改的,其作用就是根據DSP的管腳配置方式對核進行初始化(比如PLL 等)和完成不同模式的Boot 處理。所有的core 執行同一份代碼。不同的core 在執行的時候通過DNUM(核編號索引)來去做區分。初始化外設的操作由 core0來完成。所以core0初始化其他外設的同時,其他core都會執行相關的代碼映射IPC 中斷,並配置相應的寄存器,然後進入IDLE 狀態,等待core0 的IPC中斷發起。簡言之,其他核是在core0 的命令下執行第一句代碼。

技術分享圖片技術分享圖片

Boot Magic 地址是每個core 各自一塊固定的內存。該字存放的是各個core 初始化之後需要跳轉到的c程序入口地址 _c_int00()。TMS320C6657/TMS320C6670的Boot Magic地址是0x1x8FFFFC,因為他們L2 RAM大小為1MB。TMS320C6678的Boot Magic地址是0x1x87FFFC,因為L2 RAM只有512KB。

如果多核DSP 是由同一套工程分別編譯,那麽每個核內存分配完全相同。core0 在讀取自己核的Boot Magic 地址(0x108ffffc)後,加上0x0*000000 後就可以得到其他核的Boot Magic 地址(*為核號)。但是如果各核編譯各自獨立工程,各變量內存映射關系不再相同,那麽就無法從core0 的Boot Magic 地址裏的值去推算其他核相應地址。這個時候只能事先記錄下各核的 Magic地址,然後寫死在核 0 的用戶初始化代碼上。

在完成所有上述操作後,core0 需要對每個核的IPCGRx 寄存器寫中斷以喚醒其他核的正常運行狀態。IPCGRx 寄存器的31-4 比特位是IPC 中斷源索引,最多可支持多達28 個中斷源,文中例程可以設置為全0;比特3-1 是保留位,可以任意賦值。因此只要對最低比特賦1 就可以完成IPC 中斷的觸發。

SPI Nor Flash多核程序燒寫