kernel4.4.55内核的音频es8323驱动调试及dts配置
本帖最后由 luwanjia 于 2017-7-31 20:14 编辑以下是本人的调试经过,请指导!(刚接触linux驱动开发,对内核框架不熟悉,请各位指导,万分感谢!)
1. 调试环境
内核:https://gitlab.com/TeeFirefly/linux-kernel.git firefly分支
配置:rockchip_linux_defconfig
dts:rk3288-firefly-lvds.dts
$export ARCH=arm
$export CROSS_COMPILE=arm-eabi-
$make rockchip_linux_defconfig
$make rk3288-firefly-lvds.img -j4
2. 问题描述
1> 修改dts,如下git diff arch/arm/boot/dts/rk3288-firefly.dtsi:
diff --git a/arch/arm/boot/dts/rk3288-firefly.dtsi b/arch/arm/boot/dts/rk3288-firefly.dtsi
index 1650f98455e2..9888f0816265 100644
--- a/arch/arm/boot/dts/rk3288-firefly.dtsi
+++ b/arch/arm/boot/dts/rk3288-firefly.dtsi
@@ -41,7 +41,6 @@
*/
#include "rk3288.dtsi"
-
/ {
memory {
device_type = "memory";
@@ -171,10 +170,30 @@
sound {
compatible = "simple-audio-card";
- simple-audio-card,name = "SPDIF";
+ simple-audio-card,format = "i2s";
+ simple-audio-card,name = "rockchip,rockchip-codec";
+ simple-audio-card,mclk-fs = <512>;
+
+ simple-audio-card,dai-link@0 {
+ format = "i2s";
+ cpu {
+ sound-dai = <&i2s>;
+ };
+ codec {
+ sound-dai = <&hdmi>;
+ };
+
+ };
+
simple-audio-card,dai-link@1 {
- cpu { sound-dai = <&spdif>; };
- codec { sound-dai = <&spdif_out>; };
+ format = "i2s";
+ cpu {
+ sound-dai = <&i2s>;
+ };
+
+ codec {
+ sound-dai = <&es8323>;
+ };
};
};
@@ -285,6 +304,21 @@
WIFI,host_wake_irq = <&gpio4 30 GPIO_ACTIVE_HIGH>;
status = "okay";
};
+ rockchip-es8323 {
+ compatible = "rockchip-es8323";
+ dais {
+ dai0 {
+ audio-codec = <&es8323>;
+ audio-controller = <&i2s>;
+ format = "i2s";
+ //continuous-clock;
+ //bitclock-inversion;
+ //frame-inversion;
+ //bitclock-master;
+ //frame-master;
+ };
+ };
+ };
};
&cpu0 {
@@ -495,6 +529,14 @@
&i2c2 {
status = "okay";
+ es8323: es8323@10 {
+ compatible = "everest,es8323";
+ reg = <0x10>;
+ hp-det-gpio = <&gpio5 19 GPIO_ACTIVE_HIGH>;
+ clock-names = "mclk";
+ clocks = <&cru SCLK_I2S0_OUT>;
+ #sound-dai-cells = <0>;
+ };
};
&i2c4 {
2> 修改sound/soc/rockchip/card_info.c,这里不改编译不过
diff --git a/sound/soc/rockchip/card_info.c b/sound/soc/rockchip/card_info.c
index fced8016c66c..7e1d3a1e45d1 100755
--- a/sound/soc/rockchip/card_info.c
+++ b/sound/soc/rockchip/card_info.c
@@ -62,6 +62,8 @@ int rockchip_of_get_sound_card_info_(struct snd_soc_card *card,
bool is_need_fmt)
{
struct device_node *dai_node, *child_dai_node;
+ struct device_node *bitclkmaster = NULL;
+ struct device_node *framemaster = NULL;
int dai_num;
dai_node = of_get_child_by_name(card->dev->of_node, "dais");
@@ -76,7 +78,8 @@ int rockchip_of_get_sound_card_info_(struct snd_soc_card *card,
for_each_child_of_node(dai_node, child_dai_node) {
if (is_need_fmt) {
card->dai_link.dai_fmt =
- snd_soc_of_parse_daifmt(child_dai_node, NULL);
+ snd_soc_of_parse_daifmt(child_dai_node, NULL,
+ &bitclkmaster, &framemaster);
if ((card->dai_link.dai_fmt &
SND_SOC_DAIFMT_MASTER_MASK) == 0) {
dev_err(card->dev,
3> 修改sound/soc/rockchip/rk_es8323.c,这里都是无效的修改,略过。
diff --git a/sound/soc/rockchip/rk_es8323.c b/sound/soc/rockchip/rk_es8323.c
index 1cbb4448bec3..31091512f971 100755
--- a/sound/soc/rockchip/rk_es8323.c
+++ b/sound/soc/rockchip/rk_es8323.c
@@ -116,8 +116,7 @@ static const struct snd_soc_dapm_route audio_map[]= {
static int rk29_es8323_init(struct snd_soc_pcm_runtime *rtd)
{
struct snd_soc_dai *codec_dai = rtd->codec_dai;
- struct snd_soc_codec *codec = rtd->codec;
- struct snd_soc_dapm_context *dapm = &codec->dapm;
+
int ret;
DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__);
@@ -128,19 +127,7 @@ static int rk29_es8323_init(struct snd_soc_pcm_runtime *rtd)
printk(KERN_ERR "Failed to set es8323 SYSCLK: %d\n", ret);
return ret;
}
-
- /* Add specific widgets */
-#if 0
- snd_soc_dapm_new_controls(dapm, rk29_dapm_widgets,
- ARRAY_SIZE(rk29_dapm_widgets));
- //snd_soc_dapm_nc_pin(codec, "LOUT2");
- //snd_soc_dapm_nc_pin(codec, "ROUT2");
-
- /* Set up specific audio path audio_mapnects */
- snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map));
-
- snd_soc_dapm_sync(dapm);
-#endif
+
return 0;
}
4> 修改sound/soc/soc-core.c,这里是调试时发现的问题,无法找到es8323的驱动,提示cpu_name = (null), cpu_dai_name = (null),不知道哪里没有修改正确。
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 251a7e8670b7..4e14de311ec8 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -923,6 +923,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
dev_dbg(card->dev, "ASoC: binding %s at idx %d\n", dai_link->name, num);
+ printk("!!! ASoC: dai_link->name = %s, dai_link->cpu_name = %s, dai_link->cpu_dai_name = %s\n", dai_link->name, dai_link->cpu_name, dai_link->cpu_dai_name);
cpu_dai_component.name = dai_link->cpu_name;
cpu_dai_component.of_node = dai_link->cpu_of_node;
cpu_dai_component.dai_name = dai_link->cpu_dai_name;
@@ -1558,6 +1559,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_INIT);
/* bind DAIs */
+ printk("!!! snd_soc_instantiate_card: card->num_links = %d\n", card->num_links);
for (i = 0; i < card->num_links; i++) {
ret = soc_bind_dai_link(card, i);
if (ret != 0)
5> 完整diff文件是
6> Log提示如图,Log文件是
请各位大虾帮忙看看,或者你们你们哪位有现成的代码能给我一份么?万分感谢!
大家的RK3288开发板都有声音输出吗?怎么没有看到谁提出这个问题?es8323的驱动官方都不维护了吗?内核升级了,驱动居然不改!
以上
----------------------------------------------------------------------------------------------
联系方式:luwanjia@aliyun.com
你的UBUNTU声卡可以了吗? shohcl 发表于 2017-10-27 16:47
你的UBUNTU声卡可以了吗?
可以了,请使用我分享的固件
http://dev.t-firefly.com/forum.php?mod=viewthread&tid=12833&page=1#pid62376 kernel-4.4 8323修复补丁 也遇到类似的问题 是的,一样
我打了你的PATCH没有用? andy_y39548 发表于 2018-2-4 14:33
我打了你的PATCH没有用?
https://gitlab.com/TeeFirefly/linux-kernel gitlab/firefly 分支
更新下代码 下载不了,怎么下载呢 谢谢分享!!!!!!!!!!!!!!!!!!!!!!
页:
[1]
2