久久久久久久麻豆,中日韩av在线,麻豆av在线免费,中文字幕二区三区,欧美日韩视频一区二区,亚洲欧美日韩在线一区,国产无毒不卡

嵌入式Linux下ARM處理器與DSP的數(shù)據(jù)通信(2)



4.3 驅(qū)動程序的系統(tǒng)調(diào)用接口

為對處于總線地址0x4000_0000的DSP板進(jìn)行操作,首先應(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)

if((*ss).hpi_fd==-1)return -1;
(*ss).hpi_mmap_start =mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_SHARED,((*ss).hpi_fd),0); //獲得映射區(qū)內(nèi)存的起始地址
return 0;
} //dev_hpi_open
mmap的作用是將文件內(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ū)域的保護(hù)方式;flag會影響映射區(qū)域的各種特性;fd為文件描述符;offtoffset代表文件的偏移量,通常設(shè)置為零。

示例程序中的結(jié)構(gòu)體變量ss用來總知各種變量。通過mmap可以獲得映射后的內(nèi)存地址,用(*ss).hpi_mmap_start表示。

一旦獲得了這個起始地址,就能對0x4000_0000起始的總線地址進(jìn)行操作,因?yàn)橛成湟呀?jīng)完成,對(*ss).hpi_mmap_start的操作就是對0x4000_0000起始的總線地址進(jìn)行操作,而DSP板HPI接口的控制線正是在這個位置。這樣就實(shí)現(xiàn)了物理地址和用戶空間的轉(zhuǎn)換。

4.4 用戶程序接口部分

下面以HPI接口讀寫中最復(fù)雜的自增讀方式用戶程序?yàn)槔f明用戶接口程序的設(shè)計過程。要完成自增讀的操作,對于HPI一側(cè),假設(shè)采用軟件握手的方式。要完成的工作如下:

首先讀HPIC以查詢其中的HRDY位是否為1,如果為1則表示DSP中數(shù)據(jù)已經(jīng)備妥。然后寫HPIA以告訴DSP從什么位置開始進(jìn)行自增讀。接著將HPIC的FETCH位置1以刷新寫入。再讀HPIC以查詢其中的HRDY位是否為1,如果為1則表示DSP中數(shù)據(jù)已經(jīng)備妥。最后從HPID中讀取數(shù)據(jù)。

對于ARM一側(cè),要對HPIC、HPID、HPIA寄存器進(jìn)行讀寫必須滿足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----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將由映射得到的用戶空間虛擬地址代替,所以如果“自增模式讀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。

另外,還有二點(diǎn)需要說明:

通過改變宏定義中的DSPNUMBER常量可以控制地址總線A6、A7、A8。通過這3個總線組合并通過簡單地址譯碼電路就可以完成對多塊DSP板的讀寫。在硬件電路中可以定義為0。

A4(HR/W)同時還用做SN74LVTH16245的方向控制。讀的時候A4=1,此時SN74LVTH16245的數(shù)據(jù)從AB;反之,則從BA。

下面給出程序中的自增讀和注釋部分:

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_low_read_auto;
volatile unsigned long dsp_add_temp;
int i;
volatile unsigned long data_length;
//---read hpic----the host polls the HPIC for HRDY=1
volatile unsigned long polltest;
polltest=HPIC_R_F((*ss).hpi_mmap_start);
while((polltest&0x00000008)!=0x00000008)

dsp_add_temp=((*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 HPIA
HPIA_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 bit
HPIC_W_F((*ss).hpi_mmap_start)=0xfff8fff8;
HPIC_W_S((*ss).hpi_mmap_start)=0xfff8fff8;
//---read dsp s data from HPID,autoincrement mode
data_length=(*ss).hpi_dsp_data_length;//從應(yīng)用程序傳過來的參數(shù),指明期望讀取多少個字
for(i=0;i<=data_length;i )
{//---read hpic----the host polls the HPIC for HRDY=1 again
polltest=HPIC_R_F((*ss).hpi_mmap_start);
while((polltest&0x00000008)!=0x00000008)

dsp_data_hign_read_auto =HPID_R_F_A((*ss).hpi_mmap_start); //讀第一個半字。
dsp_data_low_read_auto =HPID_R_S_A((*ss).hpi_mmap_start); //第二個個半字
{(*ss).buffer [(i)]=(dsp_data_hign_read_auto&oxffff0000) (dsp_data_low_read_auto&0x0000ffff);
//數(shù)據(jù)拼接,放入結(jié)構(gòu)體,回傳給調(diào)用的用戶程序。
}
}
} //dev_hpi_read_auto(str_HPI *ss)
  
5 結(jié)束語

本文通過一個實(shí)例說明了如何實(shí)現(xiàn)在Linux操作系統(tǒng)下ARM體系結(jié)構(gòu)的處理器與DSP的數(shù)據(jù)通信。給出了接口部分的硬件處理和部分驅(qū)動程序。

在某款智能儀表的研發(fā)過程中,給出一個簡單的地址譯碼電路對二塊(或更多)DSP板進(jìn)行交替讀寫,并以自增讀方式進(jìn)行操作,當(dāng)ARM主頻為180MHz,DSP主頻為125MHz時,對DSP數(shù)據(jù)的讀寫速度可以達(dá)到每毫秒1k的32位字。


 

COPYRIGHT(C) 2011 廈門永宏亞得機(jī)電科技有限公司版權(quán)所有(閩ICP備05025945號) ALL RIGHTS RESERVED?

電話: 0592-5190891 傳真: 0592-5190720 E-Mail: E-mail:yade8895@163.com
地址: 廈門市海滄區(qū)興港六里17號2607室 郵編:361009 聯(lián)系人:翟先生