Yuhang Zheng
wm8960音频工作不正常的问题排查

背景:

之前写过两个文章来记录了wm8960音频播放出现砰砰声的问题的原因和其对应的解决方法。后来为了简单起见就选择了将MCLK时钟改为12MHz的方法,也解决了客户的问题。昨天生产部门又反馈新一批的板子又有大批量出现音频播放声音不正常的现象,不同于上次出现的砰砰声,这次是播放时直接出现嗞啦的声音,而且几秒钟的音频文件要播放几分钟才播放完毕,看来又出现新的问题了。

排查过程:

出现这个现象,可以很确定的判断大概率是音频芯片工作不正常的问题,为了验证想法,我们可以拿示波器量一下wm8960音频芯片的BCLK和LRC的时钟频率。原理图的引脚如下:(PS:芯片的引脚顺序是从芯片上的小圆点开始是第一脚,逆时针方向数)

image-20210511143826708

测量发现BCLK有11MHz之高,LRC时钟也很不正常。结合WM8960的时钟分频图来看,这个时钟很不对。

Linux platform平台总线、平台设备、平台驱动

平台总线(platform_bus)的需求来源?

随着soc的升级,S3C2440->S3C6410->S5PV210->4412,以前的程序就得重新写一遍,做着大量的重复工作,
人们为了提高效率,发现控制器的操作逻辑(方法)是一样的,只有寄存器地址不一样,如果将与硬件有关的
代码(platform_device)和驱动代码(platform_driver)分开,升级soc后,因为驱动方式一样,
只需要修改与硬件有关的代码就可以,实现一个驱动控制多个设备。

平台(platform)总线是一种虚拟的总线,在 /sys/bus/platform 目录可以看到。
平台总线三要素:平台总线、平台设备、平台驱动
平台总线原则:先分离,后合并

从命令行重置USB设备

问题描述

是否可以重置USB设备的连接,而无需从PC断开/连接?

具体来说,我的设备是数码相机。我正在使用gphoto2,但最近我收到“设备读取错误”,所以我想尝试执行连接的software-reset。

从我可以告诉的是,没有为相机加载内核模块。唯一与外表相关的是usbhid

最佳解决办法

将以下内容保存为usbreset.c

工具网站

在线画图工具

首先就是画图工具,我想了一下,程序员经常接触的无非也就是流程图、思维导图、原型图、UML图、网络拓扑图、组织结构图等等这些。

下面这三个在线画图网站我想应该足够了,其中那个processon是我用得最多的,历史文章中几乎所有相关的图形都是用它绘制,然后导出图片的。


在线开发辅助工具

在做开发和写代码的过程中,经常要用到的辅助工具其实还挺多,这段时间我重点就在整理归纳这个。

以我个人的情况为例,日常开发经常会用到一些辅助工具我总结为8大类,包括:编解码工具、转换工具、正则工具、编译工具、网络工具、格式化工具、可视化工具、在线生成器、以及其他工具等等。

OpenWRT源码目录汇总

backports概念

Backport的含义是”向后移植”,就是将软件新版本的某些功能移植到旧版本上来,这就称为backport。
Debian向来以稳定性著称,所以就存在一个问题,官方源分发的软件版本比软件本身的版本总是要慢不少,所以就有了 backports 源。 backports 主要从 testing 源,部分安全更新从unstable源重新编译包,使这些包不依赖于新版本的库就可以在 debian 的 stable 发行版上面运行。所以 backports 是 stable 和 testing 的一个折衷。

backports源码压缩包位置:

1
dl/backports-5.10.16-1.tar.xz

backport的patch目录:

1
target/linux/generic/backport-5.4/020-backport_netfilter_rtcache.patch

backport源码目录(已经打完了patch):

1
build_dir/target-aarch64_generic_musl/linux-layerscape_armv8_64b/backports-5.10.16-1

linux内核源码压缩包位置:

1
dl/linux-5.4.111.tar.xz

linux内核的patch目录:

1
target/linux/layerscape/patches-5.4/

linux内核使用的config文件:

1
target/linux/layerscape/armv8_64b/config-5.4

linux内核的源码目录(已经打完了patch):

1
build_dir/target-aarch64_generic_musl/linux-layerscape_armv8_64b/linux-5.4.111
OpenWRT编译报错信息汇总

报错信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Configuring luci-i18n-s-s-libev-zh-cn.
Configuring luci-i18n-firewall-zh-cn.
Configuring ppp-mod-pppoe.
Collected errors:
* check_data_file_clashes: Package libustream-openssl wants to install file /home/shixiaofeng/source/build_dir/target-mipsel_24kc_musl/root-ramips/lib/libustream-ssl.so
But that file is already provided by package * libustream-mbedtls
* opkg_install_cmd: Cannot install package libustream-openssl.
package/Makefile:64: recipe for target 'package/install' failed
make[2]: *** [package/install] Error 255
make[2]: Leaving directory '/home/shixiaofeng/source'
package/Makefile:106: recipe for target '/home/shixiaofeng/source/staging_dir/target-mipsel_24kc_musl/stamp/.package_install' failed
make[1]: *** [/home/shixiaofeng/source/staging_dir/target-mipsel_24kc_musl/stamp/.package_install] Error 2
make[1]: Leaving directory '/home/shixiaofeng/source'
/home/shixiaofeng/source/include/toplevel.mk:199: recipe for target 'world' failed
make: *** [world] Error 2

解决方法:

1
2
在make menuconfig进行配置编译选项中,Libraries  --->下面,libustream-openssl和libustream-mbedtls中间去掉一个。
在make menuconfig进行配置编译选项中,LuCI->Collection下的libustream-mbedtls和luci-ssl-openssl两个选项都进行了选择,其实只要进行其中一个选择便可。
OpenWrt从零开发

这篇文章主要记录基于GitHub的OpenWRT19.02源码如何一步步配置,编译,得到适用于OK1046-C2的镜像。

在源码下执行make menuconfig之后的首选配置

首先是平台相关的必要配置:

1
2
3
Target System (NXP Layerscape)
Subtarget (ARMv8 64-bit based boards)
Target Profile (NXP LS1046A-RDB Default)

然后是启用LUCI web图形界面

1
2
3
-> LuCI
-> 1. Collections
<*> luci................... LuCI interface with Uhttpd as Webserver (default)
OpenWRT在编译前选择要使用的主题

在OpenWRT源码中修改

1、默认主题配置文件
feeds/luci/modules/luci-base/root/etc/config/luci

1
2
3
4
5
config core main
option lang auto
option mediaurlbase /luci-static/bootstrap
option resourcebase /luci-static/resources
option ubuspath /ubus/

2、然后是修改每个主题文件下面的30_luci-theme-***文件
比如
/feeds/kenzo/luci-theme-opentomato/root/etc/uci-defaults/30_luci-theme-opentomato
/feeds/luci/themes/luci-theme-bootstrap/root/etc/uci-defaults/30_luci-theme-bootstrap
/package/lean/luci-theme-netgear/root/etc/uci-defaults/30_luci-theme-netgear
注释掉或者删除下面的句子,仅剩一个想要默认的主题不注释

set luci.main.mediaurlbase=/luci-static/opentomato

OpenWRT编译 LuCI - Applications添加插件应用说明

make menuconfig 进入定制界面
进入编译选项配置界面,.按照需要配置.( ‘*’ 代表编入固件,‘M’ 表示编译成模块或者IPK包, ‘空’不编译 )
选择LuCI 配置: 常用

-—————————————————————————————-

LuCI —> Applications —> luci-app-accesscontrol #访问时间控制
LuCI —> Applications —> luci-app-adbyby-plus #广告屏蔽大师Plus +
LuCI —> Applications —> luci-app-arpbind #IP/MAC绑定
LuCI —> Applications —> luci-app-autoreboot #支持计划重启
LuCI —> Applications —> luci-app-ddns #动态域名 DNS(集成阿里DDNS客户端)
LuCI —> Applications —> luci-app-filetransfer #文件传输(可web安装ipk包)
LuCI —> Applications —> luci-app-firewall #添加防火墙
LuCI —> Applications —> luci-app-flowoffload #Turbo ACC网络加速(集成FLOW,BBR,NAT,DNS…
LuCI —> Applications —> luci-app-frpc #内网穿透 Frp
LuCI —> Applications —> luci-app-guest-wifi #WiFi访客网络
LuCI —> Applications —> luci-app-ipsec-virtuald #virtual服务器 IPSec
LuCI —> Applications —> luci-app-mwan3 #MWAN3负载均衡
LuCI —> Applications —> luci-app-mwan3helper #MWAN3分流助手
LuCI —> Applications —> luci-app-nlbwmon #网络带宽监视器
LuCI —> Applications —> luci-app-ramfree #释放内存
LuCI —> Applications —> luci-app-samba #网络共享(Samba)
LuCI —> Applications —> luci-app-sqm #流量智能队列管理(QOS)

linux路由表配置

所谓路由表,指的是路由器或者其他互联网网络设备上存储的表,该表中存有到达特定网络终端的路径,在某些情况下,还有一些与这些路径相关的度量。路由器的主要工作就是为经过路由器的每个数据包寻找一条最佳的传输路径,并将该数据有效地传送到目的站点。由此可见,选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据——路由表(Routing Table),供路由选择时使用,表中包含的信息决定了数据转发的策略。打个比方,路由表就像我们平时使用的地图一样,标识着各种路线,路由表中保存着子网的标志信息、网上路由器的个数和下一个路由器的名字等内容。路由表根据其建立的方法,可以分为动态路由表和静态路由表。

路由表查看及介绍

查看 Linux 内核路由表

1
2
3
4
5
# route
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0

route 命令的输出项说明

输出项 说明
Destination 目标网段或者主机
Gateway 网关地址,”*” 表示目标是本主机所属的网络,不需要路由
Genmask 网络掩码主机路由的掩码为 255.255.255.255,默认路由的掩码为 0.0.0.0掩码 255.255.255.255 表明只有精确匹配的目标使用此路由。掩码 0.0.0.0 表示任何目标都可以使用此路由。当以二进制形式撰写掩码时,1 表示重要(必须匹配),而 0 表示不重要(不需要匹配)。
Flags 标记。一些可能的标记如下:
U — 路由是活动的
H — 目标是一个主机
G — 路由指向网关
R — 恢复动态路由产生的表项
D — 由路由的后台程序动态地安装
M — 由路由的后台程序修改
! — 拒绝路由
Metric 路由距离,到达指定网络所需的中转数(linux 内核中没有使用)
Ref 路由项正在被使用的进程数
Use 通过此路由项的分组数
Iface 路由项对应的接口

网络掩码

例如,目标 172.16.8.0 的网络掩码为 255.255.248.0。此网络掩码表示前两个八位字节必须精确匹配,第三个八位字节的前五位必须匹配(248=11111000),而最后一个八位字节无关紧要。第三个八位字节 172.16.8.0(即 8)等于二进制形式的 00001000。不更改前 5 位(以“粗体”显示的屏蔽部分),最多可到 15 或二进制形式的 00001111。因此目标为 172.16.8.0、掩码为 255.255.248.0 的路由应用于所有要通过 172.16. 15.255 到达 172.16. 8.0 的数据包。