Rockchip RK3399 - ALSA Proc Info
----------------------------------------------------------------------------------------------------------------------------
开发板 :NanoPC-T4开发板
eMMC :16GB
LPDDR3 :4GB
显示屏 :15.6英寸HDMI接口显示屏
u-boot :2023.04
linux :6.3
----------------------------------------------------------------------------------------------------------------------------
Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
基于/proc文件系统如上所述的特殊性,其内的文件也常被称作虚拟文件,并具有一些独特的特点。例如,其中有些文件虽然使用查看命令查看时会返回大量信息,但文件本身的大小却会显示为0字节。此外,这些特殊文件中大多数文件的时间及日期属性通常为当前系统时间和日期,这跟它们随时会被刷新(存储于RAM中)有关。
一、/proc/asound
ALSA有自己的proc tree,在/proc/asound这个目录下可以找到许多关于snd card 的详细信息,Proc Files of ALSA Drivers。
root@rk3399:/# ll /proc/asound dr-xr-xr-x 5 root root 0 Aug 6 16:43 card0/ dr-xr-xr-x 5 root root 0 Aug 6 16:55 card1/ -r--r--r-- 1 root root 0 Aug 6 15:10 cards -r--r--r-- 1 root root 0 Aug 6 16:55 devices lrwxrwxrwx 1 root root 5 Aug 6 16:55 hdmisound -> card0/ -r--r--r-- 1 root root 0 Aug 6 16:55 pcm lrwxrwxrwx 1 root root 5 Aug 6 16:55 realtekrt5651co -> card1/ dr-xr-xr-x 6 root root 0 Aug 6 16:55 seq/ -r--r--r-- 1 root root 0 Aug 6 16:55 timers -r--r--r-- 1 root root 0 Aug 6 16:55 version
其中主要的节点如下:
- cardx:表示注册的sound card;
- cards:显示当前配置的Alsa Drivers,index,the id string,short and long descriptions;
- version:显示版本字符串;
- devices:列举本机设备映射;
- pcm:列举当前可用的 pcm devides,格式如下:<card>-<device>: <id>: <name> : <sub-streams>;
该节主要用于讲解在alsa core 中创建的/proc/asound目录树以及如何实现的。
在 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; }
1.1 version文件
如上代码所示,在 snd_info_init函数中除了创建/proc/asound ,紧接着在 snd_proc_root entry下(即以 snd_proc_root enter 作为 parent entry) 创建 “version” 文件(即 /proc/asound/version),并提供了read方法,代码详解略,cat /proc/asound/version如下:
root@rk3399:/# cat /proc/asound/version Advanced Linux Sound Architecture Driver Version k6.3.0.
1.2 devices文件
接着在snd_proc_root entry下创建 “devices” 文件(即 /proc/asound/devices),提供了read方法,cat /proc/asound/devices如下:
root@rk3399:/# cat /proc/asound/devices 1: : sequencer 2: [ 0- 0]: digital audio playback 3: [ 0- 0]: digital audio capture 4: [ 0] : control 5: [ 1- 0]: digital audio playback 6: [ 1- 0]: digital audio capture 7: [ 1] : control 33: : timer
对于devices的print格式如下:
- Control设备: “minor: [card_id] : control”;
- PCM设备:“minor: [card_id- device_id]: digital audio playback/capture”;
- timer设备: “minor: : timer”;
1.3 cards文件
接着在snd_proc_root entry下创建 “cards” 文件(即 /proc/asound/cards),提供了read方法,cat /proc/asound/cards如下:
root@rk3399:/# cat /proc/asound/cards 0 [hdmisound ]: simple-card - hdmi-sound hdmi-sound 1 [realtekrt5651co]: simple-card - realtek,rt5651-codec realtek,rt5651-codec
对于cards的print格式如下:
card_id [card_id_string ]: card_driver - card_shortname
card_longname
1.4 cardx目录
我们前面已经分析了创建声卡函数snd_card_new的执行流程,其内部会调用snd_info_card_create在snd_proc_root下创建 "cardx" 目录(即/proc/asound/cardx),并将对应的entry保存在card->proc_root,以便后面基于该声卡的snd device等节点均以其作为 parent entry;
root@rk3399:/# ll /proc/asound/card0 -r--r--r-- 1 root root 0 Aug 6 16:43 id dr-xr-xr-x 5 root root 0 Aug 6 16:43 pcm0c/ dr-xr-xr-x 5 root root 0 Aug 6 16:43 pcm0p/
在cardx目录下主要会对每个PCM设备创建对应的pcmxp/c目录,创建方式如下:
- 我们都知道在创建PCM设备时都调用snd_pcm_new函数,在该函数中也分别会对Playback&Capture调用snd_pcm_new_stream(PLAYBACK/CAPTURE)定义playback&capture设备名称;
- 然后则会调用snd_pcm_stream_proc_init函数,在该函数中会在card->proc_root entry下创建pcmxp/c目录(即 /proc/asound/cardx/pcmxp | pcmxc),并将对应的 entry 保存在 pcm->streams[PLAYBACK/CAPTURE]->proc_root;同时也会在 pcm->streams[]->proc_root下创建info文件(即/proc/asound/cardx/pcmxp|c/info),并提供read方法;
经过上述创建目录以及cat /proc/asound/cardx/pcmxp|c/info 如下所示:
root@rk3399:/# cat /proc/asound/card0/pcm0p/info card: 0 device: 0 subdevice: 0 stream: PLAYBACK id: ff8a0000.i2s-i2s-hifi i2s-hifi-0 name: ff8a0000.i2s-i2s-hifi i2s-hifi-0 subname: subdevice #0 class: 0 subclass: 0 subdevices_count: 1 subdevices_avail: 1 root@rk3399:/# cat /proc/asound/card1/pcm0p/info card: 1 device: 0 subdevice: 0 stream: PLAYBACK id: ff880000.i2s-rt5651-aif1 rt5651-aif1-0 name: ff880000.i2s-rt5651-aif1 rt5651-aif1-0 subname: subdevice #0 class: 0 subclass: 0 subdevices_count: 1 subdevices_avail: 1
亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。
日期 | 姓名 | 金额 |
---|---|---|
2023-09-06 | *源 | 19 |
2023-09-11 | *朝科 | 88 |
2023-09-21 | *号 | 5 |
2023-09-16 | *真 | 60 |
2023-10-26 | *通 | 9.9 |
2023-11-04 | *慎 | 0.66 |
2023-11-24 | *恩 | 0.01 |
2023-12-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
2024-09-06 | *强 | 8.8 |
2024-09-09 | *波 | 1 |
2024-09-10 | *口 | 1 |
2024-09-10 | *波 | 1 |
2024-09-12 | *波 | 10 |
2024-09-18 | *明 | 1.68 |
2024-09-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了