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

相关推荐
给算法爸爸上香13 小时前
yolo目标检测线程池高性能视频tensorrt推理(每秒1000+帧)
yolo·目标检测·音视频·线程池·tensorrt
大学生小郑13 小时前
sensor成像的原理
图像处理·音视频·视频
bandaoyu15 小时前
【RDMA】rdma指令
驱动开发
AI浩17 小时前
学习语言驱动的序列级别模态不变表示用于视频可见光-红外行人重识别
学习·音视频
2301_7722042817 小时前
LCD驱动开发:行场扫描与时序
驱动开发
老陈聊架构19 小时前
『AI视频创作』Remotion Skills 完全指南:用自然语言创作视频的革命
人工智能·音视频·skill·remotion
视频技术分享19 小时前
2026年实时音视频服务选型深度解析
音视频·实时音视频·视频
LUCIFER1 天前
[驱动进阶——MIPI摄像头驱动(五)]rk3588+OV13855摄像头驱动加载过程详细解析第四部分——ISP驱动
linux·驱动开发
三十_A1 天前
前端技术分享:基于 Canvas 实现视频帧截取与下载方案
前端·音视频
地狱为王1 天前
Unity使用NovaSR将沉闷的16kHz音频升频成清晰的48kHz音频
unity·游戏引擎·音视频·novasr