DMA裸板驱动使用说明
1 DMA简要说明1.1 GDP812的dmac812 dmac在4个subsys中集成分别是sysctrl、safety、mem、audiodmac的apb slv memmap要根据各subsys 在SOC分配的地址空间决定dmac的axi master能访问到的memmap 同样的需要去根据各subsys访问能力子系统内L2 noc matrix和mainnoc matrix决定dmac 本身是支持44bit地址全SOC访问1.2 DMA-330的使用DMA-330采用MicroCode的方式实现DMA的独立控制可以理解为该DMA Controller为ARM的一个Coprocessor。按照MicroCode的指令集规则编写指令存放到指定地址的内存中ARM处理器只需要告诉DMA Controller汇编指令的起始地址DMA Controller就可以执行内存中存放的汇编指令实现独立于处理器的数据搬运工作。2 裸驱代码使用介绍目前是第一版裸驱代码在rk-3588开发板平台验证过Mem2MemMem2Uart_Tx和Uart_Rx2Mem三种情况在GDP812平台仅验证过Mem2Mem的情形。若实际调试过程中遇到DMA相关问题请及时沟通。该裸驱代码共有3个文件dma-hw.h 用于存放和硬件相关的配置信息dma-330.h 与硬件无关的驱动代码头文件dma-330.c 与硬件无关的驱动代码文件从裸驱代码的使用角度有如下需要修改的几个地方2.1 硬件相关的配置信息/** * dma-hw.h */ /* DMAC寄存器的Base Address对于不同的Subsystem这个值是不同的 */ #define PL330_BASE_ADDR DMA0_NS_BASE_ADDR /* MicroCode指令放置的内存地址 */ #define MCODE_CPU_ADDR 0x08001000 /* cpu access desc addr */ #define MCODE_BUS_ADDR 0x08001000 /* bus access desc addr */ /* 数据搬运的源地址和目的地址 */ #define MEM_SRC_ADDR 0x80000000 #define MEM_DST_ADDR 0x800100002.2 SoftReset和Clock配置需要在测试代码中自行实现软复位和时钟的配置如下示例给出了sysctrl DMA的软复位和时钟配置static void sys_init(void) { /* sysctrl dma */ writel(0x1, (void*)0x49800104); writel(0x1, (void*)0x49800100); }2.3 配置结构体的填充需要在测试代码中自行实现配置结构体的填充2.3.1 配置结构体的成员说明/* 传输配置结构体 */ struct pl330_trans_cfg { unsigned int src_phy_addr; unsigned int dst_phy_addr; enum __tfr_type tfr_type; int trans_len; unsigned char privileged; unsigned char nonsecure; enum burst_cfg user_cfg_bst; unsigned int tfr_data_width; unsigned int tfr_data_len; unsigned int peri_num; };src_phy_addr 数据传输的源地址dst_phy_addr 数据传输的目的地址tfr_type 数据传输的类型有以下三种可选类型DMAC_TFR_TYPE_M2M适用于Mem to Mem的数据传输Src和Dst地址都递增的情形DMAC_TFR_TYPE_M2P 适用于Mem to Peri的数据传输Src地址递增Dst地址固定的情形DMAC_TFR_TYPE_P2M 适用于Peri to Mem的数据传输Src地址固定Dst地址递增的情形trans_len 数据传输的总长度privileged AXI总线特权访问配置位0非特权访问AXI总线1特权访问用于高权限操作nonsecure AXI总线安全访问配置位0安全访问用于安全模式下的数据访问1非安全访问user_cfg_bst 目前只支持两种配置选择USE_AXI_MAX_CAP 以硬件配置的AXI总线位宽进行数据传输Mem to Mem的数据传输时使用USE_DEFINED 以用户自定义的burst_size和burst_len进行数据传输M2P和P2M时使用tfr_data_width用户自定义的burst_sizetfr_data_len 用户自定义的burst_lenperi_num Mem2Mem时无效用于配置DMAC与硬件握手时的握手编号2.3.2 配置结构体的配置示例针对配置结构体的成员说明以Mem2PeriUART_TX为例提供如下示例static void transfer_cfg(struct pl330_trans_cfg *cfg) { cfg-dst_phy_addr MEM_SRC_ADDR; cfg-src_phy_addr MEM_DST_ADDR; cfg-tfr_type DMAC_TFR_TYPE_M2P; cfg-trans_len 8; /* 数据传输的总长度 8-byte */ cfg-privileged 0; /* 非特权访问 */ cfg-nonsecure 1; /* 非安全访问 */ /** * 以Mem2Uart_Tx为例 * 一个burst内Memory向UartTx buffer发送1-Byte数据并等待Uart做出回应后再进行下一次数据发送。 * * 1 burst的数据量大小 burst_size * burst_len因此tfr_data_width和tfr_data_len都为1。 */ cfg-user_cfg_bst USE_DEFINED; cfg-tfr_data_width 1; /* 用户自定义的burst_size */ cfg-tfr_data_len 1; /* 用户自定义的burst_len */ cfg-peri_num UART_TX; /* UART2_TX的设备编号 */ }3 GDP-812与DMA相关的配置3.1 DMAC Base Address如下图所示有些Subsystem中用于DMA IP配置的基地址相对于Memory Map提供的Base Address存在4K的偏移。3.1.1 SysCtrlMemory Map中的地址dmac apb_slv_NS0x4a002000dmac apb_slv_S 0x4a005000实际使用的地址DAMC_BASE_ADDR(ns) 0x4a003000即dmac apb_slv_NS(0x4a002000) 0x1000DMAC_BASE_ADDR(s) 0x4a006000即dmac apb_slv_S(0x4a005000) 0x10003.1.2 safetyMemory Map中的地址Safety DMA sec apb0x4a800000Safety DMA apb 0x4ac00000实际使用的地址是否偏移0x1000需要IP Owner确认DMAC_BASE_ADDR(sec apb) : 0x4a801000DMAC_BASE_ADDR(non-sec) : 0x4ac010003.1.3 MemoryMemory Map中的地址noc2damc_apb_slv(ns) 0x52628000noc2dmac_sec_apb_slv0x52638000实际使用的地址是否偏移0x1000需要IP Owner确认DMAC_BASE_ADDR(non-sec) : 0x52629000DMAC_BASE_ADDR(sec) : 0x526390003.1.4 AudioMemory Map中的地址DMAC_0audio_noc2dmac0_s_apb_slv 0x5cc50000audio_noc2dmac0_ns_apb_slv0x5cc60000DMAC_1audio_noc2dmac1_ns_apb_slv0x5cd10000audio_noc2dmac0_s_apb_slv 0x5cd20000实际使用的地址是否偏移0x1000需要IP Owner确认DMAC_0DMAC_BASE_ADDR(sec) 0x5cc51000DMAC_BASE_ADDR(ns) 0x5cc61000DMAC_1DMAC_BASE_ADDR(ns) 0x5cd11000DMAC_BASE_ADDR(sec) 0x5cd210003.2 Periphal Num根据各Subsystem的Design Spec的描述在dma-hw.h中列出各Subsystem的DMAC握手信号的Peripheral Number不保证正确请各IP Owner自行确认如下3.2.1 SysCtrl/** * Sysctrl Subsystem DMA-Peripheral Handshake */ enum { SYSCTRL_QSPI_FLASH_TX, SYSCTRL_QSPI_FLASH_RX, SYSCTRL_USI0_TX, SYSCTRL_USI1_TX, SYSCTRL_USI2_TX, SYSCTRL_USI3_TX, SYSCTRL_USI4_TX, SYSCTRL_USI5_TX, SYSCTRL_USI6_TX, SYSCTRL_USI7_TX, SYSCTRL_USI0_RX, SYSCTRL_USI1_RX, SYSCTRL_USI2_RX, SYSCTRL_USI3_RX, SYSCTRL_USI4_RX, SYSCTRL_USI5_RX, SYSCTRL_USI6_RX, SYSCTRL_USI7_RX, };3.2.2 safety3.2.3 Memory3.2.4 Audio3.3 软复位和Clock配置3.3.1 SysCtrl0x49800100 0x10x49800104 0x13.3.2 safety软复位和时钟配置需要IP Owner确认3.3.3 Memory软复位和时钟配置需要IP Owner确认3.3.4 Audio软复位和时钟配置需要IP Owner确认DMAC_0DMAC_1