https://www.hdzikao.com

ALSA框架-ES8323声卡加载流程分析(linux设备驱动程序——bus)【es8323声卡加载流程分析】

[导读] 大家好,今天小热关注到一个比较有意思的话题,就是关于platform_driver_register的问题,于是小编就整理了2个相关介绍platform_driver_register的解答,让我们一起看看吧。 文章目录: ALSA框架-ES832

ALSA框架-ES8323声卡加载流程分析(linux设备驱动程序——bus)【es8323声卡加载流程分析】

大家好,今天小热关注到一个比较有意思的话题,就是关于platform_driver_register的问题,于是小编就整理了2个相关介绍platform_driver_register的解答,让我们一起看看吧。

文章目录:

  1. ALSA框架-ES8323声卡加载流程分析
  2. linux设备驱动程序——bus

一、ALSA框架-ES8323声卡加载流程分析

ALSA框架是Linux音频系统的核心,其ES8323声卡加载流程分析如下:

代码框架中包含DAI,即snd_soc_dai_driver,用于表示支持的数据格式,并提供设置格式的函数,启动数据传输。DAI在snd_soc_platform_driver中同样存在,用于支持数据格式和提供设置函数。控制接口则由snd_soc_codec_driver实现,用于读写芯片的寄存器。

最后,系统会注册名为“asoc-simple-card”的平台设备,导致soc-core.c中的soc_probe函数被调用,进而分配、设置和注册snd_card。

从I2S入口代码开始分析,sound/soc/rockchip/rockchip_i2s.c中的rockchip_i2s_probe重点函数,展示了playback和capture数据的格式。

进一步,从ES8323入口代码开始分析,sound/soc/codecs/es8328.c的代码开始以IIC设备注册到内核,因为ES8323的控制接口是IIC,通过IIC初始化声卡中的各个寄存器的值。

es8323_i2c_probe()函数的执行,通过调用snd_soc_register_codec()函数,传入soc_codec_dev_es8323和es8323_dai两个结构体。soc_codec_dev_es8323定义了声卡的各种操作函数,而es8323_dai定义了playback和capture的数据格式。

snd_soc_register_codec()函数的主体,作用在于向ASoC内核注册编解码器。此过程基于瑞芯微的通用平台,通过设备树获得硬件描述,完成Simple-card的配置。Simple-card.c提供入口代码,从sound/soc/generic/sound/Simple-card.c出发,分析asoc_simple_card_probe()和snd_soc_register_card()函数。最终,通过Simple-card.c实现了平台端dai和codec端的链接,声卡加载流程至此完成。

二、linux设备驱动程序——bus

总线(bus)在Linux内核中扮演着统一管理所有设备的角色,它将硬件总线或虚拟总线抽象为一种设备模型,使得系统能够以统一的方式来识别和控制各种设备。Linux系统中,设备通常会被挂载在总线上,形成一种抽象的设备树结构,这种设计有助于简化设备管理和驱动程序的开发。

总线工作流程主要包含两部分:driver(驱动程序)和device(设备)。driver实现了与特定类型设备的驱动程序实现,而device则向系统注册所需资源。当添加新的driver到总线上时,系统会调用总线的match函数,尝试匹配对应的device(驱动程序)。如果匹配成功,将调用probe函数,实现设备初始化、配置以及生成用户空间的文件接口。

以AT24CXX(一种常用的存储设备)为例,对于同系列的设备(如AT24C01、AT24C02),它们的操作方式相似,但容量不同。因此,没有必要为每种型号分别编写驱动程序。通过编写一份兼容所有AT24CXX设备的驱动程序,并根据型号参数进行调整,可以实现对这些设备的统一管理,大大提高了复用性和内存空间的节省。

在Linux驱动管理模型中,设备被注册在总线上,用户需要使用特定型号的硬件时,只需构建与型号对应的device并注册到总线上。总线的match函数匹配上后,调用probe函数即可完成设备初始化和用户空间文件接口的注册。

Linux中的总线由struct bus_type结构体进行描述,包含了总线名称、设备名、设备结构、匹配回调函数、事件回调函数、初始化和卸载函数等。这一结构使得总线能够管理注册的设备和驱动程序,并通过match函数实现设备和驱动程序的自动匹配。

总线注册过程主要涉及物理总线(如SPI、I2C)和虚拟总线(如platform)的初始化。物理总线通过postcore_initcall()将init函数注册到系统中,而虚拟总线在系统初始化时直接调用init函数。物理总线和虚拟总线分别包含特定的struct bus_type描述结构体,实现各自的注册和初始化。

当新设备或驱动程序被注册到总线上时,bus_register()接口负责初始化相关资源。以I2C为例,通过i2c_new_device接口添加设备,并调用device_register和bus_add_device函数将设备添加到总线上。同时,I2C驱动程序的注册与匹配过程通过i2c_driver_register函数实现。

设备与驱动程序的匹配主要通过设备和驱动程序中的属性进行,如设备名称、ID表、设备树转换过程中的兼容性属性等。总线的match函数负责实现这一匹配过程,确保正确的设备和驱动程序能够自动关联。

Linux的总线机制为设备管理和驱动程序开发提供了强大的支持,简化了系统对多种硬件设备的管理。通过上述介绍,我们对Linux内核中的总线机制有了更深入的理解。

到此,以上就是小编对于platform_driver_register的问题就介绍到这了,希望介绍关于platform_driver_register的2点解答对大家有用。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读