為了實現
***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版本...