Some cleaning.

Fixed and tested DMA blitarea for SSD1963.
This commit is contained in:
mobyfab 2012-09-18 22:55:02 +02:00
parent 8e89654081
commit da83b0955f
3 changed files with 71 additions and 60 deletions

View File

@ -185,22 +185,25 @@ bool_t GDISP_LLD(init)(void) {
#if defined(LCD_USE_FSMC) #if defined(LCD_USE_FSMC)
#if defined(LCD_USE_DMA) && defined(LCD_DMA_STREAM) #if defined(STM32F1XX) || defined(STM32F3XX)
if (dmaStreamAllocate(LCD_DMA_STREAM, 0, NULL, NULL)) chSysHalt(); /* FSMC setup for F1/F3 */
dmaStreamSetMemory0(LCD_DMA_STREAM, &LCD_RAM); rccEnableAHB(RCC_AHBENR_FSMCEN, 0);
dmaStreamSetMode(LCD_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M);
#endif
#if defined(STM32F1XX) || defined(STM32F3XX) #if defined(LCD_USE_DMA) && defined(LCD_DMA_STREAM)
/* FSMC setup for F1/F3 */ #error "DMA not implemented for F1/F3 Devices"
rccEnableAHB(RCC_AHBENR_FSMCEN, 0); #endif
#elif defined(STM32F4XX) || defined(STM32F2XX)
#elif defined(STM32F4XX) || defined(STM32F2XX) /* STM32F2-F4 FSMC init */
/* STM32F2-F4 FSMC init */ rccEnableAHB3(RCC_AHB3ENR_FSMCEN, 0);
rccEnableAHB3(RCC_AHB3ENR_FSMCEN, 0);
#else #if defined(LCD_USE_DMA) && defined(LCD_DMA_STREAM)
#error "FSMC not implemented for this device" if (dmaStreamAllocate(LCD_DMA_STREAM, 0, NULL, NULL)) chSysHalt();
#endif dmaStreamSetMemory0(LCD_DMA_STREAM, &LCD_RAM);
dmaStreamSetMode(LCD_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M);
#endif
#else
#error "FSMC not implemented for this device"
#endif
/* set pins to FSMC mode */ /* set pins to FSMC mode */
IOBus busD = {GPIOD, (1 << 0) | (1 << 1) | (1 << 4) | (1 << 5) | (1 << 7) | (1 << 8) | IOBus busD = {GPIOD, (1 << 0) | (1 << 1) | (1 << 4) | (1 << 5) | (1 << 7) | (1 << 8) |
@ -222,14 +225,14 @@ bool_t GDISP_LLD(init)(void) {
* This is actually not needed as already set by default after reset */ * This is actually not needed as already set by default after reset */
FSMC_Bank1->BTCR[FSMC_Bank] = FSMC_BCR1_MWID_0 | FSMC_BCR1_WREN | FSMC_BCR1_MBKEN; FSMC_Bank1->BTCR[FSMC_Bank] = FSMC_BCR1_MWID_0 | FSMC_BCR1_WREN | FSMC_BCR1_MBKEN;
#elif defined(LCD_USE_GPIO) #elif defined(LCD_USE_GPIO)
IOBus busCMD = {LCD_CMD_PORT, (1 << LCD_CS) | (1 << LCD_RS) | (1 << LCD_WR) | (1 << LCD_RD), 0}; IOBus busCMD = {LCD_CMD_PORT, (1 << LCD_CS) | (1 << LCD_RS) | (1 << LCD_WR) | (1 << LCD_RD), 0};
IOBus busDATA = {LCD_CMD_PORT, 0xFFFFF, 0}; IOBus busDATA = {LCD_CMD_PORT, 0xFFFFF, 0};
palSetBusMode(&busCMD, PAL_MODE_OUTPUT_PUSHPULL); palSetBusMode(&busCMD, PAL_MODE_OUTPUT_PUSHPULL);
palSetBusMode(&busDATA, PAL_MODE_OUTPUT_PUSHPULL); palSetBusMode(&busDATA, PAL_MODE_OUTPUT_PUSHPULL);
#else #else
#error "Please define LCD_USE_FSMC or LCD_USE_GPIO" #error "Please define LCD_USE_FSMC or LCD_USE_GPIO"
#endif #endif
GDISP_LLD(writeindex)(SSD1963_SOFT_RESET); GDISP_LLD(writeindex)(SSD1963_SOFT_RESET);
chThdSleepMicroseconds(100); chThdSleepMicroseconds(100);
@ -296,11 +299,11 @@ bool_t GDISP_LLD(init)(void) {
/* Turn on */ /* Turn on */
GDISP_LLD(writeindex)(SSD1963_SET_DISPLAY_ON); GDISP_LLD(writeindex)(SSD1963_SET_DISPLAY_ON);
#if defined(LCD_USE_FSMC) #if defined(LCD_USE_FSMC)
/* FSMC delay reduced as the controller now runs at full speed */ /* FSMC delay reduced as the controller now runs at full speed */
FSMC_Bank1->BTCR[FSMC_Bank+1] = FSMC_BTR1_ADDSET_0 | FSMC_BTR1_DATAST_2 | FSMC_BTR1_BUSTURN_0 ; FSMC_Bank1->BTCR[FSMC_Bank+1] = FSMC_BTR1_ADDSET_0 | FSMC_BTR1_DATAST_2 | FSMC_BTR1_BUSTURN_0 ;
FSMC_Bank1->BTCR[FSMC_Bank] = FSMC_BCR1_MWID_0 | FSMC_BCR1_WREN | FSMC_BCR1_MBKEN; FSMC_Bank1->BTCR[FSMC_Bank] = FSMC_BCR1_MWID_0 | FSMC_BCR1_WREN | FSMC_BCR1_MBKEN;
#endif #endif
/* Initialise the GDISP structure to match */ /* Initialise the GDISP structure to match */
GDISP.Width = SCREEN_WIDTH; GDISP.Width = SCREEN_WIDTH;
@ -387,20 +390,23 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
GDISP_LLD(setwindow)(x, y, x+cx-1, y+cy-1); GDISP_LLD(setwindow)(x, y, x+cx-1, y+cy-1);
GDISP_LLD(writestreamstart)(); GDISP_LLD(writestreamstart)();
#if defined(LCD_USE_FSMC) && defined(LCD_USE_DMA) && defined(LCD_DMA_STREAM) #if defined(LCD_USE_FSMC) && defined(LCD_USE_DMA) && defined(LCD_DMA_STREAM)
uint16_t i, splitarea; uint8_t i;
dmaStreamSetPeripheral(LCD_DMA_STREAM, &color); dmaStreamSetPeripheral(LCD_DMA_STREAM, &color);
for (i = (area/65535)+1; i > 0; i--) { dmaStreamSetMode(LCD_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M);
if (i <= 1) splitarea = area%65535; else splitarea = 65535; for (i = area/65535; i; i--) {
dmaStreamSetTransactionSize(LCD_DMA_STREAM, splitarea); dmaStreamSetTransactionSize(LCD_DMA_STREAM, 65535);
dmaStreamEnable(LCD_DMA_STREAM);
dmaWaitCompletion(LCD_DMA_STREAM);
}
dmaStreamSetTransactionSize(LCD_DMA_STREAM, area%65535);
dmaStreamEnable(LCD_DMA_STREAM); dmaStreamEnable(LCD_DMA_STREAM);
dmaWaitCompletion(LCD_DMA_STREAM); dmaWaitCompletion(LCD_DMA_STREAM);
} #else
#else uint32_t index;
uint32_t index, for(index = 0; index < area; index++)
for(index = 0; index < area; index++) GDISP_LLD(writedata)(color);
GDISP_LLD(writedata)(color); #endif //#ifdef LCD_USE_DMA
#endif //#ifdef LCD_USE_DMA
} }
#endif #endif
@ -433,26 +439,29 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
buffer += srcx + srcy * srccx; buffer += srcx + srcy * srccx;
#if defined(LCD_USE_FSMC) && defined(LCD_USE_DMA) && defined(LCD_DMA_STREAM) #if defined(LCD_USE_FSMC) && defined(LCD_USE_DMA) && defined(LCD_DMA_STREAM)
uint32_t area = cx*cy; uint32_t area = cx*cy;
uint16_t i, splitarea; uint8_t i;
dmaStreamSetPeripheral(LCD_DMA_STREAM, buffer); dmaStreamSetPeripheral(LCD_DMA_STREAM, buffer);
for (i = (area/65535)+1; i > 0; i--) { dmaStreamSetMode(LCD_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PINC | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M);
if (i <= 1) splitarea = area%65535; else splitarea = 65535; for (i = area/65535; i; i--) {
dmaStreamSetTransactionSize(LCD_DMA_STREAM, splitarea); dmaStreamSetTransactionSize(LCD_DMA_STREAM, 65535);
dmaStreamEnable(LCD_DMA_STREAM);
dmaWaitCompletion(LCD_DMA_STREAM);
}
dmaStreamSetTransactionSize(LCD_DMA_STREAM, area%65535);
dmaStreamEnable(LCD_DMA_STREAM); dmaStreamEnable(LCD_DMA_STREAM);
dmaWaitCompletion(LCD_DMA_STREAM); dmaWaitCompletion(LCD_DMA_STREAM);
} #else
#else coord_t endx, endy;
coord_t endx, endy; unsigned lg;
unsigned lg; endx = srcx + cx;
endx = srcx + cx; endy = y + cy;
endy = y + cy; lg = srccx - cx;
lg = srccx - cx; for(; y < endy; y++, buffer += lg)
for(; y < endy; y++, buffer += lg) for(x=srcx; x < endx; x++)
for(x=srcx; x < endx; x++) GDISP_LLD(writedata)(*buffer++);
GDISP_LLD(writedata)(*buffer++); #endif //#ifdef LCD_USE_DMA
#endif //#ifdef LCD_USE_DMA
} }
#endif #endif

View File

@ -39,10 +39,10 @@
#define GDISP_LLD(x) gdisp_lld_##x##_SSD1963 #define GDISP_LLD(x) gdisp_lld_##x##_SSD1963
#define GDISP_HARDWARE_FILLS TRUE #define GDISP_HARDWARE_FILLS TRUE
#define GDISP_HARDWARE_BITFILLS TRUE #define GDISP_HARDWARE_BITFILLS TRUE
/* Maybe someday soon */ /* Maybe someday soon */
#define GDISP_HARDWARE_SCROLL FALSE #define GDISP_HARDWARE_SCROLL FALSE
#define GDISP_HARDWARE_CONTROL FALSE #define GDISP_HARDWARE_CONTROL FALSE
#define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB565 #define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB565

View File

@ -52,7 +52,7 @@
/*===========================================================================*/ /*===========================================================================*/
/* Driver local variables. */ /* Driver local variables. */
/*===========================================================================*/ /*===========================================================================*/
volatile static struct cal cal = { static volatile struct cal cal = {
1, 1, 0, 0 1, 1, 0, 0
}; };
@ -167,7 +167,8 @@ uint16_t tpReadX(void) {
return SCREEN_WIDTH - x; return SCREEN_WIDTH - x;
case landscapeInv: case landscapeInv:
return y; return y;
} }
return 0;
} }
/** /**
@ -193,6 +194,7 @@ uint16_t tpReadY(void) {
case landscapeInv: case landscapeInv:
return SCREEN_WIDTH - x; return SCREEN_WIDTH - x;
} }
return 0;
} }
void tpCalibrate(void) { void tpCalibrate(void) {
@ -202,7 +204,7 @@ void tpCalibrate(void) {
uint16_t points[2][2]; uint16_t points[2][2];
uint8_t i; uint8_t i;
gdispClear(Red); gdispClear(Red);
gdispFillStringBox(0, 10, gdispGetWidth(), 30, "Calibration", &fontUI2Double, White, Red, justifyCenter); gdispFillStringBox(0, 10, gdispGetWidth(), 30, "Calibration", &fontUI2Double, White, Red, justifyCenter);
for(i = 0; i < 2; i++) { for(i = 0; i < 2; i++) {