ITOP4412 讯为开发版调试ALSA声卡

ITOP4412 讯为开发版调试ALSA声卡

ALSA 移植
1:alsa-lib 编译:版本1.0.22
https://blog.csdn.net/chunleigan/article/details/21000127
./configure --host=arm-none-linux-gnueabi CC=arm-none-linux-gnueabi-gcc --prefix=/home/topeet/alsa-lib/ --disable-mixer
make
make install
2:alsa-utils 编译:版本1.0.22
http://linux4u.jinr.ru/pub/kernel/alsa/utils/
https://blog.csdn.net/mcgrady_tracy/article/details/52503428
我觉得:如果你不用aplay或arecord的话,可以不用交叉编译 alsa-utils
./configure --host=arm-none-linux-gnueabi CC=arm-none-linux-gnueabi-gcc --prefix=/home/topeet/alsa-utils --with-alsa-inc-prefix=/home/topeet/alsa_lib/include --with-alsa-prefix=/home/topeet/alsa_lib/lib --disable-alsamixer --disable-xmlto --disable-mixer --with-curses=ncurses CFLAGS="-I/home/topeet/alsa-lib/include" LDFLAGS="-L/home/topeet/alsa-lib/lib/"
make
make install
安装时遇到cannot stat `t-ja.gmo’: No such file or directory,请 apt-get install gettext
如果遇到Sub-process /usr/bin/dpkg returned an error code,按照如下操作:
mv /var/lib/dpkg/info /var/lib/dpkg/info_bak
mkdir /var/lib/dpkg/info -p然后重新安装即可
3:测试
prefix目录下面的lib下面的so库要放到板子的文件系统里,如果是动态库编译的话
另外特别注意把prefix目录下面的share目录要放到和板子文件系统prefix的目录下!!
关于测试没有声音的问题:参考这篇文章 https://www.cnblogs.com/subo_peng/p/5233915.html
初始化后默认为差分输出,即J3,J4,不是phone输出!
关于alsa代码理解:
Digital audio interface 简称(DAI)
个人分析WM8960的代码逻辑:主要代码由这几个文件构成:soc/smdk_wm8960.c soc/i2s.c soc/codecs/wm8960.c
soc/codecs/wm8960.c----即codecs
–>snd_soc_dai_driver–>.name = “wm8960-hifi”
soc/i2s.c----即dai
–>.name = “samsung-i2s”
soc/smdk_wm8960.c----即soc或machine
–>snd_soc_dai_link–>该文件负责注册声卡,指定codecs和cpu_dai的类型
.platform_name = “samsung-audio”,
.cpu_dai_name = “samsung-i2s.0”,–>忽略.0之后与i2s.c中的一致
.codec_dai_name = “wm8960-hifi”,–>恰好与codes里面的name匹配

开机打印的几个函数依次顺序:
1:初始化:
wm8960_modinit–>soc/codecs/wm8960.c
wm8960_i2c_probe–>这里注册codec(snd_soc_register_codec)
samsung_i2s_init–>soc/i2s.c
samsung_i2s_probe–>这里注册dai(snd_soc_register_dai)
smdk4x12_audio_init–>soc/smdk_wm8960.c–> 添加snd_soc_card设备注册,指定codecs和dai
2:开始绑定并初始化
soc_probe–>soc-core.c
samsung_i2s_dai_probe–>soc/i2s.c–>初始化dai
wm8960_probe–>codecs的初始化
smdk4x12_wm8960_init–>soc的初始化
3:成功之后,
打印asoc: wm8960-hifi <-> samsung-i2s.0 mapping ok
在/proc/asound/会出现TOPEETWM8960声卡
cat /proc/asound/devices也可以看到

输出声音时的几个函数依次顺序:模块化设计,一个控制拆分成3个部分来实现,方便移植
i2s_startup
smdk4x12_hw_params
wm8960_hw_params
i2s_hw_params

正常电脑的硬件配置dump配置
ACCESS: RW_INTERLEAVED
FORMAT: S16_LE
SUBFORMAT: STD
SAMPLE_BITS: 16
FRAME_BITS: 32
CHANNELS: 2
RATE: (16000 16001)
PERIOD_TIME: 100000
PERIOD_SIZE: [1600 1600]
PERIOD_BYTES: (6400 6404)
PERIODS: (0 1)
BUFFER_TIME: (99993 100000)
BUFFER_SIZE: 1600
BUFFER_BYTES: 6400
TICK_TIME: 0
开发板上设置完16K采样率之后的dump日志,下面的值是否为上下限?:
ACCESS: RW_INTERLEAVED
FORMAT: S16_LE
SUBFORMAT: STD
SAMPLE_BITS: 16
FRAME_BITS: 32
CHANNELS: 2
RATE: (16000 16001)
PERIOD_TIME: (64062 127938)
PERIOD_SIZE: [1025 2047] //如果CHANNELS=1,这里的范围就是[2050 4094]
PERIOD_BYTES: [4100 8188]
PERIODS: (1 32)
BUFFER_TIME: (128116 2048000)
BUFFER_SIZE: [2050 32768]
BUFFER_BYTES: [8200 131072]
TICK_TIME: ALL
alsa函数返回值为:periods_size_min:1025 periods_size_max:2047 buffer_size_min:2050 buffer_size_max:32768
确实也能对上,注意:snd_pcm_hw_params_get_period_size_min与snd_pcm_hw_params_get_periods_min并不相同,后者指的是倍数,就是上图中的(1 32)

注:snd_pcm_hw_params_set_period_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val, int dir);
这个函数中dir并不代表record还是play,而是 < = > 我们去看aplay的代码,可以发现他们写的都是0,之前一直设置失败就是因为这个dir在play的代码里面都是1,但是在虚拟机里面是可以的,开发板上却不行,另外period_size buffer_size这些都有区别
另外备注:建议使用near函数,而不是直接设置rate,period,buffer之类的值
另外apaly.c中可以添加打印方便对比调试:
error((“period_time:%d,period_frames:%d”),period_time,period_frames);
error(
(“buffer_time:%d,buffer_frames:%d”),buffer_time,buffer_frames);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值