瑞芯微-I2S|音频驱动调试基本命令和工具-基于rk3568-2

原创 一口Linux 2024-03-18 11:50

点击左上方蓝色“一口Linux”,选择“设为星标

第一时间看干货文章 

【干货】嵌入式驱动工程师学习路线
【干货】Linux嵌入式知识点-思维导图-免费获取
【就业】一个可以写到简历的基于Linux物联网综合项目
【就业】找工作简历模版



 1

一口君后面会陆续更新基于瑞芯微rk3568的I2S系列文章。

10篇有对语音感兴趣的朋友,可以收藏该专题

瑞芯微 | I2S-音频基础 -1

基于Linux嵌入式设备常用调试方法很多,本文一口君把调试语音用到的工具和方法给大家做一个简单的介绍。

1.  procfs、sysfs

Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

基于/proc文件系统如上所述的特殊性,其内的文件也常被称作虚拟文件,并具有一些独特的特点。例如,其中有些文件虽然使用查看命令查看时会返回大量信息,但文件本身的大小却会显示为0字节。此外,这些特殊文件中大多数文件的时间及日期属性通常为当前系统时间和日期,这跟它们随时会被刷新(存储于RAM中)有关。

ALSA有自己的proc tree,在/proc/asound这个目录下可以找到许多关于snd card 的详细信息。

  • /proc/asound
rk3568_r:/ # ls /proc/asound -l
total 0
dr-xr-xr-x 5 root root 0 2024-02-19 22:27 card0
dr-xr-xr-x 4 root root 0 2024-02-19 22:27 card1
-r--r--r-- 1 root root 0 2024-02-19 22:27 cards
-r--r--r-- 1 root root 0 2024-02-19 22:27 devices
-r--r--r-- 1 root root 0 2024-02-19 22:27 hwdep
-r--r--r-- 1 root root 0 2024-02-19 22:27 pcm
lrwxrwxrwx 1 root root 5 2024-02-19 22:27 rockchiphdmi -> card1
lrwxrwxrwx 1 root root 5 2024-02-19 22:27 rockchiprk809co -> card0
-r--r--r-- 1 root root 0 2024-02-19 22:27 timers
-r--r--r-- 1 root root 0 2024-02-19 22:27 version

其中主要的节点如下:

  • cardx:表示注册的sound card;
  • cards:显示当前配置的Alsa Drivers,index,the id string,short and long descriptions;
  • version:显示版本字符串;
  • devices:列举本机设备映射;
  • pcm:列举当前可用的 pcm devides,格式如下:-:::
  • /proc/asound/cards

通过 proc fs 确认声卡注册成功

# cat /proc/asound/cards
0 [rockchiprk809co]: rockchip_rk809- - rockchip,rk809-codec
rockchip,rk809-codec
7 [Loopback ]: Loopback - Loopback
Loopback 1
  • /proc/asound/devices

查看声卡下的功能设备

rk3568_r:/ #  cat /proc/asound/devices
  2: [ 0- 0]: digital audio playback
  3: [ 0- 0]: digital audio capture
  4: [ 0]   : control
  5: [ 1- 0]: digital audio playback
  6: [ 1]   : control
 33:        : timer

对于devices的print格式如下:

- Control设备: “minor: [card_id] : control”;
- PCM设备    : “minor: [card_id- device_id]: digital audio playback/capture”;
- timer设备  : “minor: : timer”;
  • /proc/asound/pcm

查看声卡采集、播放PCM信息

rk3568_r:/ # cat /proc/asound/pcm
cat /proc/asound/pcm
00-00: fe410000.i2s-rk817-hifi rk817-hifi-0 : fe410000.i2s-rk817-hifi rk817-hifi-0 : playback 1 : capture 1
01-00: rockchip,hdmi i2s-hifi-0 : rockchip,hdmi i2s-hifi-0 : playback 1
  • /proc/asound/version

查看ALSA驱动版本

rk3568_r:/ # cat /proc/asound/version
cat /proc/asound/version
Advanced Linux Sound Architecture Driver Version k4.19.232.
  • /proc/asound/card0/pcm0p/sub0/status

查看声卡0的信息

rk3568_r:/ # cat /proc/asound/card0/pcm0p/sub0/status
cat /proc/asound/card0/pcm0p/sub0/status
closed
rk3568_r:/sys/devices/platform/rk809-sound # ls
driver  driver_override  fe410000.i2s-rk817-hifi  modalias  of_node  power  sound  subsystem  uevent
kernel/Documentation/devicetree/bindings/sound/rockchip-i2s.txt  rockchip,i2s-tdm.txt

alsa_sound_init函数中会调用snd_info_init函数创建 /proc/asound目录,并将该entry保存在全局变量 snd_proc_root(即作为 sound proc root entry),代码如下

int __init snd_info_init(void)
{
    //1、创建 alsa proc root entry;
    snd_proc_root = snd_info_create_entry("asound"NULL);    
    if (!snd_proc_root)
        return -ENOMEM;
    snd_proc_root->mode = S_IFDIR | 0555;
    //2、创建 dir: /proc/asound
    snd_proc_root->p = proc_mkdir("asound"NULL);    
    if (!snd_proc_root->p)
        goto error;
#ifdef CONFIG_SND_OSSEMUL
    snd_oss_root = create_subdir(THIS_MODULE, "oss");
    if (!snd_oss_root)
        goto error;
#endif
#if IS_ENABLED(CONFIG_SND_SEQUENCER)
    snd_seq_root = create_subdir(THIS_MODULE, "seq");
    if (!snd_seq_root)
        goto error;
#endif
    if (snd_info_version_init() < 0 ||    //3、创建 file: /proc/asound/version
        snd_minor_info_init() < 0 ||    //4、创建 file: /proc/asound/devices
        snd_minor_info_oss_init() < 0 ||
        snd_card_info_init() < 0 ||        //5、创建 file: /proc/asound/cards
        snd_info_minor_register() < 0)
        goto error;
    return 0;

 error:
    snd_info_free_entry(snd_proc_root);
    return -ENOMEM;
}

查看时钟clk summary

查询音频时钟,确认时钟设置正确 示例:查询 i2s0 mclk 频率,以及其所在的 pll,结果:mclk 为 12288000 Hz,pll 源为 cpll

cat /sys/kernel/debug/clk/clk_summary | egrep "i2s0|pll"
pll_cpll 1 1 0 500000000
cpll 5 10 0 500000000
mclk_i2s0_rx_div 0 0 0 500000000
mclk_i2s0_rx_fracdiv 0 0 0 12288000
mclk_i2s0_rx_mux 0 0 0 12288000
mclk_i2s0_rx 0 0 0 12288000
mclk_i2s0_tx_div 1 1 0 500000000
mclk_i2s0_tx_fracdiv 1 1 0 12288000
mclk_i2s0_tx_mux 1 1 0 12288000
mclk_i2s0_tx 1 1 0 12288000
mclk_i2s0_tx_out2io 2 2 0 12288000

2.  寄存器

io命令

通过 io 命令 查看修改寄存器(适合 SOC 寄存器查询),配合芯片手册确认配置以及工作状态。

# cat /proc/iomem | grep i2s
ff800000-ff800fff : i2s@ff800000
# #
io -4 -l 0x40 0xff800000
ff800000: 7200000f 004e000f 10003f3f 00000010
ff800010: 000f0110 01f00000 00000000 00000003
ff800020: 00000000 00000000 00000000 0000001f
ff800030: 00003eff 00003eff 00000303 20150001

regmap

通过 regmap 节点查看寄存器(只读)。

rk3568_r:/ # cat /sys/kernel/debug/regmap/0-0020-rk817-codec/name
cat /sys/kernel/debug/regmap/0-0020-rk817-codec/name                            
rk808

## rk3568 i2s0控制器寄存器
rk3568_r: # cat /sys/kernel/debug/regmap/fe400000.i2s/registers
cat /sys/kernel/debug/regmap/fe400000.i2s/registers                                                                  
00: 7200000f
04: 01c8000f
08: 00001f1f
0c: XXXXXXXX
10: 000f0010
14: 01f00000
18: XXXXXXXX
1c: 00000000
20: XXXXXXXX
24: XXXXXXXX
2c: XXXXXXXX
30: 00003eff
34: 00003eff
38: 00000707


## codec es809寄存器

rk3568_r:/ # cat /sys/kernel/debug/regmap/0-0020-rk817-codec/registers
cat /sys/kernel/debug/regmap/0-0020-rk817-codec/registers    
00: 00
01: 00
02: 00
03: 00
04: 00
05: 00
06: 00
07: 00
08: 00
09: 00
0a: 00
0b: 00
0c: 00
0d: 00
0e: 00
0f: 00
10: 00
11: 00
12: 03
13: f4
14: 00
# ls /sys/kernel/debug/regmap/
0-0020-rk817-codec
ff800000.i2s
...
# cat /sys/kernel/debug/regmap/0-0020-rk817-codec/registers
12: 03
13: f4
14: 00
15: ff
16: 00
17: 40
18: 48
19: 00
1a: 00
1b: ff
1c: 00
1d: 00
1e: 02
1f: 00
...

注意: regmap 基于 cache 机制,如果通过 io 命令直接修改寄存器后, regmap 节点不会体现更新后的寄存器,除非驱动将寄存器类型设置为 volatile 或者将 regmap cache 关闭。

3. alsa-utils

瑞芯微的android版本的sdk中不支持aplay、arecord、amixer这组命令,下面是以复旦微厂家sdk举例。

官方sdk的buildroot目录下执行make menuconfig:

  │ Symbol: BR2_PACKAGE_ALSA_UTILS_APLAY [=y]            │  
  │ Type  : boolean                                      │  
  │ Prompt: aplay/arecord                                │  
  │   Location:                                          │  
  │     -> Target packages                               │  
  │       -> Audio and video applications                │  
  │ (1)     -> alsa-utils (BR2_PACKAGE_ALSA_UTILS [=y])  │  
  │   Defined at package/alsa-utils/Config.in:57         │  
  │   Depends on: BR2_PACKAGE_ALSA_UTILS [=y]            │  
  │   Selects: BR2_PACKAGE_ALSA_LIB_PCM [=y]



aplay

Usage: aplay [OPTION]... [FILE]...

-h, --help              help
    --version           print current version
-l, --list-devices      list all soundcards and digital audio devices
-L, --list-pcms         list device names
-D, --device=NAME       select PCM by name
-q, --quiet             quiet mode
-t, --file-type TYPE    file type (voc, wav, raw or au)
-c, --channels=#        channels
-f, --format=FORMAT     sample format (case insensitive)
-r, --rate=#            sample rate
-d, --duration=#        interrupt after # seconds
-M, --mmap              mmap stream
-N, --nonblock          nonblocking mode
-F, --period-time=#     distance between interrupts is # microseconds
-B, --buffer-time=#     buffer duration is # microseconds
    --period-size=#     distance between interrupts is # frames
    --buffer-size=#     buffer duration is # frames
-A, --avail-min=#       min available space for wakeup is # microseconds
-R, --start-delay=#     delay for automatic PCM start is # microseconds 
                        (relative to buffer size if <= 0)
-T, --stop-delay=#      delay for automatic PCM stop is # microseconds from xrun
-v, --verbose           show PCM structure and setup (accumulative)
-V, --vumeter=TYPE      enable VU meter (TYPE: mono or stereo)
-I, --separate-channels one file for each channel
-i, --interactive       allow interactive operation from stdin
-m, --chmap=ch1,ch2,..  Give the channel map to override or follow
    --disable-resample  disable automatic rate resample
    --disable-channels  disable automatic channel conversions
    --disable-format    disable automatic format conversions
    --disable-softvol   disable software volume control (softvol)
    --test-position     test ring buffer position
    --test-coef=#       test coefficient for ring buffer position (default 8)
                        expression for validation is: coef * (buffer_size / 2)
    --test-nowait       do not wait for ring buffer - eats whole CPU
    --max-file-time=#   start another output file when the old file has recorded
                        for this many seconds
    --process-id-file   write the process ID here
    --use-strftime      apply the strftime facility to the output file name
    --dump-hw-params    dump hw_params of the device
    --fatal-errors      treat all errors as fatal

示例:通过声卡0   播放   48k 采样率   2声道 16 位的静音数据

aplay -D hw:0,0 --period-size=1024 --buffer-size=4096 -r 48000 -c 2 -f s16_le
/dev/zero

arecord

Usage: arecord [OPTION]... [FILE]...

-h, --help              help
    --version           print current version
-l, --list-devices      list all soundcards and digital audio devices
-L, --list-pcms         list device names
-D, --device=NAME       select PCM by name
-q, --quiet             quiet mode
-t, --file-type TYPE    file type (voc, wav, raw or au)
-c, --channels=#        channels
-f, --format=FORMAT     sample format (case insensitive)
-r, --rate=#            sample rate
-d, --duration=#        interrupt after # seconds
-M, --mmap              mmap stream
-N, --nonblock          nonblocking mode
-F, --period-time=#     distance between interrupts is # microseconds
-B, --buffer-time=#     buffer duration is # microseconds
    --period-size=#     distance between interrupts is # frames
    --buffer-size=#     buffer duration is # frames
-A, --avail-min=#       min available space for wakeup is # microseconds
-R, --start-delay=#     delay for automatic PCM start is # microseconds 
                        (relative to buffer size if <= 0)
-T, --stop-delay=#      delay for automatic PCM stop is # microseconds from xrun
-v, --verbose           show PCM structure and setup (accumulative)
-V, --vumeter=TYPE      enable VU meter (TYPE: mono or stereo)
-I, --separate-channels one file for each channel
-i, --interactive       allow interactive operation from stdin
-m, --chmap=ch1,ch2,..  Give the channel map to override or follow
    --disable-resample  disable automatic rate resample
    --disable-channels  disable automatic channel conversions
    --disable-format    disable automatic format conversions
    --disable-softvol   disable software volume control (softvol)
    --test-position     test ring buffer position
    --test-coef=#       test coefficient for ring buffer position (default 8)
                        expression for validation is: coef * (buffer_size / 2)
    --test-nowait       do not wait for ring buffer - eats whole CPU
    --max-file-time=#   start another output file when the old file has recorded
                        for this many seconds
    --process-id-file   write the process ID here
    --use-strftime      apply the strftime facility to the output file name
    --dump-hw-params    dump hw_params of the device
    --fatal-errors      treat all errors as fatal

示例:通过声卡0 录制 16k 采样率 8声道 32 位 的音频数据

arecord -D hw:0,0 --period-size=1024 --buffer-size=4096 -r 16000 -c 8 -f s32_le
r.wav

aplay | arecord

两者通过管道可以方便的实现 loopback 功能,方便驱动调试和指标测试。示例:声卡0 录制 -> 声卡1 播放

# arecord -D hw:0,0 --period-size=1024 --buffer-size=4096 -r 48000 -c 2 -f s16_le
-t raw | aplay -D hw:1,0 --period-size=1024 --buffer-size=4096 -r 48000 -c 2 -f
s16_le -t raw

amixer

控制 codec 内部的通路开关,结合 codec 手册的音频拓扑图(比如 图 3-2 RK3308 codec)实现音频流的 路由,音量控制等

Usage: amixer  [command]

Available options:
  -h,--help       this help
  -c,--card N     select the card
  -D,--device N   select the device, default 'default'
  -d,--debug      debug mode
  -n,--nocheck    do not perform range checking
  -v,--version    print version of this program
  -q,--quiet      be quiet
  -i,--inactive   show also inactive controls
  -a,--abstract L select abstraction level (none or basic)
  -s,--stdin      Read and execute commands from stdin sequentially
  -R,--raw-volume Use the raw value (default)
  -M,--mapped-volume Use the mapped volume

Available commands:
  scontrols       show all mixer simple controls
  scontents   show contents of all mixer simple controls (default command)
  sset sID P      set contents for one mixer simple control
  sget sID        get contents for one mixer simple control
  controls        show all controls for given card
  contents        show contents of all controls for given card
  cset cID P      set control contents for one control
  cget cID        get control contents for one control

示例:查询声卡 controls,将播放通路切换到 SPK

# amixer -c 0 contents
numid=1,iface=MIXER,name='Playback Path'
type=ENUMERATED,access=rw------,values=1,items=11
; Item #0 'OFF'
; Item #1 'RCV'
; Item #2 'SPK'
; Item #3 'HP'
; Item #4 'HP_NO_MIC'
; Item #5 'BT'
; Item #6 'SPK_HP'
; Item #7 'RING_SPK'
; Item #8 'RING_HP'
; Item #9 'RING_HP_NO_MIC'
; Item #10 'RING_SPK_HP'
: values=0
...
# # amixer -c 0 cset numid=1 2
numid=1,iface=MIXER,name='Playback Path'
type=ENUMERATED,access=rw------,values=1,items=11
; Item #0 'OFF'
; Item #1 'RCV'
; Item #2 'SPK'
; Item #3 'HP'
; Item #4 'HP_NO_MIC'
; Item #5 'BT'
; Item #6 'SPK_HP'
; Item #7 'RING_SPK'
; Item #8 'RING_HP'
; Item #9 'RING_HP_NO_MIC'
; Item #10 'RING_SPK_HP'
: values=2

alsaloop

支持 任意声卡间的路由 支持 自适应时钟同步 自持 自适应重采样 支持 mixer controls 重定向

Usage: alsaloop [OPTION]...

-h,--help      help
-g,--config    configuration file (one line = one job specified)
-d,--daemonize daemonize the main process and use syslog for errors
-P,--pdevice   playback device
-C,--cdevice   capture device
-X,--pctl      playback ctl device
-Y,--cctl      capture ctl device
-l,--latency   requested latency in frames
-t,--tlatency  requested latency in usec (1/1000000sec)
-f,--format    sample format
-c,--channels  channels
-r,--rate      rate
-n,--resample  resample in alsa-lib
-A,--samplerate use converter (0=sincbest,1=sincmedium,2=sincfastest,
                               3=zerohold,4=linear)
-B,--buffer    buffer size in frames
-E,--period    period size in frames
-s,--seconds   duration of loop in seconds
-b,--nblock    non-block mode (very early process wakeup)
-S,--sync      sync mode(0=none,1=simple,2=captshift,3=playshift,4=samplerate,
                         5=auto)
-a,--slave     stream parameters slave mode (0=auto, 1=on, 2=off)
-T,--thread    thread number (-1 = create unique)
-m,--mixer redirect mixer, argument is:
      SRC_SLAVE_ID(PLAYBACK)[@DST_SLAVE_ID(CAPTURE)]
-O,--ossmixer rescan and redirect oss mixer, argument is:
      ALSA_ID@OSS_ID  (for example: "Master@VOLUME")
-e,--effect    apply an effect (bandpass filter sweep)
-v,--verbose   verbose mode (more -v means more verbose)
-w,--workaround use workaround (serialopen)
-U,--xrun      xrun profiling
-W,--wake      process wake timeout in ms
-z,--syslog    use syslog for errors

示例:声卡0录制的音频通过声卡1播放,同步模式采用 策略1(增加或减少采样点)

alsaloop -C hw:0,0 -P hw:1,0 -t 10000 -A 3 -S 1 -b -v

es8388播放和录音举例

/**************************************
 * 波形测试, RAW数据
 **************************************/

aplay -D hw:0,0 -f S24_LE -r 44100 -c 2 -t raw /bin/busybox & arecord -D hw:0,1 -f S24_LE -r 44100 -c 2 -d 5  record.wav
抓包, 上传record.wav到电脑,可以听见杂波

aplay -D hw:0,0 -f S24_LE -r 44100 -c 2 -t raw test.pcm & arecord -D hw:0,1 -f S24_LE -r 44100 -c 2 -d 5  record.wav
抓包, 上传record.wav到电脑,可以听见疯狂小鸟

aplay -D hw:0,0 -fS24_LE -r 44100 -c 2 -t raw /all_0x00.bin &
arecord -r 44100 -f S24_LE -c 2 -d 30 -D hw:0,1 record.wav
aplay -D hw:0,0 -fS24_LE -r 44100 -c 2 -t raw /all_0xff.bin &
arecord -r 44100 -f S24_LE -c 2 -d 30 -D hw:0,1 record.wav


aplay /test.wav &
arecord -r 44100 -f S24_LE -c 2 -d 30 -D hw:0,1 record.wav
抓包, 上传record.wav, 听见疯狂小鸟


/**************************************
 * 设置
 **************************************/

# 查看功能
amixer scontrols

# 耳机测试
amixer sset 'Headphone Playback ZC' on # 打开耳机播放 ZC
amixer sset 'Right Output Mixer PCM' on # 打开右声道
amixer sset 'Left Output Mixer PCM' on # 打开左声道
amixer sset Headphone 105,105 # 设置耳机音量
amixer sset Playback 230,230 # 设置播放音量
# 播放
aplay /opt/hardwareTest/wav/test.wav # <---------------------------------------------------

# MIC测试
#设置声卡输入捕获音量大小
amixer sset Capture 56,56
amixer sset 'ADC PCM' 200,200
#音频输入,关闭所有右声道
amixer sset 'Right Input Mixer Boost' off
amixer sset 'Right Boost Mixer RINPUT1' off
amixer sset 'Right Input Boost Mixer RINPUT1' 0
amixer sset 'Right Boost Mixer RINPUT2' off
amixer sset 'Right Input Boost Mixer RINPUT2' 0
amixer sset 'Right Boost Mixer RINPUT3' off
amixer sset 'Right Input Boost Mixer RINPUT3' 0
#音频输入,打开左声道 1 和 2,关闭 3
amixer sset 'Left Input Mixer Boost' on
amixer sset 'Left Boost Mixer LINPUT1' on
amixer sset 'Left Input Boost Mixer LINPUT1' 5
amixer sset 'Left Boost Mixer LINPUT2' on
amixer sset 'Left Input Boost Mixer LINPUT2' 3
amixer sset 'Left Boost Mixer LINPUT3' off
amixer sset 'Left Input Boost Mixer LINPUT3' 0
# 录音
arecord -r 44100 -f S24_LE -c 2 -d 10 -D hw:0,1 record.wav # <---------------------------------------------------

# Line IN 测试
#设置声卡输入捕获音量大小
amixer sset Capture 56,56
amixer sset 'ADC PCM' 200,200
#音频输入,打开左声道 3,,关闭 1 和 2
amixer sset 'Left Input Mixer Boost' on
amixer sset 'Left Boost Mixer LINPUT1' off
amixer sset 'Left Input Boost Mixer LINPUT1' 0
amixer sset 'Left Boost Mixer LINPUT2' off
amixer sset 'Left Input Boost Mixer LINPUT2' 0
amixer sset 'Left Boost Mixer LINPUT3' on
amixer sset 'Left Input Boost Mixer LINPUT3' 5
#音频输入,打开右声道 2,关闭 1 和 3
amixer sset 'Right Input Mixer Boost' on
amixer sset 'Right Boost Mixer RINPUT1' off
amixer sset 'Right Input Boost Mixer RINPUT1' 0
amixer sset 'Right Boost Mixer RINPUT2' on
amixer sset 'Right Input Boost Mixer RINPUT2' 5
amixer sset 'Right Boost Mixer RINPUT3' off
amixer sset 'Right Input Boost Mixer RINPUT3' 0

4. tiny-alsa

RK Android SDK 标配 tiny-alsa 工具。

Linux ALSA 在内核层提供了 alsa-driver,在应用层提供了 alsa-lib,应用程序只需要调用 alsa-lib 提供的 API 即可完成对底层硬件的操作。

但由于 ALSA 架构太过于庞大,对于嵌入式设备而言很多功能用不到,且会增加功耗,所以 Android 采用了精简后的 tinyalsa

Android 中使用 tinyalsa 控制管理所有模式的音频通路,也可以使用 tinyalsa 提供的工具进行查看、调试。

Tinyalsa 源码位于 android 源码目录下 external/tinyalsa,可以使用 mmm 命令编译,

mmm external/tinyalsa

编译 tinyalsa 后会生成四个小工具:

  • tinymix
  • tinyplay
  • inycap
  • inypcminfo

1) tinypcminfo

tinypcminfo 用于查看 pcm 通道的相关信息,如 PCM 采样率,Channels,采样点数等信息。

Usage: tinypcminfo [-D card] [-d device]

示例:

rk3568_r:/ # tinypcminfo -D 0
Info for card 0, device 0:

PCM out:
     Access:   0x000009
  Format[0]:   0x000444
  Format[1]:   00000000
Format Name:   S16_LE, S24_LE, S32_LE
  Subformat:   0x000001
       Rate:   min=8000Hz      max=96000Hz
   Channels:   min=2           max=8
Sample bits:   min=16          max=32
Period size:   min=8           max=65536
Period count:   min=2           max=16384

PCM in:
     Access:   0x000009
  Format[0]:   0x000444
  Format[1]:   00000000
Format Name:   S16_LE, S24_LE, S32_LE
  Subformat:   0x000001
       Rate:   min=8000Hz      max=96000Hz
   Channels:   min=2           max=8
Sample bits:   min=16          max=32
Period size:   min=8           max=65536
Period count:   min=2           max=16384

2) tinyplay

tinyplay 是一个简易的音乐播放器,一般用于播放测试。可以直接进行播放 wav 格式文件,在播放前需要先使用 tinymix 进行相关控件的设置。

Usage: tinyplay file.wav [-D card] [-d device] [-p period_size] [-n n_periods]

示例:播放src_test_xiaoniao.wav、1khz_44100_16bit.wav 音频文件

rk3568_r:/sdcard # tinyplay src_test_xiaoniao.wav
Playing sample: 2 ch, 44100 hz, 16 bit 1764000 bytes

rk3568_r:/sdcard # tinyplay 1khz_44100_16bit.wav
Playing sample: 2 ch, 44100 hz, 16 bit 15876000 bytes

3) tinycap

tinycap 是一个简易的录音软件,一般用于录音测试。

使用之前也需要先设置录音相关的控件,设置好控件后,执行 tinycap xxx.wav 即可将音频录制到 xxx.wav 中。

Usage: tinycap file.wav [-D card] [-d device] [-c channels] [-r rate] [-b bits]
[-p period_size] [-n n_periods]

示例:44.1k 采样率录制音频

# tinycap /sdcard/rec.wav -D 0 -d 0 –c 2 –r 44100 –b 16 –p 1024 –n 3

rk3568_r:/sdcard # tinycap /sdcard/rec.wav -D 0
Capturing sample: 2 ch, 44100 hz, 16 bit

4) tinymix

控制 codec 内部的通路开关, 音量控制等。效果等同于 amixer

1)tinymix 可以查看系统的音频控件,可直接执行 tinymix 进行查看;2)tinymix 可以手动设置控件的值,控件可通过 tinymix 查看,或者通过 mixer_paths.xml 查看。

usage: tinymix [-D card]

rk3568_r:/sdcard # tinymix --help
tinymix [options] [control name/#] [value to set]
    options:
    --device|-D #>   - use the given card # instead of 0.
    --all-values|-a       - show all possible values/ranges for control.
    --tabs-only|-t        - separate all output columns/values with tabs.
    --value-only|-v       - show only the value for the selected control.

示例:

rk3568_r:/sdcard # tinymix
Mixer name: 'rockchip,rk809-codec'
Number of controls: 2
ctl     type    num     name                                     value

0       ENUM    1       Playback Path                            OFF
1       ENUM    1       Capture MIC Path                         MIC OFF


rk3568_r:/sdcard # tinymix -a
Mixer name: 'rockchip,rk809-codec'
Number of controls: 2
ctl     type    num     name                   value
        range/values
0       ENUM    1       Playback Path          >OFF RCV SPK HP HP_NO_MIC BT SPK_HP RING_SPK RING_HP RING_HP_NO_MIC RING_SPK_HP
1       ENUM    1       Capture MIC Path       >MIC OFF Main Mic Hands Free Mic BT Sco Mic

5. i2c工具链

i2c工具主要用于配置codec,本文使用的是es8388,配置该芯片可以通过i2c接口。

通过 i2c tool 查看修改 codec 寄存器(适合 i2c 类型的 codec 设备),配合 codec 手册确认配置以及工作 状态。

rk3568sdk集成i2c工具链,做了精简,与其他版本工具链使用略有差别。

安装命令

apt-get update
apt-get install i2c-tools

linux版本代码下载路径:

https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/

i2cdetect

rk3568_r:/ # i2cdetect --help
usage: i2cdetect [-ary] BUS [FIRST LAST]
usage: i2cdetect -F BUS
usage: i2cdetect -l

Detect i2c devices.

-a      All addresses (0x00-0x7f rather than 0x03-0x77)
-F      Show functionality
-l      List all buses
-r      Probe with SMBus Read Byte
-y      Answer "yes" to confirmation prompts (for script use)

查询 i2c0 总线上的设备

rk3568_r:/ # i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- UU -- -- --
20: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

i2cdump

dump 设备的所有寄存器

rk3568_r:/ # i2cdump --help
usage: i2cdump [-fy] BUS CHIP

Dump i2c registers.

-f      Force access to busy devices
-y      Answer "yes" to confirmation prompts (for script use)

示例:查询 i2c0 总线下 rk817(设备地址:0x20)的寄存器,其中 0x12 ~ 0x4f 为 codec 寄存器。

rk3568_r:/ # i2cdump -f -y 0 0x20
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 02 00 09 04 08 17 05 00 00 00 01 01 00 01 80 00    ?.?????...??.??.
10: 00 00 03 f4 00 00 00 06 c8 00 00 00 00 00 00 00    ..??...??.......
20: 00 00 00 ff ff 00 00 70 00 66 00 00 00 00 00 0f    ...??..p.f.....?
30: 06 03 03 00 a5 02 00 00 01 ff ff 00 00 e0 0f 09    ???.??..???..???
40: 69 7f 0c 58 2d 0c 95 01 00 00 00 0f 20 00 0f 00    i??X-???...? .?.
50: 8c 00 01 00 01 b0 44 10 00 60 00 00 00 00 00 00    ?.?.??D?.`......
60: 00 00 00 00 00 00 00 00 00 00 00 00 01 00 eb 00    ............?.?.
70: 00 00 00 00 ff ff ff ff 00 01 ff ff 00 00 00 00    ....????.???....
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
90: 60 80 e9 7f cb df a6 80 e9 00 00 00 00 00 00 00    `????????.......
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
b0: 00 0f 0f 0f 0f 04 a4 ff ff 00 64 1c 20 64 1a 20    .????????.d? d?
c0: 64 00 00 64 1a 20 6b ff ff ff ff ff 0c 0c 0c 0c    d..d? k?????????
d0: 0c 0c 6c 6c 6c 6c 6c 6c 30 30 30 30 30 30 09 31    ??llllll000000?1
e0: 00 00 00 55 a2 c8 c5 40 00 ff 22 03 0a 80 94 0e    ...U???@.?"?????
f0: c2 ac a0 40 18 40 00 86 00 fc 00 ff 00 ff 60 00    ???@?@.?.?.?.?`.

i2cget

查询单个寄存器值

Usage: i2cget [-f] [-y] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
I2CBUS is an integer or an I2C bus name
ADDRESS is an integer (0x03 - 0x77)
MODE is one of:
b (read byte data, default)
w (read word data)
c (write byte/read byte)
Append p for SMBus PEC

rk3568_r:/ # i2cget --help
usage: i2cget [-fy] BUS CHIP ADDR

Read an i2c register.

-f      Force access to busy devices
-y      Answer "yes" to confirmation prompts (for script use)

示例:查询 rk817 的 0x12 寄存器

rk3568_r:/ # i2cget -f -y 0 0x20 0x12
0x03

i2cset

修改单个寄存器值

Usage: i2cset [-f] [-y] [-m MASK] [-r] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE]
... [MODE]
I2CBUS is an integer or an I2C bus name
ADDRESS is an integer (0x03 - 0x77)
MODE is one of:
c (byte, no value)
b (byte data, default)
w (word data)
i (I2C block data)
s (SMBus block data)
Append p for SMBus PEC


rk3568_r:/ # i2cset --help
usage: i2cset [-fy] BUS CHIP ADDR VALUE... MODE

Write an i2c register. MODE is b for byte, w for 16-bit word, i for I2C block.

-f      Force access to busy devices
-y      Answer "yes" to confirmation prompts (for script use)

示例:修改 rk817(0x20) 的 0x12 寄存器,将值改为0

 rk3568_r:/ # i2cset -fy 0 0x20 0x12 0 b
 rk3568_r:/ # i2cget -f -y 0 0x20 0x12
 0x00

i2ctransfer

i2c-tools-4.0及以后版本添加了i2ctransfer命令。

i2cget和i2cset可以读写的i2c设备的寄存器地址小于0xff,即寄存器是8位地址。

如果i2c设备寄存器是16位地址,可使用i2ctransfer命令,该命令同样可用在寄存器地址是8位的设备。

1、命令

"Usage: i2ctransfer [-f] [-y] [-v] [-V] [-a] I2CBUS DESC [DATA] [DESC [DATA]]...\n"
"  I2CBUS is an integer or an I2C bus name\n"
"  DESC describes the transfer in the form: {r|w}LENGTH[@address]\n"
"    1) read/write-flag 2) LENGTH (range 0-65535, or '?')\n"
"    3) I2C address (use last one if omitted)\n"
"  DATA are LENGTH bytes for a write message. They can be shortened by a suffix:\n"
"    = (keep value constant until LENGTH)\n"
"    + (increase value by 1 until LENGTH)\n"
"    - (decrease value by 1 until LENGTH)\n"
"    p (use pseudo random generator until LENGTH with value as seed)\n\n"
"Example (bus 0, read 8 byte at offset 0x64 from EEPROM at 0x50):\n"
"  # i2ctransfer 0 w1@0x50 0x64 r8\n"
"Example (same EEPROM, at offset 0x42 write 0xff 0xfe ... 0xf0):\n"
"  # i2ctransfer 0 w17@0x50 0x42 0xff-\n");

2、用法

## 从i2c 4号总线0x38设备的0x3a01寄存器开始读16个字节的数据,w2:表示寄存器0x3a01的长度为2个字节
i2ctransfer -y -f 4 w2@0x38 0x3a 0x01 r16
## 向i2c 4号总线0x38设备的0x3a01寄存器写0x10,w3:表示寄存器0x3a01和写入值0x10的长度为3字节
i2ctransfer -y -f 4 w3@0x38 0x3a 0x01 0x10

逻辑分析仪

调试过程中,有时候我们需要抓取控制器和codec之间语音信号,并转换成语音数据,

一口君使用的是Kingst的 LA系列逻辑分析仪。

这是一款非常简单容易上手的设备,

即使新手也很容易就能上手,

比示波器好用很多。后面会单独开一篇讲解该设备如何抓取波形并转换成语音数据。抓取波形页面

end



一口Linux 


关注,回复【1024】海量Linux资料赠送

精彩文章合集

文章推荐

【专辑】ARM
【专辑】粉丝问答
【专辑】所有原创
专辑linux入门
专辑计算机网络
专辑Linux驱动
【干货】嵌入式驱动工程师学习路线
【干货】Linux嵌入式所有知识点-思维导图


一口Linux 写点代码,写点人生!
评论
  • 前言近年来,随着汽车工业的快速发展,尤其是新能源汽车与智能汽车领域的崛起,汽车安全标准和认证要求日益严格,应用范围愈加广泛。ISO 26262和ISO 21448作为两个重要的汽车安全标准,它们在“系统安全”中扮演的角色各自不同,但又有一定交集。在智能网联汽车的高级辅助驾驶系统(ADAS)应用中,理解这两个标准的区别及其相互关系,对于保障车辆的安全性至关重要。ISO 26262:汽车功能安全的基石如图2.1所示,ISO 26262对“功能安全”的定义解释为:不存在由于电子/电气系统失效引起的危害
    广电计量 2025-01-02 17:18 206浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 147浏览
  • 在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容,修改源码再编译很费时。今天为大家介绍一个便捷的方法,让OpenHarmony通过挂载镜像来修改镜像内容!触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。挂载镜像首先,将要修改内容的镜像传入虚拟机当中,并创建一个要挂载镜像的文件夹,如下图:之后通过挂载命令将system.img镜像挂载到sys
    Industio_触觉智能 2025-01-03 11:39 108浏览
  • 从无到有:智能手机的早期探索无线电话装置的诞生:1902 年,美国人内森・斯塔布菲尔德在肯塔基州制成了第一个无线电话装置,这是人类对 “手机” 技术最早的探索。第一部移动手机问世:1938 年,美国贝尔实验室为美国军方制成了世界上第一部 “移动” 手机。民用手机的出现:1973 年 4 月 3 日,摩托罗拉工程师马丁・库珀在纽约曼哈顿街头手持世界上第一台民用手机摩托罗拉 DynaTAC 8000X 的原型机,给竞争对手 AT&T 公司的朋友打了一个电话。这款手机重 2 磅,通话时间仅能支持半小时
    Jeffreyzhang123 2025-01-02 16:41 165浏览
  • 本文继续介绍Linux系统查看硬件配置及常用调试命令,方便开发者快速了解开发板硬件信息及进行相关调试。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。查看系统版本信息查看操作系统版本信息root@ido:/# cat /etc/*releaseDISTRIB_ID=UbuntuDISTRIB_RELEASE=20.04DISTRIB_CODENAME=focalDIS
    Industio_触觉智能 2025-01-03 11:37 127浏览
  • 物联网(IoT)的快速发展彻底改变了从智能家居到工业自动化等各个行业。由于物联网系统需要高效、可靠且紧凑的组件来处理众多传感器、执行器和通信设备,国产固态继电器(SSR)已成为满足中国这些需求的关键解决方案。本文探讨了国产SSR如何满足物联网应用的需求,重点介绍了它们的优势、技术能力以及在现实场景中的应用。了解物联网中的固态继电器固态继电器是一种电子开关设备,它使用半导体而不是机械触点来控制负载。与传统的机械继电器不同,固态继电器具有以下优势:快速切换:确保精确快速的响应,这对于实时物联网系统至
    克里雅半导体科技 2025-01-03 16:11 151浏览
  • 车身域是指负责管理和控制汽车车身相关功能的一个功能域,在汽车域控系统中起着至关重要的作用。它涵盖了车门、车窗、车灯、雨刮器等各种与车身相关的功能模块。与汽车电子电气架构升级相一致,车身域发展亦可以划分为三个阶段,功能集成愈加丰富:第一阶段为分布式架构:对应BCM车身控制模块,包含灯光、雨刮、门窗等传统车身控制功能。第二阶段为域集中架构:对应BDC/CEM域控制器,在BCM基础上集成网关、PEPS等。第三阶段为SOA理念下的中央集中架构:VIU/ZCU区域控制器,在BDC/CEM基础上集成VCU、
    北汇信息 2025-01-03 16:01 159浏览
  •  在这个日新月异的科技时代,智能家居正以前所未有的速度融入我们的日常生活,从智能灯光到温控系统,从安防监控到语音助手,每一处细节都透露着科技的温度与智慧。而在这场智能化浪潮中,一个看似不起眼却至关重要的组件——晶体管光耦,正扮演着连接物理世界与数字世界的隐形桥梁角色,默默推动着智能家居行业的发展与革新。 晶体管光耦——智能家居的“神经递质”晶体管光耦,作为一种能够将电信号转换为光信号,再通过光信号控制另一侧电路开关的电子元器件,其独特的工作原理使得它在隔离传输、抗干扰及保护电
    晶台光耦 2025-01-02 16:19 150浏览
  • 在科技飞速发展的今天,机器人已经逐渐深入到我们生活和工作的各个领域。从工业生产线上不知疲倦的机械臂,到探索未知环境的智能探测机器人,再到贴心陪伴的家用服务机器人,它们的身影无处不在。而在这些机器人的背后,C 语言作为一种强大且高效的编程语言,发挥着至关重要的作用。C 语言为何适合机器人编程C 语言诞生于 20 世纪 70 年代,凭借其简洁高效、可移植性强以及对硬件的直接操控能力,成为机器人编程领域的宠儿。机器人的运行环境往往对资源有着严格的限制,需要程序占用较少的内存和运行空间。C 语言具有出色
    Jeffreyzhang123 2025-01-02 16:26 149浏览
  • 在快速发展的能源领域,发电厂是发电的支柱,效率和安全性至关重要。在这种背景下,国产数字隔离器已成为现代化和优化发电厂运营的重要组成部分。本文探讨了这些设备在提高性能方面的重要性,同时展示了中国在生产可靠且具有成本效益的数字隔离器方面的进步。什么是数字隔离器?数字隔离器充当屏障,在电气上将系统的不同部分隔离开来,同时允许无缝数据传输。在发电厂中,它们保护敏感的控制电路免受高压尖峰的影响,确保准确的信号处理,并在恶劣条件下保持系统完整性。中国国产数字隔离器经历了重大创新,在许多方面达到甚至超过了全球
    克里雅半导体科技 2025-01-03 16:10 105浏览
  • 【工程师故事】+半年的经历依然忧伤,带着焦虑和绝望  对于一个企业来说,赚钱才是第一位的,对于一个人来说,赚钱也是第一位的。因为企业要活下去,因为个人也要活下去。企业打不了倒闭。个人还是要吃饭的。企业倒闭了,打不了从头再来。个人失业了,面对的不仅是房贷车贷和教育,还有找工作的焦虑。企业说,一个公司倒闭了,说明不了什么,这是正常的一个现象。个人说,一个中年男人失业了,面对的压力太大了,焦虑会摧毁你的一切。企业说,是个公司倒闭了,也不是什么大的问题,只不过是这些公司经营有问题吧。
    curton 2025-01-02 23:08 270浏览
  • 影像质量应用于多个不同领域,无论是在娱乐、医疗或工业应用中,高质量的影像都是决策的关键基础。清晰的影像不仅能提升观看体验,还能保证关键细节的准确传达,例如:在医学影像中,它对诊断结果有着直接的影响!不仅如此,影像质量还影响了:▶ 压缩技术▶ 存储需求▶ 传输效率随着技术进步,影像质量的标准不断提高,对于研究与开发领域,理解并提升影像质量已成为不可忽视的重要课题。在图像处理的过程中,硬件与软件除了各自扮演着不可或缺的基础角色,有效地协作能够确保图像处理过程既高效又具有优异的质量。软硬件各扮演了什么
    百佳泰测试实验室 2025-01-03 10:39 112浏览
  • 国际标准IPC 标准:IPC-A-600:规定了印刷电路板制造过程中的质量要求和验收标准,涵盖材料、外观、尺寸、焊接、表面处理等方面。IPC-2221/2222:IPC-2221 提供了用于设计印刷电路板的一般原则和要求,IPC-2222 则针对高可靠性电子产品的设计提供了进一步的指导。IPC-6012:详细定义了刚性基板和柔性基板的要求,包括材料、工艺、尺寸、层次结构、特征等。IPC-4101:定义了印刷电路板的基板材料的物理和电气特性。IPC-7351:提供了元件封装的设计规范,包括封装尺寸
    Jeffreyzhang123 2025-01-02 16:50 192浏览
  • Matter加持:新世代串流装置如何改变智能家居体验?随着现在智能家庭快速成长,串流装置(Streaming Device,以下简称Streaming Device)除了提供更卓越的影音体验,越来越多厂商开始推出支持Matter标准的串流产品,使其能作为智能家庭中枢,连结多种智能家电。消费者可以透过Matter的功能执行多样化功能,例如:开关灯、控制窗帘、对讲机开门,以及操作所有支持Matter的智能家电。此外,再搭配语音遥控器与语音助理,打造出一个更加智能、便捷的居家生活。支持Matter协议
    百佳泰测试实验室 2025-01-03 10:29 125浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 153浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦