Yuhang Zheng
基于i.MX6X的音频驱动分析(三)音频驱动ASoC的机器层

前面一节的内容我们提到,ASoC被分为Machine、Platform和Codec三大部分。

其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上一节的内容:

Machine驱动负责处理机器特有的一些控件和音频事件(例如,当播放音频时,需要先行打开一个放大器);单独的Platform和Codec驱动是不能工作的,它必须由Machine驱动把它们结合在一起才能完成整个设备的音频处理工作。

ASoC的一切都从Machine驱动开始,包括声卡的注册,绑定Platform和Codec驱动等等,下面就让我们从Machine驱动开始讨论吧

注册Platform Device

ASoC把声卡注册为Platform Device,以WM8960为例 ,涉及文件:sound/soc/imx/imx-wm8960.c

其模块初始化函数为:module_init(imx_asoc_init);

Linux内核编程广泛使用的前向声明(转载)

前向声明

编程定律

先强调一点:在一切可能的场景,尽可能地使用前向声明(Forward Declaration)。这符合信息隐蔽的原则。

一个例子

regmap

那么前向声明究竟是个什么鬼?在内核写代码和看代码的童鞋,经常发现Linux内核里面充斥着这样的代码,比如

include/vim linux/regulator/driver.h

LS1012的网络初始化解析

简单梳理一下LS1012开发板的Uboot阶段网络初始化过程

在文件:

OK10xx-linux-fs/flexbuild/packages/firmware/u-boot/include/net/pfe_eth/pfe_eth.h

首先定义了我们所需要的三个结构体:

struct gemac_s {
        void *gemac_base;
        void *egpi_base;

        /* GEMAC config */
        int gemac_mode;
        int gemac_speed;
        int gemac_duplex;
        int flags;
        /* phy iface */
        int phy_address;
        int phy_mode;
        struct mii_dev *bus;

};

struct pfe_mdio_info {
        void *reg_base;
        char *name;
};

struct pfe_eth_dev {
        int gemac_port;
        struct gemac_s *gem;
        struct pfe_ddr_address pfe_addr;
        struct udevice *dev;
#ifdef CONFIG_PHYLIB
        struct phy_device *phydev;
#endif
};
LS1046网口RCW及网口配置修改示例

LS1046网口RCW及网口配置修改示例   本文要解决的问题: 由于LS104x系列开发板引入了【复位控制字】Reset configuration word (RCW)的配置方法,通过这种配置方法客户可以方便的进行引脚的功能定义,也就是实现引脚的PinMUX功能。 LS104x平台所特有的SerDes Module也是要通过RCW来进行配置,从而将不同的SerDes通道选择为不同的功能。以LS1046A为例,可配置的两路SerDes有: 1046_Serdes1 1046_Serdes2 但是这个被称为RCW的配置方法还有很多客户还不是很了解,所以本文以一个LS1046A的实际需求为例,来详细说明一下修改的过程以供客户后续定制参考。

LS10XX的RCW参数修改方法

在使用LS10xx系列核心板开发项目的过程中,有时候需要根据自己的需求修改一些引脚功能或者一些引脚设置,难免有需要修改RCW(Reset ConfigurationWord)的时候。本文就是根据平时开发的经验谈一下LS10xx系列开发板修改RCW参数修改的方法。

针对三个平台的修改的RCW文件位置分别为:

LS1012平台:

flexbuild/packages/firmware/rcw/ls1012ardb/R_SPNH_3508/rcw_1000_default.rcw

LS1043平台:

flexbuild/packages/firmware/rcw/ls1043ardb/RR_FQPP_1455/rcw_1600_qspiboot.rcw

LS1046平台:

SerDes为1040_5559的rcw配置文件:
packages/firmware/rcw/ls1046ardb/FORLINX/rcw_1800_qspiboot_1040_5559.rcw
SerDes为1133_5559的rcw配置文件:
packages/firmware/rcw/ls1046ardb/FORLINX/rcw_1800_qspiboot_1133_5559.rcw
信号dB值的意思

说明:

手机信号值是越大越好,也就是-60db比-70db信号好。这个值越大信号就越好,因为那是个负值,而且在你手里的时候它永远是负值,如果你感兴趣且附近有无线基站的天线的话,你也可以把你的手机尽量接近天线面板,那么值就越来越大;如果手机跟天线面板挨到一起,那么它可能十分接近于 0了(0是达不到的,这里的0的意思也不是说手机没信号了)。
在无线路由中,db同样是越大越好,也就是9db比5db信号好,发射端一般是正值,数值越大发射功率越大;接收端一般是负值,数值越小代表灵敏度越高。
这两者没有必然的关联。

总结:

对于信号接收端,此值为负值,这个值越大信号就越好,也就是-60db比-70db信号好。

对于信号发送端,此值为正值,同样是越大越好,也就是9db比5db信号好

千兆网之RGMII解析

一般来说,底板的千兆网大多选用RGMII和SGMII两种接口,也有可以拓展出更多网口的QSGMII接口。

这一篇文章就是简单解析一下RGMII这种接口的内容。

RGMII均采用4位数据接口,工作时钟125MHz,并且在上升沿和下降沿同时传输数据,因此传输速率可达1000Mbps。

首先是硬件底板连接图。

先是PHY芯片的AR8031的硬件接线图:

其次是网口座子和PHY芯片的模式选择引脚以及PHY地址的接线图:

查阅AR8031的数据手册,先看硬件定义如下:

可见此接口引脚数量为12个。

其中发送端有:

  • GTX_CLK:发送端参考时钟
  • TXD[0:3]:发送数据引脚
  • TX_EN:发送控制引脚

TX_EN信号线上传送TX_EN和TX_ER两种信息,在GTX_CLK的上升沿发送TX_EN,下降沿发送TX_ER。

注:在千兆速率下,向PHY提供GTX_CLK信号,TXD、TXEN、TXER信号与此时钟信号同步。否则,在10/100M速率下,PHY提供 TXCLK时钟信号,其它信号与此信号同步。其工作频率为25MHz(100M网络)或2.5MHz(10M网络)。

其中接收端有:

  • RX_CLK:接收端参考时钟
  • RXD[0:3]:接收数据引脚
  • RX_DV:接收控制引脚

其余有一个管理配置接口,即MDIO接口,有2根线:

  • MDC:时钟线
  • MDIO:数据线(双向)
新世界的拓荒

想了很久终于要写下文字,在这么一个全新的地方,是最开放也是最私密的小世界里。在偌大的无法想象的互联网上的一个最不为人所知的小角落里。

之前看了很多大佬的搭建的个人博客,很温馨,很精致,很羡慕。在一个属于自己的地方记录着生活,分享着知识和成长,和志同道合的小伙伴们一起创造着属于他们一起的回忆。

大概是他们是很认真很专注的那种人吧,主动拥抱着热爱的生活,为了兴趣愿意付出时间并且欣然去努力。能够致力于长期的投入等待未来的回报,能够乐在其中过程而不是迷失在对结果的渴求中,这些品质就是现在的自己很想很想要的吧。

也不必在这里反思自己的状态,不必过分去内疚曾经的自己,真正重要的还是要去决心改变这一切令你不满意的现状,让曾经的过去,让未来的到来。

希望从现在开始,有一个新的启程吧,认真去对待这个地方,认真记录和分享。只有变成更好的人,才能遇到更好的人,才能与那些现在自己眼中的大佬站在同样的水平上侃侃而谈。

愿改变,从此刻开始。

基于i.MX6X的音频驱动分析(一)ALSA and ASOC基本概念

ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构,它提供了linux操作系统的音频与MIDI功能 。

在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制。

alsa的软件体系结构

图1.1 alsa的软件体系结构

基于i.MX6X的音频驱动分析(二)音频驱动的流程,平台数据,内核配置与测试

音频驱动的打开流程

ALSA音频驱动执行以下设备打开流程:

  • 分配一个空闲的操作子流
  • 打开低层硬件设备
  • 提供硬件能力给ALSA runtime信息(包括硬件,DMA,软件支持能力)
  • 配置读写DMA通道
  • 配置CPU DAI和Codec DAI接口
  • 配置Codec硬件
  • 触发传输。

音频传输触发后,接下来的DMA读写操作则由DMA的中断 Callback函数操作。