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_XXXtristate "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)。
如有问题欢迎留言!!!!!!
AW codec驱动跨平台移植相关推荐
- 【随笔记】XR872 Codec 驱动移植和应用程序实例(附芯片调试方法)
XR872 的 SDK 是我目前接触过那么多款 MCU 的 SDK 中,唯一一个将框架和 RTOS 结合的非常完美的 SDK .无论是代码风格还是框架的设计,看起来都很赏心悦目,而且是源码开源.希望能 ...
- 基于2.6.35内核的无线网卡驱动的移植
基于2.6.35内核的无线网卡驱动的移植 一. 移植环境: [移植环境] 1.主机:Ubuntu 10.10 2.目标机:FS210平台 3.交叉编译工 ...
- linux驱动:音频驱动(五)ASoc之codec驱动
linux驱动:音频驱动(五)ASoc之codec驱动
- TQ2440平台上LCD驱动的移植
参考: http://liu1227787871.blog.163.com/blog/static/205363197201242393031250/ http://blog.csdn.net/cum ...
- Android wifi驱动的移植 realtek 8188
Android wifi驱动的移植 一般我们拿到的android源代码中wifi应用层部分是好的, 主要是wifi芯片的驱动要移植并添加进去. wifi驱动的移植, 以realtek的8188etv为 ...
- linux spidev 应用_Linux下SPI驱动的移植和应用程序的测试
Linux2.6.32下SPI驱动的移植如下图所示: 下面需要修改部分内核代码,具体操作如下: 1. 修改arch/arm/mach-s3c2440/mach-mini2440.c文件 在inclu ...
- ASoC Codec驱动代码框架图
原址 [前言] 上个月写了<Audio驱动开发 之 Codec芯片ALC5677驱动代码分析>,但是感觉那个时候理解得还不够深入.写得很粗糙.这一个月以来新看了 HAL层.Framewor ...
- Linux 音频驱动(三) ASoC音频驱动之Codec驱动
目录 1. 简介 2. 源码分析 2.1. Codec 2.1.1. 数据结构struct snd_soc_codec_driver 2.1.2. 注册Codec 2.2. Codec DAI 2.2 ...
- ARM-9 4412板、linux-3.14内核、usb转串口pl2303驱动的移植相关问题
- ARM-9 4412板.linux-3.14内核.usb转串口pl2303驱动的移植相关问题 最近在做一个智能仓储的项目,遇到一个问题,当功能采集板Cortex-M0通过USB-UART接口和服务 ...
最新文章
- PCL:基于PCL绘制包围盒基础介绍(1)
- Zend Framework数据库操作
- hashCode()方法(覆盖hashCode()方法)
- 海思Hi3516A(5)3D降噪
- mysql slave lock 跳过_slave开启MTS时执行mysqldump引发死锁案例
- 中山纪念中学培训15天总结
- Matlab--colorbar的各项细节操作
- c++全局变量怎么定义_C errno全局变量是否是线程安全的
- 【面试】面试文章积累
- 锤子系统宣布回归 或将推新品
- Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析
- git21天打卡day11-删除分支
- 什么是数据脱敏(Data Masking)?
- Unique Binary Search Trees,Unique Binary Search Trees2 生成二叉排序树
- 阿里巴巴的盈利模式分析
- 金蝶系统无法建立数据可连接服务器,金蝶K3打开,提示无法建立数据链接
- DruidDataSource配置说明
- 预防数据泄露——音乐播放器Spotify强制用户重置密码
- 同时掌握96门语言,取得多项世界突破,百度发布预训练模型ERNIE-M
- php计算用户留存,留存率到底有几种计算方式