嵌入式Linux下ARM處理器與DSP的數(shù)據(jù)通信_第1頁
嵌入式Linux下ARM處理器與DSP的數(shù)據(jù)通信_第2頁
嵌入式Linux下ARM處理器與DSP的數(shù)據(jù)通信_第3頁
嵌入式Linux下ARM處理器與DSP的數(shù)據(jù)通信_第4頁
嵌入式Linux下ARM處理器與DSP的數(shù)據(jù)通信_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、嵌入式Linux下ARM處理器與DSP的數(shù)據(jù)通信        摘要:本文通過一個開發(fā)實例詳細說明如何通過DSP的HPI接口與運行Linux操作系統(tǒng)的ARM架構(gòu)處理器進行數(shù)據(jù)通信。給出接口部分的實際電路和ARM-Linux下驅(qū)動程序的開發(fā)過程。    關(guān)鍵詞:設(shè)備驅(qū)動程序 嵌入式Linux HPI ARM DSP1 引言基于ARM核心處理器的嵌入式系統(tǒng)以其自身資源豐富、功耗低、價格低廉、支持廠商眾多的緣故,越來越多地應(yīng)用在各種需要復(fù)雜控制和通信功能的嵌入式系統(tǒng)中。內(nèi)核源碼開放的Linux與ARM

2、體系處理器相結(jié)合,可以發(fā)揮Linux系統(tǒng)支持各種協(xié)議及存在多進程調(diào)度機制的優(yōu)點,從而使開發(fā)周期縮短,擴展性增強。作為數(shù)字處理專用電路,DSP的數(shù)字信號處理能力十分強大,但對諸如任務(wù)管理、通信、人機交互等功能的實現(xiàn)較為困難。如果將這三者結(jié)合起來,即由DSP結(jié)合采樣電路采集并處理信號,由ARM處理器作為平臺,運行Linux操作系統(tǒng),將經(jīng)過DSP運算的結(jié)果發(fā)送給用戶程序進行進一步處理,然后提供給圖形化友好的人機交互環(huán)境完成數(shù)據(jù)分析和網(wǎng)絡(luò)傳輸?shù)裙δ埽蜁畲笙薅鹊陌l(fā)揮三者所長。2 系統(tǒng)結(jié)構(gòu)該系統(tǒng)硬件由二部分組成,其中一部分為若干塊DSP板,各自獨立承接數(shù)據(jù)采集和信號處理。另一部分為以ARM為核心處理器

3、的CPU板。系統(tǒng)硬件框圖如圖1所示(僅接口部分)。3 接口硬件部分設(shè)計31 HPI接口簡介HPI接口是TI公司新一代、高性能DSP上用以完成與主機或其他DSP之間數(shù)據(jù)交換的接口,這里主要介紹實際電路中使用的控制引腳和時序。HCNTL0和HCNTL1為訪問控制選擇。用來確定主機(ARM)究竟對TMS320C6711中的哪一個HPI寄存器進行處理。具體功能如表1所列。表1 HCNTL0和HCNTL1的功能HCNTL0HCNTL1功    能00主機對HPI控制寄存器(HPIC)進行讀寫01主機對HPI地址寄存器(HPIA)進行讀寫10主機對HPI數(shù)據(jù)寄存器(HPID)

4、地址自動增加模式(Auto increment mode)進行讀寫,對HPID讀寫后,地址寄存器(HPIA)自動增加一個字地址(4字節(jié)地址)11主機對HPI數(shù)據(jù)寄存器(HPID)地址固定模式(Fixed mode)進行讀寫。對HPID讀寫后,地址寄存器(HPIA)保持不變HR/W:讀寫選擇控制。為“1”表示是從DSP中讀,反之則為寫。HHWIL:半字節(jié)定義選擇,與HPIC寄存器中的HWOB位進行配合可以選擇當(dāng)前傳輸?shù)氖歉甙胱诌€是低半字。低電平是第一個半字,高電平是第二個半字。HCS:選通脈沖(Strobe),與HDS1、HDS2相互配合完成內(nèi)部信號HSTROBE的生成。邏輯關(guān)系如圖2所示。將H

5、DS1、HDS2分別固定為高電平和低電平,這樣HCS就和HSTROBE完全一致。HSTROBE讀時序如圖3所示。32 接口電路ARM處理器通過DSP的HPI接口與DSP進行連接的硬件原理如圖4所示(以單板DSP為例)。其中SN74LVTH16245為16位(二個8位)雙向三態(tài)總線收發(fā)器,主要起總線驅(qū)動和方向控制的作用同時也保證在不對HPI口進行操作時數(shù)據(jù)總線鎖閉。AT91RM9200為Atmel公司生產(chǎn)的ARM9為核心的處理器,其中引腳D0-D15為數(shù)據(jù)總線,A2-A8為地址總線的一部分,CS3為片選信號線,當(dāng)ARM對總線地址范圍為0x40000 00000x4FFF FFFF的外部設(shè)備進行操

6、作時,會在該引腳產(chǎn)生一個片選信號。同時該信號控制SN74LVTH16245的使能端,避免在讀寫其他地址時對HPI端口造成影響。TMS320C6711D是TI公司生產(chǎn)的DSP,每秒可以完成15億次浮點運算,數(shù)據(jù)處理功能十分強大。引腳D0-D15為數(shù)據(jù)總線。其余端口是HPI接口的控制引腳。4 驅(qū)動程序設(shè)計41 Linux驅(qū)動程序簡介在Linux操作系統(tǒng)下有二種方式將驅(qū)動程序裝入操作系統(tǒng)內(nèi)核:一種是直接將驅(qū)動程序編譯進內(nèi)核,另外一種是將驅(qū)動程序構(gòu)建為驅(qū)動程序模塊后采用insmod/rmmod命令將模塊加載內(nèi)核中。由于是在嵌入式系統(tǒng)中進行程序開,所以筆者選用了模塊加載方式。這樣,在整個程序的調(diào)試過程中

7、不必因為修改某處而反復(fù)編譯整個內(nèi)核,只需編譯驅(qū)動程序模塊并重新加載。本例中Linux下的驅(qū)動程序主要用來完成文件(Linux把外部設(shè)備也認為是文件)的打開、關(guān)閉、讀、寫等操作。也就是對如下結(jié)合的填充。Static struct file_operations fops=open:hpi_open,release:hpi_release,mmap:hpi_mmap,;其中,open和release完成設(shè)備的打開和關(guān)閉。mmap為內(nèi)存地址映射操作。因為采用的是模塊加載方式,所以還應(yīng)該加上int init_module(void)和void cleanup_module(void)函數(shù),以完成模塊的

8、注冊和卸載。42 驅(qū)動程序中映射的實現(xiàn)由于驅(qū)動程序的內(nèi)存空間是在內(nèi)核空間中,因此首先應(yīng)解決內(nèi)核空間與用戶空間的交互問題。這里采用最直接的方式將內(nèi)核空間和用戶空間聯(lián)系起來實現(xiàn)映射,即利用remap_page_range內(nèi)核函數(shù)(通過mmap系統(tǒng)調(diào)用實現(xiàn))。函數(shù)原形如下:int remap_page_range(unsigned long virt_add,unsigned long phys_add,unsigned long size,pgprot_tprot);函數(shù)的功能是構(gòu)造用于映射一段物理地址的新頁表。函數(shù)返回的值通常是0或者一個負的錯誤碼。函數(shù)參數(shù)的確切含義如下:virt_add:重映

9、射起始處的用戶虛擬地址。phys_add:虛擬地址所映射的物理地址。Size:被重映射的區(qū)域的大小。Prot:新VMA(virtual memory area)的“保證(protection)”標志。具體定義在源泉文件/include/linux/mm.h中。系統(tǒng)調(diào)用MMAP的程序代碼如下:static int hpi_mmap(struct file *f,struct vm_area_struct *vma)vma->vm_flags|=VM_WRITE;if(remap_page_range(vma->vm_start,(0x40000000),vma->vm_end-

10、vma->vm_start,(_pgprot (pgprot_val(pgprot_noncached(vma->vm_page_prot)|(L_PTE_WRITE|L_PTE_DIRTY) /進行映射return -1; /映射失敗return 0;結(jié)合硬件結(jié)構(gòu)可對函數(shù)remap_page_range()分別填充如下參數(shù):remap_page_range(vma->vm_start,(0x40000000),vma->vm_end-vma->vm_start,(_pgprot(pgprot_val(pgprot_noncached(vma->vm_pag

11、e_prot) |(L_PTE_WRITE|L_PTE_DIRTY)其中vma為結(jié)合vm_area_struct,在<linux/mm.h>中定義。應(yīng)用中需要注意以下字段:unsigned long vm_flags應(yīng)該使用標志VM_RESERVED,以避免內(nèi)存管理系統(tǒng)將該VMA交換出去。因為要對DSP寫入數(shù)據(jù),所以必須使用標志VM_WRITE說明對這一段VMA是允許寫入的。pgport_t vm_page_prot指明了對VMA的保護權(quán)限。由于利用CS3對DSP的HPI接口進行控制,所以應(yīng)用pgprot_noncached禁止高速緩沖。    通過m

12、map的構(gòu)建就能夠?qū)?nèi)核空間的數(shù)據(jù)映射到用戶空間去,也就是說可以在用戶空間內(nèi)直接對地址為0x4000_0000的內(nèi)存空間進行操作,而該段空間正是DSP的HPI接口所對應(yīng)的地址。在實際應(yīng)用中,應(yīng)對CS3的低電平脈寬加以控制,方法是在初始化模塊時對ARM的控制寄存器CSR3進行調(diào)節(jié)。該寄存器的D0-D6確定了ARM外部總線的時鐘延時周期,D7為等待周期的使能,D12-D14為數(shù)據(jù)寬度。具體定義如下:AT91_SYS->EBI_SMC2_CSR3=0x00003083,即使用16bit數(shù)據(jù)寬度,等待周期為3個。當(dāng)ARM主頻為180MHz時,CS3低電平脈寬約為150ns。43 驅(qū)動程序的系統(tǒng)調(diào)

13、用接口為對處于總線地址0x4000_0000的DSP板進行操作,首先應(yīng)用open打開設(shè)備,該設(shè)備可以通過mknod建立(本例建立的是/dev/hpi)。然后mmap完成映射。Int dev_hpi_open(str_HPI *ss)size_t length=1024;int i;if(*ss).hpi_number=0)(*ss).hpi_fd=open("/dev/hpi",O_RDWR);if(*ss).hpi_fd=-1)return -1;(*ss).hpi_mmap_start =mmap(NULL,length,PROT_READ|PROT_WRITE,MAP

14、_SHARED,(*ss).hpi_fd),0); /獲得映射區(qū)內(nèi)存的起始地址return 0; /dev_hpi_openmmap的作用是將文件內(nèi)容映射到內(nèi)存中。函數(shù)的原形及各參數(shù)定義如下:*mmap(void *start,size_length,int prot,int flags,intfd,off_t offset)start指向欲對應(yīng)的內(nèi)存地址,size-length的含義是要映射的量;prot代表映射區(qū)域的保護方式;flag會影響映射區(qū)域的各種特性;fd為文件描述符;offtoffset代表文件的偏移量,通常設(shè)置為零。示例程序中的結(jié)構(gòu)體變量ss用來總知各種變量。通過mmap可以獲

15、得映射后的內(nèi)存地址,用(*ss).hpi_mmap_start表示。一旦獲得了這個起始地址,就能對0x4000_0000起始的總線地址進行操作,因為映射已經(jīng)完成,對(*ss).hpi_mmap_start的操作就是對0x4000_0000起始的總線地址進行操作,而DSP板HPI接口的控制線正是在這個位置。這樣就實現(xiàn)了物理地址和用戶空間的轉(zhuǎn)換。44 用戶程序接口部分下面以HPI接口讀寫中最復(fù)雜的自增讀方式用戶程序為例說明用戶接口程序的設(shè)計過程。要完成自增讀的操作,對于HPI一側(cè),假設(shè)采用軟件握手的方式。要完成的工作如下:首先讀HPIC以查詢其中的HRDY位是否為1,如果為1則表示DSP中數(shù)據(jù)已經(jīng)

16、備妥。然后寫HPIA以告訴DSP從什么位置開始進行自增讀。接著將HPIC的FETCH位置1以刷新寫入。再讀HPIC以查詢其中的HRDY位是否為1,如果為1則表示DSP中數(shù)據(jù)已經(jīng)備妥。最后從HPID中讀取數(shù)據(jù)。對于ARM一側(cè),要對HPIC、HPID、HPIA寄存器進行讀寫必須滿足HPI接口的定義,具體如下(以自增讀為例):讀前半字節(jié)(高16位)時,HCNTL0=0、HCNTL1=1、HR/W=1、HHWRL=0。讀后半字節(jié)(低16位)時,HCNTL0=0、HCNTL1=1、HR/W=1、HHWRL=0。從硬件的原理圖可知,這些HPI的控制口線分別與ARM的一部分地址總線連接。具體為HCNTL0-

17、A2、HCNTL1-A3、HR/W-A4、HHWIL-A5。宏定義過程如下:#define HPIC_R_F(HPI_VA_BASE)*(unsigned long*)(HPI_VA_BASE)+0x00000004+DSPNUMBER)/讀HPIC第一半字#define HPIC_R_S(HPI_VA_BASE)*(unsigned long*)(HPI_VA_BASE)+0x0000000C+DSPNUMBER)/讀HPIC第二半字等等,只要改變在HPI_BA_BASE基礎(chǔ)上增加的數(shù)字就可以獲取對控制口線的操作。    在這里HPI_VA_BASE將由映射得到

18、的用戶空間虛擬地址代替,所以如果“自增模式讀HPID第一半字”那么就可求滿足前文提到的HCNTL0=0、HCNTL1=1、HR/W=1、HHWRL=0,也就是要滿足地址位A2=0、A3=1、A4=1、A5=0,所以只要在HPI_VA_BASE的基礎(chǔ)上加0x0000_0006就可以了。要注意的是ARM處理器的地址是32位。所以是加上0x0000_0006而不是0x0000_0018。另外,還有二點需要說明:通過改變宏定義中的DSPNUMBER常量可以控制地址總線A6、A7、A8。通過這3個總線組合并通過簡單地址譯碼電路就可以完成對多塊DSP板的讀寫。在硬件電路中可以定義為0。A4(HR/W)同時

19、還用做SN74LVTH16245的方向控制。讀的時候A4=1,此時SN74LVTH16245的數(shù)據(jù)從A->B;反之,則從B->A。下面給出程序中的自增讀和注釋部分:int dev_hpi_auto1(str_HPI *ss)volatile unsigned long dsp_addr_hign_read_auto;/定義各種中間變量volatile unsigned long dsp_addr_low_read_auto;volatile unsigned long dsp_data_hign_read_auto;volatile unsigned long dsp_data_l

20、ow_read_auto;volatile unsigned long dsp_add_temp;int i;volatile unsigned long data_length;/-read hpic-the host polls the HPIC for HRDY=1volatile unsigned long polltest;polltest=HPIC_R_F(*ss).hpi_mmap_start);while(polltest&0x00000008)!=0x00000008)polltest=HPIC_R_F(*ss).hpi_mmap_start);dsp_add_tem

21、p=(*ss).hpi_dsp_add);/從應(yīng)用程序傳過來的參數(shù),指明希望從DSP的哪一個地址讀起dsp_addr_low_read_auto=(dsp_add_temp)&0x0000ffff)+(dsp_add_temp)<<16); /完成數(shù)據(jù)轉(zhuǎn)換dsp_addr_hign_read_auto=(dsp_add_temp)&0xffff0000)+(dsp_add_temp)>>16);/-write dsp s addr to HPIAHPIA_W_F (*ss).hpi_mmap_start)=(dsp_addr_hign_read_auto);HPIA_W_S(*ss).hpi_mmap_start)=(dsp_addr_low_read_auto);/-write hpic-to FETCH bitHPIC_W_F(*ss).hpi_mmap_start)=0xfff8fff8;HPIC_W_S(*ss).hpi_mmap_start)=0xfff8fff8;/-read dsp s data from HPID,autoincrement modedata_l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論