Mercurial > public > ostc4
diff Discovery/Src/display.c @ 38:5f11787b4f42
include in ostc4 repository
author | heinrichsweikamp |
---|---|
date | Sat, 28 Apr 2018 11:52:34 +0200 |
parents | |
children | 5ca177d2df5d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Discovery/Src/display.c Sat Apr 28 11:52:34 2018 +0200 @@ -0,0 +1,284 @@ + +#include "stm32f4xx_hal.h" /* for HAL_Delay() */ +#include "ostc.h" +#include "display.h" + +#define ENABLE_EXTENDED_COMMANDS 0xB9 +#define SET_POWER 0xB1 +#define SLEEP_OUT 0x11 +#define DISPLAY_INVERSION_OFF 0x20 +#define MEMORY_ACCESS_ONTROL 0x36 +#define INTERFACE_PIXEL_FORMAT 0x3A +#define SET_RGB_INTERFACE_RELATED 0xB3 +#define SET_DISPLAY_WAVEFORM 0xB4 +#define SET_PANEL 0xCC +#define SET_GAMMA_CURVE_RELATED 0xE0 +#define DISPLAY_ON 0x29 +#define DISPLAY_OFF 0x28 +#define SLEEP_IN 0x10 + + +static void Display_Error_Handler(void); + +void display_power_on__1_of_2__pre_RGB(void) +{ + /* reset system */ + HAL_GPIO_WritePin(DISPLAY_CSB_GPIO_PORT,DISPLAY_CSB_PIN,GPIO_PIN_SET); // chip select + + HAL_GPIO_WritePin(DISPLAY_RESETB_GPIO_PORT,DISPLAY_RESETB_PIN,GPIO_PIN_RESET); + HAL_Delay(10); + HAL_GPIO_WritePin(DISPLAY_RESETB_GPIO_PORT,DISPLAY_RESETB_PIN,GPIO_PIN_SET); + HAL_Delay(10); + + /* RGB signals should be now for 2 frames or more (datasheet) */ +} + + +void send(uint8_t *pData, uint16_t inputlength) +{ + HAL_GPIO_WritePin(DISPLAY_CSB_GPIO_PORT,DISPLAY_CSB_PIN,GPIO_PIN_RESET); // chip select + + if(HAL_SPI_Transmit(&hspiDisplay,(uint8_t*)pData, inputlength, 10000) != HAL_OK) + Display_Error_Handler(); + + while (HAL_SPI_GetState(&hspiDisplay) != HAL_SPI_STATE_READY) + { + } + HAL_GPIO_WritePin(DISPLAY_CSB_GPIO_PORT,DISPLAY_CSB_PIN,GPIO_PIN_SET); // chip select +} + + +uint16_t convert8to9to8(uint8_t *pInput, uint8_t *pOutput,uint16_t inputlength) +{ + uint16_t outputlength; + uint8_t readbit = 0x80;//0b1000000; + uint8_t writebit = 0x40;//0b0100000; + uint16_t i,j,k; + + outputlength = ((inputlength+7)/8)*9; + + for(i=0;i<outputlength;i++) + pOutput[i] = 0; + + k = 0; + for(i=0;i<inputlength;i++) + { + if(i != 0) + { + pOutput[k] |= writebit; // 9. bit + writebit = writebit >> 1; + if(writebit == 0) + { + writebit = 0x80; + k++; + } + } + for(j=0;j<8;j++) + { + if((pInput[i] & readbit) != 0) + { + pOutput[k] |= writebit; + } + readbit = readbit >> 1; + if(readbit == 0) + readbit = 0x80; + writebit = writebit >> 1; + if(writebit == 0) + { + writebit = 0x80; + k++; + } + } + } + return outputlength; +} + +void display_power_on__2_of_2__post_RGB(void) +{ + uint8_t aTxBuffer[32]; + uint8_t bTxBuffer[36]; + uint16_t i,length; + + for(i=0;i<32;i++) + aTxBuffer[i] = 0; + for(i=0;i<36;i++) + bTxBuffer[i] = 0; + + aTxBuffer[0] = ENABLE_EXTENDED_COMMANDS; + aTxBuffer[1] = 0xFF; + aTxBuffer[2] = 0x83; + aTxBuffer[3] = 0x63; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,4); + send((uint8_t*)bTxBuffer, length); + + aTxBuffer[0] = SET_POWER; + aTxBuffer[1] = 0x81; + aTxBuffer[2] = 0x24; + aTxBuffer[3] = 0x04; + aTxBuffer[4] = 0x02; + aTxBuffer[5] = 0x02; + aTxBuffer[6] = 0x03; + aTxBuffer[7] = 0x10; + aTxBuffer[8] = 0x10; + aTxBuffer[9] = 0x34; + aTxBuffer[10] = 0x3C; + aTxBuffer[11] = 0x3F; + aTxBuffer[12] = 0x3F; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,13); + send((uint8_t*)bTxBuffer, length); + + aTxBuffer[0] = SLEEP_OUT; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1); + send((uint8_t*)bTxBuffer, length); + HAL_Delay(5+1); + + aTxBuffer[0] = DISPLAY_INVERSION_OFF; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1); + send((uint8_t*)bTxBuffer, length); + + aTxBuffer[0] = MEMORY_ACCESS_ONTROL; + aTxBuffer[1] = 0x00; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,2); + send((uint8_t*)bTxBuffer, length); + + aTxBuffer[0] = INTERFACE_PIXEL_FORMAT; + aTxBuffer[1] = 0x70; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,2); + send((uint8_t*)bTxBuffer, length); + HAL_Delay(120+20); + + aTxBuffer[0] = SET_POWER; + aTxBuffer[1] = 0x78; + aTxBuffer[2] = 0x24; + aTxBuffer[3] = 0x04, + aTxBuffer[4] = 0x02; + aTxBuffer[5] = 0x02; + aTxBuffer[6] = 0x03; + aTxBuffer[7] = 0x10; + aTxBuffer[8] = 0x10; + aTxBuffer[9] = 0x34; + aTxBuffer[10] = 0x3C; + aTxBuffer[11] = 0x3F; + aTxBuffer[12] = 0x3F; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,13); + send((uint8_t*)bTxBuffer, length); + + aTxBuffer[0] = SET_RGB_INTERFACE_RELATED; + aTxBuffer[1] = 0x01; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,2); + send((uint8_t*)bTxBuffer, length); + + aTxBuffer[0] = SET_DISPLAY_WAVEFORM; + aTxBuffer[1] = 0x00; + aTxBuffer[2] = 0x08; + aTxBuffer[3] = 0x56; + aTxBuffer[4] = 0x07; + aTxBuffer[5] = 0x01; + aTxBuffer[6] = 0x01; + aTxBuffer[7] = 0x4D; + aTxBuffer[8] = 0x01; + aTxBuffer[9] = 0x42; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,10); + send((uint8_t*)bTxBuffer, length); + + aTxBuffer[0] = SET_PANEL; + aTxBuffer[1] = 0x0B; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,2); + send((uint8_t*)bTxBuffer, length); + + aTxBuffer[0] = SET_GAMMA_CURVE_RELATED; + aTxBuffer[1] = 0x01; + aTxBuffer[2] = 0x48; + aTxBuffer[3] = 0x4D; + aTxBuffer[4] = 0x4E; + aTxBuffer[5] = 0x58; + aTxBuffer[6] = 0xF6; + aTxBuffer[7] = 0x0B; + aTxBuffer[8] = 0x4E; + aTxBuffer[9] = 0x12; + aTxBuffer[10] = 0xD5; + aTxBuffer[11] = 0x15; + aTxBuffer[12] = 0x95; + aTxBuffer[13] = 0x55; + aTxBuffer[14] = 0x8E; + aTxBuffer[15] = 0x11; + aTxBuffer[16] = 0x01; + aTxBuffer[17] = 0x48; + aTxBuffer[18] = 0x4D; + aTxBuffer[19] = 0x55; + aTxBuffer[20] = 0x5F; + aTxBuffer[21] = 0xFD; + aTxBuffer[22] = 0x0A; + aTxBuffer[23] = 0x4E; + aTxBuffer[24] = 0x51; + aTxBuffer[25] = 0xD3; + aTxBuffer[26] = 0x17; + aTxBuffer[27] = 0x95; + aTxBuffer[28] = 0x96; + aTxBuffer[29] = 0x4E; + aTxBuffer[30] = 0x11; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,31); + send((uint8_t*)bTxBuffer, length); + HAL_Delay(5+1); + + aTxBuffer[0] = DISPLAY_ON; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1); + send((uint8_t*)bTxBuffer, length); +} + + +void display_power_off(void) +{ + uint8_t aTxBuffer[1]; + uint8_t bTxBuffer[9]; + uint16_t i,length; + + for(i=0;i<9;i++) + bTxBuffer[i] = 0; + + aTxBuffer[0] = DISPLAY_OFF; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1); + send((uint8_t*)bTxBuffer, length); + HAL_Delay(5); + + aTxBuffer[0] = SLEEP_IN; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1); + send((uint8_t*)bTxBuffer, length); +} + + +void display_sleep(void) +{ + uint8_t aTxBuffer[1]; + uint8_t bTxBuffer[9]; + uint16_t i,length; + + for(i=0;i<9;i++) + bTxBuffer[i] = 0; + + aTxBuffer[0] = SLEEP_IN; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1); + send((uint8_t*)bTxBuffer, length); +} + + +void display_sleep_release(void) +{ + uint8_t aTxBuffer[1]; + uint8_t bTxBuffer[9]; + uint16_t i,length; + + for(i=0;i<9;i++) + bTxBuffer[i] = 0; + + aTxBuffer[0] = SLEEP_OUT; + length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1); + send((uint8_t*)bTxBuffer, length); +} + +static void Display_Error_Handler(void) +{ + while(1) + { + } +}