2. 注册platform

news/2025/3/4 16:49:52/

这里先分析platform

对应的dts内容如下

    i2s0_8ch: i2s@ff800000 {compatible = "rockchip,rv1126-i2s-tdm";reg = <0xff800000 0x1000>;interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;clocks = <&cru MCLK_I2S0_TX>, <&cru MCLK_I2S0_RX>, <&cru HCLK_I2S0>;clock-names = "mclk_tx", "mclk_rx", "hclk";dmas = <&dmac 20>, <&dmac 19>;dma-names = "tx", "rx";resets = <&cru SRST_I2S0_TX_M>, <&cru SRST_I2S0_RX_M>;reset-names = "tx-m", "rx-m";rockchip,cru = <&cru>;rockchip,grf = <&grf>;pinctrl-names = "default";pinctrl-0 = <&i2s0m0_sclk_tx&i2s0m0_sclk_rx&i2s0m0_lrck_tx&i2s0m0_lrck_rx&i2s0m0_sdi0&i2s0m0_sdo0&i2s0m0_sdo1_sdi3&i2s0m0_sdo2_sdi2&i2s0m0_sdo3_sdi1>;status = "disabled";}; &i2s0_8ch {status = "okay";#sound-dai-cells = <0>;rockchip,clk-trcm = <0>;rockchip,i2s-rx-route = <0 1 2 3>;pinctrl-names = "default";pinctrl-0 = <&i2s0m0_lrck_rx&i2s0m0_sclk_rx&i2s0m0_sdi0>;rockchip,capture-only;}; 

对应的驱动代码位置

kernel/sound/soc/rockchip/rockchip_i2s_tdm.c

这里只关注alsa相关的代码

static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
{...ret = devm_snd_soc_register_component(&pdev->dev,&rockchip_i2s_tdm_component,soc_dai, 1);...ret = rockchip_pcm_platform_register(&pdev->dev);if (ret) {dev_err(&pdev->dev, "Could not register PCM\n");return ret;}...
}

rockchip_i2s_tdm_probe()->devm_snd_soc_register_component()

 

int devm_snd_soc_register_component(struct device *dev,const struct snd_soc_component_driver *cmpnt_drv,struct snd_soc_dai_driver *dai_drv, int num_dai)
{struct device **ptr;int ret;ptr = devres_alloc(devm_component_release, sizeof(*ptr), GFP_KERNEL);if (!ptr)return -ENOMEM;ret = snd_soc_register_component(dev, cmpnt_drv, dai_drv, num_dai);if (ret == 0) {*ptr = dev;devres_add(dev, ptr);} else {devres_free(ptr);}   return ret;
}int snd_soc_register_component(struct device *dev,const struct snd_soc_component_driver *component_driver,struct snd_soc_dai_driver *dai_drv,int num_dai)
{struct snd_soc_component *component;component = devm_kzalloc(dev, sizeof(*component), GFP_KERNEL);if (!component)return -ENOMEM;return snd_soc_add_component(dev, component, component_driver,dai_drv, num_dai);
}int snd_soc_add_component(struct device *dev,struct snd_soc_component *component,const struct snd_soc_component_driver *component_driver,struct snd_soc_dai_driver *dai_drv,int num_dai)
{int ret;int i;/* 初始化componment * 关联dev和component_driver*/ret = snd_soc_component_initialize(component, component_driver, dev);if (ret)goto err_free;if (component_driver->endianness) {for (i = 0; i < num_dai; i++) {convert_endianness_formats(&dai_drv[i].playback);convert_endianness_formats(&dai_drv[i].capture);}}/* 1. 创建dai* 2. 关联component dev dai_drv* 3. 将dai通过list挂载到component的dai_list* 4. 更新component->num_dai*/ret = snd_soc_register_dais(component, dai_drv, num_dai);if (ret < 0) {dev_err(dev, "ASoC: Failed to register DAIs: %d\n", ret);goto err_cleanup;}/* 将component通过list挂载到 component_list (全局) 上*/snd_soc_component_add(component);return 0;err_cleanup:snd_soc_component_cleanup(component);
err_free:return ret;
}

 rockchip_i2s_tdm_probe()->rockchip_pcm_platform_register()

int rockchip_pcm_platform_register(struct device *dev)
{return devm_snd_dmaengine_pcm_register(dev, &rk_dmaengine_pcm_config,SND_DMAENGINE_PCM_FLAG_COMPAT);
}int devm_snd_dmaengine_pcm_register(struct device *dev,const struct snd_dmaengine_pcm_config *config, unsigned int flags)
{struct device **ptr;int ret;ptr = devres_alloc(devm_dmaengine_pcm_release, sizeof(*ptr), GFP_KERNEL);if (!ptr)return -ENOMEM;ret = snd_dmaengine_pcm_register(dev, config, flags);if (ret == 0) {*ptr = dev;devres_add(dev, ptr);} else {devres_free(ptr);}   return ret;
}int snd_dmaengine_pcm_register(struct device *dev,const struct snd_dmaengine_pcm_config *config, unsigned int flags)
{struct dmaengine_pcm *pcm;int ret;pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);if (!pcm)return -ENOMEM;#ifdef CONFIG_DEBUG_FSpcm->component.debugfs_prefix = "dma";
#endifpcm->config = config;pcm->flags = flags;/* dma相关* 这里会关联到dma 获取dts中rx tx channel* channel存放在pcm->chan[]数组*/ret = dmaengine_pcm_request_chan_of(pcm, dev, config);if (ret)goto err_free_dma;if (config && config->process)ret = snd_soc_add_component(dev, &pcm->component,&dmaengine_pcm_component_process,NULL, 0); else/* 增加一个新的component 主要用于dma相关* 同样component通过list挂载到 component_list (全局) 上*/ret = snd_soc_add_component(dev, &pcm->component,&dmaengine_pcm_component, NULL, 0); if (ret)goto err_free_dma;return 0;err_free_dma:dmaengine_pcm_release_chan(pcm);kfree(pcm);return ret;
}

 

 以上代码可以得到这样一张链接关系图,都只是挂载到链表,并没有实际的注册动作


http://www.ppmy.cn/news/701758.html

相关文章

GNS3配置dhcp环境

一、配置说明 GNS3版本&#xff1a;2.2.40.1 二、创建拓扑图 图中包含一台msf攻击机&#xff0c;一台带有漏洞的靶机&#xff0c;二者用交换机连接。在最上面有一个路由器。 配置msf机器和靶机为dbcp 将dhcp相关内容放开&#xff08;去掉#注释&#xff09;。 # # This is a …

安卓手机分辨率修改工具的使用方法

分辨率都可以修改&#xff0c;没错&#xff0c;分辨率可以修改&#xff0c;而且可以一键修改&#xff0c;这节我们就是要给大家演示如何修改手机屏幕的分辨率高宽。 同样的&#xff0c;我们需要借助琢石模拟器这个修改神器帮我们完成分辨率的修改工作&#xff0c;如果您的手机没…

android 获取手机分辨率

使用displayMetrics 创建的对象来获得屏幕分辨率。 protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); // setContentView(R.layout.w3_14) ;LinearLayout ll new LinearLayout(this) ;Button btn new Button(this) ;final TextVi…

手机设置分辨率命令

分辨率设置命令 adb shell wm size 480X480 adb shell wm density 240 分辨率恢复命令。 adb shell wm size reset adb shell wm density reset

Android手机修改分辨率

电脑首先要安装adb&#xff0c;这个可以参考网上的方法&#xff0c;然后手机需要root 不要超过手机本身的分辨率 指令&#xff1a; adb shell wm size 480x800 恢复指令&#xff1a; adb shell wm size reset 注意&#xff1a;480x800 中间的是英文字母“x”,不是*

手机分辨率

手机中的分辨率的一些名词 名称简介分辨率VGA 640*480HVGAHalf-size VGA&#xff0c;即VGA(640*480)的一半320*480HVGA-L HVGA-P QVGAQuarter VGA,即VGA的四分之一尺寸320*240QVGA-L QVGA-P WVGA800Wide VGA800*480WVGA854 WQVGA400Wide Quarter VGA400*240WQVGA432

手机分辨率介绍

分辨率&#xff08;resolution&#xff0c;港台称之为解释度&#xff09;就是屏幕图像的精密度&#xff0c;是指显示器所能显示的像素的多少。由于屏幕上的点、线和面都是由像素组成的&#xff0c;显示器可显示的像素越多&#xff0c;画面就越精细&#xff0c;同样的屏幕区域内…

【最新】Android 手机分辨率整理(做屏幕适配的拿走)

Android 手机分辨率&#xff1a; 320x480 320x400 480x800 480x854 540x960 600x1024 720x1184 720x1196 720x1280 768x1024 768x1280 800x1280 1080x1776 1080x1794 1080x1800 1080x1812 1080x1920 1080x2016 1080x2040 1080x216…