| # Copyright (c) 2019, Song Qiang <songqiang1304521@gmail.com> |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| description: | |
| STM32 DMA controller (V1) |
| |
| It is present on stm32 devices like stm32F4 or stm32F2. |
| This DMA controller includes FIFO control registers. |
| DMA clients connected to the STM32 DMA controller must use the format |
| described in the dma.txt file, using a four-cell specifier for each |
| channel: a phandle to the DMA controller plus the following four integer cells: |
| 1. channel: the dma stream from 0 to <dma-requests> |
| 2. slot: DMA periph request ID, which is written in the DMAREQ_ID of the DMAMUX_CxCR |
| this value is 0 for Memory-to-memory transfers |
| or a value between <1> .. <dma-generators> (not supported yet) |
| or a value between <dma-generators>+1 .. <dma-generators>+<dma-requests> |
| 3. channel-config: A 32bit mask specifying the DMA channel configuration |
| which is device dependent. See stm32_dma.h: |
| -bit 6-7 : Direction (see dma.h) |
| 0x0: STM32_DMA_MEMORY_TO_MEMORY: MEM to MEM |
| 0x1: STM32_DMA_MEMORY_TO_PERIPH: MEM to PERIPH |
| 0x2: STM32_DMA_PERIPH_TO_MEMORY: PERIPH to MEM |
| 0x3: reserved for PERIPH to PERIPH |
| -bit 9 : Peripheral Increment Address |
| 0x0: STM32_DMA_PERIPH_NO_INC: no address increment between transfers |
| 0x1: STM32_DMA_PERIPH_INC: increment address between transfers |
| -bit 10 : Memory Increment Address |
| 0x0: STM32_DMA_MEM_NO_INC: no address increment between transfers |
| 0x1: STM32_DMA_MEM_INC: increment address between transfers |
| -bit 11-12 : Peripheral data size |
| 0x0: STM32_DMA_PERIPH_8BITS: Byte (8 bits) |
| 0x1: STM32_DMA_PERIPH_16BITS: Half-word (16 bits) |
| 0x2: STM32_DMA_PERIPH_32BITS: Word (32 bits) |
| 0x3: reserved |
| -bit 13-14 : Memory data size |
| 0x0: STM32_DMA_MEM_8BITS: Byte (8 bits) |
| 0x1: STM32_DMA_MEM_16BITS: Half-word (16 bits) |
| 0x2: STM32_DMA_MEM_32BITS: Word (32 bits) |
| 0x3: reserved |
| -bit 15: Peripheral Increment Offset Size |
| 0x0: STM32_DMA_OFFSET_LINKED_BUS: offset size is linked to the peripheral bus width |
| 0x1: STM32_DMA_OFFSET_FIXED_4: offset size is fixed to 4 (32-bit alignment) |
| -bit 16-17 : Priority level |
| 0x0: STM32_DMA_PRIORITY_LOW: low |
| 0x1: STM32_DMA_PRIORITY_MEDIUM: medium |
| 0x2: hSTM32_DMA_PRIORITY_HIGH: high |
| 0x3: STM32_DMA_PRIORITY_VERY_HIGH: very high |
| 4. features: A 32bit bitfield value specifying DMA features |
| -bit 0-1: DMA FIFO threshold selection |
| 0x0: STM32_DMA_FIFO_1_4: 1/4 full FIFO |
| 0x1: STM32_DMA_FIFO_HALF: 1/2 full FIFO |
| 0x2: STM32_DMA_FIFO_3_4: 3/4 full FIFO |
| 0x3: STM32_DMA_FIFO_FULL: full FIFO |
| |
| Example of dma usual combination for peripheral transfer |
| #define STM32_DMA_PERIPH_TX (STM32_DMA_MEMORY_TO_PERIPH | STM32_DMA_MEM_INC) |
| #define STM32_DMA_PERIPH_RX (STM32_DMA_PERIPH_TO_MEMORY | STM32_DMA_MEM_INC) |
| |
| examples for stm32f411 |
| dma2: dma-controller@40020400 { |
| compatible = "st,stm32-dma-v1"; |
| ... |
| st,mem2mem; |
| dma-requests = <7>; |
| status = "disabled"; |
| }; |
| |
| For the client part, example for stm32f411 on DMA2 instance |
| Tx using stream 5 on channel 3 (stream 2 on channel 2 is also possible) |
| Rx using stream 2 on channel 3 (stream 0 on channel 3 is also possible) |
| spi1 { |
| dmas = <&dma2 5 3 STM32_DMA_PERIPH_TX STM32_DMA_FIFO_FULL>, |
| <&dma2 2 3 STM32_DMA_PERIPH_RX STM32_DMA_FIFO_FULL>; |
| dma-names = "tx", "rx"; |
| }; |
| |
| compatible: "st,stm32-dma-v1" |
| |
| include: st,stm32-dma.yaml |
| |
| properties: |
| "#dma-cells": |
| const: 4 |
| |
| # Parameter syntax of stm32 follows the dma client dts syntax |
| # in the Linux kernel declared in |
| # https://git.kernel.org/pub/scm/linux/kernel/git/devicetree/devicetree-rebasing.git/plain/Bindings/dma/st,stm32-dma.yaml |
| |
| dma-cells: |
| - channel |
| - slot |
| - channel-config |
| - features |