Linux驱动的开发与移值——为Tiny210加入AC97驱动Wm9713
上一篇文章《Linux驅(qū)動(dòng)的開發(fā)與移值——分析Tiny210的聲卡驅(qū)動(dòng)模塊》地址:http://blog.csdn.net/koy0755/article/details/7341704
提到了Tiny210開發(fā)板并沒有提供WM8960的驅(qū)動(dòng)源代碼,我接下來有兩個(gè)事情可以做
一、編寫WM8960的源代碼。
二、嘗試給TINY210增加AC97芯片WM9713的代碼,讓TINY210可以與TINY6410的底析兼容(我把內(nèi)核做好后才發(fā)現(xiàn)了這是不可能兼容的,文章最后會說明原因)。
因?yàn)榈诙c(diǎn)可以無需為內(nèi)核增加代碼,所以我在這里就先發(fā)布這個(gè)過程序了。
準(zhǔn)備工作——了解內(nèi)核的文件組織
Tiny210配套提供的內(nèi)核中,其實(shí)已經(jīng)包含了所有Ac97聲音驅(qū)動(dòng)的內(nèi)容,這些內(nèi)容在如下文件中:
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
我給文件編了號以方便說明它們的作用和重點(diǎn):
1號文件,定義著聲卡所需的所有基本資源,例如:
? 1.1 static int s5pv210_ac97_cfg_gpio()這個(gè)函數(shù)用來配置AC97的引腳。
? 1.2 struct resource s5pv210_ac97_resource[]這個(gè)變量用來定義AC97要用到的內(nèi)存、DMA等資源。
? 1.3 struct platform_device s5pv210_device_ac97這個(gè)變量定義了一個(gè)名為"s3c-ac97"的平臺設(shè)備,用來加載引導(dǎo)ac97的平臺驅(qū)動(dòng)。
? 當(dāng)然,這文件里面還有一些I2S聲間設(shè)備的定義,這些跟I2S有關(guān),我這里不講它。
2號文件,定義了整個(gè)開發(fā)板最重要的平臺設(shè)備。
? 2.1 static struct platform_device *mini210_devices[]這個(gè)變量把整個(gè)開發(fā)板用到的平臺設(shè)都都定義在這個(gè)數(shù)組里了。
? 2.1.1我們留意一下大概1573行的位置有這樣的內(nèi)容:
#ifdef CONFIG_SND_S3C_SOC_AC97
? ? &s5pv210_device_ac97,
#endif
? 也就是說在編譯內(nèi)核時(shí),如果聲明了SND_S3C_SOC_AC97宏,內(nèi)核就會增加這個(gè)平臺設(shè)備。
? 2.2static void __init mini210_machine_init()這個(gè)函數(shù)里調(diào)用了platform_add_devices把平臺設(shè)備加載到內(nèi)核里。
3號文件是ac97設(shè)備的驅(qū)動(dòng)。
? 2.1第527行定義了一個(gè)平臺驅(qū)動(dòng):struct platform_driver s3c_ac97_driver。它的名稱是“s3c-ac97”。這跟我們的1號文件定義的平臺設(shè)備的中稱對應(yīng),因此內(nèi)核會用這個(gè)驅(qū)動(dòng)程序來驅(qū)動(dòng)1號文件定義的平臺設(shè)備。
4號文件是wm9713相關(guān)的文件,在/sound/soc/codec/這個(gè)目錄中針對不同的芯片有很多專門的codec,這些文件可以直接使用,與平臺無關(guān)。
5號文件是dam相關(guān)的操作,這里我們只關(guān)注聲卡驅(qū)動(dòng)可以先不管它。
6號文件就是把3、4號文個(gè)把組織成一個(gè)聲卡設(shè)備,并把聲卡作為一個(gè)名為"soc-audio"的平臺設(shè)備添加到內(nèi)核中。
? 6.1第56行,定義了平臺使用的聲音設(shè)備
? 6.2在70行,的int __init smdk_init()函數(shù)里把聲音設(shè)備增加到系統(tǒng)。
??
具體操作步驟
基本的思路清晰了,下面我們就開始通過簡單地修改幾個(gè)文個(gè)件,內(nèi)核中本來就包含了
/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文件,在最后面加入以下內(nèi)容:
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”這個(gè)宏定義,上面這個(gè)步驟能給內(nèi)核增加
/sound/soc/codec/wm9713.c
2、修改/sound/soc/s5pv2xx/MakeFile,在最后面加入以下內(nèi)容:
obj-$(CONFIG_SND_S3C_SOC_AC97)+= ../s3c24xx/s3c-ac97.o
obj-$(CONFIG_SND_S5PV2XX_SOC_WM9713)+=../s3c24xx/smdk_wm9713.o
上面這個(gè)步驟能給內(nèi)核增加
/sound/soc/s3c24xx/s3c-ac97.c
/sound/soc/s3c24xx/smdk_wm9713.c
3、重新配置內(nèi)核。
在內(nèi)核配置界面里,進(jìn)入Device Drivers --->Sound card support --->ALSA for SoC audio support --->
如下圖所示:
把SoC I2S Audio ...WM8960...的選項(xiàng)去掉,然后改用SoCAC97 Audio support for WM9713就可以了.
4、編譯內(nèi)核,大功告成。
我們的內(nèi)核需然做好了,但是我后來才發(fā)現(xiàn)tiny210的核心板的ac97功能與tiny6410并不兼容,因此還要對硬件進(jìn)行修改。
1、要把TINY210核心原中,P2針座的的29-31針與6410的底板斷來,因?yàn)門INY210的這些引腳是I2S0的功能。我是用另一個(gè)針座把這幾個(gè)腳拔掉,然后接到核心板上,然后再放到底板上的。如下圖所示:
2、TINY210把AC97的引腳放到了核心板正面的CON10排線座上了,我們要把這幾個(gè)引腳焊接到底板上對應(yīng)的AC97引腳,如下圖所示。
=======================================================================================
至此,可以把內(nèi)核燒到開發(fā)板,啟動(dòng)后就可以通過WM9713播放聲音了
總結(jié)
以上是生活随笔為你收集整理的Linux驱动的开发与移值——为Tiny210加入AC97驱动Wm9713的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSP-S 2019 游记【完结】
- 下一篇: windows下能读写linux分区的软