IT评测·应用市场-qidao123.com技术社区

标题: RK3588--调试耳机麦克风 [打印本页]

作者: 曹旭辉    时间: 2024-12-13 04:21
标题: RK3588--调试耳机麦克风

媒介

本人参考使用的是firefly itx-3588j开辟板,根据焦点板调试公司自研的底板。目前需要调试耳机麦克风语言没声音的问题。

一、如何调试

调试过程分以下几步:
二、使用步调

1.确认型号

硬件处置惩罚
2.设备树配置

   修改 rk3588-firefly-port.ptsi
  1.         es8388_sound: es8388-sound {
  2.                 status = "disabled";
  3.                 compatible = "firefly,multicodecs-card";
  4.                 rockchip,card-name = "rockchip-es8388";
  5.                 hp-det-gpio = <&gpio1 RK_PC4 GPIO_ACTIVE_HIGH>;  #这个是检测引脚,注意修改
  6.                 io-channels = <&saradc 3>;
  7.                 io-channel-names = "adc-detect";
  8.                 spk-con-gpio = <&gpio3 RK_PB2 GPIO_ACTIVE_HIGH>;  #这个没动,按照官方的就放那边了
  9.                 hp-con-gpio = <&gpio4 RK_PB0 GPIO_ACTIVE_HIGH>;   #这个没动,按照官方的就放那边了
  10.                 linein-type = <0>;  #这个参考板子来写,在驱动中能看到代表什么
  11.                 rockchip,format = "i2s";
  12.                 rockchip,mclk-fs = <384>;
  13.                 rockchip,cpu = <&i2s0_8ch>;
  14.                 rockchip,codec = <&es8388>;
  15.                 rockchip,audio-routing =
  16.                         "Headphone", "LOUT1",
  17.                         "Headphone", "ROUT1",
  18.                         "Speaker", "LOUT2",
  19.                         "Speaker", "ROUT2",
  20.                         "Headphone", "Headphone Power",
  21.                         "Headphone", "Headphone Power",
  22.                         "Speaker", "Speaker Power",
  23.                         "Speaker", "Speaker Power",
  24.                         "LINPUT1", "Main Mic",   #这个重要
  25.                         "RINPUT1", "Main Mic",   #这个重要
  26.                         "LINPUT2", "Headset Mic",  #这个重要
  27.                         "RINPUT2", "Headset Mic";  #这个重要
  28.                 pinctrl-names = "default";
  29.                 pinctrl-0 = <&hp_det>;
  30.         };
复制代码
3.修改驱动代码

  1. static struct jack_zone itx_3588j_zone[] ={
  2.         {
  3.                 .min_mv = 0,
  4.                 .max_mv = 100,
  5.                 .type = INPUT_LIN2_DIFF,
  6.         }, {
  7.                 .min_mv = 800,
  8.                 .max_mv = 1000,
  9.                 .type = INPUT_LIN1,
  10.         },{  
  11.         /*这个是我自己添加的,我耳机插进去后ADC检测电压大概1.4v,
  12.          *但是这之前是没有的,所以没有声音输入,加了之后才能链路切换,
  13.          *才能检测到输入。注意这个INPUT_LIN2 就是上面设备树配置那个。
  14.          */
  15.                 .min_mv = 1000,
  16.                 .max_mv = 1700,
  17.                 .type = INPUT_LIN2,
  18.         }, {
  19.                 .min_mv = 1700,
  20.                 .max_mv = UINT_MAX,
  21.                 .type = INPUT_LIN2_DIFF,
  22.         }
  23. };
  24. //触发的函数在这个地方,有兴趣可以源码通读,不多很好读
  25. static void mic_det_work(struct work_struct *work)
  26. {
  27.         struct multicodecs_data *mc_data = container_of(work,struct multicodecs_data,mic_work.work);
  28.         struct snd_soc_jack *jack_headset = mc_data->jack_headset;
  29.         int value, ret ,status;
  30.         ret = iio_read_channel_processed(mc_data->adc, &value);
  31.         if (unlikely(ret < 0)) {
  32.                 /* Forcibly release key if any was pressed */
  33.                 value = mc_data->keyup_voltage;
  34.                 status = INPUT_LIN2_DIFF;
  35.         } else {
  36.                 if(mc_data->linein_type == LINEIN_TYPE1){
  37.                         status = jack_get_type(roc_rk3588s_pc_zone,ARRAY_SIZE(roc_rk3588s_pc_zone),value);
  38.                 }else if (mc_data->linein_type == LINEIN_TYPE2){
  39.                         status = jack_get_type(aio_3588sjd4_zone,ARRAY_SIZE(aio_3588sjd4_zone),value);
  40.                 }else if (mc_data->linein_type == LINEIN_TYPE3){
  41.                         status = jack_get_type(roc_rk3588_pc_zone,ARRAY_SIZE(roc_rk3588_pc_zone),value);
  42.                 }else if (mc_data->linein_type == LINEIN_TPYE4){
  43.                         status = jack_get_type(aio_3588q_zone,ARRAY_SIZE(aio_3588q_zone),value);
  44.                 }else if (mc_data->linein_type == LINEIN_TPYE5){
  45.                      status = jack_get_type(roc_rk3588_pc_se_zone,ARRAY_SIZE(roc_rk3588_pc_se_zone),value);
  46.                 }else if (mc_data->linein_type == LINEIN_TPYE6){
  47.                         status = jack_get_type(aio_3588l_zone,ARRAY_SIZE(aio_3588l_zone),value);
  48.                 }else{
  49.                         status = jack_get_type(itx_3588j_zone,ARRAY_SIZE(itx_3588j_zone),value);
  50.                 }
  51.         }
  52.         if(mc_data->mic_status != status || first_init_status == 0 ){
  53.                 printk("mic_det_work value:%d,status:%d\n",value,status);
  54.                
  55.                 if(mc_data->linein_ch == -1 && mc_data->mic_ch == -1){
  56.                         if ( status == INPUT_LIN2 || status == INPUT_LIN1 ){
  57.                                 snd_soc_jack_report(jack_headset, SND_JACK_LINEIN, SND_JACK_LINEIN);
  58.                                 snd_soc_jack_report(jack_headset, 0, SND_JACK_MICROPHONE);
  59.                         } else if( status == INPUT_LIN2_DIFF || status == INPUT_LIN1_DIFF ) {       
  60.                                 snd_soc_jack_report(jack_headset, 0, SND_JACK_LINEIN);
  61.                                 snd_soc_jack_report(jack_headset, SND_JACK_MICROPHONE, SND_JACK_MICROPHONE);
  62.                         }
  63.                 }
  64.                 //这个是关键切换噢,一定要走到这里
  65.                 es8323_line1_line2_line2diff_switch(status);
  66.                 mc_data->mic_status = status;
  67.                 first_init_status = 1;
  68.         }
  69.         queue_delayed_work(system_freezable_wq, &mc_data->mic_work, msecs_to_jiffies(100));
  70. }
复制代码
4.形成补丁文件
通过diff工具 和patch工具来天生补丁,打补丁。自行研究噢

总结

有什么问题,评论区交换。觉得有帮助点个赞吧。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4