Просмотр исходного кода

Merge branch 'master' of gitee.com:openLuat/LuatOS

Wendal Chen 2 лет назад
Родитель
Сommit
e7484c0891

+ 122 - 128
components/multimedia/luat_audio_es8311.c

@@ -69,61 +69,55 @@
 #define ES8311_CHD1_REGFD               0xFD /* CHIP ID1 */
 #define ES8311_MAX_REGISTER             0xFF
 
-static void es8311_write_reg(uint8_t addr, uint8_t data){
+static void es8311_write_reg(luat_audio_codec_conf_t* conf,uint8_t addr, uint8_t data){
     uint8_t temp[] = {addr,data};
-    luat_i2c_send(0, ES8311_ADDR, temp, 2 , 1);
+    luat_i2c_send(conf->i2c_id, ES8311_ADDR, temp, 2 , 1);
 	luat_timer_mdelay(1);
 }
 
-static uint8_t es8311_read_reg(uint8_t addr){
+static uint8_t es8311_read_reg(luat_audio_codec_conf_t* conf,uint8_t addr){
 	uint8_t temp=0;
-    luat_i2c_send(0, ES8311_ADDR, &addr, 1 , 0);
-    luat_i2c_recv(0, ES8311_ADDR, &temp, 1);
+    luat_i2c_send(conf->i2c_id, ES8311_ADDR, &addr, 1 , 0);
+    luat_i2c_recv(conf->i2c_id, ES8311_ADDR, &temp, 1);
 	return temp;
 }
 
-static int es8311_codec_standby(void){
-    es8311_write_reg(ES8311_DAC_REG32, 0x00);
-    es8311_write_reg(ES8311_ADC_REG17, 0x00);
-    es8311_write_reg(ES8311_SYSTEM_REG0E, 0xFF);
-    es8311_write_reg(ES8311_SYSTEM_REG12, 0x02);
-    es8311_write_reg(ES8311_SYSTEM_REG14, 0x00);
-    es8311_write_reg(ES8311_SYSTEM_REG0D, 0xFA);
-    es8311_write_reg(ES8311_RESET_REG00, 0x00);
-    es8311_write_reg(ES8311_RESET_REG00, 0x1F);
-    es8311_write_reg(ES8311_CLK_MANAGER_REG01, 0x30);
-    es8311_write_reg(ES8311_CLK_MANAGER_REG01, 0x00);
-    es8311_write_reg(ES8311_GP_REG45, 0x01);
-    es8311_write_reg(ES8311_SYSTEM_REG0D, 0xFC);
+static int es8311_codec_standby(luat_audio_codec_conf_t* conf){
+    es8311_write_reg(conf,ES8311_DAC_REG32, 0x00);
+    es8311_write_reg(conf,ES8311_ADC_REG17, 0x00);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG0E, 0xFF);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG12, 0x02);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG14, 0x00);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG0D, 0xFA);
+    es8311_write_reg(conf,ES8311_RESET_REG00, 0x00);
+    es8311_write_reg(conf,ES8311_RESET_REG00, 0x1F);
+    es8311_write_reg(conf,ES8311_CLK_MANAGER_REG01, 0x30);
+    es8311_write_reg(conf,ES8311_CLK_MANAGER_REG01, 0x00);
+    es8311_write_reg(conf,ES8311_GP_REG45, 0x01);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG0D, 0xFC);
     return 0;
 }
 
-static uint8_t es8311_codec_mute(uint8_t enable){
-    if (enable)  es8311_write_reg(ES8311_DAC_REG31, 0x64);
-    else es8311_write_reg(ES8311_DAC_REG31, 0x00);
+static uint8_t es8311_codec_mute(luat_audio_codec_conf_t* conf,uint8_t enable){
+    if (enable)  es8311_write_reg(conf,ES8311_DAC_REG31, 0x64);
+    else es8311_write_reg(conf,ES8311_DAC_REG31, 0x00);
 	return 0;
 }
 
-static uint8_t es8311_codec_vol(uint8_t vol){
-    if(vol < 0 || vol > 100){
-		return -1;
-    }
+static uint8_t es8311_codec_vol(luat_audio_codec_conf_t* conf,uint8_t vol){
+    if(vol < 0 || vol > 100) return -1;
     int gain = vol == 0 ? -955 : (vol - 80) * 5;
 	uint8_t reg_val = (uint8_t)((gain + 955) / 5);
-	es8311_write_reg(ES8311_DAC_REG32, reg_val);
+	es8311_write_reg(conf,ES8311_DAC_REG32, reg_val);
 	return vol;
 }
 
-/*0---master, 1---slave*/
-static void es8311_codec_mode(uint8_t mode){
-	if (mode == 0){
-		es8311_write_reg(ES8311_RESET_REG00, 0xC0);
-	}else{	
-		es8311_write_reg(ES8311_RESET_REG00, 0x80);
-	}
+static void es8311_codec_mode(luat_audio_codec_conf_t* conf,uint8_t mode){
+	if (mode == LUAT_CODEC_MODE_MASTER) es8311_write_reg(conf,ES8311_RESET_REG00, 0xC0);
+	else if(mode == LUAT_CODEC_MODE_SLAVE) es8311_write_reg(conf,ES8311_RESET_REG00, 0x80);
 }
 
-static int es8311_codec_samplerate(uint16_t samplerate){
+static int es8311_codec_samplerate(luat_audio_codec_conf_t* conf,uint16_t samplerate){
     if(samplerate != 8000 && samplerate != 16000 && samplerate != 32000 &&
         samplerate != 11025 && samplerate != 22050 && samplerate != 44100 &&
         samplerate != 12000 && samplerate != 24000 && samplerate != 48000)
@@ -139,85 +133,85 @@ static int es8311_codec_samplerate(uint16_t samplerate){
 			if (mclk == 0){
 				mclk = 1;
 			}
-            es8311_write_reg(ES8311_CLK_MANAGER_REG02, 0x08);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x44);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG02, 0x08);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG05, 0x44);
 			if (switchflag == 0){
 				switchflag = 1;
-	            es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x19);
-	            es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x19);
+	            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG03, 0x19);
+	            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG04, 0x19);
 			}
             break;
         case 16000:
 			if (mclk == 0){
 				mclk = 1;
 			}
-            es8311_write_reg(ES8311_CLK_MANAGER_REG02, 0x90);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG02, 0x90);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG05, 0x00);
 			if (switchflag == 0){
 				switchflag = 1;
-	            es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x19);
-	            es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x19);
+	            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG03, 0x19);
+	            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG04, 0x19);
 			}
             break;
         case 32000:
 			if (mclk == 0){
 				mclk = 1;
 			}
-            es8311_write_reg(ES8311_CLK_MANAGER_REG02, 0x18);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x44);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG02, 0x18);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG05, 0x44);
 			if (switchflag == 0){
 				switchflag = 1;
-	            es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x19);
-	            es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x19);
+	            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG03, 0x19);
+	            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG04, 0x19);
 			}
             break;
         case 44100:
 			mclk = 0;
 			switchflag = 0;
-            es8311_write_reg(ES8311_CLK_MANAGER_REG02, (0x03 << 3));
-            es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x10);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x10);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG02, (0x03 << 3));
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG05, 0x00);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG03, 0x10);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG04, 0x10);
             break;
         case 22050:
 			mclk = 0;
 			switchflag = 0;
-            es8311_write_reg(ES8311_CLK_MANAGER_REG02, (0x02 << 3));
-            es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x10);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x10);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG02, (0x02 << 3));
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG05, 0x00);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG03, 0x10);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG04, 0x10);
             break;
         case 11025:
 			mclk = 0;			
 			switchflag = 0;
-            es8311_write_reg(ES8311_CLK_MANAGER_REG02, (0x01 << 3));
-            es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x10);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x10);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG02, (0x01 << 3));
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG05, 0x00);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG03, 0x10);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG04, 0x10);
             break;
         case 48000:
 			mclk = 0;		
 			switchflag = 0;
-            es8311_write_reg(ES8311_CLK_MANAGER_REG02, (0x03 << 3));
-            es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x10);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x10);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG02, (0x03 << 3));
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG05, 0x00);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG03, 0x10);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG04, 0x10);
             break;
         case 24000:
 			mclk = 0;		
 			switchflag = 0;
-            es8311_write_reg(ES8311_CLK_MANAGER_REG02, (0x02 << 3));
-            es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x10);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x10);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG02, (0x02 << 3));
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG05, 0x00);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG03, 0x10);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG04, 0x10);
             break;
         case 12000:
 			mclk = 0;			
 			switchflag = 0;
-            es8311_write_reg(ES8311_CLK_MANAGER_REG02, (0x01 << 3));
-            es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x10);
-            es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x10);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG02, (0x01 << 3));
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG05, 0x00);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG03, 0x10);
+            es8311_write_reg(conf,ES8311_CLK_MANAGER_REG04, 0x10);
             break;
         default:
             break;
@@ -225,15 +219,15 @@ static int es8311_codec_samplerate(uint16_t samplerate){
     return 0;
 }
 
-static int es8311_update_bits(uint8_t reg, uint8_t mask, uint8_t val){
+static int es8311_update_bits(luat_audio_codec_conf_t* conf,uint8_t reg, uint8_t mask, uint8_t val){
     uint8_t old, new;
-    old = es8311_read_reg(reg);
+    old = es8311_read_reg(conf,reg);
     new = (old & ~mask) | (val & mask);
-    es8311_write_reg(reg, new);
+    es8311_write_reg(conf,reg, new);
     return 0;
 }
 
-static int es8311_codec_samplebits(uint8_t samplebits){
+static int es8311_codec_samplebits(luat_audio_codec_conf_t* conf,uint8_t samplebits){
     if(samplebits != 8 && samplebits != 16 && samplebits != 24 && samplebits != 32){
         LLOGE("bit_width error!\n");
         return -1;
@@ -259,94 +253,94 @@ static int es8311_codec_samplebits(uint8_t samplebits){
     default:
         return -1;
     }
-    es8311_update_bits(ES8311_SDPIN_REG09,
+    es8311_update_bits(conf,ES8311_SDPIN_REG09,
                         ES8311_SDPIN_REG09_DACWL_MASK,
                         wl << ES8311_SDPIN_REG09_DACWL_SHIFT);
-    es8311_update_bits(ES8311_SDPOUT_REG0A,
+    es8311_update_bits(conf,ES8311_SDPOUT_REG0A,
                         ES8311_SDPOUT_REG0A_ADCWL_MASK,
                         wl << ES8311_SDPOUT_REG0A_ADCWL_SHIFT);
     return 0;
 }
 
-static int es8311_codec_channels(uint8_t channels){
+static int es8311_codec_channels(luat_audio_codec_conf_t* conf,uint8_t channels){
     return 0;
 }
 
-static int es8311_reg_init(void){
+static int es8311_reg_init(luat_audio_codec_conf_t* conf){
     /* reset codec */
-    es8311_write_reg(ES8311_RESET_REG00, 0x1F);
-    es8311_write_reg(ES8311_GP_REG45, 0x00);
+    es8311_write_reg(conf,ES8311_RESET_REG00, 0x1F);
+    es8311_write_reg(conf,ES8311_GP_REG45, 0x00);
 
     luat_timer_mdelay(10);
 
-    // es8311_write_reg(ES8311_GPIO_REG44, 0x08);
+    // es8311_write_reg(conf,ES8311_GPIO_REG44, 0x08);
     // luat_timer_mdelay(1);
-    // es8311_write_reg(ES8311_GPIO_REG44, 0x08);
+    // es8311_write_reg(conf,ES8311_GPIO_REG44, 0x08);
 
     /* set ADC/DAC CLK */
     /* MCLK from BCLK  */
-    es8311_write_reg(ES8311_CLK_MANAGER_REG01, 0x30);
-    es8311_write_reg(ES8311_CLK_MANAGER_REG02, 0x90);
-    es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x19);
-    es8311_write_reg(ES8311_ADC_REG16, 0x02);// bit5:0~non standard audio clock
-    es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x19);
-    es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
+    es8311_write_reg(conf,ES8311_CLK_MANAGER_REG01, 0x30);
+    es8311_write_reg(conf,ES8311_CLK_MANAGER_REG02, 0x90);
+    es8311_write_reg(conf,ES8311_CLK_MANAGER_REG03, 0x19);
+    es8311_write_reg(conf,ES8311_ADC_REG16, 0x02);// bit5:0~non standard audio clock
+    es8311_write_reg(conf,ES8311_CLK_MANAGER_REG04, 0x19);
+    es8311_write_reg(conf,ES8311_CLK_MANAGER_REG05, 0x00);
 	/*new cfg*/
-	es8311_write_reg(ES8311_CLK_MANAGER_REG06, BCLK_DIV);
-	es8311_write_reg(ES8311_CLK_MANAGER_REG07, 0x01);
-	es8311_write_reg(ES8311_CLK_MANAGER_REG08, 0xff);
+	es8311_write_reg(conf,ES8311_CLK_MANAGER_REG06, BCLK_DIV);
+	es8311_write_reg(conf,ES8311_CLK_MANAGER_REG07, 0x01);
+	es8311_write_reg(conf,ES8311_CLK_MANAGER_REG08, 0xff);
     /* set system power up */
-    es8311_write_reg(ES8311_SYSTEM_REG0B, 0x00);
-    es8311_write_reg(ES8311_SYSTEM_REG0C, 0x00);
-    es8311_write_reg(ES8311_SYSTEM_REG10, 0x1F);
-    es8311_write_reg(ES8311_SYSTEM_REG11, 0x7F);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG0B, 0x00);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG0C, 0x00);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG10, 0x1F);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG11, 0x7F);
     /* chip powerup. slave mode */
-    es8311_write_reg(ES8311_RESET_REG00, 0x80);
+    es8311_write_reg(conf,ES8311_RESET_REG00, 0x80);
     luat_timer_mdelay(50);
 
     /* power up analog */
-    es8311_write_reg(ES8311_SYSTEM_REG0D, 0x01);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG0D, 0x01);
     /* power up digital */
-    es8311_write_reg(ES8311_CLK_MANAGER_REG01, 0x3F);
+    es8311_write_reg(conf,ES8311_CLK_MANAGER_REG01, 0x3F);
     // SET ADC
-    es8311_write_reg(ES8311_SYSTEM_REG14, DADC_GAIN);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG14, DADC_GAIN);
     // SET DAC
-    es8311_write_reg(ES8311_SYSTEM_REG12, 0x00);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG12, 0x00);
     // ENABLE HP DRIVE
-    es8311_write_reg(ES8311_SYSTEM_REG13, 0x10);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG13, 0x10);
     // SET ADC/DAC DATA FORMAT
-    es8311_write_reg(ES8311_SDPIN_REG09, 0x0c);
-    es8311_write_reg(ES8311_SDPOUT_REG0A, 0x0c);
+    es8311_write_reg(conf,ES8311_SDPIN_REG09, 0x0c);
+    es8311_write_reg(conf,ES8311_SDPOUT_REG0A, 0x0c);
 
     /* set normal power mode */
-    es8311_write_reg(ES8311_SYSTEM_REG0E, 0x02);
-    es8311_write_reg(ES8311_SYSTEM_REG0F, 0x44);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG0E, 0x02);
+    es8311_write_reg(conf,ES8311_SYSTEM_REG0F, 0x44);
     // SET ADC
     /* set adc softramp */
-    es8311_write_reg(ES8311_ADC_REG15, 0x00);
+    es8311_write_reg(conf,ES8311_ADC_REG15, 0x00);
     /* set adc hpf */
-    es8311_write_reg(ES8311_ADC_REG1B, 0x05);
+    es8311_write_reg(conf,ES8311_ADC_REG1B, 0x05);
     /* set adc hpf,ADC_EQ bypass */
-    es8311_write_reg(ES8311_ADC_REG1C, 0x65);
+    es8311_write_reg(conf,ES8311_ADC_REG1C, 0x65);
     /* set adc digtal vol */
-    es8311_write_reg(ES8311_ADC_REG17, ADC_VOLUME_GAIN);
+    es8311_write_reg(conf,ES8311_ADC_REG17, ADC_VOLUME_GAIN);
 
     /* set dac softramp,disable DAC_EQ */
-    es8311_write_reg(ES8311_DAC_REG37, 0x08);
-    es8311_write_reg(ES8311_DAC_REG32, 0xBF);
+    es8311_write_reg(conf,ES8311_DAC_REG37, 0x08);
+    es8311_write_reg(conf,ES8311_DAC_REG32, 0xBF);
 
     // /* set adc gain scale up */
-    // es8311_write_reg(ES8311_ADC_REG16, 0x24);
+    // es8311_write_reg(conf,ES8311_ADC_REG16, 0x24);
     // /* set adc alc maxgain */
-    // es8311_write_reg(ES8311_ADC_REG17, 0xBF);
+    // es8311_write_reg(conf,ES8311_ADC_REG17, 0xBF);
     // /* adc alc disable,alc_winsize */
-    // es8311_write_reg(ES8311_ADC_REG18, 0x07);
+    // es8311_write_reg(conf,ES8311_ADC_REG18, 0x07);
     // /* set alc target level */
-    // es8311_write_reg(ES8311_ADC_REG19, 0xFB);
+    // es8311_write_reg(conf,ES8311_ADC_REG19, 0xFB);
     // /* set adc_automute noise gate */
-    // es8311_write_reg(ES8311_ADC_REG1A, 0x03);
+    // es8311_write_reg(conf,ES8311_ADC_REG1A, 0x03);
     // /* set adc_automute vol */
-    // es8311_write_reg(ES8311_ADC_REG1B, 0xEA);
+    // es8311_write_reg(conf,ES8311_ADC_REG1B, 0xEA);
     return 0;
 }
 
@@ -356,15 +350,15 @@ static int es8311_codec_init(luat_audio_codec_conf_t* conf){
         luat_gpio_mode(conf->pa_pin, Luat_GPIO_OUTPUT, Luat_GPIO_DEFAULT, !conf->pa_on_level);
         luat_gpio_set(conf->pa_pin, !conf->pa_on_level);
     }
-    luat_i2c_setup(0, I2C_REQ);
-    temp1 = es8311_read_reg(ES8311_CHD1_REGFD);
-    temp2 = es8311_read_reg(ES8311_CHD2_REGFE);
-    temp3 = es8311_read_reg(ES8311_CHVER_REGFF);
+    // luat_i2c_setup(0, I2C_REQ);
+    temp1 = es8311_read_reg(conf,ES8311_CHD1_REGFD);
+    temp2 = es8311_read_reg(conf,ES8311_CHD2_REGFE);
+    temp3 = es8311_read_reg(conf,ES8311_CHVER_REGFF);
     if(temp1 != 0x83 || temp2 != 0x11){
         LLOGE("codec err, id = 0x%x 0x%x ver = 0x%x", temp1, temp2, temp3);
         return -1;
     }
-    es8311_reg_init();
+    es8311_reg_init(conf);
     return 0;
 }
 
@@ -387,22 +381,22 @@ static int es8311_codec_control(luat_audio_codec_conf_t* conf,luat_audio_codec_c
     switch (cmd)
     {
     case LUAT_CODEC_CTL_MODE:
-        es8311_codec_mode((uint8_t)data);
+        es8311_codec_mode(conf,(uint8_t)data);
         break;
     case LUAT_CODEC_CTL_VOLUME:
-        es8311_codec_vol((uint8_t)data);
+        es8311_codec_vol(conf,(uint8_t)data);
         break;
     case LUAT_CODEC_CTL_MUTE:
-        es8311_codec_mute((uint8_t)data);
+        es8311_codec_mute(conf,(uint8_t)data);
         break;
     case LUAT_CODEC_CTL_RATE:
-        es8311_codec_samplerate((uint16_t)data);
+        es8311_codec_samplerate(conf,(uint16_t)data);
         break;
     case LUAT_CODEC_CTL_BITS:
-        es8311_codec_samplebits((uint8_t)data);
+        es8311_codec_samplebits(conf,(uint8_t)data);
         break;
     case LUAT_CODEC_CTL_CHANNEL:
-        es8311_codec_channels((uint8_t)data);
+        es8311_codec_channels(conf,(uint8_t)data);
         break;
     case LUAT_CODEC_CTL_PA:
         es8311_codec_pa(conf,(uint8_t)data);

+ 1 - 0
components/multimedia/luat_lib_multimedia_audio.c

@@ -346,6 +346,7 @@ static int l_audio_vol(lua_State *L) {
 @api audio.setBus(id, bus_type)
 @int 音频通道,例如0
 @int 总线类型, 例如 audio.BUS_SOFT_DAC
+@int 硬件id, 例如 总线类型为audio.BUS_I2S时,硬件id即为i2s codec的i2c id
 @return nil 无返回值
 @usage
 audio.setBus(0, audio.BUS_SOFT_DAC)	--通道0的硬件输出通道设置为软件DAC

+ 125 - 0
script/libs/pca9685.lua

@@ -0,0 +1,125 @@
+--[[
+@module pca9685
+@summary pca9685 pwm 
+@version 1.0
+@date    2023.12.26
+@author  xwtx
+@usage
+--注意:因使用了sys.wait()所有api需要在协程中使用
+-- 用法实例
+PROJECT = "pca9685"
+VERSION = "1.0.0"
+
+
+sys = require("sys")
+pca9685=require("pca9685")
+
+local function pca9685_init()
+    sys.wait(2000)
+    log.info("--------------------------------------------")
+    pca9685.Init(60,180)
+    while true do
+        pca9685.setPWM(0,0,2048);
+        sys.wait(500)
+     end
+end
+
+sys.taskInit(pca9685_init)
+
+sys.run()
+]]
+
+
+
+
+
+local pca9685={}
+local i2cId =0     --i2c通道设置
+
+
+
+local PCA_Addr = 0x40   --pwm通道地址
+local PCA_Model =0x00   --工作模式:读1/写0
+local LED0_ON_L =0x06
+local LED0_ON_H =0x07
+local LED0_OFF_L= 0x08
+local LED0_OFF_H =0x09
+local PCA_Pre = 0xFE
+
+local function pca9685_Write(addr, data)
+   i2c.send(i2cId, PCA_Addr, { addr, data })
+   --log.info("PCA9685_Write发送成功:", aa)
+   sys.wait(15)
+end
+
+local function pca9685_Read(addr)
+   i2c.send(i2cId, PCA_Addr, addr)
+   sys.wait(5)
+   local data = i2c.recv(i2cId,0x40, 1)
+   return data
+end
+
+function pca9685.Init(hz, angle)  --pcA9685初始化 
+   local off=0
+   i2c.setup(i2cId, i2c.SLOW)
+   pca9685_Write(PCA_Model,0x00)
+   pca9685.setFreq(hz)
+	off = 145+angle*2.4
+   pca9685.setPWM(0,0,off);
+	pca9685.setPWM(1,0,off);
+	pca9685.setPWM(2,0,off);
+	pca9685.setPWM(3,0,off);
+	pca9685.setPWM(4,0,off);
+	pca9685.setPWM(5,0,off);
+	pca9685.setPWM(6,0,off);
+	pca9685.setPWM(7,0,off);
+	pca9685.setPWM(8,0,off);
+	pca9685.setPWM(9,0,off);
+	pca9685.setPWM(10,0,off);
+	pca9685.setPWM(11,0,off);
+	pca9685.setPWM(12,0,off);
+	pca9685.setPWM(13,0,off);
+	pca9685.setPWM(14,0,off);
+	pca9685.setPWM(15,0,off);
+   sys.wait(100)
+end
+
+
+
+function pca9685.setFreq(freq) --PCA9685频率设置
+   local prescale
+   local oldmode
+   local newmode
+   local prescaleval
+
+   prescaleval = 25000000;
+   prescaleval = prescaleval / 4096
+   prescaleval = prescaleval / freq
+   prescaleval = prescaleval - 1
+   prescale = math.floor(prescaleval + 0.5)
+   oldmode = string.toHex(pca9685_Read(PCA_Model))
+   newmode = (oldmode & 0x7F)|0x10
+   pca9685_Write(PCA_Model, newmode)
+   pca9685_Write(PCA_Pre, prescale)
+   pca9685_Write(PCA_Model, oldmode)
+   sys.wait(5)
+   pca9685_Write(PCA_Model, oldmode|0xa1)
+end
+
+
+function pca9685.setPWM(num, on, off)
+   local cc = i2c.send(i2cId, PCA_Addr, { LED0_ON_L + 4 * num, on & 0xFF, on >> 8, off & 0xFF, off >> 8 })
+   --log.info("PCA9685_setPWM发送成功:", cc)
+   sys.wait(5)
+end
+
+function pca9685.setAngle(num, angle)
+   local off = 0
+   off = 158 + angle * 2.2
+   pca9685.setPWM(num, 0, off)
+end
+
+return pca9685
+
+
+