File indexing completed on 2025-05-11 08:23:42
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 #ifndef LIBBSP_SHARED_FSL_EDMA_H
0035 #define LIBBSP_SHARED_FSL_EDMA_H
0036
0037 #include <fsl/regs-edma.h>
0038
0039 #include <rtems.h>
0040 #include <rtems/chain.h>
0041
0042 #ifdef __cplusplus
0043 extern "C" {
0044 #endif
0045
0046 #ifdef LIBBSP_ARM_IMXRT_BSP_H
0047 #define EDMA_CHANNEL_COUNT 32U
0048 #elif MPC55XX_CHIP_FAMILY == 551
0049 #define EDMA_CHANNEL_COUNT 16U
0050 #elif MPC55XX_CHIP_FAMILY == 564
0051 #define EDMA_CHANNEL_COUNT 16U
0052 #elif MPC55XX_CHIP_FAMILY == 567
0053 #define EDMA_CHANNEL_COUNT 96U
0054 #else
0055 #define EDMA_CHANNEL_COUNT 64U
0056 #endif
0057
0058 #define EDMA_MODULE_COUNT ((EDMA_CHANNEL_COUNT + 63U) / 64U)
0059
0060 #define EDMA_CHANNELS_PER_MODULE 64U
0061
0062 volatile struct fsl_edma_tcd *fsl_edma_tcd_of_channel_index(unsigned index);
0063 unsigned fsl_edma_channel_index_of_tcd(volatile struct fsl_edma_tcd *edma_tcd);
0064
0065 #ifdef LIBBSP_POWERPC_MPC55XXEVB_BSP_H
0066 #error Legacy stuff. Move to compatibility layer.
0067 #if EDMA_MODULE_COUNT == 1
0068 #define EDMA_TCD_BY_CHANNEL_INDEX(channel_index) \
0069 (&EDMA.TCD[(channel_index)])
0070 #elif EDMA_MODULE_COUNT == 2
0071 #define EDMA_TCD_BY_CHANNEL_INDEX(channel_index) \
0072 ((channel_index) < EDMA_CHANNELS_PER_MODULE ? \
0073 &EDMA_A.TCD[(channel_index)] \
0074 : &EDMA_B.TCD[(channel_index) - EDMA_CHANNELS_PER_MODULE])
0075 #else
0076 #error "unsupported module count"
0077 #endif
0078 #endif
0079
0080 #ifdef LIBBSP_POWERPC_MPC55XXEVB_BSP_H
0081 typedef enum {
0082
0083 EDMA_EQADC_A_FISR0_CFFF0 = 0,
0084 EDMA_EQADC_A_FISR0_RFDF0 = 1,
0085 EDMA_EQADC_A_FISR1_CFFF1 = 2,
0086 EDMA_EQADC_A_FISR1_RFDF1 = 3,
0087 EDMA_EQADC_A_FISR2_CFFF2 = 4,
0088 EDMA_EQADC_A_FISR2_RFDF2 = 5,
0089 EDMA_EQADC_A_FISR3_CFFF3 = 6,
0090 EDMA_EQADC_A_FISR3_RFDF3 = 7,
0091 EDMA_EQADC_A_FISR4_CFFF4 = 8,
0092 EDMA_EQADC_A_FISR4_RFDF4 = 9,
0093 EDMA_EQADC_A_FISR5_CFFF5 = 10,
0094 EDMA_EQADC_A_FISR5_RFDF5 = 11,
0095 EDMA_DSPI_B_SR_TFFF = 12,
0096 EDMA_DSPI_B_SR_RFDF = 13,
0097 EDMA_DSPI_C_SR_TFFF = 14,
0098 EDMA_DSPI_C_SR_RFDF = 15,
0099 EDMA_DSPI_D_SR_TFFF = 16,
0100 EDMA_DSPI_D_SR_RFDF = 17,
0101 EDMA_ESCI_A_COMBTX = 18,
0102 EDMA_ESCI_A_COMBRX = 19,
0103 EDMA_EMIOS_GFR_F0 = 20,
0104 EDMA_EMIOS_GFR_F1 = 21,
0105 EDMA_EMIOS_GFR_F2 = 22,
0106 EDMA_EMIOS_GFR_F3 = 23,
0107 EDMA_EMIOS_GFR_F4 = 24,
0108 EDMA_EMIOS_GFR_F8 = 25,
0109 EDMA_EMIOS_GFR_F9 = 26,
0110 EDMA_ETPU_CDTRSR_A_DTRS0 = 27,
0111 EDMA_ETPU_CDTRSR_A_DTRS1 = 28,
0112 EDMA_ETPU_CDTRSR_A_DTRS2 = 29,
0113 EDMA_ETPU_CDTRSR_A_DTRS14 = 30,
0114 EDMA_ETPU_CDTRSR_A_DTRS15 = 31,
0115 EDMA_DSPI_A_SR_TFFF = 32,
0116 EDMA_DSPI_A_SR_RFDF = 33,
0117 EDMA_ESCI_B_COMBTX = 34,
0118 EDMA_ESCI_B_COMBRX = 35,
0119 EDMA_EMIOS_GFR_F6 = 36,
0120 EDMA_EMIOS_GFR_F7 = 37,
0121 EDMA_EMIOS_GFR_F10 = 38,
0122 EDMA_EMIOS_GFR_F11 = 39,
0123 EDMA_EMIOS_GFR_F16 = 40,
0124 EDMA_EMIOS_GFR_F17 = 41,
0125 EDMA_EMIOS_GFR_F18 = 42,
0126 EDMA_EMIOS_GFR_F19 = 43,
0127 EDMA_ETPU_CDTRSR_A_DTRS12 = 44,
0128 EDMA_ETPU_CDTRSR_A_DTRS13 = 45,
0129 EDMA_ETPU_CDTRSR_A_DTRS28 = 46,
0130 EDMA_ETPU_CDTRSR_A_DTRS29 = 47,
0131 EDMA_SIU_EISR_EIF0 = 48,
0132 EDMA_SIU_EISR_EIF1 = 49,
0133 EDMA_SIU_EISR_EIF2 = 50,
0134 EDMA_SIU_EISR_EIF3 = 51,
0135 EDMA_ETPU_CDTRSR_B_DTRS0 = 52,
0136 EDMA_ETPU_CDTRSR_B_DTRS1 = 53,
0137 EDMA_ETPU_CDTRSR_B_DTRS2 = 54,
0138 EDMA_ETPU_CDTRSR_B_DTRS3 = 55,
0139 EDMA_ETPU_CDTRSR_B_DTRS12 = 56,
0140 EDMA_ETPU_CDTRSR_B_DTRS13 = 57,
0141 EDMA_ETPU_CDTRSR_B_DTRS14 = 58,
0142 EDMA_ETPU_CDTRSR_B_DTRS15 = 59,
0143 EDMA_ETPU_CDTRSR_B_DTRS28 = 60,
0144 EDMA_ETPU_CDTRSR_B_DTRS29 = 61,
0145 EDMA_ETPU_CDTRSR_B_DTRS30 = 62,
0146 EDMA_ETPU_CDTRSR_B_DTRS31 = 63
0147 #if MPC55XX_CHIP_FAMILY == 567
0148 ,
0149 EDMA_EQADC_B_FISR0_CFFF0 = 64 + 0,
0150 EDMA_EQADC_B_FISR0_RFDF0 = 64 + 1,
0151 EDMA_EQADC_B_FISR1_CFFF1 = 64 + 2,
0152 EDMA_EQADC_B_FISR1_RFDF1 = 64 + 3,
0153 EDMA_EQADC_B_FISR2_CFFF2 = 64 + 4,
0154 EDMA_EQADC_B_FISR2_RFDF2 = 64 + 5,
0155 EDMA_EQADC_B_FISR3_CFFF3 = 64 + 6,
0156 EDMA_EQADC_B_FISR3_RFDF3 = 64 + 7,
0157 EDMA_EQADC_B_FISR4_CFFF4 = 64 + 8,
0158 EDMA_EQADC_B_FISR4_RFDF4 = 64 + 9,
0159 EDMA_EQADC_B_FISR5_CFFF5 = 64 + 10,
0160 EDMA_EQADC_B_FISR5_RFDF5 = 64 + 11,
0161 EDMA_DECFILTER_A_IB = 64 + 12,
0162 EDMA_DECFILTER_A_OB = 64 + 13,
0163 EDMA_DECFILTER_B_IB = 64 + 14,
0164 EDMA_DECFILTER_B_OB = 64 + 15,
0165 EDMA_DECFILTER_C_IB = 64 + 16,
0166 EDMA_DECFILTER_C_OB = 64 + 17,
0167 EDMA_DECFILTER_D_IB = 64 + 18,
0168 EDMA_DECFILTER_D_OB = 64 + 19,
0169 EDMA_DECFILTER_E_IB = 64 + 20,
0170 EDMA_DECFILTER_E_OB = 64 + 21,
0171 EDMA_DECFILTER_F_IB = 64 + 22,
0172 EDMA_DECFILTER_F_OB = 64 + 23,
0173 EDMA_DECFILTER_G_IB = 64 + 24,
0174 EDMA_DECFILTER_G_OB = 64 + 25,
0175 EDMA_DECFILTER_H_IB = 64 + 26,
0176 EDMA_DECFILTER_H_OB = 64 + 27
0177 #endif
0178 } fsl_edma_channel;
0179 #endif
0180
0181 typedef struct fsl_edma_channel_context {
0182 rtems_chain_node node;
0183 volatile struct fsl_edma_tcd *edma_tcd;
0184 void (*done)(struct fsl_edma_channel_context *, uint32_t);
0185 } fsl_edma_channel_context;
0186
0187 void fsl_edma_init(void);
0188
0189
0190
0191
0192
0193
0194
0195 rtems_status_code fsl_edma_obtain_channel_by_tcd(
0196 volatile struct fsl_edma_tcd *edma_tcd
0197 );
0198
0199 void fsl_edma_release_channel_by_tcd(volatile struct fsl_edma_tcd *edma_tcd);
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219 rtems_status_code fsl_edma_obtain_channel(
0220 fsl_edma_channel_context *ctx,
0221 unsigned irq_priority
0222 );
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241 rtems_status_code fsl_edma_obtain_next_free_channel(
0242 fsl_edma_channel_context *ctx
0243 );
0244
0245 void fsl_edma_release_channel(fsl_edma_channel_context *ctx);
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256 void fsl_edma_copy(
0257 volatile struct fsl_edma_tcd *edma_tcd,
0258 const struct fsl_edma_tcd *source_tcd
0259 );
0260
0261
0262
0263
0264
0265
0266
0267 void fsl_edma_copy_and_enable_hardware_requests(
0268 volatile struct fsl_edma_tcd *edma_tcd,
0269 const struct fsl_edma_tcd *source_tcd
0270 );
0271
0272 void fsl_edma_sg_link(
0273 volatile struct fsl_edma_tcd *edma_tcd,
0274 const struct fsl_edma_tcd *source_tcd
0275 );
0276
0277 static inline volatile struct fsl_edma *fsl_edma_by_tcd(
0278 volatile struct fsl_edma_tcd *edma_tcd
0279 )
0280 {
0281 return (volatile struct fsl_edma *)
0282 ((uintptr_t) edma_tcd & ~(uintptr_t) 0x1fff);
0283 }
0284
0285 static inline unsigned fsl_edma_channel_by_tcd(
0286 volatile struct fsl_edma_tcd *edma_tcd
0287 )
0288 {
0289 volatile struct fsl_edma *edma = fsl_edma_by_tcd(edma_tcd);
0290
0291 return edma_tcd - &edma->TCD[0];
0292 }
0293
0294 static inline void fsl_edma_enable_hardware_requests(
0295 volatile struct fsl_edma_tcd *edma_tcd
0296 )
0297 {
0298 volatile struct fsl_edma *edma = fsl_edma_by_tcd(edma_tcd);
0299 unsigned channel = edma_tcd - &edma->TCD[0];
0300
0301 edma->SERQR = (uint8_t) channel;
0302 }
0303
0304 static inline void fsl_edma_disable_hardware_requests(
0305 volatile struct fsl_edma_tcd *edma_tcd
0306 )
0307 {
0308 volatile struct fsl_edma *edma = fsl_edma_by_tcd(edma_tcd);
0309 unsigned channel = edma_tcd - &edma->TCD[0];
0310
0311 edma->CERQR = (uint8_t) channel;
0312 }
0313
0314 static inline void fsl_edma_enable_error_interrupts(
0315 volatile struct fsl_edma_tcd *edma_tcd
0316 )
0317 {
0318 volatile struct fsl_edma *edma = fsl_edma_by_tcd(edma_tcd);
0319 unsigned channel = edma_tcd - &edma->TCD[0];
0320
0321 edma->SEEIR = (uint8_t) channel;
0322 }
0323
0324 static inline void fsl_edma_disable_error_interrupts(
0325 volatile struct fsl_edma_tcd *edma_tcd
0326 )
0327 {
0328 volatile struct fsl_edma *edma = fsl_edma_by_tcd(edma_tcd);
0329 unsigned channel = edma_tcd - &edma->TCD[0];
0330
0331 edma->CEEIR = (uint8_t) channel;
0332 }
0333
0334 static inline void fsl_edma_set_start(
0335 volatile struct fsl_edma_tcd *edma_tcd
0336 )
0337 {
0338 volatile struct fsl_edma *edma = fsl_edma_by_tcd(edma_tcd);
0339 unsigned channel = edma_tcd - &edma->TCD[0];
0340
0341 edma->SSBR = (uint8_t) channel;
0342 }
0343
0344 static inline void fsl_edma_clear_done(
0345 volatile struct fsl_edma_tcd *edma_tcd
0346 )
0347 {
0348 volatile struct fsl_edma *edma = fsl_edma_by_tcd(edma_tcd);
0349 unsigned channel = edma_tcd - &edma->TCD[0];
0350
0351 edma->CDSBR = (uint8_t) channel;
0352 }
0353
0354 static inline void fsl_edma_clear_interrupts(
0355 volatile struct fsl_edma_tcd *edma_tcd
0356 )
0357 {
0358 volatile struct fsl_edma *edma = fsl_edma_by_tcd(edma_tcd);
0359 unsigned channel = edma_tcd - &edma->TCD[0];
0360
0361 edma->CIRQR = (uint8_t) channel;
0362 }
0363
0364 static inline bool fsl_edma_is_done(
0365 volatile struct fsl_edma_tcd *edma_tcd
0366 )
0367 {
0368 return ((edma_tcd->BMF & EDMA_TCD_BMF_DONE) != 0);
0369 }
0370
0371 #ifdef __cplusplus
0372 }
0373 #endif
0374
0375 #endif