首页 > 其他分享 >Rockchip RK3399 - Platform驱动(DMA&i2s0)

Rockchip RK3399 - Platform驱动(DMA&i2s0)

时间:2023-07-30 14:44:51浏览次数:45  
标签:DMA rockchip 8ch i2s i2s0 bus I2S0 Rockchip

Platfrom driver提供了配置/使能SoC音频接口的能力;Plaftrom驱动分为两个部分:snd_soc_platform_driver、snd_soc_dai_driver。

  • snd_soc_platform_driver:负责管理音频数据,把音频数据通过DMA或其他操作传送至CPU DAI中;
  • snd_soc_dai_driver:负责完成SoC一侧的DAI参数配置,同时也会通过一定的路径把必要的DMA等参数与snd_soc_platform_driver进行交互;

驱动代码位于sound/soc/rockchip/rockchip_i2s.c文件。

一、设备节点

1.1 设备节点i2s0

设备节点i2s0定义在arch/arm64/boot/dts/rockchip/rk3399.dts文件:

i2s0: i2s@ff880000 {
        compatible = "rockchip,rk3399-i2s", "rockchip,rk3066-i2s";
        reg = <0x0 0xff880000 0x0 0x1000>;
        rockchip,grf = <&grf>;
        interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH 0>;
        dmas = <&dmac_bus 0>, <&dmac_bus 1>;
        dma-names = "tx", "rx";
        clock-names = "i2s_clk", "i2s_hclk";
        clocks = <&cru SCLK_I2S0_8CH>, <&cru HCLK_I2S0_8CH>;
        pinctrl-names = "bclk_on", "bclk_off";
        pinctrl-0 = <&i2s0_8ch_bus>;
        pinctrl-1 = <&i2s0_8ch_bus_bclk_off>;
        power-domains = <&power RK3399_PD_SDIOAUDIO>;
        #sound-dai-cells = <0>;
        status = "disabled";
};

这是 Rockchip RK3399 SoC中I2S0设备节点描述。它包括以下属性:

  • compatible: 指定设备驱动程序的兼容性,即告诉内核该设备可以被哪些驱动程序所使用;
  • reg: 指定I2S0控制器的基地址和地址空间大小,从 0xff880000 到 0xff881000 共有 0x1000 个字节的寄存器空间,其中0xff880000 为I2S0寄存器基地址;
  • rockchip,grf:设置为grf设备节点,用于定位并访问与I2S0控制器相关的GRF寄存器;
  • interrupts: 指定I2S控制器的中断号为GIC_SPI 39,并且取值方式为IRQ_TYPE_LEVEL_HIGH,意味着中断信号为高电平触发;
  • dmas: 指定数据传输时使用的DMA控制器,第一个表示TX数据使用的DMA控制器,第二个表示 RX 数据使用的 DMA 控制器;
  • dma-names: 分别对应 "tx" 和 "rx" 的 DMA 名称;
  • clock-names: 指定I2S0时钟名称,"i2s_clk"表示I2S0控制器时钟,"i2s_hclk" 表示I2S0 BUS时钟;
  • clocks: 指定I2S0控制器时钟使用SCLK_I2S0_8CH,BUS时钟使用 HCLK_I2S0_8CH;
  • pinctrl-names: 指定设备pinctrl配置集合;
  • pinctrl-0: 设置bclk_on状态对应的引脚配置为i2s0_8ch_bus,这里主要配置I2S0相关引脚复用为I2S功能;
  • pinctrl-1: 设置bclk_off状态对应的引脚配置为i2s0_8ch_bus_bclk_off,这里主要配置I2S0相关引脚复用为I2S功能,但是SCLK被设置为了GPIO,因此此时I2S0功能是禁用的;
  • power-domains: 指定设备隶属于的电源域,这里是 RK3399_PD_SDIOAUDIO;
  • #sound-dai-cells: 表示定义这个节点的sound DAI数据单元格的数量,这里为0表示没有单元格;
  • status: 表示设备状态,这里 "disabled" 表示该设备当前是禁用状态;

我们需要在arch/arm64/boot/dts/rockchip/rk3399-evb.dts文件添加如下属性,启用I2S0控制器:

&i2s0 {
        rockchip,playback-channels = <2>;
        rockchip,capture-channels = <2>;
        status = "okay";
};

关于设备节点属性可以参考文档Documentation/devicetree/bindings/sound/rockchip-i2s.yaml。

而RK3399 I2S控制器驱动代码位于sound/soc/rockchip/rockchip_i2s.c文件。

1.2 引脚配置节点i2s0_8ch_bus

引脚配置节点i2s0_8ch_bus和i2s0_8ch_bus_bclk_off定义在pinctrl设备节点下:

i2s0 {
        i2s0_2ch_bus: i2s0-2ch-bus {
                rockchip,pins =
                        <3 RK_PD0 1 &pcfg_pull_none>,
                        <3 RK_PD1 1 &pcfg_pull_none>,
                        <3 RK_PD2 1 &pcfg_pull_none>,
                        <3 RK_PD3 1 &pcfg_pull_none>,
                        <3 RK_PD7 1 &pcfg_pull_none>,
                        <4 RK_PA0 1 &pcfg_pull_none>;
        };

        i2s0_8ch_bus: i2s0-8ch-bus {
                rockchip,pins =
                        <3 RK_PD0 1 &pcfg_pull_none>,
                        <3 RK_PD1 1 &pcfg_pull_none>,
                        <3 RK_PD2 1 &pcfg_pull_none>,
                        <3 RK_PD3 1 &pcfg_pull_none>,
                        <3 RK_PD4 1 &pcfg_pull_none>,
                        <3 RK_PD5 1 &pcfg_pull_none>,
                        <3 RK_PD6 1 &pcfg_pull_none>,
                        <3 RK_PD7 1 &pcfg_pull_none>,
                        <4 RK_PA0 1 &pcfg_pull_none>;
        };

        i2s0_8ch_bus_bclk_off: i2s0-8ch-bus-bclk-off {
                rockchip,pins =
                        <3 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none>,
                        <3 RK_PD1 1 &pcfg_pull_none>,
                        <3 RK_PD2 1 &pcfg_pull_none>,
                        <3 RK_PD3 1 &pcfg_pull_none>,
                        <3 RK_PD4 1 &pcfg_pull_none>,
                        <3 RK_PD5 1 &pcfg_pull_none>,
                        <3 RK_PD6 1 &pcfg_pull_none>,
                        <3 RK_PD7 1 &pcfg_pull_none>,
                        <4 RK_PA0 1 &pcfg_pull_none>;
        };
}; 

这里我们只关注i2s0_8ch_bus引脚配置节点,这里定义了9个引脚,管脚与具体的功能和电气特性如下:

  • GPIO3_PD0:功能复用为I2S0_SCLK,电气特性配置为pcfg_pull_none;
  • GPIO3_PD1:功能复用为I2S0_LRCK_RX,电气特性配置为pcfg_pull_none;
  • GPIO3_PD2:功能复用为I2S0_LRCK_TX,电气特性配置为pcfg_pull_none;
  • GPIO3_PD3:功能复用为I2S0_SDI0,电气特性配置为pcfg_pull_none;
  • GPIO3_PD4:功能复用为I2S0_SDI1/I2S0_SDO3,电气特性配置为pcfg_pull_none;
  • GPIO3_PD5:功能复用为I2S0_SDI2/I2S0_SDO2,电气特性配置为pcfg_pull_none;
  • GPIO3_PD6:功能复用为I2S0_SDI3/I2S0_SDO1,电气特性配置为pcfg_pull_none;
  • GPIO3_PD7:功能复用为I2S0_SDO0,电气特性配置为pcfg_pull_none;
  • GPIO4_PA0:功能复用为I2S0_MCLK,电气特性配置为pcfg_pull_none;

二、I2S控制器驱动

 

 

参考文章

[1] 理解ALSA(三):从零写ASoC驱动

标签:DMA,rockchip,8ch,i2s,i2s0,bus,I2S0,Rockchip
From: https://www.cnblogs.com/zyly/p/17591412.html

相关文章

  • rdma-core之riostream.c
    头文件和库以及全局变量#include<stdio.h>#include<stdlib.h>#include<string.h>#include<strings.h>#include<errno.h>#include<getopt.h>#include<sys/types.h>#include<sys/socket.h>#include<sys/time.h>#i......
  • rdma-core之rdma_client.c
    库函数、全局变量#include<stdio.h>#include<stdlib.h>#include<string.h>#include<netdb.h>#include<errno.h>#include<getopt.h>#include<rdma/rdma_cma.h>#include<rdma/rdma_verbs.h>staticconstchar*server......
  • 基于 Databend 实现的海量日志实时查询服务 | 多点DMALL
    作者:苏琳多点DMALL供应链补货团队负责人多点DMALL成立于2015年。从创立伊始,就致力于以大数据、云计算、AI等数字技术改变零售业,是一站式全渠道数字零售解决方案服务商,数字化解构重构零售产业,提供端到端的商业SaaS解决方案。多点DMALL通过DMALLOS提供零售云一站式......
  • RDMA虚拟环境配置
    3、IB虚拟网络配置检查是否支持:cat /boot/config-$(uname -r) | grep RXE 安装驱动:sudo apt-get install libibverbs1 ibverbs-utils librdmacm1 libibumad3 ibverbs-providers rdma-coresudo apt-get install librdmacm-dev执行ibv_devices检查是否可执......
  • rdma-core--cmatose.c
    分析:头部信息#include<stdlib.h>#include<string.h>#include<stdio.h>#include<errno.h>#include<sys/types.h>#include<sys/socket.h>#include<netdb.h>#include<getopt.h>#include<rdma/rdma_cma.h>#i......
  • Rockchip RK3399 - 音频调试
    一、内核配置1.1配置内核修改sound/soc/codecs/Kconfig文件,搜索configSND_SOC_RT5651,将该项修configSND_SOC_RT5651tristatedependsonI2C改为,如果不修改的话,makemenuconfig是看不到该配置项的;configSND_SOC_RT5651tristate"RealtekAL......
  • 内核映射器(KernelMapper)开发-扩展KdMapper在Window 7 x64的支持
    1、背景  内核映射器有较多年历史了,其中KdMapper是比较著名的,原版中它使用intel的驱动漏洞可以无痕的加载未经签名的驱动。只不过当前只支持在Win10及Win11上运行,现在进行功能的修改以支持在Win7x64环境上。当前假定读者对KdMapper的原理比较了解并编译调试过相关代码。 2......
  • sendmail
    sendmail著名电子邮件服务器补充说明sendmail命令是一款著名的电子邮件传送代理程序,也就是平常说的电子邮件服务器,它基于标准的简单邮件传输协议(SMTP)。语法sendmail(选项)选项-bd:以守护进程方式运行指令;-bD:以前台运行方式运行;-bi:初始化别名数据库;-bm:以常规发送电子邮......
  • 使用podman-compose快速部署应用
    我们对于docker-compose并不陌生,它是一个用于编排多个可能相互依赖的容器的工具。而PodmanCompose项目的目标是作为docker-ompose的替代品,而不需要对docker-compose.yaml文件进行任何修改。要想使用podman-compose需要先安装podman,然后安装podman-compose。Rocky8下安装po......
  • 跨境电商外贸商城产品展示源码-多商户汉化Woodmart主题
    源码说明:WoodMart是一个WordPress商城主题,专注于用户体验第一WoodMart采用了功能强大的AJAX技术为用户提供了非常快速和无缝的网上购物界面。建立任何形式的网上商店,并开始赚取被动收入流。70个各行业商城模板。Html5+css3响应式,主题文件80%以上汉化,插件80%以上汉化模板用途:......