AW codec驱动跨平台移植

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 = <&i2s0_8ch>;
                        };
                        codec {
                                sound-dai = <&awxxx>;
                        };
};

配置完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)。

如有问题欢迎留言!!!!!!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值