我和老刘又被搞惨了

news2024/11/8 3:13:13

前两天在调试PHY的时候遇到了一堆问题,老刘都不耐其烦的搞定了,这次我们开始调试音频部分,音频部分很简单,无非就是录音,要是能把录音的音频拿到了,那就万事大吉了。老刘也是信心满满,老刘对我说,发哥,我对这个芯片特别熟悉,你要是搞不定的话,可以把驱动代码给我看看,我来帮你调试。

然后我们就开始调试了

也很快,我们就遇到了问题了,使用录音命令录音一会就崩了,是的,崩了。

我跟老刘说,我这边程序崩了,什么音频数据都录不到。

老刘跟我说,没事发哥,只要我们的波形正确了,我有办法帮你搞定录音的。

然后我和老刘就开始测量波形,我们遇到的第一个问题是,我们配置的Mclk是12.288M,但是呢,测量出来的波形是50M。

你看得没错,我也从来没有看到过50M的波形,这部分肯定是CPU的问题了,CPU当然是没有问题了,所以就是我的问题了。

我用命令查看了下时钟的配置,也确实不是12.288M

884b04a903af4aa51b0200f18c0a9fb9.png

这个地方我就折腾了一段时间,刚开始是猜测我的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

命令执行了一会就崩了。

b70084e609c98c9e908dd1b214a08605.png

然后我开始查声卡的信息

9b72ad39a250be998224438142256d20.png

声卡的每个pcm都有两个核心的部分,一个是codec dai,一个是cpu dai,他们之间的配置要一致才可能让音频正确拾取。

我们codec 部分用的是dsp_a的IIS格式,但是我反复检查了CPU部分,cpu部分我们也已经配置成了dsp_a的格式。

dsp_a的LRCK波形如下:

c3e636796142af3bd8ff7a7ad416ac11.jpeg

老刘检查了两遍,硬件没有问题,时钟也都是正常的。

然后我使用下面的命令追踪了下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_mode=S_IFREG|0644, st_size=44, ...}, 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瓶怡宝了。

我跟老刘说,你们有没有硬件配置跟这个差不多的,拿过来给我验证一把呢?

老刘说有的,然后就给我拿了一个硬件,我把我的固件烧录进去,神奇的事情是,录音程序没有崩。

7b47ec860392c5be9d017fe0dd1cd422.png

我又跟老刘说,这个板子跑我的程序没有问题的。

老刘让我断电拿起板子去量了下,说了句,卧槽,这个地方短路了。

下面就是老刘的表演时间了,因为之前的GPIO反了的原因,这次的捣鼓也特别不容易。

这个时候是晚上11点20左右。

然后,就用刚才那个程序,录到声音了,我们用了一个linein给ADC输入了音频,也能从示波器上看到了音频波形。

真的是惊险万分,惊喜万分。

这个时候我跟老刘说,收工吧,明天再继续调试其他部分,老刘也是神情舒畅,心满意得,毕竟在硬件工程师这个职业中,老刘的技术威望那是不允许有过夜的问题存在的。

哦对了,今天有同学问,搞定寄存器计划的浮力还有吗?

我说,那必要还有,具体看下面这个链接

跟韦东山老师搞事

cc36b01601d48d75bf159ec72f86fc55.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/636211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统性能提升之内核锁优化

性能为王,系统的性能提升是每一个工程师的追求。目前,性能优化主要集中在消除系统软件堆栈中的低效率上或绕过高开销的系统操作。例如,内核旁路通过在用户空间中移动多个操作来实现这个目标,还有就是为某些类别的应用程序重构底层…

提升效率,从这款智能挂灯开始

❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。2022年度博客之星评选TOP 10🏆,Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作…

华为项目经理就是CEO,华为对项目经理的要求是什么?

项目经理要向上发展,下面我们来看看华为对项目经理的要求。 原文出自:pmo前沿

太空大战-第14届蓝桥杯国赛Scratch真题中级组第6题

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第148讲。 太空大战,本题是2023年5月28日上午举行的第14届蓝桥杯国赛Scratch图形化编程中级组真题第6题&am…

Flume学习---3、自定义Interceptor、自定义Source、自定义Sink

1、自定义Interceptor 1、案例需求 使用 Flume 采集服务器本地日志,需要按照日志类型的不同,将不同种类的日志发往不同的分析系统。 2、需求分析 在实际的开发中,一台服务器产生的日志类型可能有很多种,不同类型的日志可能需要发…

【微信公众平台对接】有关【上传图文消息内的图片获取URL】调用示例

1、微信接口说明: 2、调用示例 /*** 上传图文消息内的图片获取URL** param image* return*/PostMapping("uploadImg")public String uploadImg(MultipartFile image) {return wechatOpenService.uploadImg(image);}/*** 上传图文消息内的图片获取URL* htt…

css魔法:伪元素content内容竟然可以用css函数!

🌻 前言 CSS 伪元素用于设置元素指定部分的样式。伪元素中 ::before 和 ::after 是最常用的,它们分别用于在dom元素前/后插入内容,本文内容就是关于 ::before 和 ::after 的 content 内容的一些冷门用法展开的。 一般我们在使用伪元素时&…

基于Java+jsp+servlet的养老院管理系统设计和实现《收藏版》

基于Javajspservlet的养老院管理系统设计和实现《收藏版》 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方…

大麦生成链接 大麦生成订单截图 抢票成功截图

一键生成购票链接 一键生成订单截图 下载程序:https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

微服务工程搭建过程中的注意点

1、父工程pom.xml文件 1:父工程的maven坐标; 2:packaging使用pom; 原因:在Spring Cloud微服务工程中,通常会采用多模块的方式进行开发,父工程的pom文件中的packaging标签设置为pom,是…

操作系统 | 知识梳理 | 复习(上)

目录 📚操作系统概述 🐇操作系统中的抽象概念 📚准备知识 🐇中断输入输出 🐇软件中断 🐇处理器特权级 🐇操作系统的结构 📚程序的结构 🐇运行时视图简介 &…

SQL语句中EXISTS的详细用法大全

SQL语句中EXISTS的详细用法大全 前言一、建表1.在MySQL数据库建表语句2.在ORACLE数据库建表语句 二、在SELECT语句中使用EXISTS1.在SQL中使用EXISTS2.在SQL中使用NOT EXISTS3.在SQL中使用多个NOT EXISTS4.在SQL中使用多个EXISTS5.在SQL中使用NOT EXISTS和EXISTS 三、在DELETE语…

jmeter非gui运行,jtl生成了,但是html报告没有生成

jmeter非gui运行,jtl生成了,但是html报告没有生成,查看log,内容如下: 22:45:00,913 ERROR o.a.j.JMeter: Error generating dashboard: org.apache.jmeter.report.dashboard.GenerationException: Error while proces…

谷歌的passkey是什么?

谷歌的passkey是什么? 谷歌正在研发一种名为“Passkey”的新技术,它将用于用户身份验证。Passkey不同于传统的密码,它采用了硬件加密密钥(如安全密钥或生物识别方式)以及双因素身份验证等技术,可以更好地保…

微信:把元宇宙装进小程序

作为月活13.09亿的国民级应用,微信的每次小升级都很容易形成现象级。2023开年,微信放大招,试图把元宇宙装进小程序。 微信小程序 XR-FRAME 不久前,微信官方在开放社区贴出了“XR-FRAME”开发指南,这是一套为小程序定制…

RocketMQ 快速入门教程,手把手教教你干代码

目录 RocketMQ定义为什么要用消息中间件?应用解耦流量削峰数据分发 RocketMQ各部分角色介绍NameServer主机(Broker)生产者(Producer)消费者(Consumer)消息(Message) 使用RocketMQ的核心概念主题(Topic)消息队列(Message Queue)分组(Group)标签(Tag)偏移量(Offset) 普…

企业级信息系统开发讲课笔记4.11 Spring Boot中Spring MVC的整合支持

文章目录 零、学习目标一、Spring MVC 自动配置(一)自动配置概述(二)Spring Boot整合Spring MVC 的自动化配置功能特性 二、Spring MVC 功能拓展实现(一)创建Spring Boot项目 - SpringMvcDemo2021&#xff…

老胡的周刊(第094期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 qrbtf[2] 艺术二维码生成器: qrb…

某学院校园网站的设计与实现(论文+源码)_kaic

摘 要 使用旧方法对冀中工程技师学院网站的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在冀中工程技师学院网站的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次…

ajax--XML、AJAX简介、express框架使用、AJAX操作的基本步骤

一、XML(可扩展标记语言) XML与HTML类似,不同的是HTML中都是预定义标签,而XML中没有预定义标签,全都是自定义标签,用来表示一些数据。 比如有一个学生数据:name“孙悟空”;age18;gender“男”&a…