<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > TMS320C62x HPI引導(dǎo)過程的實現(xiàn)

          TMS320C62x HPI引導(dǎo)過程的實現(xiàn)

          作者: 時間:2004-12-06 來源:網(wǎng)絡(luò) 收藏
          作者Email: cai_yang@etang.com

          摘要和TMS320C67x DSPs提供了幾種不同的啟動模式,不同的啟動模式?jīng)Q定了DSP復(fù)位后的初始化以及代碼裝載方式。本文就 DSP的啟動模式進行詳細的說明。

          關(guān)鍵詞 DSP 啟動模式

          1 緒言

          在TMS320C62x系列DSP中,主機口是一個16位寬度的并行端口。主機(也稱上位機)掌管該接口的主控權(quán),通過它可以直接訪問CPU的存儲器空間。另外,主機還可以直接訪問TMS320C62x片內(nèi)的存儲映射的外圍設(shè)備。

          HPI與CPU存儲空間的互連是通過DMA控制器的。借助專門的地址和數(shù)據(jù)寄存器,通過DMA輔助通道,完成HPI對存儲空間的訪問。主機和CPU都可以對HPI控制寄存器HPIC進行訪問,主機一方還可以訪問HPI地址寄存器HPIA和HPI數(shù)據(jù)寄存器HPID。

          2 TMS320C62x模式

          TMS320C62x系列DSP提供了三種方式:

          (1)沒有自舉:CPU直接從地址0開始執(zhí)行代碼;

          (2)ROM自舉:由DMA/EDMA控制器從外部CE1空間中的ROM中拷貝固定數(shù)量的一段代碼到地址0,拷貝結(jié)束后,CPU從地址0開始運行;

          (3)HPI自舉:由外部主機通過HPI對芯片的存儲器空間進行初始化,初始化結(jié)束后,外部主機通過HPI中斷喚醒CPU,CPU開始從地址0運行。

          所有這些設(shè)置項都是在芯片復(fù)位的時候才進行檢查。一旦復(fù)位信號有效(reset=0),所有的三態(tài)輸出管腳恢復(fù)為默認狀態(tài),然后在reset信號的上升沿處檢查設(shè)置管腳BOOTMODE[4:0]的狀態(tài),自舉邏輯開始生效。其中C6201/C6701有專門的管腳作為BOOTMODE[4:0],C6211/C6711則是利用主機口的HD[4:0],C6202/C6203利用擴展總線的XD[4:0]作為BOOTMODE[4:0]信號。

          對于TMS320C62x的HPI自舉模式如下:首先需要設(shè)置Boot模式,Boot模式設(shè)置如表1所示。當(dāng)DSP被復(fù)位時,如果選擇了HPI boot模式,那么只有DSP的內(nèi)核進入復(fù)位狀態(tài),DSP其余模塊均保持激活狀態(tài)。這樣,主機就可以通過HPI接口訪問DSP的整個存儲空間,包括片內(nèi)、片外存儲器和片內(nèi)的外設(shè)寄存器,對它們進行初始化。主機對DSP做完了有關(guān)設(shè)置后,向HPIC寄存器的DSPINT位寫1,將DSP從復(fù)位狀態(tài)喚醒,接下來CPU就從地址0開始執(zhí)行程序。主機對DSP可以進行的操作包括:初始化CPU和EMIF,向DSP加載程序以及數(shù)據(jù)等。

          表1 TMS320C62x HPI boot配置

          BOOTMODE[4:0]

          Memory Map

          Memory at Address 0

          Boot

          00110

          MAP 0

          External; default values

          HPI

          00111

          MAP 1

          Internal

          HPI

          3 TMS320C62x HPI模式的

          3.1 創(chuàng)建啟動代碼

          TMS320C62x HPI引導(dǎo)模式的第一步是生成HPI引導(dǎo)的DSP代碼,并把它與主處理器應(yīng)用程序合并在一起,使DSP應(yīng)用程序可以和主處理器應(yīng)用程序一起遠程下載。為了簡化,采用下列方案:把DSP應(yīng)用程序轉(zhuǎn)換成頭文件中的數(shù)組,并和主處理器應(yīng)用程序一起編譯連接。

          具體實現(xiàn)分為兩步:1)利用轉(zhuǎn)換工具HEX6x把COFF文件轉(zhuǎn)換成ASCII-Hex格式十六進制文件;2)利用自編工具hex2aray.exe將ASCII-Hex格式的文件轉(zhuǎn)換成包含數(shù)組的頭文件。

          (1)利用轉(zhuǎn)換工具HEX6x把COFF文件轉(zhuǎn)換成ASCII-Hex格式十六進制文件

          利用轉(zhuǎn)換工具HEX6x把COFF文件轉(zhuǎn)換成十六進制文件,使用轉(zhuǎn)換工具HEX6x需要一個.cmd文件說明具體的轉(zhuǎn)換格式,如下面文件hexcom.cmd所示:HEX6x把COFF文件test.out轉(zhuǎn)換成兩個ASCII-Hex格式的文件:一個是代碼段,包含在文件test.a00中;另一個是初始化的數(shù)據(jù)段,包含在文件test.a10中。在DOS命令行中執(zhí)行hex6x hexcom.cmd將產(chǎn)生test.a00和test.a10兩個文件。

          文件hexcom.cmd:
          ..object est.out
          -a
          -byte
          -image
          -memwidth 16
          -romwidth 16
          -order M

          ROMS
          {
          /* Size of the internal pgm memory */
          PGM: org = 0x00000000, length = 0x10000
          /* Size of the internal data memory */
          DATA: org = 0x80000000, length = 0x10000
          }

          (2)利用工具hex2aray.exe生成頭文件

          然后利用hex2aray.exe將兩個ASCII-Hex格式的文件:test.a00和test.a10分別轉(zhuǎn)換成兩個個包含數(shù)組的頭文件:code.h和init.h。工具hex2aray.exe為自編工具。在DOS命令行中分別執(zhí)行hex2aray Ci test.a00 Co code.h和hex2aray Ci test.a10 Co init.h兩條命令將產(chǎn)生兩個頭文件code.h和init.h。在文件hexcom.cmd中的選項:- a,指示HEX6x按ASCII-Hex格式轉(zhuǎn)換文件,ASCII-Hex文件格式如下所示:

          ^B
          $AXXXX,
          XX XX XX XX XX XX XX XX XX XX. . .
          ^C

          文件開始是ASCII STX 字符 (ctrl-B, 02h),結(jié)束是ASCII ETX 字符 (ctrl-C, 03h);$AXXXX,代表地址;其余為代碼。轉(zhuǎn)換后的頭文件格式如下:

          const char code[]={0x12,0x18,0x01,0x00,0x28,0x00,0x00,0x00,0x2A,0x00,0x00,
          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,
          0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,
          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x00,
          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
          0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

          };

          3.2 主機對HPI接口的操作

          TMS320C62x提供了三個16位寄存器:HPIC、HPIA、HPID和16位數(shù)據(jù)線與主處理器通信。主處理器通過HPIC、HPIA、HPID和16位數(shù)據(jù)線來與TMS320C62x進行數(shù)據(jù)交換,數(shù)據(jù)交換的如下:

          1)首先初始化HPIC;
          2)然后把地址寫到HPIA;
          3)最后通過HPID讀或?qū)憯?shù)據(jù)。

          假設(shè)主機CPU也是TMS320C62x,那么主機與目標機之間的連接如圖1所示:

          如圖1所示,假如Target 6201的/HCS連接到主機6201的CE1上。Target 6201的HPI寄存器映射到Host 6201DSP內(nèi)存中,HCNTRL[1:0]和HHWIL連接到主機CPU的地址線上,那么HPIC、HPIA、HPID寄存器的地址分配如表2所示。,那么在C語言中,可以通過指針訪問HPIC、HPIA、HPID,例如:

          #define C6201_HPI 0x01400000 /* Host address on which C6x HPI is mapped */
          int *hpi_ptr; /* define and initialize pointer*/
          hpi_ptr = (int *)C6201_HPI;

          /* Write dest_address to HPIA, with HOB=1 */
          ptr_hpi[2] = (int)(dest_address 0x0ffff);
          ptr_hpi[3] = (int)((dest_address>>16)0x0ffff);

          表2 HPIC、HPIA、HPID各寄存器的地址分配

          映射到主機的地址

          HPI控制線

          HPI寄存器訪問

          HCNTL[1:0]

          HHWIL

          HPI Base address + 0x00

          00

          0

          HPIC 1st halfword

          HPI Base address + 0x04

          00

          1

          HPIC 2st halfword

          HPI Base address + 0x08

          01

          0

          HPIA 1st halfword

          HPI Base address + 0x0C

          01

          1

          HPIA 2st halfword

          HPI Base address + 0x10

          10

          0

          HPID 1st halfword

          HPIA 自增

          HPI Base address + 0x14

          10

          1

          HPID 2st halfword

          HPIA自增

          HPI Base address + 0x18

          11

          0

          HPID 1st halfword

          HPIA不自增

          HPI Base address + 0x1C

          11

          1

          HPID 2st halfword

          HPIA不自增

          3.3 主機通過HPI下載代碼和數(shù)據(jù)段到目標DSP

          一個程序由初始化區(qū)和非初始化區(qū)兩部分組成,主機處理器必須根據(jù).cmd命令文件把這兩個區(qū)裝載到DSP正確的地址。下面這段代碼就是將代碼段和數(shù)據(jù)段兩部分分別下載到指定地址(即程序RAM和數(shù)據(jù)RAM)。它主要是從*source中讀出32位長的數(shù)據(jù),然后通過HPI將此數(shù)據(jù)寫到DSP的dest_add地址(即程序RAM和數(shù)據(jù)RAM)中。*source中的數(shù)據(jù)就是DSP的啟動代碼段和數(shù)據(jù)段中的數(shù)據(jù)。

          void C6x_write_section(int *ptr_hpi, short *source, int dest_add, int length)
          {
          int i;
          /* Write HPIC with HWOB=1,1st halfword transferred is least significant */
          /* HCNTRL1 HCNTRL0 HHWIL */
          ptr_hpi[0] = 0x0001; /* 1st halfword 0 0 0 */
          ptr_hpi[1] = 0x0001; /* 2nd halfword 0 0 1 */
          /* Write destination address to HPIA, 1st halfword is least significant */
          /* HCNTRL1 HCNTRL0 HHWIL */
          ptr_hpi[2] = (int)(dest_add 0x0ffff); /* 0 1 0 */
          ptr_hpi[3] = (int)((dest_add>>16)0x0ffff);/* 0 1 1 */
          for(i=0 ; i length ; i++)
          {
          /* Write source_word to HPID with address post-increment */
          /* 1st half-word transferred is least significant */
          /* HCNTRL1 HCNTRL0 HHWIL */
          ptr_hpi[4] = (int) *source++; /* 1 0 0 */
          ptr_hpi[5] = (int) *source++; /* 1 0 1 */
          }
          }

          3.4 目標DSP開始執(zhí)行所下載的代碼

          主機通過HPI下載代碼段和數(shù)據(jù)段到目標DSP以后,那么目標DSP就需要執(zhí)行所下載的代碼了。通過寫HPIC寄存器的DSPINT位為1讓DSP退出復(fù)位狀態(tài)后,DSP就開始從地址0執(zhí)行所下載的代碼了。具體實現(xiàn)代碼為:

          /* Write HPIC with DSPINT=1 */
          /* HCNTRL1 HCNTRL0 HHWIL */
          /* 1st halfword 0 0 0 */
          /* 2nd halfword 0 0 1 */
          ptr_hpi[0] = 0x0002; /* 1st halfword */
          ptr_hpi[1] = 0x0002; /* 2nd halfword */

          4 總結(jié)

          根據(jù)前面所述,TMS320C62x HPI啟動過程如圖2所示。





          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();