支持楼主的回归
今天报到
楼主的贴子 ,拜读后,受教
谢谢楼主分享
谢谢分享,学习一下
过来学习。
很好的技术贴,感谢分享!
想做9039 找到资料了
感谢分享!
感谢分享!
伟大的楼主,谢谢分享
发烧求败 发表于 2026-3-11 17:06
会写程序的都是高手
这种所谓程序都是小儿科。现在用ai写,这种驱动分分钟给你写出来。都是Vibe coding时代了。
源码都开源,楼主功德无量!!!!
非常感谢!
前来向高手学习!
可惜 es9038q2m 的 programmable numerically controlled oscillator 这个高级功能 es9039q2m 欠奉了,真不知道 ess 的开发团队怎么想的,或者够功力用它的烧友太少了。
eslei 发表于 2026-5-31 17:40
可惜 es9038q2m 的 programmable numerically controlled oscillator 这个高级功能 es9039q2m 欠奉了, ...
怎么? 难道你还想手动配置 PNCO?
jacksl528 发表于 2026-6-1 10:25
怎么? 难道你还想手动配置 PNCO?
看明白的烧友不多,但一定有您,
snd_soc_component_write(component, ES9038Q2M_INPUT_CONFIG, iface);
switch(params_rate(params))
{
case 8000:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x2D);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0x3E);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0x05);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x00);
break;
case 11025:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0xB0);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0x39);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0x07);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x00);
break;
case 16000:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x5B);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0x7C);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0x0A);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x00);
break;
case 22050:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x60);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0x73);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0x0E);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x00);
break;
case 32000:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0xB6);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0xF8);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0x14);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x00);
break;
case 44100:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0xC1);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0xE6);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0x1C);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x00);
break;
case 48000:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x10);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0x75);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0x1F);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x00);
break;
case 88200:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x81);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0xCD);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0x39);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x00);
break;
case 96000:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x21);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0xEA);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0x3E);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x00);
break;
case 176400:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x02);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0x9B);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0x73);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x00);
break;
case 192000:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x41);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0xD4);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0x7D);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x00);
break;
case 352800:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x05);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0x36);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0xE7);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x00);
break;
case 384000:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x82);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0xA8);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0xFB);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x00);
break;
case 705600:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x09);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0x6C);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0xCE);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x01);
break;
case 768000:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x05);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0x51);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0xF7);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x01);
break;
case 1411200:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x12);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0xD8);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0x9C);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x03);
break;
case 1536000:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x0A);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0xA2);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0xEE);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x03);
break;
default:
snd_soc_component_write(component, ES9038Q2M_NCO_0, 0x00);
snd_soc_component_write(component, ES9038Q2M_NCO_1, 0x00);
snd_soc_component_write(component, ES9038Q2M_NCO_2, 0x00);
snd_soc_component_write(component, ES9038Q2M_NCO_3, 0x00);
}
return 0;
这是 9038q2m 刚发布不久我为 100MHz crystal freq 计算的,一直用到现在。通过实测在驱动微调 lsb 可以获得接近绝对准确的 mck,还可以因应环境温度作适应。
这就是 diy 好玩之处。
无私而强大的楼主!
本帖最后由 jacksl528 于 2026-6-2 08:18 编辑
eslei 发表于 2026-6-1 12:39
看明白的烧友不多,但一定有您,
snd_soc_component_write(component, ES9038Q2M_INPUT_CONFIG, ...
多此一举~
你连在什么情况下 需要手动去配置NCO 数值都没玩明白。
ESS解码芯片的核心技术,HyperStream®Architecture是依存AUTO_FS_DETECT为开启状态的
算了吧, 你自己偷着乐就行了。