You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/09/20 16:14:48 UTC

[incubator-nuttx] branch master updated: add SAMA5D2 support for sam_xdma driver

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 711681a90d add SAMA5D2 support for sam_xdma driver
711681a90d is described below

commit 711681a90d97b8e2d74ed1778e91857d21c2d1d1
Author: klmchp <ke...@gmail.com>
AuthorDate: Tue Sep 20 21:06:58 2022 +0800

    add SAMA5D2 support for sam_xdma driver
---
 arch/arm/src/sama5/hardware/sam_xdmac.h | 108 +++++++++++
 arch/arm/src/sama5/sam_xdmac.c          | 310 ++++++++++++++++++++++----------
 2 files changed, 327 insertions(+), 91 deletions(-)

diff --git a/arch/arm/src/sama5/hardware/sam_xdmac.h b/arch/arm/src/sama5/hardware/sam_xdmac.h
index b882d422d5..f4d1bfe625 100644
--- a/arch/arm/src/sama5/hardware/sam_xdmac.h
+++ b/arch/arm/src/sama5/hardware/sam_xdmac.h
@@ -385,6 +385,59 @@
 
 /* XDMA Controller 0 Channel Definitions (always secure) */
 
+#if defined(ATSAMA5D2)
+#define XDMAC0_CH_TWI0_TX           0  /* TWI0 Transmit */
+#define XDMAC0_CH_TWI0_RX           1  /* TWI0 Receive */
+#define XDMAC0_CH_TWI1_TX           2  /* TWI1 Transmit */
+#define XDMAC0_CH_TWI1_RX           3  /* TWI1 Receive */
+#define XDMAC0_CH_QSPI0_TX          4  /* QSPI0 Transmit */
+#define XDMAC0_CH_QSPI0_RX          5  /* QSPI0 Receive */
+#define XDMAC0_CH_SPI0_TX           6  /* SPI0 Transmit */
+#define XDMAC0_CH_SPI0_RX           7  /* SPI0 Receive */
+#define XDMAC0_CH_SPI1_TX           8  /* SPI1 Transmit */
+#define XDMAC0_CH_SPI1_RX           9  /* SPI1 Receive */
+#define XDMAC0_CH_PWM_TX            10 /* PWM Transmit */
+#define XDMAC0_CH_FLEXCOM0_TX       11 /* FLEXCOM0 Transmit */
+#define XDMAC0_CH_FLEXCOM0_RX       12 /* FLEXCOM0 Receive */
+#define XDMAC0_CH_FLEXCOM1_TX       13 /* FLEXCOM1 Transmit */
+#define XDMAC0_CH_FLEXCOM1_RX       14 /* FLEXCOM1 Receive */
+#define XDMAC0_CH_FLEXCOM2_TX       15 /* FLEXCOM2 Transmit */
+#define XDMAC0_CH_FLEXCOM2_RX       16 /* FLEXCOM2 Receive */
+#define XDMAC0_CH_FLEXCOM3_TX       17 /* FLEXCOM3 Transmit */
+#define XDMAC0_CH_FLEXCOM3_RX       18 /* FLEXCOM3 Receive */
+#define XDMAC0_CH_FLEXCOM4_TX       19 /* FLEXCOM4 Transmit */
+#define XDMAC0_CH_FLEXCOM4_RX       20 /* FLEXCOM4 Receive */
+#define XDMAC0_CH_SSC0_TX           21 /* SSC0 Transmit */
+#define XDMAC0_CH_SSC0_RX           22 /* SSC0 Receive */
+#define XDMAC0_CH_SSC1_TX           23 /* SSC1 Transmit */
+#define XDMAC0_CH_SSC1_RX           24 /* SSC1 Receive */
+#define XDMAC0_CH_ADC_RX            25 /* ADC Receive */
+#define XDMAC0_CH_AES_TX            26 /* AES Receive */
+#define XDMAC0_CH_AES_RX            27 /* AES Transmit */
+#define XDMAC0_CH_TDES_TX           28 /* TDES Transmit */
+#define XDMAC0_CH_TDES_RX           29 /* TDES Receive */
+#define XDMAC0_CH_SHA_TX            30 /* SHA Transmit */
+#define XDMAC0_CH_I2SC0_TX          31 /* I2SC0 Transmit */
+#define XDMAC0_CH_I2SC0_RX          32 /* I2SC0 Receive */
+#define XDMAC0_CH_I2SC1_TX          33 /* I2SC1 Transmit */
+#define XDMAC0_CH_I2SC1_RX          34 /* I2SC1 Receive */
+#define XDMAC0_CH_UART0_TX          35 /* UART0 Transmit */
+#define XDMAC0_CH_UART0_RX          36 /* UART0 Receive */
+#define XDMAC0_CH_UART1_TX          37 /* UART1 Transmit */
+#define XDMAC0_CH_UART1_RX          38 /* UART1 Receive */
+#define XDMAC0_CH_UART2_TX          39 /* UART2 Transmit */
+#define XDMAC0_CH_UART2_RX          40 /* UART2 Receive */
+#define XDMAC0_CH_UART3_TX          41 /* UART3 Transmit */
+#define XDMAC0_CH_UART3_RX          42 /* UART3 Receive */
+#define XDMAC0_CH_UART4_TX          43 /* UART4 Transmit */
+#define XDMAC0_CH_UART4_RX          44 /* UART4 Receive */
+#define XDMAC0_CH_TC0_RX            45 /* TC0 Receive */
+#define XDMAC0_CH_TC1_RX            46 /* TC1 Receive */
+#define XDMAC0_CH_CLASSD_TX         47 /* CLASSD Transmit */
+#define XDMAC0_CH_QSPI1_TX          48 /* QSPI1 Transmit */
+#define XDMAC0_CH_QSPI1_RX          49 /* QSPI1 Receive */
+#define XDMAC0_CH_PDMIC_RX          50 /* PDMIC Receive */
+#elif defined(ATSAMA5D4)
 #define XDMAC0_CH_HSMCI0            0  /* HSMCI0 Receive/Transmit */
 #define XDMAC0_CH_HSMCI1            1  /* HSMCI1 Receive/Transmit */
 #define XDMAC0_CH_TWI0_TX           2  /* TWI0 Transmit */
@@ -431,9 +484,63 @@
 #define XDMAC0_CH_SHA_TX            44 /* SHA Transmit */
 #define XDMAC0_CH_CATB_TX           46 /* CATB Transmit */
 #define XDMAC0_CH_CATB_RX           47 /* CATB Receive */
+#endif
 
 /* XDMA Controller 1 Channel Definitions (never secure) */
 
+#if defined(ATSAMA5D2)
+#define XDMAC1_CH_TWI0_TX           0  /* TWI0 Transmit */
+#define XDMAC1_CH_TWI0_RX           1  /* TWI0 Receive */
+#define XDMAC1_CH_TWI1_TX           2  /* TWI1 Transmit */
+#define XDMAC1_CH_TWI1_RX           3  /* TWI1 Receive */
+#define XDMAC1_CH_QSPI0_TX          4  /* QSPI0 Transmit */
+#define XDMAC1_CH_QSPI0_RX          5  /* QSPI0 Receive */
+#define XDMAC1_CH_SPI0_TX           6  /* SPI0 Transmit */
+#define XDMAC1_CH_SPI0_RX           7  /* SPI0 Receive */
+#define XDMAC1_CH_SPI1_TX           8  /* SPI1 Transmit */
+#define XDMAC1_CH_SPI1_RX           9  /* SPI1 Receive */
+#define XDMAC1_CH_PWM_TX            10 /* PWM Transmit */
+#define XDMAC1_CH_FLEXCOM0_TX       11 /* FLEXCOM0 Transmit */
+#define XDMAC1_CH_FLEXCOM0_RX       12 /* FLEXCOM0 Receive */
+#define XDMAC1_CH_FLEXCOM1_TX       13 /* FLEXCOM1 Transmit */
+#define XDMAC1_CH_FLEXCOM1_RX       14 /* FLEXCOM1 Receive */
+#define XDMAC1_CH_FLEXCOM2_TX       15 /* FLEXCOM2 Transmit */
+#define XDMAC1_CH_FLEXCOM2_RX       16 /* FLEXCOM2 Receive */
+#define XDMAC1_CH_FLEXCOM3_TX       17 /* FLEXCOM3 Transmit */
+#define XDMAC1_CH_FLEXCOM3_RX       18 /* FLEXCOM3 Receive */
+#define XDMAC1_CH_FLEXCOM4_TX       19 /* FLEXCOM4 Transmit */
+#define XDMAC1_CH_FLEXCOM4_RX       20 /* FLEXCOM4 Receive */
+#define XDMAC1_CH_SSC0_TX           21 /* SSC0 Transmit */
+#define XDMAC1_CH_SSC0_RX           22 /* SSC0 Receive */
+#define XDMAC1_CH_SSC1_TX           23 /* SSC1 Transmit */
+#define XDMAC1_CH_SSC1_RX           24 /* SSC1 Receive */
+#define XDMAC1_CH_ADC_RX            25 /* ADC Receive */
+#define XDMAC1_CH_AES_TX            26 /* AES Receive */
+#define XDMAC1_CH_AES_RX            27 /* AES Transmit */
+#define XDMAC1_CH_TDES_TX           28 /* TDES Transmit */
+#define XDMAC1_CH_TDES_RX           29 /* TDES Receive */
+#define XDMAC1_CH_SHA_TX            30 /* SHA Transmit */
+#define XDMAC1_CH_I2SC0_TX          31 /* I2SC0 Transmit */
+#define XDMAC1_CH_I2SC0_RX          32 /* I2SC0 Receive */
+#define XDMAC1_CH_I2SC1_TX          33 /* I2SC1 Transmit */
+#define XDMAC1_CH_I2SC1_RX          34 /* I2SC1 Receive */
+#define XDMAC1_CH_UART0_TX          35 /* UART0 Transmit */
+#define XDMAC1_CH_UART0_RX          36 /* UART0 Receive */
+#define XDMAC1_CH_UART1_TX          37 /* UART1 Transmit */
+#define XDMAC1_CH_UART1_RX          38 /* UART1 Receive */
+#define XDMAC1_CH_UART2_TX          39 /* UART2 Transmit */
+#define XDMAC1_CH_UART2_RX          40 /* UART2 Receive */
+#define XDMAC1_CH_UART3_TX          41 /* UART3 Transmit */
+#define XDMAC1_CH_UART3_RX          42 /* UART3 Receive */
+#define XDMAC1_CH_UART4_TX          43 /* UART4 Transmit */
+#define XDMAC1_CH_UART4_RX          44 /* UART4 Receive */
+#define XDMAC1_CH_TC0_RX            45 /* TC0 Receive */
+#define XDMAC1_CH_TC1_RX            46 /* TC1 Receive */
+#define XDMAC1_CH_CLASSD_TX         47 /* CLASSD Transmit */
+#define XDMAC1_CH_QSPI1_TX          48 /* QSPI1 Transmit */
+#define XDMAC1_CH_QSPI1_RX          49 /* QSPI1 Receive */
+#define XDMAC1_CH_PDMIC_RX          50 /* PDMIC Receive */
+#elif defined(ATSAMA5D4)
 #define XDMAC1_CH_HSMCI0            0  /* HSMCI0 Receive/Transmit */
 #define XDMAC1_CH_HSMCI1            1  /* HSMCI1 Receive/Transmit */
 #define XDMAC1_CH_TWI0_TX           2  /* TWI0 Transmit */
@@ -469,6 +576,7 @@
 #define XDMAC1_CH_ADC_RX            32 /* ADC Receive */
 #define XDMAC1_CH_SMD_TX            33 /* SMD Transmit */
 #define XDMAC1_CH_SMD_RX            34 /* SMD Receive */
+#endif
 
 /* Descriptor structure member definitions **********************************/
 
diff --git a/arch/arm/src/sama5/sam_xdmac.c b/arch/arm/src/sama5/sam_xdmac.c
index c40bfff8c9..acb4a66f8e 100644
--- a/arch/arm/src/sama5/sam_xdmac.c
+++ b/arch/arm/src/sama5/sam_xdmac.c
@@ -155,30 +155,58 @@ struct sam_xdmac_s
 
 static const struct sam_pidmap_s g_xdmac0_rxchan[] =
 {
-  { SAM_PID_HSMCI0, XDMAC0_CH_HSMCI0    }, /* HSMCI0 Receive/Transmit */
-  { SAM_PID_HSMCI1, XDMAC0_CH_HSMCI1    }, /* HSMCI1 Receive/Transmit */
-  { SAM_PID_TWI0,   XDMAC0_CH_TWI0_RX   }, /* TWI0 Receive */
-  { SAM_PID_TWI1,   XDMAC0_CH_TWI1_RX   }, /* TWI1 Receive */
-  { SAM_PID_TWI2,   XDMAC0_CH_TWI2_RX   }, /* TWI2 Receive */
-  { SAM_PID_TWI3,   XDMAC0_CH_TWI3_RX   }, /* TWI3 Receive */
-  { SAM_PID_SPI0,   XDMAC0_CH_SPI0_RX   }, /* SPI0 Receive */
-  { SAM_PID_SPI1,   XDMAC0_CH_SPI1_RX   }, /* SPI1 Receive */
-  { SAM_PID_SPI2,   XDMAC0_CH_SPI2_RX   }, /* SPI2 Receive */
-  { SAM_PID_USART2, XDMAC0_CH_USART2_RX }, /* USART2 Receive */
-  { SAM_PID_USART3, XDMAC0_CH_USART3_RX }, /* USART3 Receive */
-  { SAM_PID_USART4, XDMAC0_CH_USART4_RX }, /* USART4 Receive */
-  { SAM_PID_UART0,  XDMAC0_CH_UART0_RX  }, /* UART0 Receive */
-  { SAM_PID_UART1,  XDMAC0_CH_UART1_RX  }, /* UART1 Receive */
-  { SAM_PID_SSC0,   XDMAC0_CH_SSC0_RX   }, /* SSC0 Receive */
-  { SAM_PID_SSC1,   XDMAC0_CH_SSC1_RX   }, /* SSC1 Receive */
-  { SAM_PID_DBGU,   XDMAC0_CH_DBGU_RX   }, /* DBGU Receive */
-  { SAM_PID_ADC,    XDMAC0_CH_ADC_RX    }, /* ADC Receive */
-  { SAM_PID_SMD,    XDMAC0_CH_SMD_RX    }, /* SMD Receive */
-  { SAM_PID_USART0, XDMAC0_CH_USART0_RX }, /* USART0 Receive */
-  { SAM_PID_USART1, XDMAC0_CH_USART1_RX }, /* USART1 Receive */
-  { SAM_PID_AES,    XDMAC0_CH_AES_RX    }, /* AES Receive */
-  { SAM_PID_TDES,   XDMAC0_CH_TDES_RX   }, /* TDES Receive */
-  { SAM_PID_CATB,   XDMAC0_CH_CATB_RX   }, /* CATB Receive */
+#if defined(ATSAMA5D2)
+  { SAM_PID_TWI0,     XDMAC0_CH_TWI0_RX     }, /* TWI0  Receive */
+  { SAM_PID_TWI1,     XDMAC0_CH_TWI1_RX     }, /* TWI1  Receive */
+  { SAM_PID_QSPI0,    XDMAC0_CH_QSPI0_RX    }, /* QSPI0 Receive */
+  { SAM_PID_SPI0,     XDMAC0_CH_SPI0_RX     }, /* SPI0  Receive */
+  { SAM_PID_SPI1,     XDMAC0_CH_SPI1_RX     }, /* SPI1  Receive */
+  { SAM_PID_FLEXCOM0, XDMAC0_CH_FLEXCOM0_RX }, /* FLEXCOM0 Receive */
+  { SAM_PID_FLEXCOM1, XDMAC0_CH_FLEXCOM1_RX }, /* FLEXCOM1 Receive */
+  { SAM_PID_FLEXCOM2, XDMAC0_CH_FLEXCOM2_RX }, /* FLEXCOM2 Receive */
+  { SAM_PID_FLEXCOM3, XDMAC0_CH_FLEXCOM3_RX }, /* FLEXCOM3 Receive */
+  { SAM_PID_FLEXCOM4, XDMAC0_CH_FLEXCOM4_RX }, /* FLEXCOM4 Receive */
+  { SAM_PID_SSC0,     XDMAC0_CH_SSC0_RX     }, /* SSC0  Receive */
+  { SAM_PID_SSC1,     XDMAC0_CH_SSC1_RX     }, /* SSC1  Receive */
+  { SAM_PID_ADC,      XDMAC0_CH_ADC_RX      }, /* ADC   Receive */
+  { SAM_PID_AES,      XDMAC0_CH_AES_RX      }, /* AES   Receive */
+  { SAM_PID_TDES,     XDMAC0_CH_TDES_RX     }, /* TDES  Receive */
+  { SAM_PID_I2SC0,    XDMAC0_CH_I2SC0_RX    }, /* I2SC0 Receive */
+  { SAM_PID_I2SC1,    XDMAC0_CH_I2SC1_RX    }, /* I2SC1 Receive */
+  { SAM_PID_UART0,    XDMAC0_CH_UART0_RX    }, /* UART0 Receive */
+  { SAM_PID_UART1,    XDMAC0_CH_UART1_RX    }, /* UART1 Receive */
+  { SAM_PID_UART2,    XDMAC0_CH_UART2_RX    }, /* UART2 Receive */
+  { SAM_PID_UART3,    XDMAC0_CH_UART3_RX    }, /* UART3 Receive */
+  { SAM_PID_UART4,    XDMAC0_CH_UART4_RX    }, /* UART4 Receive */
+  { SAM_PID_TC0,      XDMAC0_CH_TC0_RX      }, /* TC0   Receive */
+  { SAM_PID_TC1,      XDMAC0_CH_TC1_RX      }, /* TC1   Receive */
+  { SAM_PID_QSPI1,    XDMAC0_CH_QSPI1_RX    }, /* QSPI1 Receive */
+  { SAM_PID_PDMIC,    XDMAC0_CH_PDMIC_RX    }, /* PDMIC Receive */
+#elif defined(ATSAMA5D4)
+  { SAM_PID_HSMCI0,   XDMAC0_CH_HSMCI0      }, /* HSMCI0 Receive/Transmit */
+  { SAM_PID_HSMCI1,   XDMAC0_CH_HSMCI1      }, /* HSMCI1 Receive/Transmit */
+  { SAM_PID_TWI0,     XDMAC0_CH_TWI0_RX     }, /* TWI0 Receive */
+  { SAM_PID_TWI1,     XDMAC0_CH_TWI1_RX     }, /* TWI1 Receive */
+  { SAM_PID_TWI2,     XDMAC0_CH_TWI2_RX     }, /* TWI2 Receive */
+  { SAM_PID_TWI3,     XDMAC0_CH_TWI3_RX     }, /* TWI3 Receive */
+  { SAM_PID_SPI0,     XDMAC0_CH_SPI0_RX     }, /* SPI0 Receive */
+  { SAM_PID_SPI1,     XDMAC0_CH_SPI1_RX     }, /* SPI1 Receive */
+  { SAM_PID_SPI2,     XDMAC0_CH_SPI2_RX     }, /* SPI2 Receive */
+  { SAM_PID_USART2,   XDMAC0_CH_USART2_RX   }, /* USART2 Receive */
+  { SAM_PID_USART3,   XDMAC0_CH_USART3_RX   }, /* USART3 Receive */
+  { SAM_PID_USART4,   XDMAC0_CH_USART4_RX   }, /* USART4 Receive */
+  { SAM_PID_UART0,    XDMAC0_CH_UART0_RX    }, /* UART0 Receive */
+  { SAM_PID_UART1,    XDMAC0_CH_UART1_RX    }, /* UART1 Receive */
+  { SAM_PID_SSC0,     XDMAC0_CH_SSC0_RX     }, /* SSC0 Receive */
+  { SAM_PID_SSC1,     XDMAC0_CH_SSC1_RX     }, /* SSC1 Receive */
+  { SAM_PID_DBGU,     XDMAC0_CH_DBGU_RX     }, /* DBGU Receive */
+  { SAM_PID_ADC,      XDMAC0_CH_ADC_RX      }, /* ADC  Receive */
+  { SAM_PID_SMD,      XDMAC0_CH_SMD_RX      }, /* SMD  Receive */
+  { SAM_PID_USART0,   XDMAC0_CH_USART0_RX   }, /* USART0 Receive */
+  { SAM_PID_USART1,   XDMAC0_CH_USART1_RX   }, /* USART1 Receive */
+  { SAM_PID_AES,      XDMAC0_CH_AES_RX      }, /* AES  Receive */
+  { SAM_PID_TDES,     XDMAC0_CH_TDES_RX     }, /* TDES Receive */
+#endif
 };
 #define NXDMAC0_RXCHANNELS (sizeof(g_xdmac0_rxchan) / sizeof(struct sam_pidmap_s))
 
@@ -186,30 +214,57 @@ static const struct sam_pidmap_s g_xdmac0_rxchan[] =
 
 static const struct sam_pidmap_s g_xdmac0_txchan[] =
 {
-  { SAM_PID_HSMCI0, XDMAC0_CH_HSMCI0    }, /* HSMCI0 Receive/Transmit */
-  { SAM_PID_HSMCI1, XDMAC0_CH_HSMCI1    }, /* HSMCI1 Receive/Transmit */
-  { SAM_PID_TWI0,   XDMAC0_CH_TWI0_TX   }, /* TWI0 Transmit */
-  { SAM_PID_TWI1,   XDMAC0_CH_TWI1_TX   }, /* TWI1 Transmit */
-  { SAM_PID_TWI2,   XDMAC0_CH_TWI2_TX   }, /* TWI2 Transmit */
-  { SAM_PID_TWI3,   XDMAC0_CH_TWI3_TX   }, /* TWI3 Transmit */
-  { SAM_PID_SPI0,   XDMAC0_CH_SPI0_TX   }, /* SPI0 Transmit */
-  { SAM_PID_SPI1,   XDMAC0_CH_SPI1_TX   }, /* SPI1 Transmit */
-  { SAM_PID_SPI2,   XDMAC0_CH_SPI2_TX   }, /* SPI2 Transmit */
-  { SAM_PID_USART2, XDMAC0_CH_USART2_TX }, /* USART2 Transmit */
-  { SAM_PID_USART3, XDMAC0_CH_USART3_TX }, /* USART3 Transmit */
-  { SAM_PID_USART4, XDMAC0_CH_USART4_TX }, /* USART4 Transmit */
-  { SAM_PID_UART0,  XDMAC0_CH_UART0_TX  }, /* UART0 Transmit */
-  { SAM_PID_UART1,  XDMAC0_CH_UART1_TX  }, /* UART1 Transmit */
-  { SAM_PID_SSC0,   XDMAC0_CH_SSC0_TX   }, /* SSC0 Transmit */
-  { SAM_PID_SSC1,   XDMAC0_CH_SSC1_TX   }, /* SSC1 Transmit */
-  { SAM_PID_DBGU,   XDMAC0_CH_DBGU_TX   }, /* DBGU Transmit */
-  { SAM_PID_SMD,    XDMAC0_CH_SMD_TX    }, /* SMD Transmit */
-  { SAM_PID_USART0, XDMAC0_CH_USART0_TX }, /* USART0 Transmit */
-  { SAM_PID_USART1, XDMAC0_CH_USART1_TX }, /* USART1 Transmit */
-  { SAM_PID_AES,    XDMAC0_CH_AES_TX    }, /* AES Transmit */
-  { SAM_PID_TDES,   XDMAC0_CH_TDES_TX   }, /* TDES Transmit */
-  { SAM_PID_SHA,    XDMAC0_CH_SHA_TX    }, /* SHA Transmit */
-  { SAM_PID_CATB,   XDMAC0_CH_CATB_TX   }, /* CATB Transmit */
+#if defined(ATSAMA5D2)
+  { SAM_PID_TWI0,     XDMAC0_CH_TWI0_TX     }, /* TWI0  Transmit */
+  { SAM_PID_TWI1,     XDMAC0_CH_TWI1_TX     }, /* TWI1  Transmit */
+  { SAM_PID_QSPI0,    XDMAC0_CH_QSPI0_TX    }, /* QSPI0 Transmit */
+  { SAM_PID_SPI0,     XDMAC0_CH_SPI0_TX     }, /* SPI0  Transmit */
+  { SAM_PID_SPI1,     XDMAC0_CH_SPI1_TX     }, /* SPI1  Transmit */
+  { SAM_PID_PWM,      XDMAC0_CH_PWM_TX      }, /* PWM   Transmit */
+  { SAM_PID_FLEXCOM0, XDMAC0_CH_FLEXCOM0_TX }, /* FLEXCOM0 Transmit */
+  { SAM_PID_FLEXCOM1, XDMAC0_CH_FLEXCOM1_TX }, /* FLEXCOM1 Transmit */
+  { SAM_PID_FLEXCOM2, XDMAC0_CH_FLEXCOM2_TX }, /* FLEXCOM2 Transmit */
+  { SAM_PID_FLEXCOM3, XDMAC0_CH_FLEXCOM3_TX }, /* FLEXCOM3 Transmit */
+  { SAM_PID_FLEXCOM4, XDMAC0_CH_FLEXCOM4_TX }, /* FLEXCOM4 Transmit */
+  { SAM_PID_SSC0,     XDMAC0_CH_SSC0_TX     }, /* SSC0 Transmit */
+  { SAM_PID_SSC1,     XDMAC0_CH_SSC1_TX     }, /* SSC1 Transmit */
+  { SAM_PID_AES,      XDMAC0_CH_AES_TX      }, /* AES  Transmit */
+  { SAM_PID_TDES,     XDMAC0_CH_TDES_TX     }, /* TDES Transmit */
+  { SAM_PID_SHA,      XDMAC0_CH_SHA_TX      }, /* SHA  Transmit */
+  { SAM_PID_I2SC0,    XDMAC0_CH_I2SC0_TX    }, /* I2SC0  Transmit */
+  { SAM_PID_I2SC1,    XDMAC0_CH_I2SC1_TX    }, /* I2SC1  Transmit */
+  { SAM_PID_UART0,    XDMAC0_CH_UART0_TX    }, /* UART0  Transmit */
+  { SAM_PID_UART1,    XDMAC0_CH_UART1_TX    }, /* UART1  Transmit */
+  { SAM_PID_UART2,    XDMAC0_CH_UART2_TX    }, /* UART2  Transmit */
+  { SAM_PID_UART3,    XDMAC0_CH_UART3_TX    }, /* UART3  Transmit */
+  { SAM_PID_UART4,    XDMAC0_CH_UART4_TX    }, /* UART4  Transmit */
+  { SAM_PID_CLASSD,   XDMAC0_CH_CLASSD_TX   }, /* CLASSD Transmit */
+  { SAM_PID_QSPI1,    XDMAC0_CH_QSPI1_TX    }, /* QSPI1  Transmit */
+#elif defined(ATSAMA5D4)
+  { SAM_PID_HSMCI0,   XDMAC0_CH_HSMCI0      }, /* HSMCI0 Receive/Transmit */
+  { SAM_PID_HSMCI1,   XDMAC0_CH_HSMCI1      }, /* HSMCI1 Receive/Transmit */
+  { SAM_PID_TWI0,     XDMAC0_CH_TWI0_TX     }, /* TWI0 Transmit */
+  { SAM_PID_TWI1,     XDMAC0_CH_TWI1_TX     }, /* TWI1 Transmit */
+  { SAM_PID_TWI2,     XDMAC0_CH_TWI2_TX     }, /* TWI2 Transmit */
+  { SAM_PID_TWI3,     XDMAC0_CH_TWI3_TX     }, /* TWI3 Transmit */
+  { SAM_PID_SPI0,     XDMAC0_CH_SPI0_TX     }, /* SPI0 Transmit */
+  { SAM_PID_SPI1,     XDMAC0_CH_SPI1_TX     }, /* SPI1 Transmit */
+  { SAM_PID_SPI2,     XDMAC0_CH_SPI2_TX     }, /* SPI2 Transmit */
+  { SAM_PID_USART2,   XDMAC0_CH_USART2_TX   }, /* USART2 Transmit */
+  { SAM_PID_USART3,   XDMAC0_CH_USART3_TX   }, /* USART3 Transmit */
+  { SAM_PID_USART4,   XDMAC0_CH_USART4_TX   }, /* USART4 Transmit */
+  { SAM_PID_UART0,    XDMAC0_CH_UART0_TX    }, /* UART0 Transmit */
+  { SAM_PID_UART1,    XDMAC0_CH_UART1_TX    }, /* UART1 Transmit */
+  { SAM_PID_SSC0,     XDMAC0_CH_SSC0_TX     }, /* SSC0 Transmit */
+  { SAM_PID_SSC1,     XDMAC0_CH_SSC1_TX     }, /* SSC1 Transmit */
+  { SAM_PID_DBGU,     XDMAC0_CH_DBGU_TX     }, /* DBGU Transmit */
+  { SAM_PID_SMD,      XDMAC0_CH_SMD_TX      }, /* SMD  Transmit */
+  { SAM_PID_USART0,   XDMAC0_CH_USART0_TX   }, /* USART0 Transmit */
+  { SAM_PID_USART1,   XDMAC0_CH_USART1_TX   }, /* USART1 Transmit */
+  { SAM_PID_AES,      XDMAC0_CH_AES_TX      }, /* AES  Transmit */
+  { SAM_PID_TDES,     XDMAC0_CH_TDES_TX     }, /* TDES Transmit */
+  { SAM_PID_SHA,      XDMAC0_CH_SHA_TX      }, /* SHA  Transmit */
+#endif
 };
 #define NXDMAC0_TXCHANNELS (sizeof(g_xdmac0_txchan) / sizeof(struct sam_pidmap_s))
 #endif
@@ -219,25 +274,54 @@ static const struct sam_pidmap_s g_xdmac0_txchan[] =
 
 static const struct sam_pidmap_s g_xdmac1_rxchan[] =
 {
-  { SAM_PID_HSMCI0, XDMAC1_CH_HSMCI0    }, /* HSMCI0 Receive/Transmit */
-  { SAM_PID_HSMCI1, XDMAC1_CH_HSMCI1    }, /* HSMCI1 Receive/Transmit */
-  { SAM_PID_TWI0,   XDMAC1_CH_TWI0_RX   }, /* TWI0 Receive */
-  { SAM_PID_TWI1,   XDMAC1_CH_TWI1_RX   }, /* TWI1 Receive */
-  { SAM_PID_TWI2,   XDMAC1_CH_TWI2_RX   }, /* TWI2 Receive */
-  { SAM_PID_TWI3,   XDMAC1_CH_TWI3_RX   }, /* TWI3 Receive */
-  { SAM_PID_SPI0,   XDMAC1_CH_SPI0_RX   }, /* SPI0 Receive */
-  { SAM_PID_SPI1,   XDMAC1_CH_SPI1_RX   }, /* SPI1 Receive */
-  { SAM_PID_SPI2,   XDMAC1_CH_SPI2_RX   }, /* SPI2 Receive */
-  { SAM_PID_USART2, XDMAC1_CH_USART2_RX }, /* USART2 Receive */
-  { SAM_PID_USART3, XDMAC1_CH_USART3_RX }, /* USART3 Receive */
-  { SAM_PID_USART4, XDMAC1_CH_USART4_RX }, /* USART4 Receive */
-  { SAM_PID_UART0,  XDMAC1_CH_UART0_RX  }, /* UART0 Receive */
-  { SAM_PID_UART1,  XDMAC1_CH_UART1_RX  }, /* UART1 Receive */
-  { SAM_PID_SSC0,   XDMAC1_CH_SSC0_RX   }, /* SSC0 Receive */
-  { SAM_PID_SSC1,   XDMAC1_CH_SSC1_RX   }, /* SSC1 Receive */
-  { SAM_PID_DBGU,   XDMAC1_CH_DBGU_RX   }, /* DBGU Receive */
-  { SAM_PID_ADC,    XDMAC1_CH_ADC_RX    }, /* ADC Receive */
-  { SAM_PID_SMD,    XDMAC1_CH_SMD_RX    }, /* SMD Receive */
+#if defined(ATSAMA5D2)
+  { SAM_PID_TWI0,     XDMAC1_CH_TWI0_RX     }, /* TWI0  Receive */
+  { SAM_PID_TWI1,     XDMAC1_CH_TWI1_RX     }, /* TWI1  Receive */
+  { SAM_PID_QSPI0,    XDMAC1_CH_QSPI0_RX    }, /* QSPI0 Receive */
+  { SAM_PID_SPI0,     XDMAC1_CH_SPI0_RX     }, /* SPI0  Receive */
+  { SAM_PID_SPI1,     XDMAC1_CH_SPI1_RX     }, /* SPI1  Receive */
+  { SAM_PID_FLEXCOM0, XDMAC1_CH_FLEXCOM0_RX }, /* FLEXCOM0 Receive */
+  { SAM_PID_FLEXCOM1, XDMAC1_CH_FLEXCOM1_RX }, /* FLEXCOM1 Receive */
+  { SAM_PID_FLEXCOM2, XDMAC1_CH_FLEXCOM2_RX }, /* FLEXCOM2 Receive */
+  { SAM_PID_FLEXCOM3, XDMAC1_CH_FLEXCOM3_RX }, /* FLEXCOM3 Receive */
+  { SAM_PID_FLEXCOM4, XDMAC1_CH_FLEXCOM4_RX }, /* FLEXCOM4 Receive */
+  { SAM_PID_SSC0,     XDMAC1_CH_SSC0_RX     }, /* SSC0  Receive */
+  { SAM_PID_SSC1,     XDMAC1_CH_SSC1_RX     }, /* SSC1  Receive */
+  { SAM_PID_ADC,      XDMAC1_CH_ADC_RX      }, /* ADC   Receive */
+  { SAM_PID_AES,      XDMAC1_CH_AES_RX      }, /* AES   Receive */
+  { SAM_PID_TDES,     XDMAC1_CH_TDES_RX     }, /* TDES  Receive */
+  { SAM_PID_I2SC0,    XDMAC1_CH_I2SC0_RX    }, /* I2SC0 Receive */
+  { SAM_PID_I2SC1,    XDMAC1_CH_I2SC1_RX    }, /* I2SC1 Receive */
+  { SAM_PID_UART0,    XDMAC1_CH_UART0_RX    }, /* UART0 Receive */
+  { SAM_PID_UART1,    XDMAC1_CH_UART1_RX    }, /* UART1 Receive */
+  { SAM_PID_UART2,    XDMAC1_CH_UART2_RX    }, /* UART2 Receive */
+  { SAM_PID_UART3,    XDMAC1_CH_UART3_RX    }, /* UART3 Receive */
+  { SAM_PID_UART4,    XDMAC1_CH_UART4_RX    }, /* UART4 Receive */
+  { SAM_PID_TC0,      XDMAC1_CH_TC0_RX      }, /* TC0   Receive */
+  { SAM_PID_TC1,      XDMAC1_CH_TC1_RX      }, /* TC1   Receive */
+  { SAM_PID_QSPI1,    XDMAC1_CH_QSPI1_RX    }, /* QSPI1 Receive */
+  { SAM_PID_PDMIC,    XDMAC1_CH_PDMIC_RX    }, /* PDMIC Receive */
+#elif defined(ATSAMA5D4)
+  { SAM_PID_HSMCI0,   XDMAC1_CH_HSMCI0      }, /* HSMCI0 Receive/Transmit */
+  { SAM_PID_HSMCI1,   XDMAC1_CH_HSMCI1      }, /* HSMCI1 Receive/Transmit */
+  { SAM_PID_TWI0,     XDMAC1_CH_TWI0_RX     }, /* TWI0 Receive */
+  { SAM_PID_TWI1,     XDMAC1_CH_TWI1_RX     }, /* TWI1 Receive */
+  { SAM_PID_TWI2,     XDMAC1_CH_TWI2_RX     }, /* TWI2 Receive */
+  { SAM_PID_TWI3,     XDMAC1_CH_TWI3_RX     }, /* TWI3 Receive */
+  { SAM_PID_SPI0,     XDMAC1_CH_SPI0_RX     }, /* SPI0 Receive */
+  { SAM_PID_SPI1,     XDMAC1_CH_SPI1_RX     }, /* SPI1 Receive */
+  { SAM_PID_SPI2,     XDMAC1_CH_SPI2_RX     }, /* SPI2 Receive */
+  { SAM_PID_USART2,   XDMAC1_CH_USART2_RX   }, /* USART2 Receive */
+  { SAM_PID_USART3,   XDMAC1_CH_USART3_RX   }, /* USART3 Receive */
+  { SAM_PID_USART4,   XDMAC1_CH_USART4_RX   }, /* USART4 Receive */
+  { SAM_PID_UART0,    XDMAC1_CH_UART0_RX    }, /* UART0 Receive */
+  { SAM_PID_UART1,    XDMAC1_CH_UART1_RX    }, /* UART1 Receive */
+  { SAM_PID_SSC0,     XDMAC1_CH_SSC0_RX     }, /* SSC0  Receive */
+  { SAM_PID_SSC1,     XDMAC1_CH_SSC1_RX     }, /* SSC1  Receive */
+  { SAM_PID_DBGU,     XDMAC1_CH_DBGU_RX     }, /* DBGU  Receive */
+  { SAM_PID_ADC,      XDMAC1_CH_ADC_RX      }, /* ADC   Receive */
+  { SAM_PID_SMD,      XDMAC1_CH_SMD_RX      }, /* SMD   Receive */
+#endif
 };
 #define NXDMAC1_RXCHANNELS (sizeof(g_xdmac1_rxchan) / sizeof(struct sam_pidmap_s))
 
@@ -245,24 +329,52 @@ static const struct sam_pidmap_s g_xdmac1_rxchan[] =
 
 static const struct sam_pidmap_s g_xdmac1_txchan[] =
 {
-  { SAM_PID_HSMCI0, XDMAC1_CH_HSMCI0    }, /* HSMCI0 Receive/Transmit */
-  { SAM_PID_HSMCI1, XDMAC1_CH_HSMCI1    }, /* HSMCI1 Receive/Transmit */
-  { SAM_PID_TWI0,   XDMAC1_CH_TWI0_TX   }, /* TWI0 Transmit */
-  { SAM_PID_TWI1,   XDMAC1_CH_TWI1_TX   }, /* TWI1 Transmit */
-  { SAM_PID_TWI2,   XDMAC1_CH_TWI2_TX   }, /* TWI2 Transmit */
-  { SAM_PID_TWI3,   XDMAC1_CH_TWI3_TX   }, /* TWI3 Transmit */
-  { SAM_PID_SPI0,   XDMAC1_CH_SPI0_TX   }, /* SPI0 Transmit */
-  { SAM_PID_SPI1,   XDMAC1_CH_SPI1_TX   }, /* SPI1 Transmit */
-  { SAM_PID_SPI2,   XDMAC1_CH_SPI2_TX   }, /* SPI2 Transmit */
-  { SAM_PID_USART2, XDMAC1_CH_USART2_TX }, /* USART2 Transmit */
-  { SAM_PID_USART3, XDMAC1_CH_USART3_TX }, /* USART3 Transmit */
-  { SAM_PID_USART4, XDMAC1_CH_USART4_TX }, /* USART4 Transmit */
-  { SAM_PID_UART0,  XDMAC1_CH_UART0_TX  }, /* UART0 Transmit */
-  { SAM_PID_UART1,  XDMAC1_CH_UART1_TX  }, /* UART1 Transmit */
-  { SAM_PID_SSC0,   XDMAC1_CH_SSC0_TX   }, /* SSC0 Transmit */
-  { SAM_PID_SSC1,   XDMAC1_CH_SSC1_TX   }, /* SSC1 Transmit */
-  { SAM_PID_DBGU,   XDMAC1_CH_DBGU_TX   }, /* DBGU Transmit */
-  { SAM_PID_SMD,    XDMAC1_CH_SMD_TX    }, /* SMD Transmit */
+#if defined(ATSAMA5D2)
+  { SAM_PID_TWI0,     XDMAC1_CH_TWI0_TX     }, /* TWI0  Transmit */
+  { SAM_PID_TWI1,     XDMAC1_CH_TWI1_TX     }, /* TWI1  Transmit */
+  { SAM_PID_QSPI0,    XDMAC1_CH_QSPI0_TX    }, /* QSPI0 Transmit */
+  { SAM_PID_SPI0,     XDMAC1_CH_SPI0_TX     }, /* SPI0  Transmit */
+  { SAM_PID_SPI1,     XDMAC1_CH_SPI1_TX     }, /* SPI1  Transmit */
+  { SAM_PID_PWM,      XDMAC1_CH_PWM_TX      }, /* PWM   Transmit */
+  { SAM_PID_FLEXCOM0, XDMAC1_CH_FLEXCOM0_TX }, /* FLEXCOM0 Transmit */
+  { SAM_PID_FLEXCOM1, XDMAC1_CH_FLEXCOM1_TX }, /* FLEXCOM1 Transmit */
+  { SAM_PID_FLEXCOM2, XDMAC1_CH_FLEXCOM2_TX }, /* FLEXCOM2 Transmit */
+  { SAM_PID_FLEXCOM3, XDMAC1_CH_FLEXCOM3_TX }, /* FLEXCOM3 Transmit */
+  { SAM_PID_FLEXCOM4, XDMAC1_CH_FLEXCOM4_TX }, /* FLEXCOM4 Transmit */
+  { SAM_PID_SSC0,     XDMAC1_CH_SSC0_TX     }, /* SSC0 Transmit */
+  { SAM_PID_SSC1,     XDMAC1_CH_SSC1_TX     }, /* SSC1 Transmit */
+  { SAM_PID_AES,      XDMAC1_CH_AES_TX      }, /* AES  Transmit */
+  { SAM_PID_TDES,     XDMAC1_CH_TDES_TX     }, /* TDES Transmit */
+  { SAM_PID_SHA,      XDMAC1_CH_SHA_TX      }, /* SHA  Transmit */
+  { SAM_PID_I2SC0,    XDMAC1_CH_I2SC0_TX    }, /* I2SC0  Transmit */
+  { SAM_PID_I2SC1,    XDMAC1_CH_I2SC1_TX    }, /* I2SC1  Transmit */
+  { SAM_PID_UART0,    XDMAC1_CH_UART0_TX    }, /* UART0  Transmit */
+  { SAM_PID_UART1,    XDMAC1_CH_UART1_TX    }, /* UART1  Transmit */
+  { SAM_PID_UART2,    XDMAC1_CH_UART2_TX    }, /* UART2  Transmit */
+  { SAM_PID_UART3,    XDMAC1_CH_UART3_TX    }, /* UART3  Transmit */
+  { SAM_PID_UART4,    XDMAC1_CH_UART4_TX    }, /* UART4  Transmit */
+  { SAM_PID_CLASSD,   XDMAC1_CH_CLASSD_TX   }, /* CLASSD Transmit */
+  { SAM_PID_QSPI1,    XDMAC1_CH_QSPI1_TX    }, /* QSPI1  Transmit */
+#elif defined(ATSAMA5D4)
+  { SAM_PID_HSMCI0,   XDMAC1_CH_HSMCI0      }, /* HSMCI0 Receive/Transmit */
+  { SAM_PID_HSMCI1,   XDMAC1_CH_HSMCI1      }, /* HSMCI1 Receive/Transmit */
+  { SAM_PID_TWI0,     XDMAC1_CH_TWI0_TX     }, /* TWI0 Transmit */
+  { SAM_PID_TWI1,     XDMAC1_CH_TWI1_TX     }, /* TWI1 Transmit */
+  { SAM_PID_TWI2,     XDMAC1_CH_TWI2_TX     }, /* TWI2 Transmit */
+  { SAM_PID_TWI3,     XDMAC1_CH_TWI3_TX     }, /* TWI3 Transmit */
+  { SAM_PID_SPI0,     XDMAC1_CH_SPI0_TX     }, /* SPI0 Transmit */
+  { SAM_PID_SPI1,     XDMAC1_CH_SPI1_TX     }, /* SPI1 Transmit */
+  { SAM_PID_SPI2,     XDMAC1_CH_SPI2_TX     }, /* SPI2 Transmit */
+  { SAM_PID_USART2,   XDMAC1_CH_USART2_TX   }, /* USART2 Transmit */
+  { SAM_PID_USART3,   XDMAC1_CH_USART3_TX   }, /* USART3 Transmit */
+  { SAM_PID_USART4,   XDMAC1_CH_USART4_TX   }, /* USART4 Transmit */
+  { SAM_PID_UART0,    XDMAC1_CH_UART0_TX    }, /* UART0 Transmit */
+  { SAM_PID_UART1,    XDMAC1_CH_UART1_TX    }, /* UART1 Transmit */
+  { SAM_PID_SSC0,     XDMAC1_CH_SSC0_TX     }, /* SSC0 Transmit */
+  { SAM_PID_SSC1,     XDMAC1_CH_SSC1_TX     }, /* SSC1 Transmit */
+  { SAM_PID_DBGU,     XDMAC1_CH_DBGU_TX     }, /* DBGU Transmit */
+  { SAM_PID_SMD,      XDMAC1_CH_SMD_TX      }, /* SMD Transmit */
+#endif
 };
 #define NXDMAC1_TXCHANNELS (sizeof(g_xdmac1_txchan) / sizeof(struct sam_pidmap_s))
 #endif
@@ -1090,7 +1202,7 @@ static inline uint32_t sam_txcc(struct sam_xdmach_s *xdmach)
       /* Look up the DMA channel code for TX:  Peripheral is the sink. */
 
       field   = sam_sink_channel(xdmach, pid);
-      regval |= (field << XDMACH_CC_CSIZE_SHIFT);
+      regval |= (field << XDMACH_CC_PERID_SHIFT);
 
 #if 0 /* Not supported */
       /* 10. Set SWREQ to use software request (only relevant for a
@@ -1221,7 +1333,7 @@ static inline uint32_t sam_rxcc(struct sam_xdmach_s *xdmach)
    */
 
   if ((xdmach->flags & DMACH_FLAG_PERIPHAHB_MASK) ==
-      DMACH_FLAG_PERIPHAHB_AHB_IF1)
+       DMACH_FLAG_PERIPHAHB_AHB_IF1)
     {
       regval |= XDMACH_CC_SIF;
     }
@@ -1249,7 +1361,7 @@ static inline uint32_t sam_rxcc(struct sam_xdmach_s *xdmach)
       /* Look up the DMA channel code for RX:  Peripheral is the source. */
 
       field   = sam_source_channel(xdmach, pid);
-      regval |= (field << XDMACH_CC_CSIZE_SHIFT);
+      regval |= (field << XDMACH_CC_PERID_SHIFT);
 
 #if 0 /* Not supported */
       /* 10. Set SWREQ to use software request (only relevant for a
@@ -1368,12 +1480,12 @@ sam_allocdesc(struct sam_xdmach_s *xdmach, struct chnext_view1_s *prev,
               xdmach->lltail = descr;
 
               /* Assume that we will be doing multiple buffer transfers and
-               * that that hardware will be accessing the descriptor via DMA.
+               * that hardware will be accessing the descriptor via DMA.
                */
 
               up_clean_dcache((uintptr_t)descr,
                               (uintptr_t)descr +
-                              sizeof(struct chnext_view1_s));
+                               sizeof(struct chnext_view1_s));
               break;
             }
         }
@@ -1890,6 +2002,12 @@ void sam_dmainitialize(struct sam_xdmac_s *xdmac)
 
   nxsem_init(&xdmac->chsem, 0, 1);
   nxsem_init(&xdmac->dsem, 0, SAM_NDMACHAN);
+
+  /* The 'dsem' is used for signaling rather than mutual exclusion and,
+   * hence, should not have priority inheritance enabled.
+   */
+
+  nxsem_set_protocol(&xdmac->dsem, SEM_PRIO_NONE);
 }
 
 /****************************************************************************
@@ -2310,13 +2428,23 @@ int sam_dmastart(DMA_HANDLE handle, dma_callback_t callback, void *arg)
 
   if (xdmach->llhead)
     {
-      /* Save the callback info.  This will be invoked whent the DMA
+      /* Save the callback info.  This will be invoked when the DMA
        * completes
        */
 
       xdmach->callback = callback;
       xdmach->arg      = arg;
 
+      /* If this is an RX DMA (peripheral-to-memory), then flush and
+       * invalidate the data cache to force reloading from memory when the
+       * DMA completes.
+       */
+
+      if (xdmach->rx)
+        {
+          up_flush_dcache(xdmach->rxaddr, xdmach->rxaddr + xdmach->rxsize);
+        }
+
       /* Is this a single block transfer?  Or a multiple block transfer? */
 
       if (xdmach->llhead == xdmach->lltail)