IT评测·应用市场-qidao123.com技术社区
标题:
RK3588--调试耳机麦克风
[打印本页]
作者:
曹旭辉
时间:
2024-12-13 04:21
标题:
RK3588--调试耳机麦克风
媒介
本人参考使用的是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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/)
Powered by Discuz! X3.4