📄 i2s_codec_jz4740.c
字号:
#include <jz4740.h>#define u8 unsigned char#define u16 unsigned short#define u32 unsigned intu16 codec_volume;u16 codec_base_gain;u16 codec_mic_gain;int HP_on_off_flag; static int HP_register_value; int IS_WRITE_PCM;void i2s_codec_clear(void){ REG_ICDC_CDCCR1 = 0x021b2302;}void i2s_codec_init(void){// REG_GPIO_PXFUNS(3) |= 0x007c0000;// REG_GPIO_PXSELS(3) |= 0x007c0000;// __gpio_as_aic(); REG_CPM_SCR &= 0x0fffffff; __i2s_internal_codec();// __i2s_as_slave();// __i2s_select_i2s(); REG_ICDC_CDCCR1 = 0x021b2303; //reset udelay(10); REG_ICDC_CDCCR1 = 0x021b2302; REG_ICDC_CDCCR2 = 0x00170803; HP_on_off_flag = 0;//HP is off}void i2s_codec_set_mic(u16 v) /* 0 <= v <= 100 */{ v = v & 0xff; if(v < 0) v = 0; if(v > 100) v = 100; codec_mic_gain = 31 * v/100; REG_ICDC_CDCCR2 = ((REG_ICDC_CDCCR2 & ~(0x1f << 16)) | (codec_mic_gain << 16));}void i2s_codec_set_bass(u16 v) /* 0 <= v <= 100 */{ v = v & 0xff; if(v < 0) v = 0; if(v > 100) v = 100; if(v < 25) codec_base_gain = 0; if(v >= 25 && v < 50) codec_base_gain = 1; if(v >= 50 && v < 75) codec_base_gain = 2; if(v >= 75 && v <= 100 ) codec_base_gain = 3; REG_ICDC_CDCCR2 = ((REG_ICDC_CDCCR2 & ~(0x3 << 4)) | (codec_base_gain << 4));}void i2s_codec_set_volume(u16 v) /* 0 <= v <= 100 */{ v = v & 0xff; if(v < 0) v = 0; if(v > 100) v = 100; if(v < 25) codec_volume = 0; if(v >= 25 && v < 50) codec_volume = 1; if(v >= 50 && v < 75) codec_volume = 2; if(v >= 75 && v <= 100 ) codec_volume = 3; REG_ICDC_CDCCR2 = ((REG_ICDC_CDCCR2 & ~(0x3)) | codec_volume);}u16 i2s_codec_get_bass(void){ u16 val; int ret; if(codec_base_gain == 0) val = 0; if(codec_base_gain == 1) val = 25; if(codec_base_gain == 2) val = 50; if(codec_base_gain == 3) val = 75; ret = val << 8; val = val | ret;}u16 i2s_codec_get_mic(void){ u16 val; int ret; val = 100 * codec_mic_gain / 31; ret = val << 8; val = val | ret;}u16 i2s_codec_get_volume(void){ u16 val; int ret; if(codec_volume == 0) val = 0; if(codec_volume == 1) val = 25; if(codec_volume == 2) val = 50; if(codec_volume == 3) val = 75; ret = val << 8; val = val | ret; return val;}void i2s_codec_set_channel(u16 ch){// i2s_codec_write(I2S_KEYCLICK_CONTROL, 0x4415);}void i2s_codec_set_samplerate(u16 rate){ unsigned short speed = 0; unsigned short val = 0; switch (rate) { case 8000: speed = 0; break; case 11025: speed = 1; break; case 12000: speed = 2; break; case 16000: speed = 3; break; case 22050: speed = 4; break; case 24000: speed = 5; break; case 32000: speed = 6; break; case 44100: speed = 7; break; case 48000: speed = 8; break; default: break; } REG_ICDC_CDCCR2 |= 0x00000f00; speed = speed << 8; speed |= 0xfffff0ff; REG_ICDC_CDCCR2 &= speed;}void actual_delay_msec(long delay_val){ udelay(delay_val*1000); }void HP_turn_on(void){ //see 1.3.4.1 REG_ICDC_CDCCR1 &= 0xfffffffc;//set suspend 0 actual_delay_msec(15); REG_ICDC_CDCCR1 &= 0xffecffff; REG_ICDC_CDCCR1 |= 0x01001000; actual_delay_msec(600); REG_ICDC_CDCCR1 &= 0xfff7ecff; actual_delay_msec(2); HP_register_value = REG_ICDC_CDCCR1; //see 1.3.4.2 /*REG_ICDC_CDCCR1 &= 0xfffffffc; mdelay(7); REG_ICDC_CDCCR1 |= 0x00040400; mdelay(15); REG_ICDC_CDCCR1 &= 0xfffbfbff; udelay(500); REG_ICDC_CDCCR1 &= 0xffe5fcff; REG_ICDC_CDCCR1 |= 0x01000000; mdelay(400); REG_ICDC_CDCCR1 &= 0xfffeffff; mdelay(7); HP_register_value = REG_ICDC_CDCCR1;*/ //see 1.3.4.3 }void HP_turn_off(void){ //see 1.3.4.1 actual_delay_msec(2); REG_ICDC_CDCCR1 = HP_register_value; REG_ICDC_CDCCR1 |= 0x001b0300; REG_ICDC_CDCCR1 &= 0xfeffffff; actual_delay_msec(15); REG_ICDC_CDCCR1 |= 0x00000002;//set suspend 1 //see 1.3.4.2 /*mdelay(4); REG_ICDC_CDCCR1 = HP_register_value; REG_ICDC_CDCCR1 |= 0x001b0300; REG_ICDC_CDCCR1 &= 0xfeffffff; mdelay(4); REG_ICDC_CDCCR1 |= 0x00000400; mdelay(15); REG_ICDC_CDCCR1 &= 0xfffffdff; mdelay(7); REG_ICDC_CDCCR1 |= 0x00000002;*/ //see 1.3.4.3}void in_codec_app1(void){ /* test is OK */ if(HP_on_off_flag == 0) { HP_on_off_flag = 1; HP_turn_on(); } REG_ICDC_CDCCR1 &= 0xc3ffbfff; REG_ICDC_CDCCR1 |= 0x03000000;// REG_ICDC_CDCCR2 = 0x00170803;}void in_codec_app2(void){ /* test is OK */ if(HP_on_off_flag == 0) { HP_on_off_flag = 1; HP_turn_on(); } REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 | (1 << 29) | (1 << 27 ) | (1 << 25) | (1 << 24); REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 & ~(1 << 28) & ~(1 << 26) & ~(1 << 14); //REG_ICDC_CDCCR2 = 0x00170803;}static void in_codec_app3(void){ /* test is OK */ if(HP_on_off_flag == 0) { HP_on_off_flag = 1; HP_turn_on(); } REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 | (1 << 28) | (1 << 27 ) | (1 << 25) | (1 << 24); REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 & ~(1 << 29) & ~(1 << 26) & ~(1 << 14); //REG_ICDC_CDCCR2 = 0x00170803;}static void in_codec_app4(void){ /* test is OK */ if(HP_on_off_flag == 0) { HP_on_off_flag = 1; HP_turn_on(); } REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 | (1 << 29) | (1 << 28) | (1 << 27 ) | (1 << 25) | (1 << 24); REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 & ~(1 << 26) & ~(1 << 14); //REG_ICDC_CDCCR2 = 0x00170803;}static void in_codec_app5(void){ /* wait to be test */ if(HP_on_off_flag == 0) { HP_on_off_flag = 1; HP_turn_on(); } REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 | (1 << 28) | (1 << 26) | (1 << 25) | (1 << 24); REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 & ~(1 << 29) & ~(1 << 27) & ~(1 << 14); //REG_ICDC_CDCCR2 = 0x00170803;}static void in_codec_app6(void){ /* test is OK */ if(HP_on_off_flag == 0) { HP_on_off_flag = 1; HP_turn_on(); } REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 | (1 << 29) | (1 << 27); REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 & ~(1 << 28) & ~(1 << 26) & ~(1 << 25) & ~(1 << 24) & ~(1 << 14); //REG_ICDC_CDCCR2 = 0x00170803;}static void in_codec_app7(void){ /* test is OK */ if(HP_on_off_flag == 0) { HP_on_off_flag = 1; HP_turn_on(); } REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 | (1 << 29) | (1 << 26) | (1 << 14); REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 & ~(1 << 28) & ~(1 << 27) & ~(1 << 25) & ~(1 << 24); //REG_ICDC_CDCCR2 = 0x00170803;}static void in_codec_app8(void){ /* test is wrong */ if(HP_on_off_flag == 1) { HP_on_off_flag = 0; HP_turn_off(); } REG_ICDC_CDCCR1 &= ~(1 << 1); udelay(7000); REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 | (1 << 29) | (1 << 26); REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 & ~(1 << 28) & ~(1 << 24); //REG_ICDC_CDCCR2 = 0x00170803;}static void in_codec_app9(void){ /* test is OK */ if(HP_on_off_flag == 0) { HP_on_off_flag = 1; HP_turn_on(); } REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 | (1 << 29) | (1 << 27) | (1 << 26); REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 & ~(1 << 28) & ~(1 << 25) & ~(1 << 24) & ~(1 << 14); //REG_ICDC_CDCCR2 = 0x00170803;}static void in_codec_app10(void){ /* test is OK */ if(HP_on_off_flag == 0) { HP_on_off_flag = 1; HP_turn_on(); } REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 | (1 << 28) | (1 << 27); REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 & ~(1 << 29) & ~(1 << 26) & ~(1 << 25) & ~(1 << 24) & ~(1 << 14); //REG_ICDC_CDCCR2 = 0x00170803;}void in_codec_app11(void){ /* test is OK */ if(HP_on_off_flag == 0) { HP_on_off_flag = 1; HP_turn_on(); } REG_ICDC_CDCCR1 |= 1 << 28; REG_ICDC_CDCCR1 |= 1 << 26; REG_ICDC_CDCCR1 |= 1 << 14; REG_ICDC_CDCCR1 &= ~(1 << 29); REG_ICDC_CDCCR1 &= ~(1 << 27); REG_ICDC_CDCCR1 &= ~(1 << 25); REG_ICDC_CDCCR1 &= ~(1 << 24); //REG_ICDC_CDCCR2 = 0x00170823;}void in_codec_app12(void){ /* test is OK */ if(HP_on_off_flag == 1) { HP_on_off_flag = 0; HP_turn_off(); } REG_ICDC_CDCCR1 &= ~(1 << 1); udelay(7000); REG_ICDC_CDCCR1 |= 1 << 28; REG_ICDC_CDCCR1 |= 1 << 26; REG_ICDC_CDCCR1 &= ~(1 << 29); REG_ICDC_CDCCR1 &= ~(1 << 24); //REG_ICDC_CDCCR2 = 0x00170823;}void in_codec_app13(void){ /* test is OK */ if(HP_on_off_flag == 0) { HP_on_off_flag = 1; HP_turn_on(); } REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 | (1 << 28) | (1 << 27) | (1 << 26); REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 & ~(1 << 29) & ~(1 << 25) & ~(1 << 24) & ~(1 << 14);}static void in_codec_app14(void){ /* test is OK */ if(HP_on_off_flag == 0) { HP_on_off_flag = 1; HP_turn_on(); } REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 | (1 << 29) | (1 << 28) | (1 << 27); REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 & ~(1 << 26) & ~(1 << 25) & ~(1 << 24) & ~(1 << 14);}static void in_codec_app15(void){ /* test is OK */ if(HP_on_off_flag == 0) { HP_on_off_flag = 1; HP_turn_on(); } REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 | (1 << 29) | (1 << 28) | (1 << 26) | (1 << 14); REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 & ~(1 << 27) & ~(1 << 25) & ~(1 << 24);}static void in_codec_app16(void){ /* test is wrong */ if(HP_on_off_flag == 1) { HP_on_off_flag = 0; HP_turn_off(); } REG_ICDC_CDCCR1 &= ~(1 << 1); udelay(7000); REG_ICDC_CDCCR1 |= 1 << 29; REG_ICDC_CDCCR1 |= 1 << 28; REG_ICDC_CDCCR1 |= 1 << 26; REG_ICDC_CDCCR1 &= ~(1 << 24); //REG_ICDC_CDCCR2 = 0x00170823;}static void in_codec_app17(void){ /* test is OK */ if(HP_on_off_flag == 0) { HP_on_off_flag = 1; HP_turn_on(); } REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 | (1 << 29) | (1 << 28) | (1 << 27) | (1 << 26); REG_ICDC_CDCCR1 = REG_ICDC_CDCCR1 & ~(1 << 25) & ~(1 << 24) & ~(1 << 14);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -