登录后台

页面导航

本文编写于 397 天前,最后修改于 397 天前,其中某些信息可能已经过时。

前言

PIO

PIO的英文拼写是“Programming Input/Output Model”,PIO模式是一种通过CPU执行I/O端口指令来进行数据的读写的数据交换模式。是最早先的硬盘数据传输模式,数据传输速率低下,CPU占有率也很高,大量传输数据时会因为占用过多的CPU资源而导致系统停顿,无法进行其它的操作。PIO数据传输模式又分为PIO mode 0、PIO mode 1、PIO mode 2、PIO mode 3、PIO mode 4几种模式,数据传输速率从3.3MB/s到16.6MB/s不等。受限于传输速率低下和极高的CPU占有率,这种数据传输模式很快就被淘汰。

BDL

BDL(buffer descriptor list)是一种常见的DMA(直接存储器访问)描述符结构。BDL的主要作用是描述一系列缓冲区信息,这些缓冲区会被DMA引擎用于读写数据。

典型的BDL包含三部分信息:

  1. 缓冲区起始地址
  2. 缓冲区长度
  3. 状态标志位(空闲、已填充等)

工作原理是:

  • CPU初始化BDL,提供一系列缓冲区描述信息。
  • DMA开始工作时,会依次读取BDL中的每一项。
  • 根据描述符获取缓冲区地址及长度,然后读/写数据。
  • DMA完成后会更新描述符的状态标志。
  • CPU可以根据状态标志判断DMA是否完成。

BDL的优点是可以很方便地定义多块不连续的缓冲区,并进行高效的数据传输。它常用于需要大批量数据传输的场合,如音视频处理、通信系统等。

DMA

原理

DMA(DirectMemoryAccess,直接内存存取),顾名思义DMA功能就是让设备可以绕过处理器,直接由内存来读取资料。

DMA的工作原理是:

  • DMA控制器连接在系统总线上,可以直接访问系统内存。
  • 当需要数据传输时,CPU会配置DMA控制器的源地址、目标地址、传输数量等参数。
  • CPU发出传输请求后,DMA控制器就可以自主对内存进行读写操作,不需要CPU参与。
  • 传输完成后,DMA控制器会发出中断通知CPU。

DMA的主要优势有:

  • 减轻CPU负担,CPU可以在DMA传输时做其他任务。
  • 提高数据传输效率,不受CPU影响。
  • 可以进行突发传输,利用总线带宽。
  • 适合流式数据的传输,如音视频等。
  • 支持多通道传输。

DMA广泛用于外设与内存之间大批量数据的传输,例如网卡、硬盘控制器等。正确配置和使用DMA可以大大提升系统的数据吞吐量。它是计算机体系结构一个非常重要的部分。

基本工作流程

  1. 从内存搬移数据到外设:当某个通道配置的是接收dma_tx_req信号,即需要dma从内存读取数据到本地,并写入外设
    1. 配置通道接收dma_tx_req模式,配置BDL列表首地址,配置BDL有效条目和所有循环buffer的长度,配置外设寄存器数据写入地址,使能通道,使能dma。首先将BDL的第一个条目信息读取到本地,解析内容获取数据在DDR中存放位置,开始从DDR中读取数据,若该条目对应buffer的数据小于64B,则一次性全部搬移到本地,若大于等于64B,则每次搬运64B,直至该buffer数据全部读取完成,则读取下一个条目的内容,继续上述流程。
    2. 配置下行通道每次传输的size和burst lenth,检测到有dma_tx_req的请求,且本地fifo中有数据,则开始发送一定数量的数据到外设,发送完成后,将dma_tx_ack信号拉高,随后等待dma_tx_req信号拉低之后,再次拉低dma_tx_ack信号,完成一次请求,并开始等待下一轮的传输
    3. 传输边界情况:当前若将此BDL对应的buffer数据都搬移完成之后,则返回到第一个BDL条目地址,开始循环操作。每一个BDL条目对应的数据读取完成后,会根据IOC标志来判断是否产生中断,这是软硬件交互的过程,每个BDL对应buffer的数据长度最小为4B,且数据量要求是4B的整数倍。
  2. 从外设搬移数据到内存:当某个通道配置的是接收dma_rd_req信号,即需要从外设读取数据到本地,DMA需要将本地数据发送到内存,则基本流程如下
    1. 配置下行通道每次传输的size和burst length,通道使能后,下行axi检测到dma_rx_req的请求,且检测到本地FIFO非满,则开始发送axi读请求,读取一定量的数据到本地,并完成DMA请求的握手操作,若FIFO满了,则暂时不处理这个请求。
    2. 上行axi检测到本地FIFO中可用的数据量,大于下一次传输length的时候,则准备发送上行的axi报文,若当前BDL对应的buffer空间小于64B,则按照实际剩余空间来存放数据,若大于64B,则写入64B。
  3. DMA请求信号的握手处理机制:对于外围设备的req&ack是一个4段握手的机制,每个通道有一个独有的状态机,实现握手机制。当通道使能后,即检测req是否有效,若有效,则状态跳转到wait ack,等待数据与外设交互完成后,使能ack信号,完成后续握手机制。

Flash

flash闪存是非易失存储器,可以对称为块和页的存储器单元块进行擦写和再编程,现在主要的非易失闪存技术有NOR和NAND两种。任何flash器件的写入操作只能在空或已擦除的单元内进行,因为编程写入只能将1写为0而不能将0写为1,所以大多数情况下,在进行写入操作之前必须先执行擦除。

早期的NOR flash的接口是并行口的形式,也就是把数据线、地址线并排设置在IC的管脚中。但由于不同容量的并行口NOR flash不能硬件上兼容(数据线和地址线的数量不一样),并且封装比较大,占用PCB板的位置较大,后来逐渐被SPI的NOR flash所取代。SPI NOR flash可以做到不同容量的flash管脚兼容,并且采用了更小的封装形式。很快就取代了并口的NOR flash成为市场主流,以至于现在很多人说起NOR flash直接都以SPI flash来代称。

概述

LSD模块用于拓展PIO访问通路,集成芯片的低速IO接口,支持的主要功能有以下:

I2C

I2C总线由一条数据线(SDA)和一条时钟线(SCL)组成。设备分主从,主设备提供时钟,并发起操作。

Untitled

当scl为高时,sda下拉表示start。当scl为高时,sda上拉表示stop。

Untitled

  • master控制sda、scl:start
  • master控制sda、scl:7位地址
  • master控制sda、scl:1位写
  • master控制scl,slave控制sda:slave ack
  • master控制sda、scl:1字节数据
  • master控制scl,slave控制sda:slave ack
  • master控制sda、scl:1字节数据
  • master控制scl,slave控制sda:slave ack
  • master控制sda、scl:stop

Untitled

Untitled

在第一个byte传输完之后的一段时间内,scl为低。为什么会出现这种情况那?其实不一定是在第一个字节之后,也可能是master要从slave那读取某个寄存器的值,第一个字节的slave address发过去了,然后第二个字节的寄存器地址又发过去了,后面就该slave来返回一个byte的数据了。但是可能这个数据并不是那么简单的得到的,slave可能会先进入中断,然后做一些计算才能得到要返回的值,而这个计算又比较耗时。那slave可以强制拉低scl来表示现在我在忙,要等我做完事情了才可以继续返回数据。

SMBUS/PMBUS

SMBUS是一种基于I2C而扩展出来的协议。有一些更为复杂的操作,但是原理都还是基于I2C的。

Untitled

Untitled

Untitled

SPI

SPI(Serial Peripheral Interface)是一种同步串行外设接口标准,主要用于主机与外设设备之间的短距离通信。

SPI有四根线,一根时钟,一根收数据,一根发数据,一根片选。当有多个设备时,他就需要多根片选,所以相比I2C而言,布线更为复杂。

Untitled

SPI只规定了如何收发数据,但是数据的具体格式含义并没有定义。譬如在I2C中跟在7位地址后面的1位表示读写,所有设备都需要遵循。但是SPI不是这样,每个slave都有自己定义的数据格式,各不相同。如下图所示。master发送的第一个字节里01表示写,而05表示读。根据第一个字节的不同,slave会做出不一样的响应。

Untitled

Untitled

SPI传输数据必须要根据slave设备的timing规则来。

I2S

I2S(Inter-IC Sound)总线,又称集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准。采用了独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分离,避免了因时差诱发的失真。

时差诱发失真(Time skew induced distortion)是一种信号失真,主要出现在采样过程中。

它的原因是:

  1. 信号的不同频率成分,在采样过程中会得到不同的时差(Time skew)。
  2. 这种时差会造成信号不同频率成分之间的相位偏移。
  3. 相位偏移会导致信号在重建过程中产生波形失真。

I2S总线一般由1根系统时钟线和3根信号线组成:

  • MCLK:称为主时钟,也叫系统时钟(Sys Clock),一般为了使系统间能够更好地同步时增加MCLK信号,MCLK的频率 = 128或者256或者512 * 采样频率;
  • SCLK(BCLK):串行时钟SCLK,也叫位时钟(BCLK),即对应数字音频的每一位数据,SCLK都有1个脉冲。SCK的频率 = 声道数 采样频率 采样位数;
  • LRCK:帧时钟LRCK,(也称WS),用于切换左右声道的数据。LRCK为“1”表示正在传输的是右声道的数据,为“0”则表示正在传输的是左声道的数据。LRCK的频率等于采样频率;
  • SDATA(SD):就是用二进制补码表示的音频数据。最高位拥有固定的位置,而最低位的位置则是依赖于数据的有效位数。

Untitled

随着技术的发展,在统一的I2S硬件接口下,出现了多种不同的I2S数据格式,可分为:I2S Philips标准、左对齐(MSB)标准和右对齐(LSB,也叫日本格式、普通格式)标准。
发送端和接收端必须使用相同的数据格式,确保发送和接收的数据一致。

I2S Philips标准

Untitled

使用LRCLK信号表示当前正在发送数据所属的声道,LRCLK为“1”表示正在传输的是右声道的数据,为“0”则表示正在传输的是左声道的数据。LRCLK信号从当前声道数据的第一个位(MSB)之前的一个时钟开始有效。
LRCLK信号在BCLK的下降沿变化,发送方在时钟信号BCLK的下降沿改变数据,接收方在时钟信号BCLK的上升沿读取数据。正如上文所说,LRCLK频率等于采样频率Fs,一个LRCLK周期(1/Fs)包括发送左声道和右声道数据。
对于这种标准I2S格式的信号,无论有多少位有效数据,数据的最高位总是出现在LRCLK变化(也就是一帧开始)后的第2个BCLK脉冲处。这就使得接收端与发送端的有效位数可以不同。如果接收端能处理的有效位数少于发送端,可以放弃数据帧中多余的低位数据;如果接收端能处理的有效位数多于发送端,可以自行补足剩余的位。
这种同步机制使得数字音频设备的互连更加方便,而且不会造成数据错位。

左对齐MSB标准

Untitled

该标准较少使用,在LRCLK发生翻转的同时开始传输数据,注意LRCLK与Philips标准相反。

右对齐LSB标准

Untitled

声音数据LSB传输完成的同时,LRCLK完成第二次翻转(刚好是LSB和LRCLK是右对齐的,所以称为右对齐标准)。注意LRCLK为1时,传输的是左声道数据,LRCLK为0时,传输的是右声道数据,这刚好与I2S Philips标准相反。

GPIO

GPIO是"General Purpose Input/Output"的缩写,意思是通用输入/输出接口。

它是一种可编程的接口,可以在软件控制下实现对各种外设的接入和控制。GPIO具有以下的一些主要特点:

  1. 可编程性:GPIO接口的每个引脚都可以通过软件进行编程,配置为输入或输出模式。
  2. 通用性:GPIO可以连接各种不同类型的外设,如LED灯、按键、传感器等。
  3. 简单性:GPIO控制相对简单,通过读写寄存器的方式就可以实现对GPIO的控制。
  4. 众多引脚资源:通常GPIO都具有大量的引脚资源,一款MCU芯片GPIO的数量可以到几十个甚至上百个。
  5. 输出驱动能力:GPIO的输出端口可以提供一定的源、汲电流来驱动外部装置。

GPIO的常见用途有:

  • 读取按键或传感器的输入信号
  • 控制LED、蜂鸣器、步进电机等的开关
  • 产生中断请求
  • 通讯接口(I2C、SPI等)
  • 模数转换或数模转换接口

通过编程控制GPIO,可以实现对外设的接入和控制,使得MCU可以通过简单的GPIO接口来与外界交互,Expand)了MCU的应用范围。GPIO是嵌入式系统和IoT中最基础和重要的接口之一。GPIO作为APB2总线的一个从设备。GPIO可以控制外部IOpad的输入输出方向,当IO pad为输出时,内部寄存器中的数据输出到片外;当IO pad为输入时,pad上的数据被锁存到内部寄存器。模块不支持硬件控制,数据源与方向通过软件配置。

初始化配置

  • 作为数据传输信号
    • 写数据
      • 配置方向寄存器gpio_swporta_ddr为输入(写0)
      • 数据写入寄存器gpio_swporta_dr
    • 读数据
      • 配置方向寄存器gpio_swporta_ddr为输出(写1)
      • 从寄存器gpio_swporta_dr中读出数据
  • 复用为中断信号
    • 配置方向寄存器gpio_swporta_ddr为输入(写0)
    • 写中断屏蔽寄存器gpio_intmask为0
    • 配置中断类型寄存器gpio_inttype_level
    • 配置中断极性寄存器gpio_int_polarity
    • 使能中断,寄存器写1

MMSCD

mmcsd在计算机系统中通常指的是MultiMediaCard存储设备接口(MultiMediaCard Storage Device)。

MultiMediaCard,即MMC,是一种小型的只读存储卡接口规范,主要用于移动设备和嵌入式设备。

mmcsd接口的主要特点包括:

  1. 小型化设计:MMC卡体积小,一般尺寸只有32毫米×24毫米×1.4毫米。
  2. 低功耗:工作电流最大只有10毫安,可以使用3.3伏工作电压。
  3. 高速传输:支持时钟频率在0-20MHz范围内,最大传输速率可达52Mbps。
  4. 支持热插拔:可以在设备运行时动态插拔,使用简单方便。
  5. 支持安全访问机制:设置密码识别来防止非法访问。
  6. 分区设计:可以对卡内存储进行区块管理,支持FAT32文件系统。

mmcsd接口在硬件上只需要几根信号线,包括时钟线、命令线、数据线等,可使用SPI或SD模式与MCU连接。

在Linux系统中,mmcsd存储设备可以作为块设备访问,通过文件系统支持对存储内容的访问。

mmcsd接口因其小巧、低功耗、高速度等优点,非常适合在嵌入式产品和移动设备中使用,是这些设备存储接口的首选方案之一。

MMCSD controller总体结构可以分解为一个总线接口单元BIU,一个卡接口单元CIU,及FIFO控制单元。可分解为五大模块组成:

  • mmcsd_biu:提供APB从机接口,用于数据存取控制和内部u寄存器状态读取,中断产生,DMA请求发送等。
  • mmcsd_dmac_axi:通过ADMA2接口提供FIFO缓存存取,用于系统存储器与控制器内部FIFO之间的数据交互。
  • mmcsd_dmac_if
  • mmcsd_2clk_fifoctl
  • mmcsd_ciu:负责设备端电源管理控制,时钟产生及变频,数据相位调整及SD/MMC总线协议解析、指令数据传输控制、卡状态信息上报等。

软件交互说明:

  • SD卡总线通信基于命令/数据的传输,有三种数据格式:命令包,响应包,数据包。
  • 寄存器操作——命令交互流程:CMD控制总线的基本事务是命令/响应事务。内核可将SD控制器内部寄存器映射到统一的地址空间,使内核可以通过地址访问,读写SD卡控制寄存器,直接在命令与响应结构中进行控制并随时获取外设状态传输信息
  • ADMA操作——数据交互流程:DATA数据总线交互传输支持burst传输模式的AXI4总线,支持ADMA模块读写模式,通过一个DMA接口提供独立的FIFO缓存存取,完成FIFO与DMA主端口之间的数据交互。DMA寄存器可被内核访问来控制DMA操作。控制器核自动处理所有的SD卡协议,包括数据移位和CRC生成,使数据可以自动的在外部存储器和SD卡之间传送而无需CPU干预。
  • 中断配置:当SD卡完成某项操作或工作异常,中断控制器会产生相应的中断,软件可对不同的中断做出相应的处理。中断包括读/写缓冲器已满/空、读/写缓冲器读写错误、命令发送完毕、数据传输完成、响应超时、读写数据CRC出错等。软件可通过配置中断控制器屏蔽或使能中断。

初始化配置:

  • UHS_REG_EXT配置CIU时钟及驱动相位以及EXT_CLK_ENABLE
  • CLKDIV配置CARD时钟分频系数,分频参数为(DIV-1)*2。注意:配置分频之前要先关断CLKENA[0],配置完成再开启使能。
  • CLKENA[0] clock- enable control for card
  • CMD[21][31],updata clk, start cmd。注意:USE_HOLD_REG必须为1,否则CMDOUT发出的命令会有问题。
  • 每个命令完成,需要检测对应的命令完成响应状态RINTSTS[2]是否收到,然后对应写1清0.开始后续的命令send

QSPI

QSPI(Queued Serial Peripheral Interface) 是一种快速串行外设接口标准,主要用于主机与外设之间的高速串行通信。其主要特点如下:

  1. 高速传输:QSPI支持全双工通信,时钟频率可以达到数十MHz,传输速率很快。
  2. 队列操作:支持多个传输指令排队,主机可以一次性传输多个数据。提高了传输效率。
  3. 多线控制:除数据线外,还有一至两条控制线,可以实现额外的控制功能。
  4. 支持双向传输:MOSI和MISO两条数据线可以实现同时发送和接收数据。
  5. 支持同步和微代码模式:同步模式类似SPI,微代码模式可以实现更复杂的传输控制。
  6. 支持多种外设:如串行Flash、AD转换器、数字信号处理器等。

QSPI的典型传输协议包含以下4种线:

  • SCLK: 串行时钟线
  • MOSI: 主设备输出,从设备输入数据线
  • MISO: 主设备输入,从设备输出数据线
  • SS: 从设备选择线

总体来说,QSPI具有传输速度快、支持全双工、编程控制性强等优点。它被广泛应用于主机和外设设备之间的高速串行通信中,尤其适合闪存、图像传感器等对带宽数量和速度有要求的场合。

QSPI相比SPI提供了更高速率、更丰富的传输控制能力、支持更多高性能外设等优势。但SPI更简单易用,成本更低。
对于不需要过高速率、控制相对简单的场合,SPI仍是一个不错的选择。但如果需要传输速度快、功能更丰富,那么QSPI会是更好的解决方案。

典型应用场景:

在嵌入式操作系统中,bootloader是在操作系统内核运行之前运行,可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。

以ARM为例,ARM加电后读取flash存储的boot loader并启动,然后加载Linux系统,启动完成。bootloader启动大多数都分为两个阶段。第一阶段主要包含依赖于处理器的体系结构硬件初始化的代码,包括基本的硬件设备初始化,为第二阶段准备RAM空间。第二阶段实现更复杂的功能,包括初始化本阶段要使用到的硬件设备,检测本阶段要使用到的硬件设备,检测系统内存映射,将内核映像和根文件系统映像从flash读到RAM,为内核设置启动参数,调用内核。PC的BIOS与上述嵌入式操作系统的bootloader类似。

QSPI flash相对于SPI flash来说通过复用SPI flash芯片的W#/ACC和HOLD#两个功能引脚作为数据传输,在同一时刻同方向上可以同时传输4比特数据,大幅提升了其数据交互能力。控制器连接APB总线和QSPI接口,完成两者之间的协议转换,使处理器能够通过APB总线访问QSPI接口的Flash存储器。

HDA

HDA是一种高清晰音频技术规范,由Intel在2004年提出,现已成为PC平台的标准高 fidelity音频解决方案。

CPU从内存中读取音频文件信息,并完成音频文件的解码工作,将解码后的音频数据和指令信息放入内存的指定位置。HDA控制器通过内部的DMA控制器将内存中的音频数据缓存到本地FIFO。HDA控制器内部的azalia link控制模块负责实现本地fifo与外部音频解码器codec之间的数据传输,包括按照格式发送数据以及接收数据。

codec,音频解码器。其内部包含数个转换器DAC,负责将数字信号转换成模拟信号。codec内部也包含ADC,负责将外部的模拟信号转换成内部数字信号,实现录音功能。

在azalia link总线上,最多可以连接15个codec,每个codec可以根据stream ID来提取自身所需要的数据流,从而实现多codec的工作。

HDA控制器主要有两种外部总线接口:对上通过axi总线实现与内存的数据交互(数据内容主要是音频文件以及控制信息),控制器本身的寄存器配置通过apb总线完成;对下通过azalia link协议完成与音频设备的数据交互。

对于HDA控制器,硬件工作流程如下:

  1. 首先硬件检测到CRST=0,整个控制器处于复位态,azalia总线也处于复位态,总线上时钟与同步等信号也无效,所有寄存器为默认值。
  2. 硬件检测到CRST=1后,控制器跳出复位态,controller进行初始化。azalia link control模块中inbound模块为每一个发出请求的codec分配地址信息,并记录发送请求的SDI线;outbound模块进入等待,DMAC模块也开始运转,只是尚未有RUN=0出现所以是空运行;FIFO组模块、RIRB/CORB控制模块也跳出复位态,等待工作,APB_REG模块内部只读寄存器被赋初值。
  3. 完成codec的地址分配后,将STATESTS[14:0]相关位置1,表示该SDIx线上有codec接入。软件等待521us后读取CRST位得到的结果是1,可以通过APB总线读取和配置内部寄存器的值。
  4. 此时所有模块都等待工作,除了APB_REG模块正在进行内部寄存器的配置,首先读取全局功能类的寄存器,随后根据读取的结果,确定了input和output的stream数量、版本号以及其他信息,随后配置controller内部中断类型的寄存器。
  5. 在这个过程中,DMAC模块一直在轮询RUN位的合集,检测是否有数据需要实现内存与FIFO之间的数据搬移;azalia link控制模块中的outbound部分在检测SSYNC寄存器,判断是否组织数据帧发送;inbound部分也在检测SSYNC寄存器,判断是否接收数据。
  6. 软件会向CORB中写入交互配置类的指令,并把CORB和RIRB相关的寄存器配置好。controller会开始向codec发送不携带数据的指令,并根据response获取codec具体能,并将特定的stream ID与codec之间进行绑定。上述操作都是在开机初始化阶段,尚未有音频文件的播放。
  7. contorller内部模块始终在轮询等待工作。当检测到stream相关的RUN=1后,开始DMAC操作。通过AXI总线实现内存与本地FIFO之间的数据交换;azalia link control模块是否组织帧数据发送还需要检测SSYNC寄存器。
  8. 当FIFO中缓存到足够多数据的时候,会将对应的FIFORDY信号置1,并等待SSYNC寄存器;对于outbound stream,一旦SSYNC寄存器对应位变为0后,开始组织帧数据发送;对于inbound stream,一旦FIFORDY=1后,软件会将RUN置1,这样DMAC会开始将这些FIFO中数据送到内存中。

corb和rorb是Intel高清音频(HDA)规范中的两个重要概念:

corb - Command Output Ring Buffer
命令输出环形缓冲区。

rorb - Response Input Ring Buffer
响应输入环形缓冲区。

它们是HDA控制器和编解码器之间的两种缓冲区,用于传输控制命令和响应。

  1. corb

corb由控制器维护,它存储了要发送给编解码器的控制命令。这些命令用于配置编解码器的音频流,设置混音器参数等。

控制器会不断将corb中的命令通过HDA串行接口传输给编解码器。

  1. rorb

rorb由编解码器维护,它存储了对控制器命令的响应。

当编解码器接收并处理完控制器发来的命令后,会将处理结果作为响应消息写入rorb。

控制器可以从rorb中读取这些响应,以确认命令已经被成功处理。

通过corb和rorb的配合,HDA实现了控制器和编解码器之间的可靠命令传输机制。这是HDA可以软件控制音频硬件的基础。

总结一下,corb负责传输控制命令,rorb负责返回响应结果,两者一起使HDA控制器可以可靠地管理编解码器的音频功能。