基于USB2.0總線的TMS320VC5402 HPI自舉的實現
引言
當前,dsp(digital signal processor)芯片已經廣泛應用于通信、信號處理、雷達、圖像處理等多個領域,其強大、高效的運算能力,是其他微處理器無法比擬的。為充分發揮dsp運算高效的優勢,用戶程序通常在dsp內部ram中運行,這就需要利用dsp的自舉引導(boot
loader)功能。在dsp多機系統中,hpi自舉是首選。目前,采用hpi自舉的實例主要有兩種,一種是用單片機作為主控制器,通過pc機串口或者外掛的存儲器得到要下載的dsp用戶程序數據,這種方案無法實現系統與pc機之間數據的實時高速傳輸;另一種是用pc機并口里控制dsp
hpi接口,從而把程序寫入dsp 的內部ram,該方案無法滿足嵌入式系統的即插即用要求。
usb接口具有即插即用,速度快(最高可達480mbps)等特點,可成為pc機的外圍設備擴展中應用日益廣泛的接口標準,基于usb總線對dsp實現hpi自舉,可以降低成本,也便于dsp與pc機的高速數據通信,鑒于此種考慮,本文介紹一種利用usb2.0接口控制芯片(cy7c68013-56pvc)實現tms320vc5402自舉的實現方案。
芯片介紹
usb2.0芯片及其gpif簡介
本方案采用的usb2.0接口控制芯片是cvpress公司的cy7c6801356pvc,該系列芯片是世界上第一款支持usb2.0的集成微控制器芯片,它集成有usb2.0收發器、智能串行接口引擎(sie)、增強的8051微處理器,通用可編程接口(gpif)、片上ram和fifo存儲器[1]。該系列芯片的智能引擎也支持usb1.1協議,因此,它具有很好兼容性。
cy7c68013與外設有主/從兩種接口方式:可編程接口gpif和slave fifo,可編程接口gpif是一個微狀態機[2],可由軟件編寫讀寫控制時序,也可以作為usb fifo的主控制器與dsp進行無縫連接,gpif可工作在自動模式,usb總線和gpif接口域直接進行數據傳輸,無需8051內核直接參入,以此解決usb2.0高速傳輸的“瓶頸”問題,gpif與8051內核關系如圖1所示。

dsp芯片及其hpi簡介
tms320vc5402是ti公司的一款性價比極高的低功耗定點數字信號處理器(dsp),該芯片的主機接口(hpi,host port interface)被稱為hpi-8。這種hpi-8接口的最大特點是它允許主機訪問dsp的整個片內空間。hpi接口通過hpi控制寄存器(hpic)、地址寄存器(hpia)數據寄存器(hpid)和hpi內存塊來實現與主機的數據通信。主處理器對hpi的訪問由內外兩部分組成,其中外部主要為主處理與hpi寄存器交換數據,而內部則用于為hpi寄存器與dsp存儲單元交換數據(由dma自動完成)。在進行數據地實時通信時,dsp與主機可以通過中斷信號進行握手。其具體實現可通過設置hpic寄存器的hint、dspint位來對對方進行中斷[3]。
硬件設計
設計原理
自舉從本質上說就是dsp上電后,在bootloader引導下,獲取應用程序并開始運行的過程,tms320vc5402上電以后,當mp/mc為低電平時,系統將從片內rom的off80h開始執行,此處的跳轉指令使程序跳轉至bootloader程序入口處(of800h處)。bootloader程序先清除ifr,并設置hpi入口點(0x7f)的值為0,置hint為低,再檢測int2是否置位(置位可以通過將hint和int2相連來實現),如置位則進行hip自舉[4],具過程如圖2所示。

dsp復位之后,如檢測到hpi自舉方式有效,就可以進行hpi自舉引導,基于usb總線的hpi自舉,就是在bootloader引導下,通過usb接口控制芯片把程序數據由主機(pc)寫入dsp內部ram(daram)并使dsp開始運行的過程,該自舉過程分為三個步驟:一是寫hpic,以設置hpi控制參數;二是寫hpia,設置訪問dsp的首地址;三是通過hpid下載程序。
首先,推動ez-usb control panel下載cy7c68013的固件程序。當重枚舉結束,驅動程序(ezusb.sis)重新安裝成功后,在control panel中通過發送請求的方式由端點0向hpic(主要設置bob位,確定字節配合)發送兩個相同的8位控制字,而當hpic初始化完成之后,再通過端點0設置欲下載程序段到dsp中的首地址hpia。hpic、hpia設置好之后,就可以通過端點2下載dsp程序代碼段,程序代碼段需要分段下載,實際上,cy7c68013通過端點2把數據寫入hpid,然后,dsp按照hpia指定的地址,由dma自動將hpid中的數據寫到ram,接口控制時序可由gpif軟件編程控制,程序數據分段下載完畢之后,再將程序的入口地址通過端點0寫入0x7f處,在主機下載程序的過程中,dsp將一直檢測0x7f是否為0,如不為0,即判定dsp已由主機進行了hpi自舉加載,并按照該值跳轉pc指針,以開始運行,進而完成hpi自舉。
硬件電路
本設計用cy7c68013-56pvc與tms320vc5402的hpi口相連接,接口選擇gpif模式,硬件電路如圖3所示,該方案中,hcntl[1:0]與gpif的低位地址線pa3、pa2相連,以選擇需要訪問的hpi的hpia、hpic,hpid寄存器,ctl0接至hr/w,可作為讀寫控制信號,hds1與輸出信號線ctl1相連,以作為hpi訪問的選通信號,hbil與輸出信號線ctl2相連,已用于識別傳輸的是第一個字節還是第二個字節,hrdy接輸入信號線rdy0。用于通過主機查詢hpi口的狀態,hint、int2與int0連接,可確保hpi自舉有效,hcs接gnd,可使hpi片選信號有效,hpiena接高電平時,hpi使能,has、hds2接高電平時,信號線禁用。數據線pd[7:0]與hd[7:0]相連,可在控制時序作用下傳輸一切數據信號。hpi接口控制時序由ctl0、ctl1、ctl2引腳輸出,在自舉過程中,系統將關閉cy7c68013所有的中斷,若要通過中斷實現數據通信的握手,可以在自舉完畢打開cy7c68013的中斷。

cy7c68013的具體配置為:啟用gpif接口控制數據傳輸,gpif接口采用內部時鐘(48mhz);端點2設置為批量傳輸輸出端點,最大傳輸值是512字節,雙緩沖;終端4、8禁用。端點6可作為批量傳輸輸入端點來向主機傳輸數據,需要說明的是端點6不是自舉所必需的。
軟件設計
dsp應用程序設計
實現tms320vc5402 hpi自舉的前提是生成dsp應用程序的分段hex代碼文件,在ccs中可用匯編語言,c語言等編寫應用程序源代碼,經匯編、鏈接、編譯后,生成可執行的公共目標文件格式(coff)的文件,coff文件不能用于hpi自舉引導,而需要利用ti公司的文件格式轉換工具hex00.exe,將coff文件轉換為hex格式文件[5]。格式轉換的關鍵是正確編寫hex命令文件,下面討論如何編寫這種命令文件,例如將包含text段的源程序鏈接、編譯生成test.out文件,編寫命令文件時,可利用hex500.exe將test.out轉換為對應text段的hex文件,命令文件test為.cmd如下:
-i //生成intel格式
test.out //輸入文件
roms
{
page 0:rom1:org=0x2000,length=0x2000,romwidth=16,memwidth=16,
files={test1.hex} //text段的起始地址為0x2000
} //如有多端就可增加多個rom sections
{text:paddr=0x2000} //如有多端就可增加多個部分
在dos環境下,利用hex500.exe轉換命令文件test.cmd,就可得到test1.hex文件,通過cy7c68013把test1.hex文件寫入dsp內部ram,再把程序的入口地址寫入0x7f處,便可完成自舉。
usb固件程序設計
cypress公司提供有usb的輔助開發工具:ez-usb control panel,gpif designer。通過gpif designer可以生成gpif波形圖及相應的c源代碼gpif.c。cypress公司同時提供了固件程序框架,因而可把gpif.c加入固件程序框架進行開發,從而提高開發效率。本方案中,固件程序設計的重點是對gpif的編程,以便生成符合hpi接口的時序的波形描述代碼,以用于控制數據傳輸,hpi自舉需要的gpif控制波形描述符為:單字節寫(兩種),fifo寫。hpia、hpic的初始化需要單字節寫控制時序,程序代碼寫入hpid需要fifo寫控制時序,若要實現二者的數據通信,還需要單字節讀、fifo讀等控制波形描述符。
hpic、hpia的初始值是在ezusb control panel中通過制造商請求工具欄由ep0發送的,固件程序中還要有相應的請求處理程序,以完成具體的設置,如假定hpic請求類型的id為0xb6.hpic=0x0101(bob位為1),則請求工具欄的具體參數應為:req=0xb6,value=0x0000,index=0xbeef,length=2,dir=0,hex bytes=0101,固件中應加入的請求處理程序為:
case 0xb6:
{epobcl=0; //ep0使能
while(ep01stat&bmep0bsy); //等待epo數據接收完畢
while(!hpi_rdy); //等待hpi處理完畢
ioa=0x00; //選擇hpic寄存器
gpifwfselect=0x1e;
//選擇寫低字節的單字節寫控制波形
while(!(gpiftrig&0x80))
{;}
xgpifsgldatlx=ep0buf[0]; //寫低字節數據
gpifwfselect=0x4e; //選擇寫高字節的單字節寫控制波形
while(!(gpiftrig&0x80))
{;}
xgpifsgldatalx=ep0buf[1]; //寫高字節數據
break;}
設置程序下載的首地址(hpia值)的請求處理程序與設置hpic的程序基本相同,只需按照請求類型的id,來改變訪問寄存器的地址即可,訪問hpia時,hcntl[1:0]=10b,即ioa=0x08。
訪問hpid下載程序數據時,可采用大端點ep2自動打包方式(autoin=1),即將數據發送到端點后,自動傳到fifo中,等待寫hpid條件具備,再啟動gpif,以將程序數據寫入hpid,訪問hpdi可采用地址自動增加模式(hcntl[1:0]=01b),寫數據前,地址自動加1,這樣,數據便可以經過dsp內部dma自動寫入內部ram,寫hpid的程序如下:
if(gpiftrig&0x80) //gpif接口是否處于空閑狀態
{if(!(ep24fifoelgs&0x02)) //自動向量是否可以訪問ep2fifo中數據
{ioa=0x04; //選擇hpid寄存器,且訪問時地址自動增加
while(!hpi_rdy); //等待hpi處理完畢
syncdelay;
gpiftcb1=ep2fifobch; //寫入的字節數
syncdelay;
gpiftcb0=ep2fifobcl;
syncdelay;
gpiftrig=gpif_ep2; //啟動寫數據
syncdelay;
while(!(gpiftrig&0x80)
//等待寫入完畢
{;}
syncdelay;}}
這樣程序數據就可以分段通過端點2寫入dsp內部ram,最后再把入口地址寫入0x7f,以完成hpi自舉,值得注意的是,采用此種方式訪問hpid時,寫入hpia的初值為程序入口的一個地址,例如,寫test1.hex時,應設定hpia=0x1fff。
為縮短開發周期,本設計采用開發包中通用驅動(ezusb.sys)和ezusb control panel進行開發、調試、也可以對通用驅動、控制面板的源程序在vc++環境(需要ddk的支持)下進行二次開發,以便編譯出開發者滿意的驅動程序和上位機程序。
結束語
通過實踐證明,基于usb2.0總線dsp hpi自舉的方案是可行的,可以達到預期效果,該方案可以省掉外擴的eprom、flash及ram等程序存儲器,故可節約成本,也便于dsp軟件算法升級,而且符合嵌入式系統要求,有很好的應用前景,當然,該方案還有待進一步優化與增強,若要訪問外部存儲器,還需要編寫二次引導程序,以便通過該程序把內部存儲器中的數據編譯到外部存儲器,若需dsp與主機實時通信,則需要usb固件和dsp源程序中編寫相應的中斷服務程序。
評論