一般来说,消费电子产品比如智能电视和音箱只有立体声两个喇叭,硬件上只需要一个codec芯片即能满足要求,有时需要做多声道,这时候可能就用到多个codec芯片了,如果是不同的codec芯片,则分别编写对应的驱动即可,如果用的都是同一款芯片,那么就只需要一份驱动即可,方法也简单。
在dts设备数里i2c的的模块添加板子对应的codec,当然i2c地址肯定也是不同的。比如添加3个ti的tas5805 dac:
tas5805m_2c: tas5805m_2c@2c {
compatible = "ti,tas5805m_2c";
#sound-dai-cells = <0>;
codec_name = "tas5805m_2c";
reset_pin = <&gpio GPIOC_13 GPIO_ACTIVE_HIGH>;
reg = <0x2c>;
status = "okay";
};
tas5805m_2d: tas5805m_2d@2d {
compatible = "ti,tas5805m_2d";
#sound-dai-cells = <0>;
codec_name = "tas5805m_2d";
reset_pin = <&gpio GPIOC_13 GPIO_ACTIVE_HIGH>;
reg = <0x2d>;
status = "okay";
};
tas5805m_2e: tas5805m_2e@2e {
compatible = "ti,tas5805m_2e";
#sound-dai-cells = <0>;
codec_name = "tas5805m_2e";
reset_pin = <&gpio GPIOC_13 GPIO_ACTIVE_HIGH>;
reg = <0x2e>;
status = "okay";
};
在系统启动时,I2C总线会在dts设备树种寻找和of_match_table匹配的设备,如果匹配成功,将会调用codec驱动中注册的i2c的probe接口,做设备的初始化工作。
所以在dts里添加的codec 设备里compatible 和要与驱动中注册的i2c_device_id与of_device_id中的compatible字段一致,否则会导致注册失败,接着来看codec驱动中要添加的部分
static const struct i2c_device_id tas5805m_i2c_id[] = {
- {"tas5805",},
+ {"tas5805m_2c",},
+ {"tas5805m_2d",},
+ {"tas5805m_2e",},
{}
};
@@ -660,7 +662,9 @@ MODULE_DEVICE_TABLE(i2c, tas5805m_i2c_id);
#ifdef CONFIG_OF
static const struct of_device_id tas5805m_of_match[] = {
- {.compatible = "ti,tas5805",},
+ {.compatible = "ti,tas5805m_2c",},
+ {.compatible = "ti,tas5805m_2d",},
+ {.compatible = "ti,tas5805m_2e",},
{}
};
这样也就等于3个设备将分别调用一次驱动中的probe接口进行初始化