本帖最后由 54zw 于 2016-6-15 14:14 编辑
FirePrime 外接codec(ap8048c)
linux codec 驱动框架大体分三个部分,machine, platform, codec.
所以要在内核中新添加一块codec芯片,内核代码中需要修改的地方就可以根据上面三个方面来修改
1. 首先看下硬件连接情况:
从图上可以看到AP8048C连接到了RK3128上的I2S0控制器(查看rockchip-rk312x.h根据管脚复用情况得知是I2S0).
一般情况下都是通过I2C来控制codec的,所以会把codec的I2C连接到RK3128,图中并没有,但是这并没有太大影响,这里暂且认为有接到RK3128上。
2. 知道硬件连接情况后就能根据这个连接情况写出DeviceTree里描述了
在任何一个平台添加一块codec一般都不大会需要修改platform相关到内容,所以基本上的修改都是针对machine,和codec的
先列出各部分的文件
machine和platform的代码全部都放在kernel/sound/soc/rockchip/目录下:
machine: rk_ap8048c.c
platform: rk30_i2s.c
codec相关的代码放在kernel/sound/soc/codecs/目录下:
codec: ap8048c.c
其中rk_ap8048c.c 和 ap8048c.c是自己添加的
各个部分的核心内容:
machine: 注册dai_link
platform: 注册cpu_dai dma相关
codec: 注册codec_dai codec_drv
所以根据各部分需要做的核心事情,可以在各个驱动模块里的probe函数中完成
machine部分在DeviceTree里添加platform device信息,其中指定所使用的codec和i2s,如下:
其中ap8048c这个节点信息,由于之前提到说这个IC是通过I2C挂在RK3128上的,所以可以写在I2C0节点下面,这和是否有真实物理连接无关,只是为了借用驱动模型而已。
3.测试由于ap8048c烧写的固件目前只支持8khz的采样率,所以测试的时候需要用一个8khz采样的文件测试
使用的是tinyplay测试的:
tinyplay 8khz_audio.wav
这个8khz的wav文件可以用cool editer修改一个音频文件的格式得到
直接使用android系统中的音乐播放器播放不出正确的音乐
调试过程中遇到的问题:
发现I2S_DOUT的数据在示波器上的显示异常,如下图:
出现该问题是由于硬件上将RK3128的I2S OUT 和ap8048c的I2S OUT连起来了,正确的应该是RK3128_OUT==>CODEC_IN RK3128_IN ==> CODEC_OUT
后续将会从头分析上面提到的rk_ap8048c.c 和 ap8048c.c这个两个文件中的代码实现
|