快速建设网站视频,wordpress化妆品模板,建设工程造价管理总站网站,个人网站建设与实现前两天在调试PHY的时候遇到了一堆问题#xff0c;老刘都不耐其烦的搞定了#xff0c;这次我们开始调试音频部分#xff0c;音频部分很简单#xff0c;无非就是录音#xff0c;要是能把录音的音频拿到了#xff0c;那就万事大吉了。老刘也是信心满满#xff0c;老刘对我说… 前两天在调试PHY的时候遇到了一堆问题老刘都不耐其烦的搞定了这次我们开始调试音频部分音频部分很简单无非就是录音要是能把录音的音频拿到了那就万事大吉了。老刘也是信心满满老刘对我说发哥我对这个芯片特别熟悉你要是搞不定的话可以把驱动代码给我看看我来帮你调试。 然后我们就开始调试了 也很快我们就遇到了问题了使用录音命令录音一会就崩了是的崩了。 我跟老刘说我这边程序崩了什么音频数据都录不到。 老刘跟我说没事发哥只要我们的波形正确了我有办法帮你搞定录音的。 然后我和老刘就开始测量波形我们遇到的第一个问题是我们配置的Mclk是12.288M但是呢测量出来的波形是50M。 你看得没错我也从来没有看到过50M的波形这部分肯定是CPU的问题了CPU当然是没有问题了所以就是我的问题了。 我用命令查看了下时钟的配置也确实不是12.288M 这个地方我就折腾了一段时间刚开始是猜测我的ADC是不是没有配置正确如果CPU配置成了master模式ADC又配置成了master模式那就有冲突了不是所以这个部分我又检查了一会。 后面我看到这个时钟的配置是开始录音的时候去使能的然后我每次测试的时候就会先去录音后再测量波形。 然后还是没啥进展。 在这个没有进展的过程中我们曾经有一次测量到了正确的波形也就是16k的LRCLK和3.072M的BCLK但是在软件没有修改的情况下我们重新上电后那些之前看到的美好景象都没有了。 然后没有其他思路的情况下我只好软件分析分析了。 使用下面的命令开始录音。 arecord -f S16_LE -c 4 -r 16000 -v -Vmono -D hw:2 /tmp/4ch.wav 命令执行了一会就崩了。 然后我开始查声卡的信息 声卡的每个pcm都有两个核心的部分一个是codec dai一个是cpu dai他们之间的配置要一致才可能让音频正确拾取。 我们codec 部分用的是dsp_a的IIS格式但是我反复检查了CPU部分cpu部分我们也已经配置成了dsp_a的格式。 dsp_a的LRCK波形如下 老刘检查了两遍硬件没有问题时钟也都是正常的。 然后我使用下面的命令追踪了下arecord的调用流程 / # strace arecord -f S16_LE -c 4 -r 16000 -v -Vmono -D hw:2 /tmp/4ch.wav
....
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) 0
ioctl(4, SNDRV_PCM_IOCTL_HW_REFINE, 0x7fc8656820) 0
ioctl(4, SNDRV_PCM_IOCTL_HW_PARAMS, 0x7fc8656820) 0
ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0xf2167e0) 0
ioctl(4, SNDRV_PCM_IOCTL_SW_PARAMS, 0x7fc86566d0) 0
ioctl(4, SNDRV_PCM_IOCTL_PREPARE, 0x8) 0
ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0xf2167e0) 0
ioctl(4, SNDRV_PCM_IOCTL_SYNC_PTR, 0xf2167e0) 0
openat(AT_FDCWD, /dev/snd/controlC2, O_RDWR|O_CLOEXEC) 3
fcntl(3, F_SETFD, FD_CLOEXEC) 0
ioctl(3, SNDRV_CTL_IOCTL_PVERSION, 0x7fc865653c) 0
ioctl(3, SNDRV_CTL_IOCTL_CARD_INFO, 0x7fc86565b0) 0
close(3) 0
.....
newfstatat(AT_FDCWD, /tmp/4ch.wav, {st_modeS_IFREG|0644, st_size44, ...}, AT_SYMLINK_NOFOLLOW) 0
unlinkat(AT_FDCWD, /tmp/4ch.wav, 0) 0
openat(AT_FDCWD, /tmp/4ch.wav, O_WRONLY|O_CREAT, 0644) 3
write(3, RIFF$\0\0\200WAVE, 12) 12
write(3, fmt \20\0\0\0, 8) 8
write(3, \1\0\4\0\200\0\0\0\364\1\0\10\0\20\0, 16) 16
write(3, data\0\0\0\200, 8) 8
ioctl(4, SNDRV_PCM_IOCTL_READI_FRAMES, 0x7fc8656b40) -1 EIO (Input/output error)
write(2, arecord: pcm_read:2143: , 24arecord: pcm_read:2143: ) 24
write(2, read error: Input/output error, 30read error: Input/output error) 30
write(2, \n, 1
) 1
ioctl(4, SNDRV_PCM_IOCTL_DROP, 0x8) 0
ioctl(4, SNDRV_PCM_IOCTL_HW_FREE, 0x8) 0
close(4) 0
exit_group(1) ?exited with 1
/ # 看到调用里面有一个音频的读取相关的ioctl。 c文件里面的函数调用关系是这样的 snd_pcm_capture_ioctl1
-snd_pcm_lib_read
--snd_pcm_lib_read1 最后的函数会检查子流的状态。如果子流不处于可读取音频数据的状态如准备、运行、暂停则直接返回错误。 我这里不能读取到音频就是因为没有可读取的音频所以就返回错误了也就是说CPU看到的SDIO线上没有数据。 那问题就来了示波器测量到的I2S数据线上已经看到数据了但是为什么读取出来还是不行 那不就是见了鬼了吗 我跟老刘说我这边已经没有办法了已经把能检查的地方检查过了一遍然后我让老刘给原理图我想再检查一下。 我看了下原理图其中有一个地方很奇怪就是有一个GPIO口标注了两个名字我就跟老刘说这个GPIO口怎么又两个名字呢 老刘跟我说这个是一个比较牛逼的设计因为我可以通过飞跳电阻的方式把这两个引脚飞到另外两个引脚是硬件上面的预留设计。 我质疑了下老刘我说这个地方会不会有问题呢 老刘说不会的我已经检查了波形也都出来了说明这个地方是没有问题的。 老刘说我想看看你的ADC程序会不会程序上有什么可以配置的我到你电脑上看看代码。 然后就是老刘看代码的时间看了一会老刘给我指出一个宏他说这个宏是不是可能配置成1然后就是我给老刘解释代码的时间。 过了挺久时间。 大概是晚上10点40左右了因为9点后这栋楼的空调会被物业统一关闭实验室里面有点闷老刘把我前面的窗户打开了从外面吹进来一阵阵的热风把脑子吹得有些膨胀这个时候我已经干掉了5瓶怡宝了。 我跟老刘说你们有没有硬件配置跟这个差不多的拿过来给我验证一把呢 老刘说有的然后就给我拿了一个硬件我把我的固件烧录进去神奇的事情是录音程序没有崩。 我又跟老刘说这个板子跑我的程序没有问题的。 老刘让我断电拿起板子去量了下说了句卧槽这个地方短路了。 下面就是老刘的表演时间了因为之前的GPIO反了的原因这次的捣鼓也特别不容易。 这个时候是晚上11点20左右。 然后就用刚才那个程序录到声音了我们用了一个linein给ADC输入了音频也能从示波器上看到了音频波形。 真的是惊险万分惊喜万分。 这个时候我跟老刘说收工吧明天再继续调试其他部分老刘也是神情舒畅心满意得毕竟在硬件工程师这个职业中老刘的技术威望那是不允许有过夜的问题存在的。 哦对了今天有同学问搞定寄存器计划的浮力还有吗 我说那必要还有具体看下面这个链接 跟韦东山老师搞事