PL330 DMAC笔记(2) - DMAC接口,状态机,初始化,APB slave接口

DMAC接口

APB slave interfaces

non-secure APB slave interfac

secure APB slave interface.

每个APB接口分配了4KB内存,memory map参考“编程模型”

AXI master interface

一个AXI master接口用于传输数据,从源AXI slave到目的AXI slave

当一个DMA channel线程访问AXI接口时,DMAC发起的AXI ID TAG和DMAC channel号一样。例如,当DMA channel 5的线程执行一个DMA store操作时,DMAC会设置AWID[2:0]和WID[2:0] 为b101(5)

当DMA管理线程访问AXI接口时,DMAC发起的AXI ID TAG和DMAC所提供的DMA channel号一样。例如,如果DMAC被配置为提供8个DMA channel,那么当DMA管理线程执行读操作时,DMAC设置ARID[3:0]为b1000(8)。

Peripheral request interfaces

外设请求接口支持连接DMA-capable外设。

Interrupt interface

Reset initialization interface

 工作状态机

DMAC从reset状态退出后,所有DMA channel线程都在Stopped状态。DMA管理线程状态根据boot_from_pc的状态控制:

boot_from_pc为LOW: DMA管理线程进入Stopped状态

boot_from_pc为HIGH:DMA管理线程进入Executing状态

Stopped

线程有非法PC值,没有取指令。根据线程类型不同,转换到Executing状态的方法不同:

DMA管理线程 - 写Debug Command Register

DMA channel线程 - 编程DMA管理线程去执行某个处于Stopped状态的DMAchannel线程的DMAG0命令

Executing

线程有合法PC值,DMAC在仲裁时会包含这个线程

Executing -> other states

Stopped: DMA管理线程执行DMAEND命令

Cache miss:任意线程在指令cache不包含下一条该线程使用的指令的时候

Updating PC: 当DMAC计算cache中下一次访存的地址的时候

Waiting for event:任意线程执行DMAWFE

At barrier:

DMA channel线程执行DMARMB,DMAWMB或DMAFLUSHP

DMAC更新MFIFO数据buffer或类似的内部控制功能

Waiting for peripheral: DMA channel线程执行DMAWFP

Killing:DMA channel线程执行DMAKILL

Faulting completing:当DMAC在执行一个DMA传输时如果发生了一个AXI bus error。这个状态只对DMA channel线程有用。

Faulting:

当DMAC在取一条指令时发生了AXI bus error

DMAC执行了一条未定义指令

Completing: DMA channel线程执行DMAEND

Cache miss

DMAC正在做cache line fill,线程被停住。当cache line fill完成后线程返回Executing状态

Updating PC

DMAC正在计算cache里下一次访存的地址。计算完PC后线程返回Executing状态

Waiting for event

线程被停住,等待DMAC执行DMASEV(使用对应的事件编号)。对应事件发生后线程返回Executing状态

At barrier

DMA channel线程被停住,DMAC正在等待AXI bus上的事务结束。当AXI事务结束后,线程返回Executing状态

Waiting for peripheral

DMA channel线程被停住,DMAC正在等待外设提供请求的数据。当外设提供数据后线程返回Executing状态

Faulting completing

DMA channel线程正在等待AXI 接口发出信号表明outstanding的load或store事务结束。当事务结束后线程进入Faulting状态。

关于AXI outstanding理解

https://zhuanlan.zhihu.com/p/376525373

Faulting

线程被不确定地停住了。当使用Debug Command寄存器来让DMAC对这个线程执行DMAEND或DMAKILL的时候,线程进入Stopped状态

Completing

DMA channel线程正在等待AXI接口发信号表明outstanding的load或store事务结束。

初始化DMAC

设置DMA管理器的安全状态

boot_manager_ns信号是唯一的设置DMA管理器安全状态的方法。当DMAC退出复位状态时,它会读取boot_manager_ns状态并且设置DMA管理器的安全性。

安全状态一旦被设置,会保持到DMAC被复位。

设置DMAC执行的第一条指令地址

当DMAC退出复位状态时,boot_from_pc信号会控制DMAC:

  1. 进入Executing状态:

更新DMA PC寄存器,地址值由boot_addr[31:0]提供

根据DMA PC寄存器里的地址取出指令执行

(必须确保boot_addr[31:0]信号所对应的地址指向包含了DMAC启动程序的系统内存地址;如果boot_manager_ns也设置了,DMA管理器会工作在非安全态,启动程序必须处于非安全内存区域)

  1. 进入Stopped状态:

必须通过使用slave APB接口中的一个来提供第一条指令给DMAC

设置中断输出的安全状态

DMAC提供了boot_irq_ns[x:0]信号,来对每个irq[x]的安全状态来进行启用或禁用。

一旦irq[x]的安全状态被设置,状态会保持到DMAC复位

设置外设请求接口的安全状态

DMAC提供了boot_periph_ns[x:0]信号,来对每个外设请求接口的安全状态进行启用或禁用。

同理,安全状态会保持到DMAC复位

使用APB slave接口

APB slave接口链接了DMAC和APB,能够让微处理器访问“编程模型”里描述的寄存器。利用这些寄存器,微处理器能够:

访问DMA管理线程的状态

访问DMA channel线程的装填

启用或清除中断

启用事件

通过编程下列debug寄存器让DMAC执行一条指令:

Debug Command寄存器

Debug Instruction-0寄存器

Debug Instruction-1寄存器

使用APB接口发起指令到DMAC

当DMAC正在实时工作中时,只能发起有限的指令:

DMAG0 使用指定的DMA channel启动一个DMAC事务

DMASEV 使用指定的事件号发起信号通知事件或中断的发生

DMAKILL 终止一个线程

必须确保使用的APB接口是合适的,这里主要是指安全状态(boot_manager_ns)。对于安全状态,必须使用安全APB接口,否则DMAC会忽略指令。对于非安全状态,可以使用安全APB接口或非安全APB接口。

在使用debug instruction寄存器或debug command寄存器前,必须读取Debug Status寄存器来确保debug处于idle状态

当DMAC从APB slave接口接收到一条指令时,在处理指令前它可能会延迟几个时钟周期,比如在流水线正在忙于处理其它指令的时候。

在发起DMAG0前,必须确保系统内存包含一个DMAC用于执行的适合的程序,起始地址由DMAG0所指定。

例子,使用debug instruction寄存器启动一个DMA channel

  1. 创建这个DMA channel要用的程序

  2. 将程序放到系统内存的一块区域中

使用DMAC的一个APB接口,编程一条DMAG0指令:

  1. 轮询Debug Status寄存器确保debug处于idle状态(dbgstatus = 0)

  2. 写入Debug Instruction-0寄存器:

DMAG0的指令byte 0

DMAG0的指令byte 1

debug线程bit设置为0,选择DMA管理线程

  1. 写入Debug Instruction-1寄存器:

DMAG0指令byte[5:2]的数据。这四个byte是第2步程序的第一条指令的地址。

让DMAC执行debug instruction寄存器里的指令

  1. 写0到Debug Command寄存器。DMAC会启动DMA channel并设置dbgstatus为1

当DMAC完成指令执行后它会清除dbgstatus到0

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦枫Leonlew

希望这篇文章能帮到你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值