Yuhang Zheng
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
Linux内核编程广泛使用的前向声明(转载)

前向声明

编程定律

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

一个例子

regmap

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

include/vim linux/regulator/driver.h

LS1046网口RCW及网口配置修改示例

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

千兆网之RGMII解析

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

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

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

首先是硬件底板连接图。

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

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

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

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

其中发送端有:(“发送”面向的是MAC,只从MAC向PHY发送数据)

  • GTX_CLK:发送端参考时钟,由MAC向PHY提供
  • TXD[0:3]:发送数据引脚
  • TX_EN:发送控制引脚

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

其中接收端有:(“接收”面向的是MAC,只从MAC从PHY接收数据)

  • RX_CLK:接收端参考时钟,由PHY向MAC提供
  • RXD[0:3]:接收数据引脚
  • RX_DV:接收控制引脚

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

  • MDC:时钟线
  • MDIO:数据线(双向)


补充知识:

MII(Media Independent interface)即介质无关接口,它是IEEE-802.3定义的行业标准,是MAC与PHY之间的接口。MII数据接口包含16个信号和2个管理接口信号

信号名称 描述 方向
TX_CLK 发送时钟 PHY → MAC
TX_ER 发送数据错误 MAC → PHY
TX_EN 发送使能 MAC → PHY
TXD0 发送数据位0(最先传输) MAC → PHY
TXD1 发送数据位1 MAC → PHY
TXD2 发送数据位2 MAC → PHY
TXD3 发送数据位3 MAC → PHY
RX_CLK 接收时钟 PHY → MAC
RX_DV 接收数据有效 PHY → MAC
RX_ER 接收数据错误 PHY → MAC
RXD0 接收数据位0(最先传输) PHY → MAC
RXD1 接收数据位1 PHY → MAC
RXD2 接收数据位2 PHY → MAC
RXD3 接收数据位3 PHY → MAC
CRS 载波监测 PHY → MAC
COL 冲突碰撞监测 PHY → MAC
MDIO 管理数据 双向
MDC 管理数据时钟 MAC → PHY

MII以4位半字节方式传送数据双向传输,是一个支持10/100-Mbit/s速度的接口

  • 时钟频率为2.5MHz时,对应速率为10Mbit/s
  • 时钟速率为25MHz时,对应速率可达100Mbit/s

MII: 10Mbits/s = 2.5MHz x 4(数据位)

​ 100Mbit/s = 25MHz x 4(数据位)

MII接口虽然很灵活但由于信号线太多限制多接口网口的发展,后续又衍生出RMII,SMII等。


RMII(Reduced Media Independant Interface),精简MII接口,节省了一半的数据线。RMII收发使用2位数据进行传输,收发时钟均采用50MHz时钟源。信号定义如下:

信号名称 描述 方向
REF_CLK 参考时钟 MAC→PHY或由外部时钟源提供
TX_EN 发送数据使能 MAC → PHY
TXD0 发送数据位0(最先传输) MAC → PHY
TXD1 发送数据位1 MAC → PHY
RX_ER 接收错误 PHY → MAC
RXD0 接收数据位0(最先传输) PHY → MAC
RXD1 接收数据1 PHY → MAC
CRS_DV 载波和接收数据有效 PHY → MAC
MDIO 管理数据 双向
MDC 管理数据时钟 MAC → PHY

其中CRS_DV是MII中RX_DV和CRS两个信号的合并,当物理层接收到载波信号后CRS_DV变得有效,将数据发送给RXD。当载波信号消失后,CRS_DV会变为无效。在100M以太网速率中,MAC层每个时钟采样一次RXD[1:0]上的数据,在10M以太网速率中,MAC层每10个时钟采样一次RXD[1:0]上的数据,此时物理层接收的每个数据会在RXD[1:0]保留10个时钟。

MII以2位字节方式传送数据双向传输,是一个支持10/100-Mbit/s速度的接口

  • 无论传输速率为10Mbit/s和100Mbit/s,时钟速率都为为50MHz

RMII: 10Mbits/s = 50MHz / 10(10个时钟采样一次) x 2(数据位)

​ 100Mbit/s = 50MHz x 2(数据位)


SMII(Serial Media Independant Interface),串行MII接口。它包括TXD,RXD,SYNC三个信号线,共用一个时钟信号,此时钟信号是125MHz,信号线与此时钟同步。信号定义如下:

信号名称 描述 方向
REF_CLK 参考时钟 外部时钟源提供125MHz
TXD 发送数据 MAC → PHY
RXD 接收数据 PHY → MAC
SYNC 同步信号 -
MDIO 管理数据 双向
MDC 管理数据时钟 MAC → PHY

SYNC是数据收发的同步信号,每10个时钟同步置高一次电平,表示同步。TXD和RXD上的数据和控制信息,以10bit为一组。发送部分波形如下:

20190407194548782

从波形可以看出,SYNC变高后的10个时钟周期内,TXD依次输出一组10bit的数据即TX_ER,TX_EN,TXD[0:7],这些控制信息和MII接口含义相同。在100M速率中,每一组的内容都是变换的,在10M速率中,每一组数据需要重复10次,采样任一一组都可以。

SMII以1位字节方式传送数据双向传输,是一个支持10/100-Mbit/s速度的接口

  • 无论传输速率为10Mbit/s和100Mbit/s,时钟速率都为为125MHz

SMII: 10Mbits/s = 125MHz / 10(一个时钟周期10bit的数据) x 8(10bit的数据中有8位是有效数据)

​ 100Mbit/s = 125MHz / 10(10bit的数据) x 8(8位有效数据) / 10(每组数据重复10次)


GMII(Gigabit Media Independant Interface),千兆MII接口。GMII采用8位接口数据,工作时钟125MHz,因此传输速率可达1000Mbps。同时兼容MII所规定的10/100 Mbps工作方式。GMII接口数据结构符合IEEE以太网标准,该接口定义见IEEE 802.3-2000。信号定义如下:

信号名称 描述 方向
GTX_CLK 1000M发送时钟 MAC → PHY
TX_CLK 100/10M发送时钟 MAC → PHY
TX_ER 发送数据错误 MAC → PHY
TX_EN 发送使能 MAC → PHY
TX_[7:0] 发送数据8bit MAC → PHY
RX_CLK 接收时钟 PHY → MAC
RX_DV 接收数据有效 PHY → MAC
RX_ER 接收数据错误 PHY → MAC
RX_[7:0] 接收数据8bit PHY → MAC
CRS 载波监测 PHY → MAC
COL 冲突碰撞监测 PHY → MAC
MDIO 管理数据 双向
MDC 管理数据时钟 MAC → PHY

GMII以8位半字节方式传送数据双向传输,是一个支持10/100/1000-Mbit/s速度的接口

  • 时钟频率为2.5MHz时(使用TX_CLK引脚发送),对应速率为10Mbit/s
  • 时钟速率为25MHz时(使用TX_CLK引脚发送),对应速率可达100Mbit/s
  • 时钟速率为125MHz时(使用GTX_CLK引脚发送),对应速率可达1000Mbit/s

GMII: 10Mbits/s = 2.5MHz x 4(兼容MII模式,使用4位数据位)

​ 100Mbit/s = 25MHz x 4(兼容MII模式,使用4位数据位)

​ 1000Mbit/s = 125MHz x 8(数据位)


RGMII

RGMII(Reduced Gigabit Media Independant Interface),精简GMII接口。相对于GMII相比,RGMII具有如下特征:

  • 发送/接收数据线由8条改为4条
  • TX_ER和TX_EN复用,通过TX_CTL传送
  • RX_ER与RX_DV复用,通过RX_CTL传送
  • 1 Gbit/s速率下,时钟频率为125MHz
  • 100 Mbit/s速率下,时钟频率为25MHz
  • 10 Mbit/s速率下,时钟频率为2.5MHz

信号定义如下:

信号名称 描述 方向
TXC 发送时钟 MAC→PHY
TX_CTL 发送数据控制 MAC → PHY
TXD[3:0] 发送数据4bit MAC → PHY
RXC 接收时钟 PHY → MAC
RX_CTL 接收数据控制 PHY → MAC
RXD[3:0] 接收数据4bit PHY → MAC
MDIO 管理数据 双向
MDC 管理数据时钟 MAC → PHY

虽然RGMII信号线减半,但TXC/RXC时钟仍为125Mhz,为了达到1000Mbit的传输速率,TXD/RXD信号线在时钟上升沿发送接收GMII接口中的TXD[3:0]/RXD[3:0],在时钟下降沿发送接收TXD[7:4]/RXD[7:4],并且信号TX_CTL反应了TX_EN和TX_ER状态,即在TXC上升沿发送TX_EN,下降沿发送TX_ER,同样的道理试用于RX_CTL,下图为发送接收的时序:

20190407210933900

20190407210957915

RGMII以4位半字节方式传送数据双向传输,是一个支持10/100/1000-Mbit/s速度的接口

  • 时钟频率为2.5MHz时,对应速率为10Mbit/s
  • 时钟速率为25MHz时,对应速率可达100Mbit/s
  • 时钟速率为125MHz时,对应速率可达1000Mbit/s

RGMII: 10Mbits/s = 2.5MHz x 4(数据位)

​ 100Mbit/s = 25MHz x 4(数据位)

​ 1000Mbit/s = 125MHz x 2(一个时钟上升沿和下降沿共传输两个数据) x 4(数据位)

具体知识的参考链接如下:

以太网详解(一)-MAC/PHY/MII/RMII/GMII/RGMII基本介绍

Network 之二 Ethernet(以太网)中的 MAC、MII、PHY 详解

千兆网之SGMII解析

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

SGMII即Serial GMII,串行GMII,收发各一对差分信号线,时钟频率625MHz,在时钟信号的上升沿和下降沿均采样。

首先是硬件底板连接图。

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

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

可见此接口引脚数量为4个,收发各一对差分信号线。

参考时钟RX_CLK由PHY提供,是可选的,主要用于MAC侧没有时钟的情况,一般情况下,RX_CLK不使用,收发都可以从数据中恢复出时钟。

其实,大多数MAC芯片的SGMII接口都可以配置成SerDes接口(在物理上完全兼容,只需配置寄存器即可),直接外接光模块,而不需要PHY层芯片,此时时钟速率仍旧是625MHz,不过此时跟SGMII接口不同,SGMII接口速率被提高到1.25Gbps是因为插入了控制信息,而SerDes端口速率被提高是因为进行了8B/10B变换,本来8B/10B变换是PHY芯片的工作,在SerDes接口中,因为外面不接PHY芯片,此时8B/10B变换在MAC芯片中完成了。8B/10B变换的主要作用是扰码,让信号中不出现过长的连“0”和连“1”情况,影响时钟信息的提取

基于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函数操作。

基于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);

锂电池充放电电压注意事项

我目前手边上有一个7.4v的锂电池,因为不常用,又怕总是搁置着会慢慢给放坏,所以网上查了一下7.4v锂电池的充电注意事项,特此记录一下。

7.4V一般是2串锂电的电池组,这也可以从电池的充电接口看到,一般是一个3p的接口,如果用万用表去测量的话,分别为0v,一串电池的电压,两串电池的电压。

单串电池的充放电范围是4.2V-2.7V,也就是说,如果电池电压一致性比较好的话,充电的满电电压是8.4V,放电的最低电压是5.4V。

如果没有保护板的话在5.4V以下也许用电器还能工作,但电池已经不能再用了,会损失寿命,需要充电再用。

另外锂电池对电压上下限很敏感,经常超高或超低会极大地损失循环寿命。

也就是对于7.4v的锂电池来说

满电 标称 停止 终止
8.4v 7.4v 7.0v 6.0v

在内核驱动文件./drivers/power/supply/da9052-battery.c中,有以下内容

    {
    {4102, 100}, {4065, 98},
    {4048, 96}, {4034, 95},
    {4021, 93}, {4011, 92},
    {4001, 90}, {3986, 88},
    {3968, 87}, {3952, 85},
    {3938, 84}, {3926, 82},
    {3916, 81}, {3908, 79},
    {3900, 77}, {3892, 76},
    {3883, 74}, {3874, 73},
    {3864, 71}, {3855, 70},
    {3846, 68}, {3836, 67},
    {3827, 65}, {3819, 64},
    {3810, 62}, {3801, 61},
    {3793, 59}, {3786, 58},
    {3778, 56}, {3772, 55},
    {3765, 53}, {3759, 52},
    {3754, 50}, {3748, 49},
    {3743, 47}, {3738, 46},
    {3733, 44}, {3728, 43},
    {3724, 41}, {3720, 40},
    {3716, 38}, {3712, 37},
    {3709, 35}, {3706, 34},
    {3703, 33}, {3701, 31},
    {3698, 30}, {3696, 28},
    {3693, 27}, {3690, 25},
    {3687, 24}, {3683, 22},
    {3680, 21}, {3675, 19},
    {3671, 18}, {3666, 17},
    {3660, 15}, {3654, 14},
    {3647, 12}, {3639, 11},
    {3630, 9}, {3621, 8},
    {3613, 6}, {3606, 5},
    {3597, 4}, {3582, 2},
    {3546, 1}, {2747, 0}
    },

由上可以看到,当单串电池电压到3.5v时,电池电量已经接近于0了,所以平时在放电的时候,要注意电池组电压不要低于7v

wm8960芯片驱动打印寄存器方法

目前在调试wm8960芯片的时候遇到一个问题,需要能够打印wm8960芯片上的寄存器的值。

但是通过wm8960的手册我们知道,它的寄存器地址是7为,数据是9位,不是标准的i2c协议的情况,只支持了i2c来写寄存器,没有实现i2c读寄存器。

image-20220908105702728