私はcs4245デバイス用のオーディオコーデックドライバを開発しています。 i2cによって制御されます。私は2つのハードウェア(開発ボード)を持っています。1つはコーデックがi2c-1に接続され、もう1つがi2c-2に接続されています。最初は機能しますが、2番目は機能しません。
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 ファイルに設定されます。犯罪問題を解決してください。