| 作者:哈爾濱工業(yè)大學(xué) 李陽 郭士增 王彬 摘 要:在IP語音網(wǎng)關(guān)中,語音分組處理器負(fù)責(zé)把PCM碼流轉(zhuǎn)化成分組的語音數(shù)據(jù)包。本文介紹AudioCodes公司的語音分組處理囂AC4830xC-C與MPC852T的接口設(shè)計(jì),以及基于嵌入式Linux的驅(qū)動程序的實(shí)現(xiàn)。 關(guān)鍵詞:AC4830xC-C MPC852T HPI 語音網(wǎng)關(guān) 引 言 AudioCodes公司的語音分組處理器AC4830xC-C(簡稱AC483)是一個單芯片系統(tǒng)。它提供可配置的、低比特率的語音壓縮和傳真/數(shù)據(jù)中繼功能;可以提供高達(dá)四個獨(dú)立的語音、傳真/數(shù)據(jù)通道;廣泛應(yīng)用于1P語音網(wǎng)關(guān)等語音接入設(shè)備中。在研制的IP語音網(wǎng)關(guān)中,AC483通過PCM接口接收來自PCM編解碼器數(shù)字化的語音輸入,然后把64 kb/s的語音信號壓縮成低比特率的語音分組,通過HPI接口交給主處理器MPC852T處理;主處理器MPC852T通過HPI接口把語音分組交給AC483處理,它把語音分組解壓成64 kb/s的PCM碼流,然后通過PCM接口送給PCM編解碼器,如圖1所示。  在此項(xiàng)目中,MPC852T嵌入式處理器與AC483HPI接口設(shè)計(jì)以及驅(qū)動程序,是兩個主要的攻關(guān)點(diǎn)! 1 MPC852T與AC483的HPl接口設(shè)計(jì) MPC852T處理器是MPC866系列的一款低成本的通信處理器,其工作在52 MHz,通過其集成在系統(tǒng)接口單元中的存儲器控制器來控制外部存儲體,最多可以控制8個存儲體。這里把。HPI口看作MPC852T的一個存儲體(bank),通過訪問HPI口的3個16位寄存器(地址寄存器HPIA、數(shù)據(jù)寄存器HPII)和控制寄存器HPIC),來訪問AC483HPI接口的2K字的RAM空間。如圖2所示,選擇CS3作為HPl口的片選信號,OE和WE0分別為讀寫使能控制信號。由于HPI口為8位數(shù)據(jù)寬度,所以選擇D0~D7。這里應(yīng)該注意,MPC852T處理器為PowerPC架構(gòu),為BIG ENDIAN模式,最高有效位和最低有效位應(yīng)該倒置!  最后通過A28~A31四位地址線來選擇3個寄存器,并對3個寄存器的高低字節(jié)進(jìn)行讀寫控制。HPI口寄存器選擇如表1所列。  訪問時可進(jìn)行如下定義: #define HPIC_WRlTE_LOW 0x80000000 /*寫控制寄存器的低字節(jié)*/ #define HPIC_WRITE_HlGH 0x80000001 /*寫控制寄存器的高字節(jié)*/ #define HPIC_READ_LOW 0x80000002 /*讀控制寄存器的低字節(jié)*/ #define HPIC_READ_HIGH 0x80000003 /*讀控制寄存器的高字節(jié)*/ 在CPU通過HPI口連接DSP時,應(yīng)特別注意時序匹配問題。這里,通過正確設(shè)置MPC852T的寄存器來解決這個問題。選用MPC852T的GPCM方式控制HPI口寄存器,所以只要設(shè)置好相應(yīng)的基本寄存器BR和選擇寄存器OR就可以了。圖3所示的時序,主要要求以下幾點(diǎn): ◆@要求HRS、HI/LO有效要在HCS下降沿前最少10 ns; ◆@要求HCS為低的持續(xù)時間要大于30 ns; ◆@要求HCS的循環(huán)時間,即一個HCS的上升沿到下一個HCS的上升沿,在AC483的時鐘為10 MHz時,要大于500 ns,100 MHz時,要大于50 ns! 考慮到MPC852T的時鐘為52 MHz,所以設(shè)置MPC852T的CS3延遲半個周期(約為10 ns),等待周期設(shè)為2個,即可大于30 ns;而時序要求的第3條中的500 ns可通過軟件延時來滿足(僅在AC483引導(dǎo)時)。最后可以設(shè)置MPC852T的存儲器控制寄存器:基本寄存器BR3=0x80000401;選擇寄存器OR3=0xffffof24!  2 驅(qū)動程序的實(shí)現(xiàn) 本項(xiàng)目所采用的操作系統(tǒng)是開源的嵌入式Linux操作系統(tǒng)。Linux操作系統(tǒng)下的驅(qū)動程序和其他操作系統(tǒng)下的驅(qū)動程序有很大區(qū)別。它把設(shè)備分為字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。所有設(shè)備都看成普通文件,因此可以通過用操縱普通文件相同的系統(tǒng)調(diào)用來打開、關(guān)閉、讀取和寫入設(shè)備。系統(tǒng)中每個設(shè)備都用一種特殊設(shè)備文件來表示。這里把AC483看作一個字符設(shè)備。 在IAnux中,設(shè)備驅(qū)動程序是一組相關(guān)函數(shù)的集合。它包含設(shè)備服務(wù)子程序和中斷處理程序,每個設(shè)備服務(wù)子程序只處理一種設(shè)備或者緊密相關(guān)的設(shè)備。其目的就是從與設(shè)備無關(guān)的軟件中接受抽象的命令并執(zhí)行。當(dāng)執(zhí)行一條請求時,具體操作是根據(jù)控制器驅(qū)動程序提供的接口,并利用中斷機(jī)制去調(diào)用中斷服務(wù)子程序配合設(shè)備來完成這個請求。設(shè)備程序利用結(jié)構(gòu)file_operations與文件系統(tǒng)聯(lián)系起來。 struct file_operations AC483_fops={ owner;THIS_MODULE, read:AC483_read, write:AC483_write, ioctl:AC483_ioetl, open:AC483_open. release:AC483_release, }; 設(shè)備驅(qū)動程序主要分為3個組成部分。 (1)自動配置和初始化子程序 先在驅(qū)動程序hpi_config()中配置HPI接口,配置MPC852T的初始化寄存器與選擇寄存器,把0x80000000到0x8000000f的16個地址分配給HPI接口的3個寄存器。這里把這3個寄存器映射為I/O內(nèi)存,由于Linux使用MPC852T的MMU單元,MMU控制物理地址到虛擬地址的轉(zhuǎn)換,所有對I/O存儲器物理地址的操作都必須先在MMU中注冊,并返回虛擬地址,通過虛擬地址訪問物理地址。Linux提供2個讀寫函數(shù)unsigned readb(ad—dress);void writeb(unsigned value,address)來對3個寄存器進(jìn)行讀寫訪問。 |