Firefly开源社区

打印 上一主题 下一主题

【驱动入门】 FirePrime_codec_ap8048c

582

积分

10

威望

8

贡献

技术大神

Rank: 3Rank: 3

积分
582
QQ

【驱动入门】 FirePrime_codec_ap8048c

发表于 2016-6-15 14:11:04      浏览:4787 | 回复:0        打印      只看该作者   [复制链接] 楼主
本帖最后由 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这个两个文件中的代码实现

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表