/** Initialize Direct Drive. This function is called from emWin during initialization. */ void initDisplayController(void) { /* Set up Direct Drive and configure display controller */ TFT_DirectInit(&tftInit); /* Enable the interrupt on VSYNC, generated from Direct Drive */ enableVsyncInterrupt(); }
/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { uint16_t *frameBuffer; bool redraw; /* Configure for 48MHz HFXO operation of core clock */ CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFXO); /* Setup SysTick Timer for 1 msec interrupts */ if (SysTick_Config(CMU_ClockFreqGet(cmuClock_CORE) / 1000)) { while (1) ; } /* Initialize EBI banks (Board Controller, external PSRAM, ..) */ BSP_Init(BSP_INIT_DEFAULT); /* If first word of user data page is non-zero, enable eA Profiler trace */ BSP_TraceProfilerSetup(); /* Indicate we are waiting for AEM button state enable EFM32GG */ BSP_LedsSet(0x8001); while (BSP_RegisterRead(&BC_REGISTER->UIF_AEM) != BC_UIF_AEM_EFM) { /* Show a short "strobe light" on DK LEDs, indicating wait */ BSP_LedsSet(0x8001); Delay(200); BSP_LedsSet(0x4002); Delay(50); } /* Set frame buffer start address */ frameBuffer = (uint16_t *) EBI_BankAddress(EBI_BANK2); /* Loop demo forever */ while (1) { redraw = TFT_DirectInit(&tftInit); if (redraw) { /* Inidicate that we are in active drawing mode */ BSP_LedsSet(0x0000); /* Update frame buffer */ TFT_DrawScreen(frameBuffer); /* Wait slightly before next update */ Delay(100); } else { /* Sleep - no need to update display */ BSP_LedsSet(0x8001); Delay(200); } } }
/* Initialize LCD in Direct mode and touch panel */ void LCD_InitializeLCD(void) { TOUCH_Config_TypeDef touch_init = TOUCH_INIT_DEFAULT; TFT_DirectInit(&tftInit); _SetVRAMAddr((void *)(VRAM_pointer + EBI_BankAddress(EBI_BANK2))); _SetOrg(orgx, orgy); /* Initialize touch panel driver and register upcall function */ TOUCH_Init(&touch_init); TOUCH_RegisterUpcall(LCD_TOUCH_Upcall); }
void LCD_X_InitDriver(void) { /* Set up Direct Drive and configure display controller */ TFT_DirectInit(&tftInit); /* Enable the interrupt on VSYNC, generated from Direct Drive */ /* Disable all EBI interrupts */ EBI_IntDisable(_EBI_IF_MASK); /* Clear previous interrupts */ EBI_IntClear(_EBI_IF_MASK); /* Enable VSYNC interrupt */ EBI_IntEnable(EBI_IF_VSYNC); /* Enable EBI interrupts in core */ NVIC_ClearPendingIRQ(EBI_IRQn); NVIC_EnableIRQ(EBI_IRQn); }
/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { uint32_t buttons; POINT P[ 3 ]; TOUCH_Config_TypeDef touch_config = TOUCH_INIT_DEFAULT; const char readmeText[] = \ "USB Bitmap transfer using USB drive functionality.\r\n\r\n"\ "This example demonstrate use several functionalities:\r\n"\ "1. Creation of virtual drive in system with FAT FS,\r\n"\ "2. Mounting the drive on PC and file transfer,\r\n"\ "3. Bitmap file creation based on TFT frame buffer content,\r\n"\ "4. Resistive touch panel interaction.\r\n\r\n"\ "On system startup initial drive is created and\r\n"\ "formatted using FAT FS then simple readme.txt file\r\n"\ "is put on file system. Every time user press PB4 key\r\n"\ "new file, containing TFT frame buffer in bitmap format\r\n"\ "is added. All files could be retrieved after connecting\r\n"\ "board to PC by means of USB. For this connection use\r\n"\ "small USB socket located on Leopard Gecko CPU board, not\r\n"\ "the big one on development kit.\r\n\r\n"\ "If new files doesn't appear on drive after pressing PB4,\r\n"\ "try to reconnect the board to PC.\r\n\r\n"\ "Board: Energy Micro EFM32LG-DK3650 Development Kit\r\n"\ "Device: EFM32LG990F256\r\n"; /* Configure for 48MHz HFXO operation of core clock */ CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFXO); /* Initialize DK board register access */ BSP_Init(BSP_INIT_DEFAULT); /* If first word of user data page is non-zero, enable eA Profiler trace */ BSP_TraceProfilerSetup(); CMU_ClockEnable(cmuClock_GPIO, true); CMU_ClockEnable( cmuClock_ADC0, true); /* Set frame buffer start address */ frameBuffer = (uint16_t *) EBI_BankAddress(EBI_BANK2); /* Make sure CYCCNT is running, needed by delay functions. */ DWT_CTRL |= 1; /* Initialize USB subsystem and prepare for taking pictures */ BITMAP_Init(); /* Create our first file on disk - simple readme */ BITMAP_CreateFileAndSaveData("README.TXT", readmeText, sizeof(readmeText)); /* Indicate we are waiting for AEM button state enabling EFM */ while (BSP_RegisterRead(&BC_REGISTER->UIF_AEM) != BC_UIF_AEM_EFM) { /* Show a short "strobe light" on DK LEDs, indicating wait */ BSP_LedsSet(0x8001); delayMs(100); BSP_LedsSet(0x4002); delayMs(100); } touch_config.frequency = 13000000; /* use max ADC frequency */ touch_config.ignore = 0; /* notice every move, even 1 pixel */ TOUCH_Init(&touch_config); /* Initialize touch screen calibration factor matrix with approx. values */ setCalibrationMatrix( (POINT*)&lcdCalibPoints, /* Display coordinates */ (POINT*)&touchCalibPoints, /* Touch coordinates */ &calibFactors ); /* Calibration factor matrix */ while (1) { delayMs(100); if ( TFT_DirectInit(&tftInit) ) { delayMs(100); displayHelpScreen(); BSP_LedsSet(0x0000); BSP_PeripheralAccess(BSP_TOUCH, true); GPIO_PinModeSet(LCD_TOUCH_X1, gpioModeInput, 0); GPIO_PinModeSet(LCD_TOUCH_X2, gpioModeInput, 0); GPIO_PinModeSet(LCD_TOUCH_Y1, gpioModeInput, 0); GPIO_PinModeSet(LCD_TOUCH_Y2, gpioModeInput, 0); do { delayMs(25); buttons = readButtons(); /* Draw on screen */ if ( buttons & BC_UIF_PB1 ) { memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT ); /* Clear screen */ do { TOUCH_Pos_TypeDef *pos = TOUCH_GetPos(); if ( pos->pen ) drawPixel( pos->x, pos->y, COLOR ); delayMs(1); buttons = readButtons() & ~BC_UIF_PB1; if(buttons == BC_UIF_PB4) { getNicePicture(); buttons &= ~BC_UIF_PB4; } } while ( buttons == 0 ); } /* Calibrate touch screen */ else if ( buttons & BC_UIF_PB2 ) { memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT ); /* Clear screen */ drawCross( lcdCalibPoints[ 0 ].x, lcdCalibPoints[ 0 ].y, COLOR ); TFT_DrawString(30, 35, "Tap green marker" ); P[ 0 ] = getTouchTapSample10bit(); memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT ); /* Clear screen */ drawCross( lcdCalibPoints[ 1 ].x, lcdCalibPoints[ 1 ].y, COLOR ); TFT_DrawString(40, 130, "Tap green marker" ); P[ 1 ] = getTouchTapSample10bit(); memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT ); /* Clear screen */ drawCross( lcdCalibPoints[ 2 ].x, lcdCalibPoints[ 2 ].y, COLOR ); TFT_DrawString(20, 180, "Tap green marker" ); P[ 2 ] = getTouchTapSample10bit(); TOUCH_CalibrationTable((POINT*)&lcdCalibPoints,/* Display coordinates*/ &P[0]); /* Touch coordinates */ memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT ); /* Clear screen */ TFT_DrawString(10, 100, "The touch screen is" ); TFT_DrawString(30, 130, "now calibrated !" ); } /* Display help screen */ else if ( buttons & BC_UIF_PB3 ) { displayHelpScreen(); while ( readButtons() & BC_UIF_PB3 ) delayMs(50); } else if( buttons & BC_UIF_PB4 ) { getNicePicture(); } } while ( ( buttons & EXIT_LOOP ) == 0 ); } else { BSP_LedsSet(0x8001); delayMs(100); BSP_LedsSet(0x4002); } } }
/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { bool redraw; /* Configure for 48MHz HFXO operation of core clock */ CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFXO); /* Setup SysTick Timer for 1 msec interrupts */ if (SysTick_Config(CMU_ClockFreqGet(cmuClock_CORE) / 1000)) { while (1) ; } /* Initialize EBI banks (Board Controller, external PSRAM, ..) */ BSP_Init(BSP_INIT_DEFAULT); /* If first word of user data page is non-zero, enable eA Profiler trace */ BSP_TraceProfilerSetup(); /* Indicate we are waiting for AEM button state enable EFM32WG */ BSP_LedsSet(0x8001); while (BSP_RegisterRead(&BC_REGISTER->UIF_AEM) != BC_UIF_AEM_EFM) { /* Show a short "strobe light" on DK LEDs, indicating wait */ BSP_LedsSet(0x8001); Delay(200); BSP_LedsSet(0x4002); Delay(50); } /* Initialize scroll text pointer */ scrollptr = scrolltext; /* Initial initialization, enables clocks etc */ redraw = TFT_DirectInit(&tftInit); /* Configure common settings */ EBI_TFTHStrideSet((V_WIDTH - D_WIDTH) * 2); TFT_IRQEnable(EBI_IF_VFPORCH | EBI_IF_HSYNC); TFT_DisplayClear(); /* Loop demo forever */ while (1) { /* If necessary, reinitalize display and report back if we are active */ redraw = TFT_DirectInit(&tftInit); if (redraw) { /* Inidicate that we are in active drawing mode */ BSP_LedsSet(0x0000); /* Update frame buffer - do a simple block copy */ TFT_DrawString(0, 10, " Regular copy "); TFT_DrawRectangle(0, 50, D_WIDTH, 140, DARKGREEN); TFT_DrawGraphics(); EBI_TFTMaskBlendMode(ebiTFTMBDisabled); Delay(1000); /* Update frame buffer - enable masking */ TFT_DrawString(0, 10, " Masking "); TFT_DrawRectangle(0, 50, D_WIDTH, 140, DARKGREEN); EBI_TFTMaskSet(0x0000); EBI_TFTMaskBlendMode(ebiTFTMBEMask); TFT_DrawGraphics(); EBI_TFTMaskBlendMode(ebiTFTMBDisabled); Delay(1000); /* Update frame buffer - enable masking and blending */ TFT_DrawString(0, 10, " Masking & Blending "); TFT_DrawRectangle(0, 50, D_WIDTH, 140, DARKGREEN); EBI_TFTMaskBlendMode(ebiTFTMBEMaskAlpha); TFT_DrawGraphics(); EBI_TFTMaskBlendMode(ebiTFTMBDisabled); Delay(1000); } else { /* Sleep - no need to update display */ BSP_LedsSet(0x8001); /* Instead of this, we could go into energy mode 3 */ /* waiting for an interrupt on GPIO/keypress */ Delay(200); } } }
/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { uint32_t buttons; POINT touchSample, P[ 3 ]; ADC_Init_TypeDef init = ADC_INIT_DEFAULT; /* Configure for 48MHz HFXO operation of core clock */ CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFXO); /* Initialize DK board register access */ BSP_Init(BSP_INIT_DEFAULT); /* If first word of user data page is non-zero, enable eA Profiler trace */ BSP_TraceProfilerSetup(); CMU_ClockEnable(cmuClock_GPIO, true); CMU_ClockEnable( cmuClock_ADC0, true); /* Max ADC clock is 13MHz, use 14MHz/(1+1) or 48MHz/(5+1) */ init.prescale = 5; ADC_Init(ADC0, &init); sInit.reference = adcRefVDD; /* Set frame buffer start address */ frameBuffer = (uint16_t *) EBI_BankAddress(EBI_BANK2); /* Make sure CYCCNT is running, needed by delay functions. */ DWT_CTRL |= 1; /* Indicate we are waiting for AEM button state enabling EFM */ BSP_LedsSet(0x8001); while (BSP_RegisterRead(&BC_REGISTER->UIF_AEM) != BC_UIF_AEM_EFM) { /* Show a short "strobe light" on DK LEDs, indicating wait */ BSP_LedsSet(0x8001); delayMs(200); BSP_LedsSet(0x4002); delayMs(50); } /* Initialize touch screen calibration factor matrix with approx. values */ setCalibrationMatrix( (POINT*)&lcdCalibPoints, /* Display coordinates */ (POINT*)&touchCalibPoints, /* Touch coordinates */ &calibFactors ); /* Calibration factor matrix */ while (1) { if ( TFT_DirectInit(&tftInit) ) { displayHelpScreen(); BSP_LedsSet(0x0000); BSP_PeripheralAccess(BSP_TOUCH, true); GPIO_PinModeSet(LCD_TOUCH_X1, gpioModeInput, 0); GPIO_PinModeSet(LCD_TOUCH_X2, gpioModeInput, 0); GPIO_PinModeSet(LCD_TOUCH_Y1, gpioModeInput, 0); GPIO_PinModeSet(LCD_TOUCH_Y2, gpioModeInput, 0); do { buttons = readButtons(); /* Draw on screen */ if ( buttons & BC_UIF_PB1 ) { memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT ); /* Clear screen */ do { if ( touched() ) { touchSample = getTouchSample(); drawPixel( touchSample.x, touchSample.y, COLOR ); } delayMs( 2 ); buttons = readButtons() & ~BC_UIF_PB1; } while ( buttons == 0 ); } /* Calibrate touch screen */ else if ( buttons & BC_UIF_PB2 ) { memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT ); /* Clear screen */ drawCross( lcdCalibPoints[ 0 ].x, lcdCalibPoints[ 0 ].y, COLOR ); TFT_DrawString(30, 35, "Tap green marker" ); P[ 0 ] = getTouchTapSample10bit(); memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT ); /* Clear screen */ drawCross( lcdCalibPoints[ 1 ].x, lcdCalibPoints[ 1 ].y, COLOR ); TFT_DrawString(40, 130, "Tap green marker" ); P[ 1 ] = getTouchTapSample10bit(); memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT ); /* Clear screen */ drawCross( lcdCalibPoints[ 2 ].x, lcdCalibPoints[ 2 ].y, COLOR ); TFT_DrawString(20, 180, "Tap green marker" ); P[ 2 ] = getTouchTapSample10bit(); setCalibrationMatrix( (POINT*)&lcdCalibPoints,/* Display coordinates*/ &P[0], /* Touch coordinates */ &calibFactors ); /* Calibration factor matrix*/ memset( frameBuffer, BLACK, 2 * WIDTH * HEIGHT ); /* Clear screen */ TFT_DrawString(10, 100, "The touch screen is" ); TFT_DrawString(30, 130, "now calibrated !" ); } /* Display help screen */ else if ( buttons & BC_UIF_PB3 ) { displayHelpScreen(); while ( readButtons() & BC_UIF_PB3 ) {} } } while ( ( buttons & EXIT_LOOP ) == 0 ); } else { BSP_LedsSet(0x8001); delayMs(200); } } }