Firefly开源社区

12
发表新贴

移植sgtl5000到rk3288板子上的痛苦经历,求思路

55

积分

0

威望

0

贡献

技术小白

积分
55
发表于 2015-6-26 09:33:59     
我们现在需要移植sgtl5000到瑞星微rk3288板子(我们参考firefly-rk3288设计的板子)上,现在sound/codec/sgtl5000.c是有的,但是sound/rockchip/rk_sgtl5000(codec的machine相关驱动)是没有的。
因为之前我们公司飞思卡尔平台上的sgtl5000是成功播放声音的。所以我把之前飞思卡尔版本内核(3.01作左右的版本)的imx-sgtl5000.c 直接当成sound/rockchip/rk_sgtl5000用,这个文件也做了些细微修改,修改主要是适配从Linux内核3.01到3.10的变化。不过核心的配置I2S,codec寄存器的我没改。

然后的移植还有个工作,飞思卡尔平台上的是SSI总线吧,这个也可以配成I2S模式,我比较下sound/imx/imx-ssi.c 和 sound/rockchip/rk30_i2s.c (codec的platform驱动比较),感觉rk30_i2s.c应该对于rk_wm8960,rk_es8323都是独立的,也不需要针对sgtl5000再做什么改动吧。

然后移植代码修改完,编译后的andorid内核启动后,显示声卡已经被加载。
dmesg | grep -i sgtl
<4>[    1.502494] sgtl5000_i2c_probe begin
<4>[    1.502516] sgtl5000_i2c_probe end
<4>[    1.503217] imx_sgtl5000_probe enteredddd
<4>[    1.503359] sgtl5000_probe here
<3>[    1.548906] sgtl5000 2-000a: ASoC: no sink widget found for Capture Mux
<3>[    1.548916] sgtl5000 2-000a: ASoC: Failed to add route LINE_IN -> LINE_IN
-> Capture Mux
<3>[    1.548924] sgtl5000 2-000a: ASoC: no sink widget found for Mic Bias
<3>[    1.548932] sgtl5000 2-000a: ASoC: Failed to add route MIC_IN -> direct ->
Mic Bias
<3>[    1.548940] sgtl5000 2-000a: ASoC: no source widget found for Mic Bias
<3>[    1.548948] sgtl5000 2-000a: ASoC: Failed to add route Mic Bias -> MIC_IN
-> Capture Mux
<3>[    1.548956] sgtl5000 2-000a: ASoC: no source widget found for Capture Mux
<3>[    1.548963] sgtl5000 2-000a: ASoC: Failed to add route Capture Mux -> dire
ct -> ADC
<3>[    1.548971] sgtl5000 2-000a: ASoC: no source widget found for ADC
<3>[    1.548978] sgtl5000 2-000a: ASoC: Failed to add route ADC -> ADC -> DAP_I
N
<3>[    1.548986] sgtl5000 2-000a: ASoC: no sink widget found for DAP_IN
<3>[    1.548993] sgtl5000 2-000a: ASoC: Failed to add route AIFIN -> I2S_IN ->
DAP_IN
<3>[    1.549001] sgtl5000 2-000a: ASoC: no source widget found for ADC
<3>[    1.549008] sgtl5000 2-000a: ASoC: Failed to add route ADC -> ADC -> MIX_M
UX
<3>[    1.549016] sgtl5000 2-000a: ASoC: no sink widget found for MIX_MUX
<3>[    1.549023] sgtl5000 2-000a: ASoC: Failed to add route AIFIN -> I2S_IN ->
MIX_MUX
<3>[    1.549031] sgtl5000 2-000a: ASoC: no source widget found for DAP_IN
<3>[    1.549038] sgtl5000 2-000a: ASoC: Failed to add route DAP_IN -> direct ->
DAP_MIXER
<3>[    1.549046] sgtl5000 2-000a: ASoC: no source widget found for MIX_MUX
<3>[    1.549054] sgtl5000 2-000a: ASoC: Failed to add route MIX_MUX -> Mixer Ch
annel -> DAP_MIXER
<3>[    1.549062] sgtl5000 2-000a: ASoC: no source widget found for ADC
<3>[    1.549070] sgtl5000 2-000a: ASoC: Failed to add route ADC -> ADC -> I2S_O
UT
<3>[    1.549077] sgtl5000 2-000a: ASoC: no sink widget found for I2S_OUT
<3>[    1.549085] sgtl5000 2-000a: ASoC: Failed to add route AIFIN -> I2S_IN ->
I2S_OUT
<3>[    1.549092] sgtl5000 2-000a: ASoC: no source widget found for DAP_MIXER
<3>[    1.549100] sgtl5000 2-000a: ASoC: Failed to add route DAP_MIXER -> DAP ->
I2S_OUT
<3>[    1.549108] sgtl5000 2-000a: ASoC: no source widget found for I2S_OUT
<3>[    1.549115] sgtl5000 2-000a: ASoC: Failed to add route I2S_OUT -> direct -
> AIFOUT
<3>[    1.549123] sgtl5000 2-000a: ASoC: no source widget found for ADC
<3>[    1.549130] sgtl5000 2-000a: ASoC: Failed to add route ADC -> ADC -> DAC_I
N
<3>[    1.549138] sgtl5000 2-000a: ASoC: no sink widget found for DAC_IN
<3>[    1.549146] sgtl5000 2-000a: ASoC: Failed to add route AIFIN -> I2S_IN ->
DAC_IN
<3>[    1.549154] sgtl5000 2-000a: ASoC: no source widget found for DAP_MIXER
<3>[    1.549161] sgtl5000 2-000a: ASoC: Failed to add route DAP_MIXER -> DAP ->
DAC_IN
<3>[    1.549168] sgtl5000 2-000a: ASoC: no source widget found for DAC_IN
<3>[    1.549176] sgtl5000 2-000a: ASoC: Failed to add route DAC_IN -> direct ->
DAC
<3>[    1.549183] sgtl5000 2-000a: ASoC: no source widget found for DAC
<3>[    1.549190] sgtl5000 2-000a: ASoC: Failed to add route DAC -> DAC -> Headp
hone Mux
<3>[    1.549198] sgtl5000 2-000a: ASoC: no source widget found for DAC
<3>[    1.549205] sgtl5000 2-000a: ASoC: Failed to add route DAC -> direct -> LO

<3>[    1.549213] sgtl5000 2-000a: ASoC: no sink widget found for Headphone Mux
<3>[    1.549221] sgtl5000 2-000a: ASoC: Failed to add route LINE_IN -> LINE_IN
-> Headphone Mux
<3>[    1.549229] sgtl5000 2-000a: ASoC: no source widget found for Headphone Mu
x
<3>[    1.549237] sgtl5000 2-000a: ASoC: Failed to add route Headphone Mux -> di
rect -> HP
<3>[    1.549244] sgtl5000 2-000a: ASoC: no source widget found for LO
<3>[    1.549251] sgtl5000 2-000a: ASoC: Failed to add route LO -> direct -> LIN
E_OUT
<3>[    1.549259] sgtl5000 2-000a: ASoC: no source widget found for HP
<3>[    1.549266] sgtl5000 2-000a: ASoC: Failed to add route HP -> direct -> HP_
OUT
<6>[    1.549303] sgtl5000 2-000a: read 2 => 60
<6>[    1.549314] sgtl5000 2-000a: read 2 => 60
<6>[    1.549997] rockchip-sgtl5000 rockchip-sgtl5000.25:  sgtl5000 <-> rockchip
-i2s.0 mapping ok
<6>[    1.550322] input: sgtl5000-audio Headphone Jack as /devices/rockchip-sgtl
5000.25/sound/card0/input1
<6>  #0: sgtl5000-audio

然后用i2c相关工具读写codec从设备地址0x0a没有失败:
i2c_test /dev/i2c-2 0x0a

但是执行tingplay /data/shasha.wav 时,显示error play sample ,然后这个命名就退出了。
我用dmesg | grep -i i2c 看到:
<3>[   94.832661] rockchip_i2c ff660000.i2c: SCL was hold by slave
<3>[   94.832861] rockchip_i2c ff660000.i2c: Addr[0x000a] wait event timeout, st
ate: 3, is_busy: 1, error: 0, complete_what: 0x2, ipd: 0x80
我们的板子是分载板和核心板的,sgtl5000是焊在载板上,核心板有飞思卡尔和rk3288两个不同板子,载板不变,核心板换成飞思卡尔的就可以成功驱动sgtl5000播放出声音。但是换成3288板子就出现上面错误。
还有3288核心板之前搭配wm8960我们移植成功了,说明我们3288核心板的i2s部分也可以工作的。
所以我觉得板子I2C通信出的问题可能跟软件有关。

我想问问 如果出现i2c 通信错误比如上面那个,该怎样调试解决啊?大家有没有思路啊?谢谢指点。
回复

使用道具 举报

265

积分

5

威望

6

贡献

实习版主

Rank: 7Rank: 7Rank: 7

积分
265

活跃会员热心会员突出贡献

发表于 2015-6-26 09:47:14     
这个估计难度大,但是要IIC通应该不难,1.保证电源都对 2.保证IIC地址对 3.RK3288的 IIC速度貌似不能设置为400K,默认的是400K,建议改成100K 200K试试。
回复

使用道具 举报

55

积分

0

威望

0

贡献

技术小白

积分
55
发表于 2015-6-26 12:32:34     
carlinluo 发表于 2015-6-26 09:47
这个估计难度大,但是要IIC通应该不难,1.保证电源都对 2.保证IIC地址对 3.RK3288的 IIC速度貌似不能设置为 ...

太感谢了,我回去试下。是啊,我谷歌上搜sgtl5000,发现全部是配合飞思卡尔平台的,没有一个是sgtl5000配合非飞思卡尔平台移植成功的。为什么wm8960可以配合多个平台,sgtl5000多平台化比较少啊
回复

使用道具 举报

55

积分

0

威望

0

贡献

技术小白

积分
55
发表于 2015-6-29 10:05:10     
已经移植成功,感觉驱动移植没啥技术含量,都是辛苦活。
回复

使用道具 举报

2918

积分

56

威望

46

贡献

高级创客

Rank: 6Rank: 6

积分
2918

优秀版主论坛元老

发表于 2015-6-29 11:21:55     
buhui912 发表于 2015-6-29 10:05
已经移植成功,感觉驱动移植没啥技术含量,都是辛苦活。

可以把相关的经验分享出来:)
回复

使用道具 举报

55

积分

0

威望

0

贡献

技术小白

积分
55
发表于 2015-6-29 12:55:13     
zhansb 发表于 2015-6-29 11:21
可以把相关的经验分享出来

感觉Linux内核做的那么复杂,跟芯片真正有关系的就是配置寄存器,看看信号波形,电源之类的。仔细比较两个版本寄存器配置差异,然后困难的地方看看芯片资料也就够了,当然了这需要耐得住寂寞,有耐心。

底层驱动开发思维比较受限,得靠你去不断阅读芯片资料。当然了Linux内核的蓬勃发展一定程度上解放了驱动开发者的思维模式。可以让我们站在比较高的视野开发驱动,比如那个device tree这些概念。

所以感觉做驱动开发或者移植,有两个方向发展,一个是再往底层去,理解芯片的硬件工作机制,还有一个方向是如果你觉得你的抽象思维强,很想多搞软件而非硬件,可以望Linux内核方向发展,站在比较高的视野上去做驱动开发。

欢迎大家讨论,拍砖。
回复

使用道具 举报

1万

积分

232

威望

218

贡献

管理员

Rank: 9Rank: 9Rank: 9

积分
10889

突出贡献

发表于 2015-6-29 16:09:45     
buhui912 发表于 2015-6-29 12:55
感觉Linux内核做的那么复杂,跟芯片真正有关系的就是配置寄存器,看看信号波形,电源之类的。仔细比较两 ...

:lol赞一个
回复

使用道具 举报

18

积分

0

威望

0

贡献

游客

积分
18
发表于 2015-7-23 15:49:02     
楼主的可以录音嘛
回复

使用道具 举报

72

积分

0

威望

0

贡献

技术小白

积分
72
发表于 2017-4-11 17:43:50     
您好,请问vm8960怎么调试的,麻烦指导一下
回复

使用道具 举报

98

积分

0

威望

0

贡献

技术小白

积分
98
发表于 2017-12-1 15:42:42     
楼主,能请你指点下吗,我现在也要在RK3288平台下面调试SGTL5000
回复

使用道具 举报

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

本版积分规则

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