马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
媒介
本人参考使用的是firefly itx-3588j开辟板,根据焦点板调试公司自研的底板。目前需要调试耳机麦克风语言没声音的问题。
一、如何调试
调试过程分以下几步:
- 确认耳机是美标还是国标的(这个整错很尴尬的)
- 配置设备树
- 修改官方的驱动代码(因硬件计划的板子而异,以是一定要硬件共同去测)
- 形成补丁文件 (更加规范,防止哪天电脑挂了,不知道改的啥)
二、使用步调
1.确认型号
硬件处置惩罚
2.设备树配置
修改 rk3588-firefly-port.ptsi
- es8388_sound: es8388-sound {
- status = "disabled";
- compatible = "firefly,multicodecs-card";
- rockchip,card-name = "rockchip-es8388";
- hp-det-gpio = <&gpio1 RK_PC4 GPIO_ACTIVE_HIGH>; #这个是检测引脚,注意修改
- io-channels = <&saradc 3>;
- io-channel-names = "adc-detect";
- spk-con-gpio = <&gpio3 RK_PB2 GPIO_ACTIVE_HIGH>; #这个没动,按照官方的就放那边了
- hp-con-gpio = <&gpio4 RK_PB0 GPIO_ACTIVE_HIGH>; #这个没动,按照官方的就放那边了
- linein-type = <0>; #这个参考板子来写,在驱动中能看到代表什么
- rockchip,format = "i2s";
- rockchip,mclk-fs = <384>;
- rockchip,cpu = <&i2s0_8ch>;
- rockchip,codec = <&es8388>;
- rockchip,audio-routing =
- "Headphone", "LOUT1",
- "Headphone", "ROUT1",
- "Speaker", "LOUT2",
- "Speaker", "ROUT2",
- "Headphone", "Headphone Power",
- "Headphone", "Headphone Power",
- "Speaker", "Speaker Power",
- "Speaker", "Speaker Power",
- "LINPUT1", "Main Mic", #这个重要
- "RINPUT1", "Main Mic", #这个重要
- "LINPUT2", "Headset Mic", #这个重要
- "RINPUT2", "Headset Mic"; #这个重要
- pinctrl-names = "default";
- pinctrl-0 = <&hp_det>;
- };
复制代码 3.修改驱动代码
- static struct jack_zone itx_3588j_zone[] ={
- {
- .min_mv = 0,
- .max_mv = 100,
- .type = INPUT_LIN2_DIFF,
- }, {
- .min_mv = 800,
- .max_mv = 1000,
- .type = INPUT_LIN1,
- },{
- /*这个是我自己添加的,我耳机插进去后ADC检测电压大概1.4v,
- *但是这之前是没有的,所以没有声音输入,加了之后才能链路切换,
- *才能检测到输入。注意这个INPUT_LIN2 就是上面设备树配置那个。
- */
- .min_mv = 1000,
- .max_mv = 1700,
- .type = INPUT_LIN2,
- }, {
- .min_mv = 1700,
- .max_mv = UINT_MAX,
- .type = INPUT_LIN2_DIFF,
- }
- };
- //触发的函数在这个地方,有兴趣可以源码通读,不多很好读
- static void mic_det_work(struct work_struct *work)
- {
- struct multicodecs_data *mc_data = container_of(work,struct multicodecs_data,mic_work.work);
- struct snd_soc_jack *jack_headset = mc_data->jack_headset;
- int value, ret ,status;
- ret = iio_read_channel_processed(mc_data->adc, &value);
- if (unlikely(ret < 0)) {
- /* Forcibly release key if any was pressed */
- value = mc_data->keyup_voltage;
- status = INPUT_LIN2_DIFF;
- } else {
- if(mc_data->linein_type == LINEIN_TYPE1){
- status = jack_get_type(roc_rk3588s_pc_zone,ARRAY_SIZE(roc_rk3588s_pc_zone),value);
- }else if (mc_data->linein_type == LINEIN_TYPE2){
- status = jack_get_type(aio_3588sjd4_zone,ARRAY_SIZE(aio_3588sjd4_zone),value);
- }else if (mc_data->linein_type == LINEIN_TYPE3){
- status = jack_get_type(roc_rk3588_pc_zone,ARRAY_SIZE(roc_rk3588_pc_zone),value);
- }else if (mc_data->linein_type == LINEIN_TPYE4){
- status = jack_get_type(aio_3588q_zone,ARRAY_SIZE(aio_3588q_zone),value);
- }else if (mc_data->linein_type == LINEIN_TPYE5){
- status = jack_get_type(roc_rk3588_pc_se_zone,ARRAY_SIZE(roc_rk3588_pc_se_zone),value);
- }else if (mc_data->linein_type == LINEIN_TPYE6){
- status = jack_get_type(aio_3588l_zone,ARRAY_SIZE(aio_3588l_zone),value);
- }else{
- status = jack_get_type(itx_3588j_zone,ARRAY_SIZE(itx_3588j_zone),value);
- }
- }
- if(mc_data->mic_status != status || first_init_status == 0 ){
- printk("mic_det_work value:%d,status:%d\n",value,status);
-
- if(mc_data->linein_ch == -1 && mc_data->mic_ch == -1){
- if ( status == INPUT_LIN2 || status == INPUT_LIN1 ){
- snd_soc_jack_report(jack_headset, SND_JACK_LINEIN, SND_JACK_LINEIN);
- snd_soc_jack_report(jack_headset, 0, SND_JACK_MICROPHONE);
- } else if( status == INPUT_LIN2_DIFF || status == INPUT_LIN1_DIFF ) {
- snd_soc_jack_report(jack_headset, 0, SND_JACK_LINEIN);
- snd_soc_jack_report(jack_headset, SND_JACK_MICROPHONE, SND_JACK_MICROPHONE);
- }
- }
- //这个是关键切换噢,一定要走到这里
- es8323_line1_line2_line2diff_switch(status);
- mc_data->mic_status = status;
- first_init_status = 1;
- }
- queue_delayed_work(system_freezable_wq, &mc_data->mic_work, msecs_to_jiffies(100));
- }
复制代码 4.形成补丁文件
通过diff工具 和patch工具来天生补丁,打补丁。自行研究噢
总结
有什么问题,评论区交换。觉得有帮助点个赞吧。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |