摘 要: 給出了一個(gè)基于TMS320DM6437 DSP的嵌入式網(wǎng)絡(luò)實(shí)現(xiàn)方案,對(duì)該DSP的網(wǎng)絡(luò)控制模塊和NDK進(jìn)行了深入的研究與分析,實(shí)現(xiàn)了NDK在不同外設(shè)的移植,并以SEED-DEC6437與PC之間網(wǎng)絡(luò)通信為例,介紹了PC端Winsock與DSP的NDK開(kāi)發(fā)流程。實(shí)驗(yàn)結(jié)果表明,使用移植過(guò)的NDK進(jìn)行開(kāi)發(fā),可以有效地提高開(kāi)發(fā)速度,減少開(kāi)發(fā)時(shí)間。
關(guān)鍵詞: 嵌入式;網(wǎng)絡(luò)接口;DSP;NDK
隨著網(wǎng)絡(luò)通信技術(shù)的不斷發(fā)展,嵌入式設(shè)備間的網(wǎng)絡(luò)通信起到了越來(lái)越重要的作用,TI公司推出的嵌入式數(shù)字信號(hào)處理器(DSP)都集成了以太網(wǎng)介質(zhì)存取控制器(EMAC),使得因特網(wǎng)終端的連接成本降低了50%以上。TI同時(shí)推出了相對(duì)應(yīng)的開(kāi)發(fā)工具包(NDK),使用NDK不僅能夠快速地開(kāi)發(fā)網(wǎng)絡(luò)程序,縮短開(kāi)發(fā)周期,而且應(yīng)用程序能夠方便地在不同型號(hào)DSP上進(jìn)行移植。本文主要針對(duì)NDK的結(jié)構(gòu)進(jìn)行詳細(xì)介紹,闡述了移植的詳細(xì)過(guò)程,最后進(jìn)行實(shí)驗(yàn),實(shí)驗(yàn)結(jié)果證明,移植過(guò)的NDK可以進(jìn)行良好的運(yùn)用。
1 DM6437的網(wǎng)絡(luò)模塊
TMS320DM6437是TI公司的一款專(zhuān)用于數(shù)字媒體應(yīng)用的高性能 32 bit定點(diǎn)DSP 處理器,集成了以太網(wǎng)媒質(zhì)訪(fǎng)問(wèn)控制器(EMAC)和物理層設(shè)備的數(shù)據(jù)輸入輸出管理(MDIO)模塊用于網(wǎng)絡(luò)配置[1]。其網(wǎng)絡(luò)功能模塊如圖1所示。
DM6437的網(wǎng)絡(luò)功能主要由EMAC控制模塊、EMAC模塊和MDIO模塊3部分組成[2]。
EMAC控制模塊提供了DSP核與EMAC模塊和MDIO模塊之間的接口,它的作用主要是控制中斷和有效地利用設(shè)備內(nèi)存。EMAC控制模塊內(nèi)部具有8 KB的隨機(jī)存儲(chǔ)器用來(lái)保存信息包的緩沖描述符。
MDIO模塊采用串行接口控制器來(lái)對(duì)以太網(wǎng)的物理層進(jìn)行監(jiān)視和控制[3],最多支持32個(gè)物理層設(shè)備。它主要負(fù)責(zé)管理與EMAC相連的所有PHY芯片,包括對(duì)PHY芯片進(jìn)行狀態(tài)檢測(cè)、配置等操作。使用MDIO可以減少額外的CPU開(kāi)銷(xiāo)。
EMAC模塊提供了DSP核與網(wǎng)絡(luò)之間通信的高效接口,DM6437的EMAC模塊支持10 Mb/s和100 Mb/s。在半雙工或全雙工模式下,同時(shí)具有硬件流控制及服務(wù)質(zhì)量保證(QoS)支持。
內(nèi)置的EMAC/MDIO僅僅需要連接一個(gè)物理層設(shè)備即可,大大減少了開(kāi)發(fā)時(shí)間,因此成為高速嵌入式網(wǎng)絡(luò)連接一個(gè)很好的選擇。在PHY的接口設(shè)計(jì)中SEED-DEC6437使用的是DAVICOM公司的DM9161A作為10/100Base-TX以太網(wǎng)收發(fā)器[4],DM9161A提供有MII接口,可以實(shí)現(xiàn)與TMS320DM6437的MII接口無(wú)縫對(duì)接。RJ45連接器選用AMP公司的406549-1,其上帶兩個(gè)LED指示燈,右邊的LED為綠色,用作指示連接狀態(tài);左邊的為黃色,正常情況下,用來(lái)指示數(shù)據(jù)傳輸。接口原理圖[5]如圖2所示。
2 NDK結(jié)構(gòu)的介紹與移植
為了加速C6000系列DSP的網(wǎng)絡(luò)開(kāi)發(fā)進(jìn)程,TI公司結(jié)合C6000系列芯片推出TCP/IP的NDK開(kāi)發(fā)套件,目的是為了通過(guò)使用較少資源消耗來(lái)支持TCP/IP服務(wù),例如應(yīng)用層Telnet、DHCP、HTTP服務(wù)等。由于NDK中內(nèi)置了常用的服務(wù)程序,因此通過(guò)使用NDK不僅可以有效地減少服務(wù)占用的資源,而且可以減少開(kāi)發(fā)時(shí)間,以便于更快地推出產(chǎn)品。
NDK建立在TI的嵌入式操作系統(tǒng)DSP/BIOS之上,主要由TCP/IP網(wǎng)絡(luò)協(xié)議棧(STACK.LIB)、網(wǎng)絡(luò)工具庫(kù)(NETTOOL.LIB)、操作系統(tǒng)層和打印層(OS.LIB and MiniPrintf.LIB)、硬件接口層(HAL.LIB)以及網(wǎng)絡(luò)控制層(NETCTRL.LIB)5部分重要的庫(kù)構(gòu)成,如圖3所示。
協(xié)議棧(STACK.LIB)指的是主要的TCP/IP網(wǎng)絡(luò)棧,這個(gè)庫(kù)文件主要是跟DSP/BIOS系統(tǒng)有關(guān),移植的時(shí)候不需要對(duì)它進(jìn)行改變。
網(wǎng)絡(luò)工具庫(kù)(NETTOOL.LIB)包含NDK提供的所有網(wǎng)絡(luò)服務(wù)的套接字和一些幫助用戶(hù)開(kāi)發(fā)的工具。
操作系統(tǒng)層和打印層(OS.LIB and MiniPrintf.LIB)提供了一些抽象的函數(shù)以供DSP/BIOS調(diào)用,例如任務(wù)線(xiàn)程管理、內(nèi)存分配和包緩沖管理等。而打印層提供了CCS使用的RTS輸出函數(shù)等。
網(wǎng)絡(luò)控制層(NETCTRL.LIB)是協(xié)議棧的中心,它控制TCP/IP與外界交互,主要作用是初始化NDK以及底層設(shè)備,啟動(dòng)網(wǎng)絡(luò)系統(tǒng)配置,響應(yīng)和調(diào)度設(shè)備,退出時(shí)卸載系統(tǒng)配置清除驅(qū)動(dòng)程序。
硬件接口層(HAL.LIB)是連接硬件設(shè)備與NDK之間的接口,包含時(shí)鐘、LED指示燈、以太網(wǎng)設(shè)備及串口的驅(qū)動(dòng)。需要對(duì)這個(gè)文件進(jìn)行修改用來(lái)適應(yīng)不同的外設(shè)。由于HAL.LIB是個(gè)靜態(tài)鏈接庫(kù),需要找到開(kāi)發(fā)包中提供的源程序文件,修改之后重新進(jìn)行編譯。源文件位于%NDK_INSTALL_DIR%\packages\ti\ndk\src\hal\<board_name>\eth_<device_name>中。以NDK1.92版本為例,在ndk_1_92_00_22_eval\packages\ti\ndk\src\hal\evmdm6437中找到eth_dm6437和userled_dm6437文件夾,其中eth_dm6437中是以太網(wǎng)設(shè)備驅(qū)動(dòng)程序,而userled_dm6437中是LED指示燈的驅(qū)動(dòng)程序,LED的驅(qū)動(dòng)程序采用默認(rèn)的即可。NDK的以太網(wǎng)驅(qū)動(dòng)程序所包含的文件如表1所示。
LLPACKET.C是與硬件設(shè)備無(wú)關(guān)的以太網(wǎng)包驅(qū)動(dòng),不需要進(jìn)行修改。DM64LC_MDIO.C是與硬件設(shè)備有關(guān)的,包括PHY設(shè)備的初始化、配置等,需要進(jìn)行修改。文件首先定義了相應(yīng)的PHY控制寄存器地址,經(jīng)過(guò)與DM9161A手冊(cè)對(duì)比,地址符合,不需要進(jìn)行更改。在接下來(lái)的初始化PHY設(shè)備MDIO_initPHY的函數(shù)中,應(yīng)該進(jìn)行適當(dāng)?shù)男薷囊苑喜煌腜HY設(shè)備。TI為了加快PHY的初始化速度,當(dāng)PHY設(shè)備啟動(dòng)時(shí),采用宏定義PHY_MASK來(lái)屏蔽不使用的PHY位。通過(guò)查看DM9161A手冊(cè)可以看到,管腳29、28、27、26、35分別代表的是PHYAD[0]~PHYAD[4],通過(guò)查看原理圖上引腳是否有上拉電阻即可確定其值,一般通過(guò)10 k?贅的上拉,設(shè)置為1,不上拉設(shè)置為0。經(jīng)過(guò)查看PHYAD=01111,換成十進(jìn)制為15,則PHY_MASK就為0x8000。在文件開(kāi)始位置修改PHY_MASK即可。如果需要連接多個(gè)PHY設(shè)備,在MDIO_initPHY()函數(shù)中,需要把注釋“Shutdown all other PHYs”下面的代碼刪除。這段代碼是為加速單個(gè)PHY設(shè)備啟動(dòng)而設(shè)計(jì)的,當(dāng)連接多個(gè)PHY設(shè)備時(shí)就會(huì)阻止其正常工作,經(jīng)過(guò)修改之后需要重新編譯生成lib文件,注意要添加編譯包含的路徑,如圖4所示。
將生成的文件復(fù)制到NDK中的lib\hal\evmdm6437目錄下,名稱(chēng)為hal_eth_dm64lc.lib即可。
3 NDK的開(kāi)發(fā)與測(cè)試
在使用NDK開(kāi)發(fā)之前,需要設(shè)置NDK的開(kāi)發(fā)環(huán)境,需要進(jìn)行以下操作[6]:
?。?)硬件層需要一個(gè)100 ms的周期函數(shù)來(lái)作為它的時(shí)鐘驅(qū)動(dòng),每100 ms周期驅(qū)動(dòng)一次llTimerTick()函數(shù)。所以在BIOS里面PRD下面新建一個(gè)prdNDK變量,并在其屬性中設(shè)置周期為100 ms,函數(shù)為_(kāi)llTimerTick。
?。?)系統(tǒng)需要鉤子函數(shù)為T(mén)CP/IP堆棧加載和保存私人變量指針,所以在BIOS中的HOOK下面新建一個(gè)hookNdk,并將初始化函數(shù)設(shè)置為_(kāi)NDK_hookInit,創(chuàng)建函數(shù)設(shè)置為_(kāi)NDK_hookCreat。
?。?)需要包含一些文件頭文件。必須把工程項(xiàng)目的IncludeSearchingPath指向NDK安裝目錄下的inc目錄,如%NDK_INSTALL_DIR%\packages\ti\ndk\inc。
?。?)為了確保能夠正確編譯項(xiàng)目文件,需要在CCS項(xiàng)目中的“build options”的“Link Order”一欄按一定順序添加庫(kù)文件,最佳的順序是:NETCTRL.LIB、HAL_xxx.LIB、NETTOOL.LIB、STACK.LIB、OS.LIB以及MiniPrintf.LIB。
?。?)NDK中的OS和HAL會(huì)創(chuàng)建3個(gè)內(nèi)存段,分別是PACKETMEM、MMBUFFER和OBJMEM,必須為這3個(gè)段分配內(nèi)存,在CMD中寫(xiě)入以下內(nèi)容:
SECTIONS
{
.far:PACKETMEM:{}>MYSDRAM
.far:MMBUFFER:{}>MYSDRAM
.far:OBJMEM:{}>MYSDRAM
}
這里將3個(gè)段分配到自定義的MYSDRAM中。
?。?)如果cache L2完全設(shè)置為SRAM,HAL驅(qū)動(dòng)將不能正常工作,這里需要把Cache設(shè)置至少為32 KB大小。Cache的大小對(duì)網(wǎng)絡(luò)傳輸速度的有很大的影響,Cache越大速度越快。
設(shè)置好開(kāi)發(fā)環(huán)境之后,在DSP端開(kāi)發(fā)一個(gè)UDP程序來(lái)與上位機(jī)通信。具體實(shí)現(xiàn)的功能是:上位機(jī)發(fā)送一個(gè)字符串,DSP接收后進(jìn)行回傳,在上位機(jī)進(jìn)行顯示。程序的基本流程如圖5所示。
為了研究NDK開(kāi)發(fā)工具的移植方法,本文討論了DM6437上NDK的結(jié)構(gòu)以及工作原理,并進(jìn)行了與PC數(shù)據(jù)通信的測(cè)試。測(cè)試表明經(jīng)過(guò)移植的NDK可以正確地開(kāi)發(fā)網(wǎng)絡(luò)程序。本文重點(diǎn)介紹了NDK的移植方法,使開(kāi)發(fā)者可以將其使用在不同的PHY設(shè)備上,這大大拓展了NDK的使用范圍。TI推出的NDK網(wǎng)絡(luò)開(kāi)發(fā)工具可以使技術(shù)人員快速開(kāi)發(fā)基于DSP的網(wǎng)絡(luò)應(yīng)用程序,而且具有十分可靠的性能,使用本文的方法使得基于NDK開(kāi)發(fā)的程序可以快速地移植到不同PHY設(shè)備的DSP上。隨著DSP網(wǎng)絡(luò)通信的不斷普及,該方法的應(yīng)用范圍將越來(lái)越廣闊。希望通過(guò)本文的介紹,使得相關(guān)的開(kāi)發(fā)研究人員得到方便,減少開(kāi)發(fā)時(shí)間。
參考文獻(xiàn)
[1] Texas Instruments. TMS320C6000 network developer′s kit support package for EVMDM6437 user′s guide[Z]. 2006.
[2] Texas Instruments. TMS320C6000 network developer′s kit(NDK) software user′s guide[Z]. 2007.
[3] Texas Instruments. TMS320DM643x DMP ethernet aedia access controller(EMAC)/management data input/output (MDIO)module user′s guide[Z]. 2007.
[4] 合眾達(dá).SEED-DEC6437用戶(hù)指南[Z].2008.
[5] 合眾達(dá).SEED-DEC6437 V1.1原理圖[Z].2008.
[6] Texas Instruments. TMS320C6000 network developer′s kit(NDK) software programmer′s reference guide[Z]. 2007.