關於linux的音訊驅動

2021-04-21 20:31:39 字數 3508 閱讀 7584

為了實現

***sep4020

上完成了

i2s的驅動,主要經驗總結如下:

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) &= ~(l

3m|l

3c|l3d);

*(volatile unsigned long*)(gpio_portd_data_v) |= (l

3m|l

3c); //start condition : l

3m=h, l

3c=h

//以下配置可能需要修改

marked at 11-08

uda1341_l3_address(0x14 + 2);

uda1341_l3_data(0x61);//1110 dc-filtering

開不開無所謂

不能像三星的選成

msb

uda1341_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(0x

0f);//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_audio_fops

這個結構體主要實現了

i2s控制器的操作,包括讀寫,控制,查詢(

poll

),開啟,釋放等等。

audio

主要實現了接受上層應用資料,並將資料傳遞給

codec

codec

接受資料,並傳遞給上層的功能(錄音)。這部分中又以

write

,read

函式最為重要,

ioctl

可以沿用別人的,因此我們的主要工作也是集中在

write

,read

函式上。 而

sep4020_mixer_fops

則主要實現了對

codec

引數的配置,我們也可以很清晰的看到它的

operation

結構體中只有控制函式,沒有讀寫。並且由於

codec

的通用性,這部分的**基本上可以沿用別人的,如

2410。

3.

關於

sep4020_audio_write

函式:

這個是整個驅動的核心,也是難點,牽涉了

dma操作,

buffer ring

的思想,

linux

中訊號量的思想,明天繼續,今天累了,呵呵

關於linux的音訊驅動

1.首先是要在probe函式裡進行一系列的初始化,這些初始化對於i2s是很重要的,而且很多 配置操作codec的l3的gpio口線 l3介面相對於乙個混音器控制介面,也就是對應在驅動中的mixer結構體,在這裡我們需要利用3根gpio口線實現對l3的控制,以下是初始化 volatile unsign...

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