1 /* ---------------------------------------------------------------------------- */
\r
2 /* Atmel Microcontroller Software Support */
\r
3 /* ---------------------------------------------------------------------------- */
\r
4 /* Copyright (c) 2015, Atmel Corporation */
\r
6 /* All rights reserved. */
\r
8 /* Redistribution and use in source and binary forms, with or without */
\r
9 /* modification, are permitted provided that the following condition is met: */
\r
11 /* - Redistributions of source code must retain the above copyright notice, */
\r
12 /* this list of conditions and the disclaimer below. */
\r
14 /* Atmel's name may not be used to endorse or promote products derived from */
\r
15 /* this software without specific prior written permission. */
\r
17 /* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR */
\r
18 /* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
\r
19 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE */
\r
20 /* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, */
\r
21 /* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */
\r
22 /* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */
\r
23 /* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
\r
24 /* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
\r
25 /* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */
\r
26 /* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
\r
27 /* ---------------------------------------------------------------------------- */
\r
34 #include <stdbool.h>
\r
37 #define __I volatile /**< Defines 'read-only' permissions */
\r
39 #define __I volatile const /**< Defines 'read-only' permissions */
\r
41 #define __O volatile /**< Defines 'write-only' permissions */
\r
42 #define __IO volatile /**< Defines 'read/write' permissions */
\r
44 /* ************************************************************************** */
\r
45 /* PERIPHERAL ID DEFINITIONS FOR SAMA5D2x */
\r
46 /* ************************************************************************** */
\r
47 /** \addtogroup SAMA5D2x_id Peripheral Ids Definitions */
\r
50 #define ID_SAIC_FIQ ( 0) /**< \brief FIQ Interrupt ID (SAIC_FIQ) */
\r
51 #define ID_ARM_PMU ( 2) /**< \brief Performance Monitor Unit (PMU) (ARM_PMU) */
\r
52 #define ID_PIT ( 3) /**< \brief Periodic Interval Timer Interrupt (PIT) */
\r
53 #define ID_WDT ( 4) /**< \brief Watchdog timer Interrupt (WDT) */
\r
54 #define ID_GMAC0 ( 5) /**< \brief Ethernet MAC (GMAC0) */
\r
55 #define ID_XDMAC0 ( 6) /**< \brief DMA Controller 0 (XDMAC0) */
\r
56 #define ID_XDMAC1 ( 7) /**< \brief DMA Controller 1 (XDMAC1) */
\r
57 #define ID_ICM ( 8) /**< \brief Integritry Check Monitor (ICM) */
\r
58 #define ID_AES ( 9) /**< \brief Advanced Enion Standard (AES) */
\r
59 #define ID_AESB (10) /**< \brief AES bridge (AESB) */
\r
60 #define ID_TDES (11) /**< \brief Triple Data Enion Standard (TDES) */
\r
61 #define ID_SHA (12) /**< \brief SHA Signature (SHA) */
\r
62 #define ID_MPDDRC (13) /**< \brief MPDDR controller (MPDDRC) */
\r
63 #define ID_MATRIX1 (14) /**< \brief H32MX, 32-bit AHB Matrix (MATRIX1) */
\r
64 #define ID_MATRIX0 (15) /**< \brief H64MX, 64-bit AHB Matrix (MATRIX0) */
\r
65 #define ID_HSMC (17) /**< \brief Multi-bit ECC Interrupt (HSMC) */
\r
66 #define ID_PIOA (18) /**< \brief Parallel I/O Controller (PIOA) */
\r
67 #define ID_FLEXCOM0 (19) /**< \brief FLEXCOM 0 (FLEXCOM0) */
\r
68 #define ID_USART0 (19) /**< \brief USART (USART0) from FLEXCOM0 */
\r
69 #define ID_FCOMSPI0 (19) /**< \brief Serial Peripheral Interface (SPI0) from FLEXCOM0 */
\r
70 #define ID_TWI0 (19) /**< \brief Two-Wire Interface (TWI0) from FLEXCOM0 */
\r
71 #define ID_FLEXCOM1 (20) /**< \brief FLEXCOM 1 (FLEXCOM1) */
\r
72 #define ID_USART1 (20) /**< \brief USART (USART1) from FLEXCOM1 */
\r
73 #define ID_FCOMSPI1 (20) /**< \brief Serial Peripheral Interface (SPI1) from FLEXCOM1 */
\r
74 #define ID_TWI1 (20) /**< \brief Two-Wire Interface (TWI1) from FLEXCOM1 */
\r
75 #define ID_FLEXCOM2 (21) /**< \brief FLEXCOM 1 (FLEXCOM1) */
\r
76 #define ID_USART2 (21) /**< \brief USART (USART1) from FLEXCOM1 */
\r
77 #define ID_FCOMSPI2 (21) /**< \brief Serial Peripheral Interface (SPI1) from FLEXCOM1 */
\r
78 #define ID_TWI2 (21) /**< \brief Two-Wire Interface (TWI1) from FLEXCOM1 */
\r
79 #define ID_FLEXCOM3 (22) /**< \brief FLEXCOM 3 (FLEXCOM3) */
\r
80 #define ID_USART3 (22) /**< \brief USART (USART3) from FLEXCOM3 */
\r
81 #define ID_FCOMSPI3 (22) /**< \brief Serial Peripheral Interface (SPI3) from FLEXCOM3 */
\r
82 #define ID_TWI3 (22) /**< \brief Two-Wire Interface (TWI3) from FLEXCOM3 */
\r
83 #define ID_FLEXCOM4 (23) /**< \brief FLEXCOM 4 (FLEXCOM4) */
\r
84 #define ID_USART4 (23) /**< \brief USART (USART4) from FLEXCOM4 */
\r
85 #define ID_FCOMSPI4 (23) /**< \brief Serial Peripheral Interface (SPI4) from FLEXCOM4 */
\r
86 #define ID_TWI4 (23) /**< \brief Two-Wire Interface (TWI4) from FLEXCOM4 */
\r
87 #define ID_UART0 (24) /**< \brief UART 0 (UART0) */
\r
88 #define ID_UART1 (25) /**< \brief UART 1 (UART1) */
\r
89 #define ID_UART2 (26) /**< \brief UART 2 (UART2) */
\r
90 #define ID_UART3 (27) /**< \brief UART 3 (UART3) */
\r
91 #define ID_UART4 (28) /**< \brief UART 4 (UART4) */
\r
92 #define ID_TWIHS0 (29) /**< \brief Two-Wire Interface 0 (TWIHS0) */
\r
93 #define ID_TWIHS1 (30) /**< \brief Two-Wire Interface 1 (TWIHS1) */
\r
94 #define ID_SDMMC0 (31) /**< \brief Secure Digital Multimedia Card Controller 0 (SDMMC0) */
\r
95 #define ID_SDMMC1 (32) /**< \brief Secure Digital Multimedia Card Controller 1 (SDMMC1) */
\r
96 #define ID_SPI0 (33) /**< \brief Serial Peripheral Interface 0 (SPI0) */
\r
97 #define ID_SPI1 (34) /**< \brief Serial Peripheral Interface 1 (SPI1) */
\r
98 #define ID_TC0 (35) /**< \brief Timer Counter 0 (ch. 0, 1, 2) (TC0) */
\r
99 #define ID_TC1 (36) /**< \brief Timer Counter 1 (ch. 3, 4, 5) (TC1) */
\r
100 #define ID_PWM (38) /**< \brief Pulse Width Modulation Controller0 (ch. 0, 1, 2, 3) (PWM) */
\r
101 #define ID_ADC (40) /**< \brief Touch Screen ADC Controller (ADC) */
\r
102 #define ID_UHPHS (41) /**< \brief USB Host High Speed (UHPHS) */
\r
103 #define ID_UDPHS (42) /**< \brief USB Device High Speed (UDPHS) */
\r
104 #define ID_SSC0 (43) /**< \brief Synchronous Serial Controller 0 (SSC0) */
\r
105 #define ID_SSC1 (44) /**< \brief Synchronous Serial Controller 1 (SSC1) */
\r
106 #define ID_LCDC (45) /**< \brief LCD Controller (LCDC) */
\r
107 #define ID_ISC (46) /**< \brief Camera Interface (ISC) */
\r
108 #define ID_TRNG (47) /**< \brief True Random Number Generator (TRNG) */
\r
109 #define ID_PDMIC (48) /**< \brief Pulse Density Modulation Interface Controller (PDMIC) */
\r
110 #define ID_AIC_IRQ (49) /**< \brief IRQ Interrupt ID (AIC_IRQ) */
\r
111 #define ID_SFC (50) /**< \brief Fuse Controller (SFC) */
\r
112 #define ID_SECURAM (51) /**< \brief Secured RAM (SECURAM) */
\r
113 #define ID_QSPI0 (52) /**< \brief QSPI 0 (QSPI0) */
\r
114 #define ID_QSPI1 (53) /**< \brief QSPI 1 (QSPI1) */
\r
115 #define ID_I2SC0 (54) /**< \brief Inter-IC Sound Controller 0 (I2SC0) */
\r
116 #define ID_I2SC1 (55) /**< \brief Inter-IC Sound Controller 1 (I2SC1) */
\r
117 #define ID_CAN0_INT0 (56) /**< \brief MCAN 0 Interrupt0 (CAN0_INT0) */
\r
118 #define ID_CAN1_INT0 (57) /**< \brief MCAN 1 Interrupt0 (CAN1_INT0) */
\r
119 #define ID_CLASSD (59) /**< \brief Audio Class D amplifier (CLASSD) */
\r
120 #define ID_SFR (60) /**< \brief Special Function Register (SFR) */
\r
121 #define ID_SAIC (61) /**< \brief Secured Advanced Interrupt Controller (SAIC) */
\r
122 #define ID_AIC (62) /**< \brief Advanced Interrupt Controller (AIC) */
\r
123 #define ID_L2CC (63) /**< \brief L2 Cache Controller (L2CC) */
\r
124 #define ID_CAN0_INT1 (64) /**< \brief MCAN 0 Interrupt1 (CAN0_INT1) */
\r
125 #define ID_CAN1_INT1 (65) /**< \brief MCAN 1 Interrupt1 (CAN1_INT1) */
\r
126 #define ID_GMAC0_Q1 (66) /**< \brief GMAC Queue 1 Interrupt (GMAC0_Q1) */
\r
127 #define ID_GMAC0_Q2 (67) /**< \brief GMAC Queue 2 Interrupt (GMAC0_Q2) */
\r
128 #define ID_PIOB (68) /**< \brief (PIOB) */
\r
129 #define ID_PIOC (69) /**< \brief (PIOC) */
\r
130 #define ID_PIOD (70) /**< \brief (PIOD) */
\r
131 #define ID_SDMMC0_TIMER (71) /**< \brief (SDMMC0_TIMER) */
\r
132 #define ID_SDMMC1_TIMER (72) /**< \brief (SDMMC1_TIMER) */
\r
133 #define ID_SYSC (74) /**< \brief System Controller Interrupt, RTC, RSTC, PMC (SYSC) */
\r
134 #define ID_ACC (75) /**< \brief Analog Comparator (ACC) */
\r
135 #define ID_RXLP (76) /**< \brief Uart Low Power (RXLP) */
\r
136 #define ID_CHIPID (78) /**< \brief Chip ID (CHIPID) */
\r
138 #define ID_PERIPH_COUNT (79) /**< \brief Number of peripheral IDs */
\r
142 /* ************************************************************************** */
\r
143 /* SLAVE MATRIX ID DEFINITIONS FOR SAMA5D2x */
\r
144 /* ************************************************************************** */
\r
145 /** \addtogroup SAMA5D2x_matrix Matrix Ids Definitions */
\r
148 #define H64MX_SLAVE_BRIDGE_H32MX 0 /**< Bridge from H64MX to H32MX */
\r
149 #define H64MX_SLAVE_APB 1 /**< H64MX APB - User interfaces */
\r
150 #define H64MX_SLAVE_SDMMC 1 /**< SDMMC0 - SDMMC1 */
\r
151 #define H64MX_SLAVE_DDR_PORT0 2 /**< DDR Port 0 */
\r
152 #define H64MX_SLAVE_DDR_PORT1 3 /**< DDR Port 1 */
\r
153 #define H64MX_SLAVE_DDR_PORT2 4 /**< DDR Port 2 */
\r
154 #define H64MX_SLAVE_DDR_PORT3 5 /**< DDR Port 3 */
\r
155 #define H64MX_SLAVE_DDR_PORT4 6 /**< DDR Port 4 */
\r
156 #define H64MX_SLAVE_DDR_PORT5 7 /**< DDR Port 5 */
\r
157 #define H64MX_SLAVE_DDR_PORT6 8 /**< DDR Port 6 */
\r
158 #define H64MX_SLAVE_DDR_PORT7 9 /**< DDR Port 7 */
\r
159 #define H64MX_SLAVE_SRAM 10 /**< Internal SRAM 128K */
\r
160 #define H64MX_SLAVE_L2C_SRAM 11 /**< Internal SRAM 128K (L2) */
\r
161 #define H64MX_SLAVE_QSPI0 12 /**< QSPI0 */
\r
162 #define H64MX_SLAVE_QSPI1 13 /**< QSPI1 */
\r
163 #define H64MX_SLAVE_AESB 14 /**< AESB */
\r
165 #define H32MX_SLAVE_BRIDGE_H64MX 0 /**< Bridge from H32MX to H64MX */
\r
166 #define H32MX_SLAVE_APB0 1 /**< H32MX APB0 - User interfaces */
\r
167 #define H32MX_SLAVE_APB1 2 /**< H32MX APB1 - User interfaces */
\r
168 #define H32MX_SLAVE_EBI 3 /**< External Bus Interface CS0..CS3 */
\r
169 #define H32MX_SLAVE_NFC_CMD 3 /**< NFC Command Register */
\r
170 #define H32MX_SLAVE_NFC_SRAM 4 /**< NFC SRAM */
\r
171 #define H32MX_SLAVE_USB 5 /**< USB */
\r
175 /* ************************************************************************** */
\r
176 /* PMECC DEFINITIONS FOR SAMA5D2x */
\r
177 /* ************************************************************************** */
\r
178 /** \addtogroup SAMA5D2x_pmecc PMECC Definitions */
\r
181 /** defines the maximum value of the error correcting capability */
\r
182 #define PMECC_NB_ERROR_MAX (25)
\r
184 /** Address of Galois Field Table 512 mapping in ROM. */
\r
185 #define GALOIS_TABLE_512_ROM_MAPPING (0x40000)
\r
187 /** Address of Galois Field Table 1024 mapping in ROM. */
\r
188 #define GALOIS_TABLE_1024_ROM_MAPPING (0x48000)
\r
192 /* ************************************************************************** */
\r
193 /* INCLUDE FOR SAMA5D2x */
\r
194 /* ************************************************************************** */
\r
196 #if defined(CONFIG_SOC_SAMA5D21)
\r
197 #include "sama5d21.h"
\r
198 #elif defined(CONFIG_SOC_SAMA5D22)
\r
199 #include "sama5d22.h"
\r
200 #elif defined(CONFIG_SOC_SAMA5D23)
\r
201 #include "sama5d23.h"
\r
202 #elif defined(CONFIG_SOC_SAMA5D24)
\r
203 #include "sama5d24.h"
\r
204 #elif defined(CONFIG_SOC_SAMA5D26)
\r
205 #include "sama5d26.h"
\r
206 #elif defined(CONFIG_SOC_SAMA5D27)
\r
207 #include "sama5d27.h"
\r
208 #elif defined(CONFIG_SOC_SAMA5D28)
\r
209 #include "sama5d28.h"
\r
211 #error Library does not support the specified device.
\r
214 #include "chip_pins.h"
\r
216 /** Size of Cortex-A5 L1 cache line */
\r
217 #define L1_CACHE_WORDS (8u)
\r
218 #define L1_CACHE_BYTES (32u)
\r
220 /** FLEXCOM USART FIFO depth */
\r
221 #define FLEXCOM_USART_FIFO_DEPTH (32u)
\r
223 /** FLEXCOM SPI FIFO depth */
\r
224 #define FLEXCOM_SPI_FIFO_DEPTH (32u)
\r
226 /** SPI FIFO depth */
\r
227 #define SPI_FIFO_DEPTH (16u)
\r
229 /** TWI FIFO depth */
\r
230 #define TWI_FIFO_DEPTH (16u)
\r
232 /** Frequency of the on-chip slow clock oscillator */
\r
233 #define SLOW_CLOCK_INT_OSC 32000
\r
235 /** Frequency of the on-chip main clock oscillator */
\r
236 #define MAIN_CLOCK_INT_OSC 12000000
\r
238 /** AIC redirection unlock key */
\r
239 #define AICREDIR_KEY 0x5B6C0E26u
\r
241 /** Indicates chip has an UDP High Speed. */
\r
242 #define CHIP_USB_UDPHS
\r
244 /** Indicates chip has an internal pull-up. */
\r
245 #define CHIP_USB_PULLUP_INTERNAL
\r
247 /** Number of USB endpoints */
\r
248 #define CHIP_USB_ENDPOINTS 16
\r
250 /** Endpoints max paxcket size */
\r
251 #define CHIP_USB_ENDPOINT_MAXPACKETSIZE(ep) \
\r
252 ((ep == 0) ? 64 : 1024)
\r
254 /** Endpoints Number of Bank */
\r
255 #define CHIP_USB_ENDPOINT_BANKS(ep) \
\r
256 ((ep == 0) ? 1 : ((ep == 1) ? 3 : ((ep == 2) ? 3 : 2)))
\r
258 /** Endpoints DMA support */
\r
259 #define CHIP_USB_ENDPOINT_HAS_DMA(ep) \
\r
260 ((ep == 0) ? false : ((ep < 7) ? true : false ))
\r
267 * \brief retrieve Flexcom base address from its ID
\r
268 * \return Flexcom base address on success, 0 otherwise
\r
270 extern Flexcom* get_flexcom_addr_from_id(const uint32_t id);
\r
273 * \brief retrieve TWI ID from its base address
\r
274 * \return TWI ID on success, ID_PERIPH_COUNT otherwise
\r
276 extern uint32_t get_twi_id_from_addr(const Twi* addr);
\r
279 * \brief retrieve TWI base address from its ID
\r
280 * \return TWI base address on success, 0 otherwise
\r
282 extern Twi* get_twi_addr_from_id(const uint32_t id);
\r
287 extern uint32_t get_spi_id_from_addr(const Spi* addr);
\r
289 extern Spi* get_spi_addr_from_id(const uint32_t id);
\r
291 extern uint32_t get_uart_id_from_addr(const Uart* addr);
\r
293 extern uint32_t get_usart_id_from_addr(const Usart* addr);
\r
296 * \brief retrieve Timer/Counter ID from its base address
\r
297 * \return TC ID on success, ID_PERIPH_COUNT otherwise
\r
299 extern uint32_t get_tc_id_from_addr(const Tc* addr);
\r
302 * \brief retrieve Timer/Counter base address from its ID
\r
303 * \return TC base address on success, 0 otherwise
\r
305 extern Tc* get_tc_addr_from_id(const uint32_t id);
\r
308 * \brief retrieve QSPI ID from its base address
\r
309 * \return QSPI ID on success, ID_PERIPH_COUNT otherwise
\r
311 uint32_t get_qspi_id_from_addr(const Qspi* addr);
\r
314 * \brief retrieve QSPI memory start from its base address
\r
315 * \return QSPI memory start on success, NULL otherwise
\r
317 void *get_qspi_mem_from_addr(const Qspi* addr);
\r
320 * \brief retrieve GMAC ID from its base address
\r
321 * \return GMAC ID on success, ID_PERIPH_COUNT otherwise
\r
323 uint32_t get_gmac_id_from_addr(const Gmac* addr);
\r
325 /** \brief Returns the matrix on which the given peripheral is connected
\r
327 * \param id the Peripheral ID
\r
328 * \return a pointer to the Matrix instance
\r
330 extern Matrix* get_peripheral_matrix(uint32_t id);
\r
332 /** \brief Returns the clock divider for the given peripheral
\r
334 * \param id the Peripheral ID
\r
335 * \return the clock divider for the peripheral
\r
337 extern uint32_t get_peripheral_clock_divider(uint32_t id);
\r
339 /** \brief Returns the XDMAC interface number for a given peripheral
\r
341 * \param id the Peripheral ID
\r
342 * \param xdmac the XDMAC controller instance
\r
343 * \param transmit a boolean, true for transmit, false for receive
\r
344 * \return the XDMAC interface number or 0xff if none
\r
346 extern uint8_t get_peripheral_xdma_channel(uint32_t id, Xdmac *xdmac,
\r
349 /** \brief Checks if a peripheral is usable with a XDMAC controller
\r
351 * \param id the Peripheral ID
\r
352 * \param xdmac the XDMAC controller instance
\r
353 * \return true if the peripheral is usable on the given XDMAC controller,
\r
356 extern bool is_peripheral_on_xdma_controller(uint32_t id, Xdmac *xdmac);
\r
358 /** \brief Retrive peripheral FIFO size from its base address
\r
360 * \param addr the Peripheral base addr
\r
361 * \return Size in number of data of the peripherals FIFO if
\r
362 * available, negative value otherwise.
\r
364 extern int32_t get_peripheral_fifo_depth(void* addr);
\r
370 #endif /* _CHIP_H_ */
\r