OS:Android8.1
platform:PX30(RK平台)
驱动包:AW88195_Driver_MTK_V0.1.6.zip
AW88195是艾为公司的一款用于调节speaker 音质的codec,厂商给的驱动包是基于MTK 平台适配的移植文档,现在要将其在MTK 平台下适配的驱动程序移植到我们的平台下。
其实对于这种芯片驱动的移植,内核部分都是大部分平台通用的,平台应该都是基于linux 内核源码做的,所以第一步,移植内核。
将驱动包里面的驱动文件(一般也就是一些.c .h 文件了)拷贝到系统的对应目录下,/kernel/sound/soc/codec/ 如果驱动文件较多,可以自己重命名一个文件夹,在这儿假设为awxxx,在该目录下创建
Makefile Kconfig 两个文件。
Makefile 内容:
snd-soc-xxxx-objs:=xxx.o xxx1.o //xxx为你驱动的名字
obj-$(CONFIG_SND_SOC_XXX) += snd-soc-xxx.o
Kconfig内容:
config SND_SOC_XXX
tristate "Describe"
然后修改codec/下的Makefile,添加如下代码:
obj-$(CONFIG_SND_SOC_XXX) += awxxx/
Kconfig 中添加:
source "sound/soc/codecs/awxxx/Kconfig"
然后kernel/arch/arm64/configs/rockchip_defconfig中添加
CONFIG_SND_SOC_XXX=y
到这儿驱动代码能正常编译进系统了。然后需要将新的codec 注册为声卡,rockchip 使用的machine driver 为原内核提供的simple-card.c 作为machine 驱动,代码在/kernel/sound/soc/generic/ 下。代码里通过解析dts 方式链接codec dai 和 cpu dai,这儿贴出来一部分代码
/* Single/Muti DAI link(s) & New style of DT node */
if (of_get_child_by_name(node, "simple-audio-card,dai-link")) {
struct device_node *np = NULL;
int i = 0;
for_each_child_of_node(node, np) {
dev_dbg(dev, "\tlink %d:\n", i);
ret = asoc_simple_card_dai_link_of(np, priv,
i, false);
if (ret < 0) {
of_node_put(np);
return ret;
}
i++;
}
} else {
/* For single DAI link & old style of DT node */
ret = asoc_simple_card_dai_link_of(node, priv, 0, true);
if (ret < 0)
return ret;
}
具体的实现方法在asoc_simple_card_dai_link_of函数中执行,函数代码较长就不贴出来了,感兴趣朋友可以自己去查看。
然后修改对应的dts 配置/kernel/arch/arm64/boot/dts/下:
simple-audio-card,dai-link@0 {
format = "i2s";
cpu {
sound-dai = ;
};
codec {
sound-dai = ;
};
};
配置完dts 重新编译kernel,烧录代码,然后在板子里cat /proc/asound/pcm,就可看见对应的声卡信息:
00-00: ff060000.i2s-aw881xx-aif aw881xx-aif-0 : : playback 1 : capture 1
有这个声卡信息,就代表你注册成功了,然后添加codec 固件。
一般系统固件都放在vendor/etc/firmware下,则需要在内核kernel/drivers/base/firmware_class.c文件中加入
static const char * const fw_path[] = {
fw_path_para,
"/system/vendor/firmware",
"/system/etc/firmware",
"/lib/firmware/updates/" UTS_RELEASE,
"/lib/firmware/updates",
"/lib/firmware/" UTS_RELEASE,
"/lib/firmware"
};
内核中读取并加载系统固件则是通过
struct firmware;
request_firmware();
request_firmware_nowait();
release_firmware();
这几个接口去进行读取的,具体使用方法,请自行查阅相关信息!
最后通过device.mk 将固件拷贝到系统的/vendor/etc/firmware/下就好了。
移植完成后,请先使用底层播音命令tinyplay 来尝试播音,看是否能正常运行,如可以正常播音,再使用上层ap端播音,如有问题,请检查audio hal 是否正常调用了底层的播音设备(在/dev/snd/下 controlC0 pcmC0D0c pcmC0D0p pcmC0D1c timer)。
如有问题欢迎留言!!!!!!
我的小鱼楠 原创文章 6获赞 4访问量 2744 关注 私信 展开阅读全文