全志T507 音频ALSA核心层注册流程分析

一.ALSA核心层注册流程分析

**驱动目录:**kernel-4.9/sound/core/sound.c

bash 复制代码
struct file_operations snd_fops =

{

.owner = THIS_MODULE,

.open = snd_open, (inode, file)

    ---->struct snd_minor *mptr = snd_minors[minor];

        ---->file->f_op = fops_get(mptr->f_ops);

            ---->file->f_op->open(inode, file);

.llseek = noop_llseek,

}

1.alsa_sound_init()

bash 复制代码
---->register_chrdev(major, "alsa", &snd_fops)

    ---->__register_chrdev(major, 0, 256, name, fops);

这里注册了256个cdev

**驱动目录:**kernel-4.9/sound/core/control.c

bash 复制代码
static  const  struct  file_operations  snd_ctl_f_ops =
{
         .owner =  THIS_MODULE,
         .read =               snd_ctl_read,
         .open =        snd_ctl_open,
         .release =         snd_ctl_release,
         .llseek =   no_llseek,
         .poll =                 snd_ctl_poll,
         .unlocked_ioctl =      snd_ctl_ioctl,
         .compat_ioctl =        snd_ctl_ioctl_compat,
         .fasync =  snd_ctl_fasync,
};
bash 复制代码
snd_ctl_dev_register(struct snd_device *device)
---->sprintf(name, "controlC%i", cardnum);
    ---->snd_register_device(SNDRV_DEVICE_TYPE_CONTROL, card, -1,
                                   &snd_ctl_f_ops, card, name)) < 0)

驱动目录:

kernel-4.9/sound/core/sound.c

kernel-4.9/sound/core/control.c

bash 复制代码
---->snd_register_device_for_dev(int type, struct snd_card *card, int dev,
                                     struct file_operations *f_ops,
                                     void *private_data,
                                     char *name, struct device *device)
       ---->preg->type = type;
            ---->preg->card = card ? card->number : -1;
            ---->preg->device = dev;
            ---->preg->f_ops = f_ops;
            ---->preg->private_data = private_data;
       ---->snd_minors[minor] = preg;
       ---->device_create(sound_class, device, MKDEV(major,minor),private_data, "%s", name);//dev节点         /dev/sound/controlC0

2.snd_ctl_create(struct snd_card *card)

bash 复制代码
---->static  struct snd_device_ops  ops = {
        .dev_free = snd_ctl_dev_free,
        .dev_register =snd_ctl_dev_register,
        .dev_disconnect = snd_ctl_dev_disconnect,
   };

创建snd_card的一个实例snd_card_new

kernel-4.9/sound/core/device.c

bash 复制代码
---->snd_device_new(card, SNDRV_DEV_CONTROL, card, &ops)

    ----> list_add(&dev->list, &card->devices)

然后通过snd_card_register注册到内核中:kernel-4.9/sound/core/init.c

3.snd_card_register (struct snd_card *card)

bash 复制代码
----> device_create(sound_class, card->dev, MKDEV(0, 0), card, "card%i", card->number);
//dev节点         /dev/sound/card0
---->snd_device_register_all(card)
    ---->list_for_each_entry(dev, &card->devices, list)
       ----> dev->ops->dev_register(dev)
----> init_info_for_card(card);// 建立一些相应的proc和sysfs下的文件或属性节点

4.如何要完成一个声卡驱动

如果要完成一个完整的声卡驱动,其应该满足3步曲,那就是申请、初始化和注册才能成功。

(1)创建snd_card的一个实例snd_card_new

(2)初始化结构体

(3)通过snd_card_register注册到内核中

相关推荐
潜创微科技1 小时前
切换器芯片主要型号有哪些:潜创微高清音视频领域主流型号与应用场景全解析
音视频
KevinCyao2 小时前
106视频短信接口怎么发?支持高清影音下发的106视频短信服务商
音视频
潜创微科技--高清音视频芯片方案开发2 小时前
2026年切换器方案服务商市场格局分析与主流品牌选型指南
音视频·硬件工程
Freak嵌入式3 小时前
MicroPython LVGL基础知识和概念:GUI 的扩展接口
ide·驱动开发·嵌入式·gui·lvgl·micropython·upypi
潜创微科技--高清音视频芯片方案开发3 小时前
2026年高清音视频切换器方案选型分
音视频
二等饼干~za8986684 小时前
源码可控:云罗 GEO 源头工厂,开源搭建 + 二次开发全链路解决方案
服务器·开发语言·开源·php·音视频·ai-native
SY.ZHOU5 小时前
移动端架构体系(四):View层的组织与调用方案
flutter·ios·架构·系统架构·安卓
feasibility.6 小时前
OpenClaw+LibTV视频生成实测(含安装+配置+分析):ai生成工作流很规范,但画面在“打架“
人工智能·aigc·音视频·内容运营·短剧·openclaw·libtv
深念Y7 小时前
FFmpeg 480p 转码失败但 1080p/720p 正常的坑
ffmpeg·音视频·转码·流媒体·分辨率·hls·m3u8
不吃鱼的猫7488 小时前
【音视频流媒体进阶:从网络到 WebRTC】第04篇-流媒体场景下的网络优化
网络·音视频·webrtc