AW codec驱动跨平台移植

Gretchen ·
更新时间:2024-11-13
· 840 次阅读

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 关注 私信 展开阅读全文
作者:我的小鱼楠



跨平台

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章