我正在开发 cs4245 设备的音频编解码器驱动程序。它是由 i2c 控制的。我有 2 个硬件(开发板),其中一个的编解码器连接到 i2c-1,另一个连接到 i2c-2。第一个有效,但第二个无效。
我已经在第二块板上测试了与编解码器的通信(使用 i2cdetect、i2cget),并且它正在工作。它通信并接收芯片ID。
查看代码,我可以找到用于设置总线通信的 i2c 总线的定义:
static struct snd_soc_dai_link mod_duo_dai =
{
.name = "MOD-DUO-I2S",
.stream_name = "MOD-DUO-SUNXI-I2S",
.cpu_dai_name = "sunxi-i2s.0",
.codec_dai_name = "cs4245-dai",
.platform_name = "sunxi-i2s-pcm-audio.0",
.codec_name = "cs4245-codec.1-004c", // EDITED
.ops = &mod_duo_ops,
.init = &mod_duo_dai_link_init,
};
因此,我编辑了突出显示的行,"cs4245-codec.2-004c"
但驱动程序仍在寻找 i2c-1。内核打印如下:
bus: 'i2c': really_probe: probing driver cs4245-codec with device 1-004c
[i2c_device_probe] client name: cs4245, adapter name: sunxi-i2c.1, adapter nr: 1
另外,我在 soc-core.c 中的函数 snd_soc_instantiate_card 中插入了一个打印内容,以确保它得到我的更改:
snd_soc_instantiate_card: cs4245-codec.2-004c
后来,内核到达编解码器探测函数,它显示:
[ 11.907394] [CS4245]Failed to read i2c at addr 0x4C.
[ 11.919643] cs4245-codec: probe of 1-004c failed with error -70
编辑的行是否足以更改 i2c 总线?
该代码可在以下位置获取:https://github.com/moddevices/linux-sunxi/blob/mod-duo/sound/soc/sunxi/mod-duo.c
我也尝试过更改评论中描述的以下行:
static const struct i2c_device_id cs4245_id[] = {
{"cs4245", 1}, // changed to {"cs4245", 2}
{}
};
也不起作用。这段代码存在于编解码器驱动程序中:https://github.com/moddevices/linux-sunxi/blob/mod-duo/sound/soc/codecs/cs4245.c
答案1
i2c 总线选项在 arch/arm/plat-sunxi/devices.c 文件中设置,如下犯罪修复它。