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

相关推荐
开开心心就好15 小时前
用户推荐的文件解锁与强制操作工具
安全·智能手机·pdf·scala·音视频·symfony·1024程序员节
luoqice16 小时前
linux下安装rtsp流媒体服务器
linux·音视频
searchforAI17 小时前
5款AI笔记工具实测:导入体验、结构化输出、后续能力逐项对比
人工智能·笔记·学习·ai·chatgpt·aigc·音视频
nashane18 小时前
HarmonyOS 6学习:SoundPool音频防抖与Web长截图时序重构
学习·音视频·harmonyos·harmonyos 5
ACP广源盛1392462567318 小时前
OpenAI 推出的 GPT-5.5 大模型,倒逼接口芯片升级迭代@ACP#IX8024应用迭代
网络·人工智能·嵌入式硬件·电脑·音视频
ACP广源盛1392462567318 小时前
OpenAI 推出的 GPT-5.5 大模型,倒逼接口芯片升级迭代@ACP#IX8012应用迭代
大数据·网络·人工智能·嵌入式硬件·电脑·音视频
枳实-叶18 小时前
【Linux驱动开发】第13天:Linux内核设备树解析 OF API 超详细全解
linux·运维·驱动开发
java小吕布19 小时前
HyperFrames:写 HTML 就能渲染视频,专为 AI 智能体打造的开源渲染框架
人工智能·html·音视频
小此方19 小时前
Re:Linux系统篇(二十一)进程篇·六:穿过底层看本质,深入理解底层进程切换与 O(1) 调度算法
linux·驱动开发·算法
2601_957879331 天前
短视频矩阵的数据驱动运营:从流量监测到内容迭代的完整技术链路
大数据·矩阵·音视频