關於linux的音訊驅動

2021-06-05 19:55:42 字數 2739 閱讀 2353

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版本...