diff options
author | mobyfab <mobyfab@free.fr> | 2012-09-17 19:35:10 +0200 |
---|---|---|
committer | mobyfab <mobyfab@free.fr> | 2012-09-17 19:35:10 +0200 |
commit | ac228656ae741e7f9253e4c9238b702cad896cd8 (patch) | |
tree | 4ed96b512495586c172bc3de42baf97f2c8e8f6e /drivers | |
parent | 9921d74243cad8b8f18cb1dc0265a502f8e3265c (diff) | |
download | uGFX-ac228656ae741e7f9253e4c9238b702cad896cd8.tar.gz uGFX-ac228656ae741e7f9253e4c9238b702cad896cd8.tar.bz2 uGFX-ac228656ae741e7f9253e4c9238b702cad896cd8.zip |
DMA fixes, splitting the requests since 65535 is the max count
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gdisp/SSD1963/gdisp_lld.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/drivers/gdisp/SSD1963/gdisp_lld.c b/drivers/gdisp/SSD1963/gdisp_lld.c index 2b4fcaf5..50f163bb 100644 --- a/drivers/gdisp/SSD1963/gdisp_lld.c +++ b/drivers/gdisp/SSD1963/gdisp_lld.c @@ -388,10 +388,15 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) { if (area > 1000) { // Do not use DMA for small areas
dmaStreamSetPeripheral(LCD_DMA_STREAM, &color);
dmaStreamSetMemory0(LCD_DMA_STREAM, LCD_RAM);
- dmaStreamSetTransactionSize(LCD_DMA_STREAM, area);
- dmaStreamSetMode(LCD_DMA_STREAM, STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M | STM32_DMA_CR_EN);
-
- while ((LCD_DMA_STREAM)->stream->NDTR > 0) chThdSleepMilliseconds(1);
+ uint32_t i;
+ uint16_t splitarea;
+ for (i = (area/65535)+1; i > 0; i--) {
+ if (i <= 1) splitarea = area%65535;
+ else splitarea = 65535;
+ dmaStreamSetTransactionSize(LCD_DMA_STREAM, splitarea);
+ dmaStreamSetMode(LCD_DMA_STREAM, STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M | STM32_DMA_CR_EN);
+ while ((LCD_DMA_STREAM)->stream->NDTR > 0) chThdSleepMilliseconds(5);
+ }
}
else {
for(index = 0; index < area; index++)
@@ -444,10 +449,15 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) { if (area > 1000) { // Do not use DMA for small areas
dmaStreamSetPeripheral(LCD_DMA_STREAM, buffer);
dmaStreamSetMemory0(LCD_DMA_STREAM, LCD_RAM);
- dmaStreamSetTransactionSize(LCD_DMA_STREAM, area);
- dmaStreamSetMode(LCD_DMA_STREAM, STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_PINC | STM32_DMA_CR_DIR_M2M | STM32_DMA_CR_EN);
-
- while ((LCD_DMA_STREAM)->stream->NDTR > 0) chThdSleepMilliseconds(1);
+ uint32_t i;
+ uint16_t splitarea;
+ for (i = (area/65535)+1; i > 0; i--) {
+ if (i <= 1) splitarea = area%65535;
+ else splitarea = 65535;
+ dmaStreamSetTransactionSize(LCD_DMA_STREAM, splitarea);
+ dmaStreamSetMode(LCD_DMA_STREAM, STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_PINC | STM32_DMA_CR_DIR_M2M | STM32_DMA_CR_EN);
+ while ((LCD_DMA_STREAM)->stream->NDTR > 0) chThdSleepMilliseconds(5);
+ }
}
else {
for(; y < endy; y++, buffer += lg)
|