sep4020上完成了i2s的驅動

2021-05-27 21:15:05 字數 2856 閱讀 8300

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

開不開無所謂 不能像三星的選成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(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中訊號量的思想,明天繼續,今天累了,呵呵

I2S與pcm的區別

i2s僅僅是pcm的乙個分支,介面定義都是一樣的,i2s的取樣頻率一般為44.1khz和48khz做,pcm取樣頻率一般為8k,16k。有四組訊號 位時鐘訊號,同步訊號,資料輸入,資料輸出.i2s inter ic sound bus 是飛利浦公司為數字音訊裝置之間的音訊資料傳輸而制定的一種匯流排標...

I2S與pcm的區別

i2s僅僅是pcm的乙個分支,介面定義都是一樣的,i2s的取樣頻率一般為44.1khz和48khz做,pcm取樣頻率一般為8k,16k。有四組訊號 位時鐘訊號,同步訊號,資料輸入,資料輸出.i2s inter ic sound bus 是飛利浦公司為數字音訊裝置之間的音訊資料傳輸而制定的一種匯流排標...

I2S與pcm的區別

i2s僅僅是pcm的乙個分支,介面定義都是一樣的,i2s的取樣頻率一般為44.1khz和48khz做,pcm取樣頻率一般為8k,16k。有四組訊號 位時鐘訊號,同步訊號,資料輸入,資料輸出.i2s inter ic sound bus 是飛利浦公司為數字音訊裝置之間的音訊資料傳輸而制定的一種匯流排標...