程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)

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-30I*B1
2024-01-28*兴20
2024-02-01QYing20
2024-02-11*督6
2024-02-18一*x1
2024-02-20c*l18.88
2024-01-01*I5
2024-04-08*程150
2024-04-18*超20
2024-04-26.*V30
2024-05-08D*W5
2024-05-29*辉20
2024-05-30*雄10
2024-06-08*:10
2024-06-23小狮子666
2024-06-28*s6.66
2024-06-29*炼1
2024-06-30*!1
2024-07-08*方20
2024-07-18A*16.66
2024-07-31*北12
2024-08-13*基1
2024-08-23n*s2
2024-09-02*源50
2024-09-04*J2
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-26B*h10
2024-09-3010
2024-10-02M*i1
2024-10-14*朋10
2024-10-22*海10
2024-10-23*南10
2024-10-26*节6.66
2024-10-27*o5
2024-10-28W*F6.66
2024-10-29R*n6.66
2024-11-02*球6
2024-11-021*鑫6.66
2024-11-25*沙5
2024-11-29C*n2.88
posted @   大奥特曼打小怪兽  阅读(292)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
如果有任何技术小问题,欢迎大家交流沟通,共同进步

公告 & 打赏

>>

欢迎打赏支持我 ^_^

最新公告

程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)。

了解更多

点击右上角即可分享
微信分享提示