00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include "board.h"
00041
00042 #include <string.h>
00043 #include <stdio.h>
00044
00045 #ifdef BOARD_LCD_ILI9488
00046
00047
00048
00049
00050
00051 static const Pin lcd_ebi_cds_pin = BOARD_EBI_LCD_PIN_CDS;
00052
00053 static sIli9488Dma ili9488EbiDma;
00054 static sIli9488DmaCtl ili9488DmaCtlInEbiMode;
00055
00056
00057
00058
00059
00060
00061
00062 static void _ILI9488_ConfigureSmc( void )
00063 {
00064
00065 PMC_EnablePeripheral( ID_SMC ) ;
00066
00067
00068
00069 SMC->SMC_CS_NUMBER[SMC_EBI_LCD_CS].SMC_SETUP = SMC_SETUP_NWE_SETUP(2)
00070 | SMC_SETUP_NCS_WR_SETUP(0)
00071 | SMC_SETUP_NRD_SETUP(0)
00072 | SMC_SETUP_NCS_RD_SETUP(0);
00073
00074 SMC->SMC_CS_NUMBER[SMC_EBI_LCD_CS].SMC_PULSE = SMC_PULSE_NWE_PULSE(6)
00075 | SMC_PULSE_NCS_WR_PULSE(0xA)
00076 | SMC_PULSE_NRD_PULSE(0xA)
00077 | SMC_PULSE_NCS_RD_PULSE(0xA);
00078
00079 SMC->SMC_CS_NUMBER[SMC_EBI_LCD_CS].SMC_CYCLE = SMC_CYCLE_NWE_CYCLE(0xA)
00080 | SMC_CYCLE_NRD_CYCLE(0xA);
00081
00082 SMC->SMC_CS_NUMBER[SMC_EBI_LCD_CS].SMC_MODE = SMC_MODE_READ_MODE
00083 | SMC_MODE_WRITE_MODE
00084 | SMC_MODE_DBW_16_BIT
00085 | SMC_MODE_EXNW_MODE_DISABLED
00086 | SMC_MODE_TDF_CYCLES(0xF);
00087 }
00088
00089
00090
00091
00092 static void _ILI9488_Ebi_Rx_CB(void)
00093 {
00094 if(!ili9488DmaCtlInEbiMode.cmdOrDataFlag){
00095 ili9488DmaCtlInEbiMode.rxDoneFlag = 1;
00096 memory_barrier()
00097 }
00098 }
00099
00100
00101
00102
00103 static void _ILI9488_Ebi_Tx_CB(void)
00104 {
00105 volatile uint32_t i;
00106 if(ili9488DmaCtlInEbiMode.cmdOrDataFlag) {
00107 for(i = 0; i<0xF; i++);
00108 PIO_Set(&lcd_ebi_cds_pin);
00109 ili9488DmaCtlInEbiMode.cmdOrDataFlag = 0;
00110 }
00111 ili9488DmaCtlInEbiMode.txDoneFlag = 1;
00112 }
00113
00114
00115
00116
00117
00118 static void _ILI9488_EbiDmaInitialize(sXdmad * dmad)
00119 {
00120 ili9488DmaCtlInEbiMode.cmdOrDataFlag = 1;
00121 ili9488DmaCtlInEbiMode.rxDoneFlag = 0;
00122 ili9488DmaCtlInEbiMode.txDoneFlag = 1;
00123
00124 ili9488EbiDma.xdmaD = dmad;
00125 ili9488EbiDma.xdmaD->pXdmacs = XDMAC;
00126 ili9488EbiDma.ili9488DmaTxChannel = 0;
00127 ili9488EbiDma.ili9488DmaRxChannel = 0;
00128 ili9488EbiDma.xdmaInt = 0;
00129 ili9488EbiDma.pSpiHw = 0;
00130 ili9488EbiDma.spiId = 0;
00131 }
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 static uint8_t _ILI9488_EbiDmaConfigChannels(void)
00142 {
00143 uint32_t srcType,dstType;
00144
00145
00146 XDMAD_Initialize( ili9488EbiDma.xdmaD, 0 );
00147
00148 XDMAD_FreeChannel( ili9488EbiDma.xdmaD, ili9488EbiDma.ili9488DmaTxChannel);
00149 XDMAD_FreeChannel( ili9488EbiDma.xdmaD, ili9488EbiDma.ili9488DmaRxChannel);
00150
00151 srcType = XDMAD_TRANSFER_MEMORY;
00152 dstType = XDMAD_TRANSFER_MEMORY;
00153
00154
00155 ili9488EbiDma.ili9488DmaTxChannel =
00156 XDMAD_AllocateChannel( ili9488EbiDma.xdmaD, srcType, dstType);
00157 if ( ili9488EbiDma.ili9488DmaTxChannel == XDMAD_ALLOC_FAILED ) {
00158 return ILI9488_ERROR_DMA_ALLOCATE_CHANNEL;
00159 }
00160
00161
00162 ili9488EbiDma.ili9488DmaRxChannel =
00163 XDMAD_AllocateChannel( ili9488EbiDma.xdmaD, dstType, srcType);
00164 if ( ili9488EbiDma.ili9488DmaRxChannel == XDMAD_ALLOC_FAILED ) {
00165 return ILI9488_ERROR_DMA_ALLOCATE_CHANNEL;
00166 }
00167
00168
00169 XDMAD_SetCallback(ili9488EbiDma.xdmaD, ili9488EbiDma.ili9488DmaRxChannel,
00170 (XdmadTransferCallback)_ILI9488_Ebi_Rx_CB, &ili9488EbiDma);
00171 if (XDMAD_PrepareChannel( ili9488EbiDma.xdmaD, ili9488EbiDma.ili9488DmaRxChannel ))
00172 return ILI9488_ERROR_DMA_ALLOCATE_CHANNEL;
00173
00174
00175 XDMAD_SetCallback(ili9488EbiDma.xdmaD, ili9488EbiDma.ili9488DmaTxChannel,
00176 (XdmadTransferCallback)_ILI9488_Ebi_Tx_CB, &ili9488EbiDma);
00177 if ( XDMAD_PrepareChannel( ili9488EbiDma.xdmaD, ili9488EbiDma.ili9488DmaTxChannel ))
00178 return ILI9488_ERROR_DMA_ALLOCATE_CHANNEL;
00179
00180
00181 if(!(NVIC_GetActive(XDMAC_IRQn))) {
00182 NVIC_SetPriority( XDMAC_IRQn ,1);
00183
00184 NVIC_EnableIRQ(XDMAC_IRQn);
00185 }
00186 return 0;
00187 }
00188
00189
00190
00191
00192
00193
00194 static uint8_t _ILI9488_EbiDmaConfigureRxTx(void)
00195 {
00196 uint32_t txAddress,rxAddress;
00197 sXdmad *pXdmad;
00198 pXdmad = ili9488EbiDma.xdmaD;
00199
00200 txAddress = rxAddress =(uint32_t)ILI9488_BASE_ADDRESS;
00201
00202
00203 ili9488EbiDma.xdmadTxCfg.mbr_sa = 0;
00204 ili9488EbiDma.xdmadTxCfg.mbr_da = txAddress;
00205 ili9488EbiDma.xdmadTxCfg.mbr_ubc = 0;
00206
00207 ili9488EbiDma.xdmadTxCfg.mbr_cfg =
00208 XDMAC_CC_TYPE_MEM_TRAN
00209 | XDMAC_CC_MBSIZE_SINGLE
00210 | XDMAC_CC_CSIZE_CHK_1
00211 | XDMAC_CC_DWIDTH_HALFWORD
00212 | XDMAC_CC_SIF_AHB_IF0
00213 | XDMAC_CC_DIF_AHB_IF1
00214 | XDMAC_CC_SAM_INCREMENTED_AM
00215 | XDMAC_CC_DAM_FIXED_AM;
00216
00217 ili9488EbiDma.xdmadTxCfg.mbr_bc = 0;
00218 ili9488EbiDma.xdmadTxCfg.mbr_sus = 0;
00219 ili9488EbiDma.xdmadTxCfg.mbr_dus = 0;
00220
00221
00222 ili9488EbiDma.xdmadRxCfg.mbr_ubc =
00223 XDMA_UBC_NVIEW_NDV0 | XDMA_UBC_NDE_FETCH_DIS | XDMA_UBC_NDEN_UPDATED ;
00224 ili9488EbiDma.xdmadRxCfg.mbr_da = 0;
00225 ili9488EbiDma.xdmadRxCfg.mbr_sa = rxAddress;
00226
00227 ili9488EbiDma.xdmadRxCfg.mbr_cfg =
00228 XDMAC_CC_TYPE_MEM_TRAN
00229 | XDMAC_CC_MBSIZE_SINGLE
00230 | XDMAC_CC_CSIZE_CHK_1
00231 | XDMAC_CC_DWIDTH_WORD
00232 | XDMAC_CC_SIF_AHB_IF1
00233 | XDMAC_CC_DIF_AHB_IF0
00234 | XDMAC_CC_SAM_FIXED_AM
00235 | XDMAC_CC_DAM_INCREMENTED_AM;
00236
00237 ili9488EbiDma.xdmadRxCfg.mbr_bc = 0;
00238 ili9488EbiDma.xdmadRxCfg.mbr_sus = 0;
00239 ili9488EbiDma.xdmadRxCfg.mbr_dus =0;
00240
00241
00242 ili9488EbiDma.xdmaInt = (XDMAC_CIE_BIE
00243 | XDMAC_CIE_RBIE
00244 | XDMAC_CIE_WBIE
00245 | XDMAC_CIE_ROIE);
00246
00247 if (XDMAD_ConfigureTransfer( pXdmad, ili9488EbiDma.ili9488DmaRxChannel,
00248 &ili9488EbiDma.xdmadRxCfg, 0, 0, ili9488EbiDma.xdmaInt))
00249 return ILI9488_ERROR_DMA_CONFIGURE;
00250
00251 if (XDMAD_ConfigureTransfer( pXdmad, ili9488EbiDma.ili9488DmaTxChannel,
00252 &ili9488EbiDma.xdmadTxCfg, 0, 0, ili9488EbiDma.xdmaInt))
00253 return ILI9488_ERROR_DMA_CONFIGURE;
00254 return 0;
00255 }
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266 static uint8_t _ILI9488_EbiDmaUpdateBuffer(uint16_t *pTxBuffer,uint32_t wTxSize,
00267 uint32_t *pRxBuffer,uint32_t wRxSize)
00268 {
00269 sXdmad *pXdmad;
00270 pXdmad = ili9488EbiDma.xdmaD;
00271
00272 ili9488EbiDma.xdmadTxCfg.mbr_sa = (uint32_t)pTxBuffer;
00273 ili9488EbiDma.xdmadTxCfg.mbr_ubc = wTxSize;
00274 if (wRxSize) {
00275 ili9488EbiDma.xdmadRxCfg.mbr_da = (uint32_t)pRxBuffer;
00276 ili9488EbiDma.xdmadRxCfg.mbr_ubc = wRxSize;
00277 if (XDMAD_ConfigureTransfer( pXdmad, ili9488EbiDma.ili9488DmaRxChannel,
00278 &ili9488EbiDma.xdmadRxCfg, 0, 0, ili9488EbiDma.xdmaInt))
00279 return ILI9488_ERROR_DMA_CONFIGURE;
00280 }
00281 if (XDMAD_ConfigureTransfer( pXdmad, ili9488EbiDma.ili9488DmaTxChannel,
00282 &ili9488EbiDma.xdmadTxCfg, 0, 0, ili9488EbiDma.xdmaInt))
00283 return ILI9488_ERROR_DMA_CONFIGURE;
00284 return 0;
00285 }
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296 uint8_t ILI9488_EbiInitializeWithDma(sXdmad * dmad)
00297 {
00298 _ILI9488_ConfigureSmc();
00299 _ILI9488_EbiDmaInitialize(dmad);
00300 if (_ILI9488_EbiDmaConfigChannels()) return ILI9488_ERROR_DMA_ALLOCATE_CHANNEL;
00301 if(_ILI9488_EbiDmaConfigureRxTx()) return ILI9488_ERROR_DMA_CONFIGURE;
00302 return 0;
00303 }
00304
00305
00306
00307
00308
00309
00310
00311
00312 uint8_t ILI9488_EbiDmaTxTransfer( uint16_t *pTxBuffer,uint32_t wTxSize)
00313 {
00314 _ILI9488_EbiDmaUpdateBuffer(pTxBuffer, wTxSize, 0, 0);
00315 SCB_CleanInvalidateDCache();
00316 if (XDMAD_StartTransfer( ili9488EbiDma.xdmaD, ili9488EbiDma.ili9488DmaTxChannel))
00317 return ILI9488_ERROR_DMA_TRANSFER;
00318 while(!ili9488DmaCtlInEbiMode.txDoneFlag);
00319 ili9488DmaCtlInEbiMode.txDoneFlag = 0;
00320
00321 return 0;
00322 }
00323
00324
00325
00326
00327
00328
00329
00330
00331 uint8_t ILI9488_EbiDmaRxTransfer(uint32_t *pRxBuffer,uint32_t wRxSize)
00332 {
00333 uint16_t dummyTxBuffer[5];
00334
00335 _ILI9488_EbiDmaUpdateBuffer(dummyTxBuffer, wRxSize, pRxBuffer, wRxSize);
00336
00337 SCB_CleanInvalidateDCache();
00338 if (XDMAD_StartTransfer( ili9488EbiDma.xdmaD, ili9488EbiDma.ili9488DmaRxChannel))
00339 return ILI9488_ERROR_DMA_TRANSFER;
00340
00341 return 0;
00342 }
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353 uint8_t ILI9488_EbiSendCommand(uint16_t Instr, uint16_t *pTxData,
00354 uint32_t *pRxData, AccessIli_t ReadWrite, uint32_t size)
00355 {
00356 if(ReadWrite == AccessInst) {
00357 PIO_Clear(&lcd_ebi_cds_pin);
00358 ili9488DmaCtlInEbiMode.cmdOrDataFlag = 1;
00359 return ILI9488_EbiDmaTxTransfer( &Instr, 1 );
00360 } else if (ReadWrite == AccessWrite) {
00361 PIO_Clear(&lcd_ebi_cds_pin);
00362 ili9488DmaCtlInEbiMode.cmdOrDataFlag = 1;
00363 ILI9488_EbiDmaTxTransfer( &Instr, 1 );
00364 if(size == 0) return 0;
00365 ILI9488_EbiDmaTxTransfer( pTxData, size);
00366 return 0;
00367 } else {
00368 ili9488DmaCtlInEbiMode.rxDoneFlag = 0;
00369 ILI9488_EbiDmaRxTransfer( pRxData, size);
00370 while(!ili9488DmaCtlInEbiMode.rxDoneFlag);
00371 }
00372 return 0;
00373 }
00374 #endif //BOARD_LCD_ILI9488