歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux驅動的開發與移值——為Tiny210加入AC97驅動Wm9713

Linux驅動的開發與移值——為Tiny210加入AC97驅動Wm9713

日期:2017/3/1 9:48:17   编辑:Linux編程

文章目的:記錄聲卡驅動開發的學習過程,本文只是講解了聲卡驅動開發過程中的驅動的基本文件體系結構,暫沒有對內核增加新的代碼。通過簡單的修改配置,讓Tiny210具備Ac97的驅動,兼容Tiny6410的聲卡芯片Wm9713。

上一篇文章《Linux驅動的開發與移值——分析Tiny210的聲卡驅動模塊》地址:http://www.linuxidc.com/Linux/2014-02/96929.htm

提到了Tiny210開發板並沒有提供WM8960的驅動源代碼,我接下來有兩個事情可以做

一、編寫WM8960的源代碼。

二、嘗試給TINY210增加AC97芯片WM9713的代碼,讓TINY210可以與TINY6410的底析兼容(我把內核做好後才發現了這是不可能兼容的,文章最後會說明原因)。

因為第二點可以無需為內核增加代碼,所以我在這裡就先發布這個過程序了。

准備工作——了解內核的文件組織

Tiny210配套提供的內核中,其實已經包含了所有Ac97聲音驅動的內容,這些內容在如下文件中:
1、/arch/arm/mach-s5pv210/dev-audio.c
2、/arch/arm/mach-s5pv210/mach-mini210.c
3、/sound/soc/s3c24xx/s3c-ac97.c
4、/sound/soc/codec/wm9713.c
5、/sound/soc/s5pv2xx/s3c-dma.c
6、/sound/soc/s3c24xx/smdk_wm9713.c


我給文件編了號以方便說明它們的作用和重點:
1號文件,定義著聲卡所需的所有基本資源,例如:
1.1 static int s5pv210_ac97_cfg_gpio()這個函數用來配置AC97的引腳。
1.2 struct resource s5pv210_ac97_resource[]這個變量用來定義AC97要用到的內存、DMA等資源。
1.3 struct platform_device s5pv210_device_ac97這個變量定義了一個名為"s3c-ac97"的平台設備,用來加載引導ac97的平台驅動。
當然,這文件裡面還有一些I2S聲間設備的定義,這些跟I2S有關,我這裡不講它。

2號文件,定義了整個開發板最重要的平台設備。
2.1 static struct platform_device *mini210_devices[]這個變量把整個開發板用到的平台設都都定義在這個數組裡了。
2.1.1我們留意一下大概1573行的位置有這樣的內容:

#ifdef CONFIG_SND_S3C_SOC_AC97
&s5pv210_device_ac97,
#endif

也就是說在編譯內核時,如果聲明了SND_S3C_SOC_AC97宏,內核就會增加這個平台設備。
2.2static void __init mini210_machine_init()這個函數裡調用了platform_add_devices把平台設備加載到內核裡。


3號文件是ac97設備的驅動。
2.1第527行定義了一個平台驅動:struct platform_driver s3c_ac97_driver。它的名稱是“s3c-ac97”。這跟我們的1號文件定義的平台設備的中稱對應,因此內核會用這個驅動程序來驅動1號文件定義的平台設備。


4號文件是wm9713相關的文件,在/sound/soc/codec/這個目錄中針對不同的芯片有很多專門的codec,這些文件可以直接使用,與平台無關。


5號文件是dam相關的操作,這裡我們只關注聲卡驅動可以先不管它。


6號文件就是把3、4號文個把組織成一個聲卡設備,並把聲卡作為一個名為"soc-audio"的平台設備添加到內核中。
6.1第56行,定義了平台使用的聲音設備
6.2在70行,的int __init smdk_init()函數裡把聲音設備增加到系統。

具體操作步驟
基本的思路清晰了,下面我們就開始通過簡單地修改幾個文個件,內核中本來就包含了
/arch/arm/mach-s5pv210/dev-audio.c
/arch/arm/mach-s5pv210/mach-mini210.c
/sound/soc/s5pv2xx/s3c-dma.c


為了用最簡單的方法加入其它文件,我們還要做以下工作:
1、修改/sound/soc/s5pv2xx/Kconfig文件,在最後面加入以下內容:
config SND_S5PV2XX_SOC_WM9713
tristate "SoC AC97 Audio support for WM9713 on MINI210"
depends on SND_S5PV2XX_SOC
select SND_S3C_SOC_AC97
select SND_SOC_WM9713
help
Say Y if you want to add support for SoC audio on the MINI210.


我們看一看上面提到的2號文件的說明,所以一定要增加“SND_S3C_SOC_AC97”這個宏定義,上面這個步驟能給內核增加
/sound/soc/codec/wm9713.c


2、修改/sound/soc/s5pv2xx/MakeFile,在最後面加入以下內容:
obj-$(CONFIG_SND_S3C_SOC_AC97)+= ../s3c24xx/s3c-ac97.o
obj-$(CONFIG_SND_S5PV2XX_SOC_WM9713)+=../s3c24xx/smdk_wm9713.o


上面這個步驟能給內核增加
/sound/soc/s3c24xx/s3c-ac97.c
/sound/soc/s3c24xx/smdk_wm9713.c


3、重新配置內核。
在內核配置界面裡,進入Device Drivers --->Sound card support --->ALSA for SoC audio support --->
如下圖所示:


把SoC I2S Audio ...WM8960...的選項去掉,然後改用SoCAC97 Audio support for WM9713就可以了.


4、編譯內核,大功告成。


我們的內核需然做好了,但是我後來才發現tiny210的核心板的ac97功能與tiny6410並不兼容,因此還要對硬件進行修改。

1、要把TINY210核心原中,P2針座的的29-31針與6410的底板斷來,因為TINY210的這些引腳是I2S0的功能。我是用另一個針座把這幾個腳拔掉,然後接到核心板上,然後再放到底板上的。如下圖所示:

2、TINY210把AC97的引腳放到了核心板正面的CON10排線座上了,我們要把這幾個引腳焊接到底板上對應的AC97引腳,如下圖所示。

================================================================

至此,可以把內核燒到開發板,啟動後就可以通過WM9713播放聲音了

Copyright © Linux教程網 All Rights Reserved