直播推薦
企業(yè)動態(tài)
- 東莞市皓天試驗設(shè)備有限公司召開線上技術(shù)會議 凝聚智慧共促技術(shù)升級
- 天津市投資促進(jìn)局、天津市建設(shè)銀行一行到訪國聯(lián)股份肥多多
- 山西省長治市屯留區(qū)區(qū)委書記牛海江一行到訪國聯(lián)股份肥多多
- 華為F5G-A萬兆全光園區(qū)方案用網(wǎng)速保障徐工動力的產(chǎn)速
- 迎風(fēng)筑基●初心如恒-2025年深圳市建筑電氣學(xué)術(shù)會議
- 皓天最新款 512L 冷熱沖擊試驗箱交付廣東某電子科技公司
- 銳呈網(wǎng)絡(luò)時鐘同步系統(tǒng)在中國石油寧夏石化公司成功投運(yùn)
- 同方威視CT安檢技術(shù)斬獲中國專利金獎,為全球跨境行包監(jiān)管提供“中國方案“
推薦展會
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)
{
(*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_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)行操作,因為映射已經(jīng)完成,對(*ss).hpi_mmap_start的操作就是對0x4000_0000起始的總線地址進(jìn)行操作,而DSP板HPI接口的控制線正是在這個位置。這樣就實現(xiàn)了物理地址和用戶空間的轉(zhuǎn)換。
4.4 用戶程序接口部分
下面以HPI接口讀寫中zui復(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)備妥。zui后從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。
另外,還有二點需要說明:
通過改變宏定義中的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)
{polltest=HPIC_R_F((*ss).hpi_mmap_start);
}
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)
{polltest=HPIC_R_F((*ss).hpi_mmap_start);
}
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é)束語
本文通過一個實例說明了如何實現(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位字。
免責(zé)聲明
- 凡本網(wǎng)注明"來源:智能制造網(wǎng)"的所有作品,版權(quán)均屬于智能制造網(wǎng),轉(zhuǎn)載請必須注明智能制造網(wǎng),http://www.xashilian.com。違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
- 企業(yè)發(fā)布的公司新聞、技術(shù)文章、資料下載等內(nèi)容,如涉及侵權(quán)、違規(guī)遭投訴的,一律由發(fā)布企業(yè)自行承擔(dān)責(zé)任,本網(wǎng)有權(quán)刪除內(nèi)容并追溯責(zé)任。
- 本網(wǎng)轉(zhuǎn)載并注明自其它來源的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品來源,并自負(fù)版權(quán)等法律責(zé)任。
- 如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
2025中國鄭州衡器與計量技術(shù)設(shè)備展覽會
展會城市:鄭州市展會時間:2025-11-07