全志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注册到内核中

相关推荐
DogDaoDao17 小时前
【H266/VVC提案解读】ITU-T H.274 (V4) 规范深度解读 — 视频编码 SEI 消息的全面演进
音视频·实时音视频·视频编解码·流媒体·h266·vvc·视频编解码标准
hhzz19 小时前
Tiger AI 平台「手势识别」功能全解析:从数字手势 0–9,到中国手语字母,再到本地视频批量识别——一条链路,三种输入,双模型可同开;双手比划,机器秒懂
人工智能·python·深度学习·aigc·音视频
martindelophy19 小时前
DeepSeek Harness 插件开发实战:用自然语言检查、修改并渲染 Timeline Studio 视频工程
音视频
平原201820 小时前
LTX-2.5 22B 本地部署:ModelScope 下载、8 步推理与图生视频命令
音视频
淡淡的香烟20 小时前
Android视频直播播放器简单封装
android·物联网·音视频
show4331 天前
2026视频处理小程序技术选型指南:链接解析+OCR+ASR+AI配音多引擎对比
小程序·ocr·音视频
昨日之日20061 天前
LTX-2.5:更清晰、更可控、同步音画、多镜头连贯的AI视频神器
人工智能·音视频
点云-激光雷达-Slam-三维牙齿2 天前
批量音频转文本 ASR 目前中文识别效果最好的qwen3 模型
音视频
小柯南敲键盘2 天前
跨马翻译:跨境电商批量图片翻译与视频字幕一站式工具
人工智能·python·音视频
weixin_446260852 天前
AVA-Encoder:面向智能体原生视频表征学习框架
学习·音视频