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

相关推荐
上海合宙LuatOS11 小时前
LuatOS核心库API——【audio 】
java·网络·单片机·嵌入式硬件·物联网·音视频·硬件工程
Android系统攻城狮12 小时前
Android16进阶之音频播放定位MediaPlayer.seekTo调用流程与实战(二百二十七)
音视频·mediaplayer·android16·音频进阶·音频性能实战
晚霞的不甘13 小时前
Flutter for OpenHarmony 可视化教学:A* 寻路算法的交互式演示
人工智能·算法·flutter·架构·开源·音视频
听麟13 小时前
HarmonyOS 6.0+ 跨端智慧政务服务平台开发实战:多端协同办理与电子证照管理落地
笔记·华为·wpf·音视频·harmonyos·政务
晚霞的不甘14 小时前
Flutter for OpenHarmony 实现计算几何:Graham Scan 凸包算法的可视化演示
人工智能·算法·flutter·架构·开源·音视频
零一iTEM15 小时前
MAX98357A_音频输出测试
单片机·嵌入式硬件·开源·音视频·硬件工程
Android系统攻城狮16 小时前
Android16进阶之获取播放位置MediaPlayer.getCurrentPosition调用流程与实战(二百二十八)
音视频·android16·音频进阶·音频性能实战
愚公搬代码18 小时前
【愚公系列】《AI短视频创作一本通》020-AI短视频创作实例精解(文旅宣传AI短视频实例精解)
人工智能·音视频
有位神秘人18 小时前
Android获取设备中本地音频
android·音视频
硫酸锌0118 小时前
使用ffmpeg合并文件夹内的所有*.mp4格式视频
ffmpeg·音视频