【DSP開發】TMS320C66x DSP SPI Nor Flash的程式燒寫
經過一段時間的研究終於把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中的第9行51改為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中的第9行51改為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中的第
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 中斷的觸發。