hpi_eonfig(){
/*init br3 8Lor3 HPI*/
memctrl_p一>meme_br3=0x80000401;
memctrl_p一>meme_or3=Oxffffof24;
:
/*映射為I/O內(nèi)存*/
v_addr=ioremap(AC483_REG_BASE,AC483_REG_LEN);
request_mem_region(AC483_REG_BASE.AC483.”AC483”);
:
接著對AC483進行初始化配置。AC483的操作模式順序為內(nèi)核文件下載模式、程序下載模式、初始化模式以及運行模式,如圖4所示。
對AC483初始化,就是要完成內(nèi)核下載、程序下載,以及初始化模式和空閑狀態(tài)下一些命令設(shè)置、參數(shù)設(shè)置,使AC483進入正常工作狀態(tài),即產(chǎn)生語音分組和接收來自主機的語音分組。這里由AC483_init()完成這些功能。
AC483_init(){
kernel_download(); /*內(nèi)核文件下載*/
program_download(); /*程序下載*/
setup_device(); /*初始化AC483的參數(shù)配置*/
setup_channel(); /*設(shè)置每個信道的參數(shù),共四個信道*/
:
}
以上對AC483的初始化配置可以放在open入口點函數(shù)中。
在內(nèi)核文件下載時,由于AC483還運行在10 MHz,所以此時對HPI口進行兩次讀或?qū)懼g要加入延時來滿足時序要求。
writeb(addr,value);
udelay(1);/*延時1 ms*/
writeb(addr,value);
udelay(1);/*延時1 ms*/
(2)服務(wù)于I/o請求的子程序
驅(qū)動程序的主要任務(wù)是在底層實現(xiàn)對硬件的讀寫,對AC483來說就是要從HPI口讀取和寫入語音包。系統(tǒng)進行read和write調(diào)用時,調(diào)用read和write入口點函數(shù),由用戶態(tài)進入核心態(tài)。由函數(shù)transmit_packet()和re—eeive_packet()實現(xiàn)語音包的寫入和讀取。語音包數(shù)據(jù)結(jié)構(gòu)的定義:
typedef struct{
packet_head_t packet_head,/*包頭*/
char payload[MAX_SIZE];/*載荷*/
}packet_t;
語音包頭數(shù)據(jù)結(jié)構(gòu)的定義:
typedef struct{
shortconstAA :8;
short const_0_0_13 :3 ;
short channel_id :5;
/*Word#1*/
short pay_load_size :8;
short packet_size :8;
/*Word#2*/
/*Word#7*/
}packet_head_t;
transmit_packet()和receive_packet()是根據(jù)語音包數(shù)據(jù)結(jié)構(gòu)中的packet_size字段,在HPI 口相應(yīng)的位置寫入或讀取packet_size長度的字節(jié)數(shù)。
(3)中斷服務(wù)子程序
使用中斷來進行處理,可以提高程序的實時性及運行效率。AC483每一個幀間隔就會產(chǎn)生一個語音包,就會產(chǎn)生一個中斷;MPC852T檢測到中斷后,將會調(diào)用中斷處理函數(shù)。在此中斷處理函數(shù)中,將會調(diào)用讀語音包函數(shù)來讀取HPI口中語音包,存人內(nèi)核空間的緩沖區(qū)中。使用下面兩個函數(shù)在系統(tǒng)中注冊和注銷中斷:
ret=request_8xxirq(dev一>irq,AC483_interrupt,0*
“AC483”,dev); /*申請中斷*/
free_irq(dev irq,dev);/*釋放中斷*/
對于中斷處理函數(shù),由于它運行在interrupt context,所以有許多限制,它必須盡可能快地執(zhí)行。這里使用tasklet來處理中斷。
在驅(qū)動程序中先聲明AC483_tasklet,并且指定函數(shù)
AC483_do_tasklet()作為tasklet的函數(shù):
void AC483_do_tasklet(unsigned long);
DECLARE_TASKLET(AC483_tasklet,AC483_do_tasklet.0);
然后在AC483_interrup()中斷處理函數(shù)中調(diào)度AC483_
tasklet:
tasklet_schedule(&AC483_tasklet);
在AC483_tasklet被調(diào)度后,它將盡可能快地被執(zhí)行,在AC483_do_tasklet()函數(shù)中,相應(yīng)AC483的中斷,讀取HPI口中的語音包!
結(jié) 語
本文介紹了一種語音分組處理器AC483與MPC852T的接口設(shè)計以及基于Linux的驅(qū)動程序?qū)崿F(xiàn)。經(jīng)過硬件電路的調(diào)試和驅(qū)動程序的測試,此語音分組處理器已應(yīng)用于我們開發(fā)的語音網(wǎng)關(guān)中。





