1. 首先是要在probe函式裡進行一系列的初始化,這些初始化對於i2s是很重要的,而且很多
● 配置操作codec的l3的gpio口線;
l3介面相對於乙個混音器控制介面,也就是對應在驅動中的mixer結構體,在這裡我們需要利用3根gpio口線實現對l3的控制,以下是初始化**:
*(volatile unsigned long*)(gpio_portd_dir_v) &= ~(0xd<<1); //gpb[4:1]=00_0 output(l3clock):output(l3data):output(l3mode)
*(volatile unsigned long*)(gpio_portd_sel_v) |= (0xd<<1);
//gpd[4:1] 1 1010
● 配置埠為放音功能,因為sep4020只支援單獨放音和錄音,不能全雙工,因此我們在這裡配置為放音,是通過乙個口線置高置低實現的,具體**:
*(volatile unsigned long*)(gpio_portg_dir_v) &= ~(0x1<<11);
*(volatile unsigned long*)(gpio_portg_sel_v) |= 0x1<<11;
*(volatile unsigned long*)(gpio_portg_data_v) |= 0x1<<11;
● 配置pwm,實現對codec時鐘的供給:
*(volatile unsigned long*)pwm4_ctrl_v =0x00;
*(volatile unsigned long*)pwm4_div_v =0x4; //88mhz/(4*2)=11mhz 11m/256fs=42.96k
*(volatile unsigned long*)pwm4_period_v =0x2; //計數時鐘為匯流排的
div分頻
*(volatile unsigned long*)pwm4_data_v =0x1; //週期為兩個計數時鐘
*(volatile unsigned long*)pwm_enable_v =0x1<<3; //高電平為乙個計數時鐘
● 初始化codec(uda1341),實際這一步是和第一步配置控制l3口線一起的,配置好口線後,通過這些口線將codec的引數配置好,當然具體codec的引數要看uda1341的手冊,其中的uda1341_l3_address,uda1341_l3_data是單獨為其編寫的函式:
*(volatile unsigned long*)(gpio_portd_data_v) &= ~(l3m|l3c|l3d);
*(volatile unsigned long*)(gpio_portd_data_v) |= (l3m|l3c); //start condition : l3m=h, l3c=h
//以下配置可能需要修改
marked at 11-08
uda1341_l3_address(0x14 + 2);
uda1341_l3_data(0x61); //1110 dc-filtering開不開無所謂
不能像三星的選成
msbuda1341_l3_address(0x14 + 2);
uda1341_l3_data(0x21);
uda1341_l3_address(0x14 + 2);
uda1341_l3_data(0xc1); //status 1,gain of dac 6 db,gain of adc 0db,adc non-inverting,dac non-inverting,single speed playback,adc-off dac-on
uda1341_l3_address(0x14 + 0);
uda1341_l3_data(0x0f); //00,00 ffff : volume control (6 bits) -14db
uda1341_l3_address(0x14 + 0);
uda1341_l3_data(0x7b); //01,11 10,11 : data0, bass boost 18~24db, treble 6db
uda1341_l3_address(0x14 + 0);
uda1341_l3_data(0x83);
● 配置dma,主要實現了對dma通道的使能,清除中斷標誌位,具體對dma的緩衝區分配等會在使用dma之前的乙個dmasetup函式中實現,並且有對應的dmaclear清除緩衝區。
2. 音訊驅動的audio結構體,和mixer結構體
在音訊驅動中主要就是實現這兩個結構體的operation函式:
static struct file_operations sep4020_audio_fops = ;
static struct file_operations sep4020_mixer_fops = ;
而sep4020_mixer_fops則主要實現了對codec引數的配置,我們也可以很清晰的看到它的operation結構體中只有控制函式,沒有讀寫。並且由於codec的通用性,這部分的**基本上可以沿用別人的,如2410。
3. 關於sep4020_audio_write函式:
這個是整個驅動的核心,也是難點,牽涉了dma操作,buffer ring的思想,linux中訊號量的思想,明天繼續,今天累了,呵呵
**:
關於linux的音訊驅動
為了實現 sep4020 上完成了 i2s的驅動,主要經驗總結如下 1.首先是要在 probe 函式裡進行一系列的初始化,這些初始化對於 i2s是很重要的,而且很多 配置操作 codec的l3 的gpio 口線 l3介面相對於乙個混音器控制介面,也就是對應在驅動中的 mixer 結構體,在這裡我們需...
Linux音訊驅動 IIS匯流排標準
許多數字音訊系統正被引入消費者音訊市場,包括cd,磁帶,數字聲音處理器和數碼電視聲音。在這些系統中的數字音訊訊號需要由許許多多 very large scale integration 的ic組成,處理。在音訊系統中常見的ic晶元有 由於裝置和ic製造商眾多,所以需要乙個統一的規範來管理,這樣就可以...
linux 音訊驅動介紹(alas和oss的聯絡)
由於linux系統是乙個開源系統,所以linux系統能夠將新技術引入,也同時可以將某些子模組進行替換。alsa和oss都是linux聲音子系統。alsa為advanced linux sound architecture,oss為open sound system。alsa是linux核心2.6版本...