摘 要:采用TOP-DOWN設計方法,在DE2開發平臺上完成音頻播放器設計。設計主要包括Nios Ⅱ軟核處理器、音頻控制器、I2C控制器和IDE接口等IP核構成的Nios Ⅱ系統,在此基礎上完成μClinux操作系統移植以及完成基于HAL層的音頻驅動器的驅動程序開發,最后用C語言在Nios Ⅱ系統上編寫應用程序進行測試。該實現方法即是下一代消費類電子發展的趨勢,也是集成電路發展的一個趨勢。
關鍵詞:SoPC;音頻控制器;HAL;系統移植
中圖分類號:TP311文獻標識碼:A
文章編號:1004-373X(2010)04-097-05
Design and Driver Development of Audio Player Based on Nios Ⅱ
FENG Xinyu,JIANG Hongbo,QI Hongyan
(Heilongjiang Institute of Science and Technology,Harbin,150027,China)
Abstract:Using TOP-DOWN design method to develop audio player in the DE2 platform.The system mainly consists of Nios Ⅱ soft-core processor,audio controller,I2C controller,IDE interface and other IP core.It completes the μClinux operating system transplantation and driver drives of HAL,using C language write test bench for it.The method is trend of the next generation of consumer electronics and IC.
Keywords:SoPC;audio controller;HAL;system transplantation
0 引 言
隨著集成電路的發展,嵌入式系統發生了深刻的變革,各種消費類電子產品、終端設備都采用了嵌入設計技術。SoPC技術[1]作為嵌入式系統的重要分支,最近兩年發展迅猛,使用軟核處理器的概念[2]更加明確,但目前市場上還沒有軟核控制器的產品。隨著軟核處理器的不斷成熟,軟核處理器必將應用在各種設備上,使得終端產品的價格也會因此而降低。在此,采用SoPC技術,設計了由Nios Ⅱ軟核處理器作為中央處理單元、開發音頻控制器及I2C控制器等IP核[3]構成的音頻播放器系統。在此基礎上,完成了μClinux操作系統移植及相應驅動程序開發,用C語言在該系統上編寫應用程序進行測試,實現了一個完整的音頻播放器功能。
1 系統的整體結構
在此使用的硬件開發平臺是DE2開發板,它是Altera公司針對大學教學以及研究機構推出的FPGA開發平臺。DE2平臺上提供的硬件資源有Altera CycloneⅡ系列的EP2C35F672C6;主動串行配置器件EPCS16U30;編程調試和用戶API設計的USB Blaster,支持JTAG模式和AS模式;512 KB SRAM;8 MB SDRAM;4 MB FLASH;SD卡接口;兩個板上時鐘源,50 MHz和27 MHz;24位音頻編解碼器等。音頻播放器的系統硬件框圖如圖1所示。
圖1 系統硬件框圖
在圖1中,處理器的工作由Nios Ⅱ軟核處理器完成;存儲器是存放音頻文件,DE2開發板外接了SD卡擴展口,該設計采用SD卡作為數據的存儲,音頻編解碼處理單元使用的是音頻編解碼芯片WM8731。
實現音頻播放器需要開發二個接口,一個是處理器控制WM8731的控制接口,WM8731有3線和2線兩種控制方式,在此采用的是兩線的I2C控制模式;第二個接口是音頻編解碼控制器接口,也是設計的核心重點,最后把這二個接口包裝成IP。IP與系統之間的互聯使用Avalon總線結構,與系統之間的關系[3]如圖2所示,其他IP由Altera公司免費提供。
圖2 SoPC Builde系統模塊
2 I2C控制模塊與音頻編解碼控制接口設計
2.1 I2C控制模塊接口設計
在I2C控制器中,輸入SCLK是I2C控制器的時鐘輸入,頻率為20 kHz,通過外部晶振分頻可以得到。WM8731總線接口時序如圖3所示。
圖3 WM8731 I2C總線控制時序
WM8731控制接口采用兩線接口模式,起始條件是SDIN為下降沿而SCLK為上升沿的時刻。接下來的7位是設備地址,確定使用哪一個設備(這里使用就是WM8731),之后一位為確定數據的傳輸方向,0說明為寫狀態。設備在第9個時鐘周期通過SDIN,它為低電平態,用于確定寄存器地址和讀/寫控制,應答數據傳輸(ACK,一共需要3個應答信號)。B[15:8]包括了要控制的寄存器地址,B[7:0]包含的是數據信息。結束條件是傳輸數據后SDIN和SCLK均為高電平。
由時序圖和WM8731芯片的具體控制過程得知,I2C控制器每次傳輸24 b數據,前8 b是從設備地址,接下來的8 b是從設備寄存器地址,最后8 b是數據,但是WM8731的寄存器地址是7 b,數據是9 b。所以實際傳輸時,從設備寄存器地址的最后一位為數據的最高位,即第9 b。
I2C控制器使用33個I2C時鐘周期,完成1次傳輸24 b數據,第一個時鐘周期用于初始化控制器,第2,3個周期用于啟動傳輸,第4~30個周期用于傳輸數據。其中,包括3個ACK信號,最后3個時鐘周期用以停止傳輸。控制器中使用了一個6 b計數器對傳輸周期計數。在開始傳輸之前和結束傳輸之后,總線的時鐘信號應該保持高電平,并且起始條件和結束條件由I2C的兩個信號共同配合完成。
I2C傳輸一次數據的控制流程如圖4所示。結合WM8731 I2C總線控制時序圖,SD0為控制器發送的串行數據,END為傳輸結束標志。當復位信號為有效電平時,發送計數器置為6′b111111,因為當計數器值為32時,I2C控制總線停止傳輸數據;當復位電平無效時,計數器賦值為0,等待數據傳輸開始標志。當傳輸標志有效時,計數器開始計數,完成I2C控制器數據傳輸的控制功能,計數同時對計數器的值進行判斷。當計數器值為0(第1個時鐘周期)時,對控制器進行初始化;當計數器為值1和2時,啟動傳輸,依次類推,與控制時序完全對應。
圖4 音頻控制器程序流程圖
2.2 I2C配置模塊
I2C配置模塊是通過例化I2C控制模塊完成對WM8731內部11個寄存器包括工作模式、采樣率、音量等參數的設定。WM8731的寄存器以及參數值設置如表1所示。
表1 WM8731的寄存器參數設置
寄存器地址設置參數值寄存器地址設置參數值
00H1AH0AH06H
02H1AH0CH00H
04H7BH0EH01H
06H7BH10H02H
08HF8H12H01H
配置數據指通過查表的方式對數據進行配置。從表中可以看出,數據為16 b,包括寄存器地址和寄存器數據。
最后,把用Verilog代碼編寫的I2C控制器模塊程序,利用SoPC Builder工具進行包裝,用IP的形式連接到系統的Avalon總線上。I2C控制功能所需的Avalon總線信號類型、傳輸方向及接口名稱如表2所示。
2.3 音頻編解碼控制接口設計
音頻控制模塊主要是完成對音頻編解碼芯片WM8731的接口控制。在接口的拓撲結構中,從端口需要接收或者發送音頻數據,因而需要加一個音頻控制器,負責數據的傳輸。Nios Ⅱ把音頻控制器中的數據送給WM8731的數據接收引腳DACDAT,可以完成音頻的播放。同理,錄音過程也需要在WM8731中完成ADC轉換后,通過音頻控制器送給Nios Ⅱ處理。這里主要是一個音頻控制器和Avalon總線之間的相互通信,圖5為接口拓撲結構。
表2 I2C信號和Avalon接口信號類型
信號名稱方向位寬/b描述
Avalon接口信號
iCLKinput1時鐘
iRST_Ninput1復位信號
I2C_SCLKinput1總線時鐘信號
I2C_SDATbidir1數據信號
圖5 接口拓撲結構
Nios Ⅱ處理器與WM8731之間的數據交換要求音頻控制器功能包括FIFO單元、數據并入串出轉換模塊、位時鐘發生器模塊、數據鎖存模塊等,音頻控制器結構模塊如圖6所示。
圖6 音頻控制器結構模塊圖
通過外部晶振分頻為音頻控制器提供一個WM8731所需的18 MHz工作頻率,這個頻率從引腳oAUD_XCK(WM8731主時鐘)輸出,數字音頻位時鐘(oAUD_BCK),left/right 采樣時鐘(oAUD_LRCK)都是從18 MHz經過分頻處理得到。其中,oAUD_BCK信號頻率為3 MHz;oAUD_LRCK信號頻率為96 kHz,FIFO接收的數據經過鎖存器控制后送到并入串出模塊,這時信號可以直接給音頻編解碼芯片來使用。音頻控制器端口信號如表3所示。
最后還是利用SoPC Builder將編寫好的音頻控制器中Verilog代碼封裝成IP,在使用時調用即可。
表3 音頻接口信號和Avalon接口信號類型
信號名稱方向位寬/b
Avalon接口信號
iRST_ninput1
iDATA[15:0]input16
iWR_CLKinput1
iCLK_18_4input1
iWRinput1
輸出信號
oAUD_DATAoutput1
oDATAoutput16
oAUD_BCKoutput1
oAUD_XCKoutput1
oAUD_LRCKoutput1
3 操作系統移植
操作系統移植的實驗環境為PC上采用虛擬機的方法來訪問Linux系統,Linux操作系統使用的是Red Hat Enterprise 4 AS。在這個環境下進行系統移植[4,5],需要下載一些Nios Ⅱ開發工具,如下:
(1) nios2gcc.tar.bz2:nios2gcc交叉編譯工具;
(2) μClinux-dist-20070130-nios2-02.diff.gz μClinux源代碼包;
(3) μClinux-dist-20070130-nios2-02.diff.gz μClinux補丁。
系統移植主要設計問題有bootloader配置、內核配置和文件系統的配置。
μClinux系統的日益完善,現行大部分操作系統移植屬于板級移植,即所用的處理器已經被μClinux支持,板級移植需要修改或添加linux/arch/Nios2 nommu/scripts目錄中的文件,該目錄中主要是與具體硬件平臺相關的配置,可以利用Nios Ⅱ自帶的SoPC Builder軟件生成具體平臺對應的配置文件[6,7]。但具體的細節略有不同。這里重點要修改兩個文件:altera.c和dm9000x.c。altera.c文件主要是文件本身默認的存儲單元,其大小與實際的開發板略有出入,把默認的的寄存器大小改為與開發板一致即可。第二個要修改的文件dm9000x.c,將其中的na_dm9000全部改為na_DM9000A,保存后退出。內核的配置與一般μClinux內核配置過程基本相同,配置好后,保存,重新編譯。最后可在make生成所需要的內核,把編譯好的內核文件通過jtag下載到系統中,得到如圖7所示的啟動界面,它表明系統啟動成功,可以對其進行一般Linux的系統操作。
4 音頻驅動程序的編寫
設備驅動程序可以使用模塊的方式動態地加載到內核中去。它們之間的關系如圖8所示。
設備注冊:設備注冊使用函數register_chrdev,調用后函數就可以向系統申請主設備號,如果register_chrdev操作成功,設備名就會出現在/proc/devices文件里。設備注冊需要的頭文件為fs.h,具體的各個形式參數意義與注冊函數的形參相同[8],若函數返回值為0,說明關閉設備成功,否則返回-1。
圖7 系統啟動界面
圖8 設備驅動程序流程圖
I/O設備的讀/寫:在PIO設備寄存器范圍內使用結構體變量訪問使用和分配PIO設備,可以提高驅動程序的開發效率。-linux-2.6.x/include/asm-nios2nommu/pio_struct.h中定義了np_pio結構體,如下:
typedef volatile struct
{
int np_piodata;
int np_piodirection;
int np_piointerruptmask;
int np_pioedgecapture;
}np_pio;
I/O內存分配和映射:在使用之前,必須首先分配I/O內存區域[9,10](memory region)的接口。該設計的設備驅動程序申請內存區域可以被定義為:
request_mem_region((unsigned long)WM8731_BASE,sizeof(np_pio),\"de2_wm8731\");
該函數從WM8731_BASE開始分配sizeof(np_pio)長的內存區域。如果成功,返回非NULL指針;否則返回NULL值。
設備操作:假定設備文件代表物理設備,這些物理設備一些用作輸入,一些用作輸出。因此,在內核中驅動程序對于輸出設備可以通過打開設備文件對它寫操作,就像寫一個文件,也可以通過打開設備完成如讀設備等操作,最后關閉文件,這些操作在file_operation結構體[5]中定義。
5 測 試
對驅動程序的驗證主要是通過幾個應用程序實現的。在μClinux里,驅動程序的編寫是在IDE里完成的,編譯通過后,與μClinux一起下載到開發板上進行測試。當驅動程序加載到系統后,首先查看設備是否被加載上,利用命令查看設備號,確認設備是否被掛載上,在提示符后面,所用命令為:
mount –n –t proc proc /proc
cat /proc/devices
顯示信息為:
Character devices:
1 men
2 pty
…
243 de2_wm8731
可以看出設備de2_wm8731已經被加載,其設備號為243。
5.1 在IDE中編寫應用程序
編寫應用程序的方法與普通C編程相同,主要是把音樂數據送到音頻控制器音頻數據接口,這里播放的是WAV格式的音頻文件。由于受到存儲空間的限制,首先要將WAV文件轉換成十進制文件(二,八進制亦可),選取其中的很小一段,以數組的形式放到應用程序里,這些數組中存放的就是音頻測試數據。
5.2 把WAV文件轉換成十進制數據的方法
當音頻控制器不在μClinux操作系統下播放音頻數據時,而是通過存儲媒質(如SD卡)播放的,則可以把從buffer里讀出的數據以十進制的方式打印出來,主要程序代碼為:
while(1)
{ SD_read_lba(Buffer,j,1);
printf(\"{\");
while(i<512)
{ if(!IORD(WM8731_BASE,0))
{ Tmp1=(Buffer[i+1]<<8)|Buffer[i];
printf(\",%d\",Buffer[i]);
IOWR(WM8731_BASE,0,Tmp1);
i+=1;
}
}
printf(\"},\");
這樣就把音頻數據以下列十進制形式打印出來:
37,255,52,255,38,0,84,255,94,0,119,255,148,0,157,255,202,0,196,255,255,0,238,255[HJ1〗
5.3 應用程序編譯
編譯應用程序需要編寫一小段makefile文件。這里把其他應用程序的makefile拷貝過來進行修改使用,該驗證把系統中自帶的samples/hello/Makefile拷貝到應用程序testaudio工程中,然后修改Makefile。
Hello程序的Makefile文件主要程序段為:
DEBUG = 1
PROJ_NAME = hello
INSTALL_DIR =
PROGS :=$(PROJ_NAME).exe
CFLAGS +=
#
# You should not need to modify anything beyond this point
#
TOPDIR = ..
include $(TOPDIR)/Rules.mak
修改的方法為:
將Debug = 1 改為 Debug = 0
將PROJ_NAME =hello 改為 PROJ_NAME = testaudio
將TOPDIR = ..改為 TOPDIR = .
在include $(TOPDIR)/Rules.mak 前面加上 include $(TOPDIR)/Settings.mak
完成修改后,在工程中單擊右鍵,選擇Create Make Target,這時生成testaudio.exe文件,將其拷貝到文件系統里的bin文件夾下,再對文件系統進行編譯,此后文件系統的/bin中就含有testaudio.exe程序。這時在μClinux下運行該應用程序即可。
其他驅動程序,如顯示、按鍵和LED采用類似的方法編寫測試程序,再向相應的數據緩沖區內寫數據,這些數據都可以在相應終端看到,且可以實現相應的功能,驅動成功。
6 結 語
這里主要是將嵌入式眾多技術中發展比較快的FPGA,SoPC、嵌入式操作系統等有機結合起來,利用DE2開發平臺,主要完成以下幾方面工作:
(1) 對DE2開發平臺功能模塊進行劃分,掌握其開發平臺特性、使用方法,及SoPC系統設計過程、Avalon總線規范和使用方法;
(2) 掌握音頻編解碼芯片的工作原理, 完成其接口設計, 主要包括控制接口和音頻數字接口兩部分,并結合第三方IP,完成基于Nios Ⅱ音頻系統的FPGA的設計;
(3) 研究嵌入式操作系統相關知識,完成μClinux系統中基于Nios Ⅱ硬件平臺的移植工作;
(4) 研究嵌入式驅動程序的基本方法,完成音頻驅動程序的設計和調試。實現音頻驅動程序的功能,可以正常播放音頻文件。
參考文獻
[1]李蘭英.Nios Ⅱ嵌入式軟核SoPC設計原理及應用[M].北京:北京航空航天大學出版社,2006.
[2]Deng Qingxu,Xu Hai.An Embedded SoPC System using Automation Design[A].International Conference on Parallel Processing[C].IEEE Computer Society,2005:232-239.
[3]張春生.面向SoPC的IP核設計與IP復用技術研究[D].長沙:國防科技大學,2006.
[4]ChinChen Chang,YungChen Chou.High Payload Data Embedding with Hybrid Strategy[J].Intelligent Information Hiding and Multimedia Signal Processing,2007,1:505-508.
[5]Chen M C,Fang Y J,Zhang D H.Development of an Embedded Industrial Vision System[A].2006 1st IEEE Conference,Industrial Electronics and Applications[C].Singapore,2006:1-4.
[6]Yingshieh Kung,Guashieh Shu.Development of a FPGA-based Motion Control IC for Robot Arm[A].IEEE International Conference on Industrial Technology[C].IEEE Computer Society,2005:1 397-1 402.
[7]Onatban Corbet,Alessandro Rubini,Greg Kroab Hartman.Linux Device Driver[M].3版.魏永明,譯.北京:中國電力出版社,2006.
[8]蔡偉綱.Nios Ⅱ軟件架構解析[M].西安:西安電子科技大學出版社,2007.
[9]Tam Nguyen,Zaliznyak.Architecture and Methodology of a SoPC with 3.25Gbps CDR Based SERDES and 1Gbps Dynamic Phase Alignment[A].Custom Integrated Circuits Confe-rence[C].IEEE Computer Society,2003:659-662.
[10]Kuan Jen Lin,Chuang Hsiang Huang.Design and Implementation of a Schedulable DMAC on an AMBA-Based SoPC Platform[A].IEEE Asia Pacific on Conference Circuits and Systems[C].IEEE Computer Society,2005:279-282.