38
+ − 1
+ − 2 #include "stm32f4xx_hal.h" /* for HAL_Delay() */
+ − 3 #include "ostc.h"
+ − 4 #include "display.h"
+ − 5
+ − 6 #define ENABLE_EXTENDED_COMMANDS 0xB9
+ − 7 #define SET_POWER 0xB1
+ − 8 #define SLEEP_OUT 0x11
+ − 9 #define DISPLAY_INVERSION_OFF 0x20
+ − 10 #define MEMORY_ACCESS_ONTROL 0x36
+ − 11 #define INTERFACE_PIXEL_FORMAT 0x3A
+ − 12 #define SET_RGB_INTERFACE_RELATED 0xB3
+ − 13 #define SET_DISPLAY_WAVEFORM 0xB4
+ − 14 #define SET_PANEL 0xCC
+ − 15 #define SET_GAMMA_CURVE_RELATED 0xE0
+ − 16 #define DISPLAY_ON 0x29
+ − 17 #define DISPLAY_OFF 0x28
+ − 18 #define SLEEP_IN 0x10
+ − 19
+ − 20
+ − 21 static void Display_Error_Handler(void);
+ − 22
+ − 23 void display_power_on__1_of_2__pre_RGB(void)
+ − 24 {
+ − 25 /* reset system */
+ − 26 HAL_GPIO_WritePin(DISPLAY_CSB_GPIO_PORT,DISPLAY_CSB_PIN,GPIO_PIN_SET); // chip select
+ − 27
+ − 28 HAL_GPIO_WritePin(DISPLAY_RESETB_GPIO_PORT,DISPLAY_RESETB_PIN,GPIO_PIN_RESET);
+ − 29 HAL_Delay(10);
+ − 30 HAL_GPIO_WritePin(DISPLAY_RESETB_GPIO_PORT,DISPLAY_RESETB_PIN,GPIO_PIN_SET);
+ − 31 HAL_Delay(10);
+ − 32
+ − 33 /* RGB signals should be now for 2 frames or more (datasheet) */
+ − 34 }
+ − 35
+ − 36
+ − 37 void send(uint8_t *pData, uint16_t inputlength)
+ − 38 {
+ − 39 HAL_GPIO_WritePin(DISPLAY_CSB_GPIO_PORT,DISPLAY_CSB_PIN,GPIO_PIN_RESET); // chip select
+ − 40
+ − 41 if(HAL_SPI_Transmit(&hspiDisplay,(uint8_t*)pData, inputlength, 10000) != HAL_OK)
+ − 42 Display_Error_Handler();
+ − 43
+ − 44 while (HAL_SPI_GetState(&hspiDisplay) != HAL_SPI_STATE_READY)
+ − 45 {
+ − 46 }
+ − 47 HAL_GPIO_WritePin(DISPLAY_CSB_GPIO_PORT,DISPLAY_CSB_PIN,GPIO_PIN_SET); // chip select
+ − 48 }
+ − 49
+ − 50
+ − 51 uint16_t convert8to9to8(uint8_t *pInput, uint8_t *pOutput,uint16_t inputlength)
+ − 52 {
+ − 53 uint16_t outputlength;
+ − 54 uint8_t readbit = 0x80;//0b1000000;
+ − 55 uint8_t writebit = 0x40;//0b0100000;
+ − 56 uint16_t i,j,k;
+ − 57
+ − 58 outputlength = ((inputlength+7)/8)*9;
+ − 59
+ − 60 for(i=0;i<outputlength;i++)
+ − 61 pOutput[i] = 0;
+ − 62
+ − 63 k = 0;
+ − 64 for(i=0;i<inputlength;i++)
+ − 65 {
+ − 66 if(i != 0)
+ − 67 {
+ − 68 pOutput[k] |= writebit; // 9. bit
+ − 69 writebit = writebit >> 1;
+ − 70 if(writebit == 0)
+ − 71 {
+ − 72 writebit = 0x80;
+ − 73 k++;
+ − 74 }
+ − 75 }
+ − 76 for(j=0;j<8;j++)
+ − 77 {
+ − 78 if((pInput[i] & readbit) != 0)
+ − 79 {
+ − 80 pOutput[k] |= writebit;
+ − 81 }
+ − 82 readbit = readbit >> 1;
+ − 83 if(readbit == 0)
+ − 84 readbit = 0x80;
+ − 85 writebit = writebit >> 1;
+ − 86 if(writebit == 0)
+ − 87 {
+ − 88 writebit = 0x80;
+ − 89 k++;
+ − 90 }
+ − 91 }
+ − 92 }
+ − 93 return outputlength;
+ − 94 }
+ − 95
+ − 96 void display_power_on__2_of_2__post_RGB(void)
+ − 97 {
+ − 98 uint8_t aTxBuffer[32];
+ − 99 uint8_t bTxBuffer[36];
+ − 100 uint16_t i,length;
+ − 101
+ − 102 for(i=0;i<32;i++)
+ − 103 aTxBuffer[i] = 0;
+ − 104 for(i=0;i<36;i++)
+ − 105 bTxBuffer[i] = 0;
+ − 106
+ − 107 aTxBuffer[0] = ENABLE_EXTENDED_COMMANDS;
+ − 108 aTxBuffer[1] = 0xFF;
+ − 109 aTxBuffer[2] = 0x83;
+ − 110 aTxBuffer[3] = 0x63;
+ − 111 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,4);
+ − 112 send((uint8_t*)bTxBuffer, length);
+ − 113
+ − 114 aTxBuffer[0] = SET_POWER;
+ − 115 aTxBuffer[1] = 0x81;
+ − 116 aTxBuffer[2] = 0x24;
+ − 117 aTxBuffer[3] = 0x04;
+ − 118 aTxBuffer[4] = 0x02;
+ − 119 aTxBuffer[5] = 0x02;
+ − 120 aTxBuffer[6] = 0x03;
+ − 121 aTxBuffer[7] = 0x10;
+ − 122 aTxBuffer[8] = 0x10;
+ − 123 aTxBuffer[9] = 0x34;
+ − 124 aTxBuffer[10] = 0x3C;
+ − 125 aTxBuffer[11] = 0x3F;
+ − 126 aTxBuffer[12] = 0x3F;
+ − 127 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,13);
+ − 128 send((uint8_t*)bTxBuffer, length);
+ − 129
+ − 130 aTxBuffer[0] = SLEEP_OUT;
+ − 131 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1);
+ − 132 send((uint8_t*)bTxBuffer, length);
+ − 133 HAL_Delay(5+1);
+ − 134
+ − 135 aTxBuffer[0] = DISPLAY_INVERSION_OFF;
+ − 136 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1);
+ − 137 send((uint8_t*)bTxBuffer, length);
+ − 138
+ − 139 aTxBuffer[0] = MEMORY_ACCESS_ONTROL;
+ − 140 aTxBuffer[1] = 0x00;
+ − 141 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,2);
+ − 142 send((uint8_t*)bTxBuffer, length);
+ − 143
+ − 144 aTxBuffer[0] = INTERFACE_PIXEL_FORMAT;
+ − 145 aTxBuffer[1] = 0x70;
+ − 146 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,2);
+ − 147 send((uint8_t*)bTxBuffer, length);
+ − 148 HAL_Delay(120+20);
+ − 149
+ − 150 aTxBuffer[0] = SET_POWER;
+ − 151 aTxBuffer[1] = 0x78;
+ − 152 aTxBuffer[2] = 0x24;
+ − 153 aTxBuffer[3] = 0x04,
+ − 154 aTxBuffer[4] = 0x02;
+ − 155 aTxBuffer[5] = 0x02;
+ − 156 aTxBuffer[6] = 0x03;
+ − 157 aTxBuffer[7] = 0x10;
+ − 158 aTxBuffer[8] = 0x10;
+ − 159 aTxBuffer[9] = 0x34;
+ − 160 aTxBuffer[10] = 0x3C;
+ − 161 aTxBuffer[11] = 0x3F;
+ − 162 aTxBuffer[12] = 0x3F;
+ − 163 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,13);
+ − 164 send((uint8_t*)bTxBuffer, length);
+ − 165
+ − 166 aTxBuffer[0] = SET_RGB_INTERFACE_RELATED;
+ − 167 aTxBuffer[1] = 0x01;
+ − 168 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,2);
+ − 169 send((uint8_t*)bTxBuffer, length);
+ − 170
+ − 171 aTxBuffer[0] = SET_DISPLAY_WAVEFORM;
+ − 172 aTxBuffer[1] = 0x00;
+ − 173 aTxBuffer[2] = 0x08;
+ − 174 aTxBuffer[3] = 0x56;
+ − 175 aTxBuffer[4] = 0x07;
+ − 176 aTxBuffer[5] = 0x01;
+ − 177 aTxBuffer[6] = 0x01;
+ − 178 aTxBuffer[7] = 0x4D;
+ − 179 aTxBuffer[8] = 0x01;
+ − 180 aTxBuffer[9] = 0x42;
+ − 181 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,10);
+ − 182 send((uint8_t*)bTxBuffer, length);
+ − 183
+ − 184 aTxBuffer[0] = SET_PANEL;
+ − 185 aTxBuffer[1] = 0x0B;
+ − 186 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,2);
+ − 187 send((uint8_t*)bTxBuffer, length);
+ − 188
+ − 189 aTxBuffer[0] = SET_GAMMA_CURVE_RELATED;
+ − 190 aTxBuffer[1] = 0x01;
+ − 191 aTxBuffer[2] = 0x48;
+ − 192 aTxBuffer[3] = 0x4D;
+ − 193 aTxBuffer[4] = 0x4E;
+ − 194 aTxBuffer[5] = 0x58;
+ − 195 aTxBuffer[6] = 0xF6;
+ − 196 aTxBuffer[7] = 0x0B;
+ − 197 aTxBuffer[8] = 0x4E;
+ − 198 aTxBuffer[9] = 0x12;
+ − 199 aTxBuffer[10] = 0xD5;
+ − 200 aTxBuffer[11] = 0x15;
+ − 201 aTxBuffer[12] = 0x95;
+ − 202 aTxBuffer[13] = 0x55;
+ − 203 aTxBuffer[14] = 0x8E;
+ − 204 aTxBuffer[15] = 0x11;
+ − 205 aTxBuffer[16] = 0x01;
+ − 206 aTxBuffer[17] = 0x48;
+ − 207 aTxBuffer[18] = 0x4D;
+ − 208 aTxBuffer[19] = 0x55;
+ − 209 aTxBuffer[20] = 0x5F;
+ − 210 aTxBuffer[21] = 0xFD;
+ − 211 aTxBuffer[22] = 0x0A;
+ − 212 aTxBuffer[23] = 0x4E;
+ − 213 aTxBuffer[24] = 0x51;
+ − 214 aTxBuffer[25] = 0xD3;
+ − 215 aTxBuffer[26] = 0x17;
+ − 216 aTxBuffer[27] = 0x95;
+ − 217 aTxBuffer[28] = 0x96;
+ − 218 aTxBuffer[29] = 0x4E;
+ − 219 aTxBuffer[30] = 0x11;
+ − 220 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,31);
+ − 221 send((uint8_t*)bTxBuffer, length);
+ − 222 HAL_Delay(5+1);
+ − 223
+ − 224 aTxBuffer[0] = DISPLAY_ON;
+ − 225 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1);
+ − 226 send((uint8_t*)bTxBuffer, length);
+ − 227 }
+ − 228
+ − 229
+ − 230 void display_power_off(void)
+ − 231 {
+ − 232 uint8_t aTxBuffer[1];
+ − 233 uint8_t bTxBuffer[9];
+ − 234 uint16_t i,length;
+ − 235
+ − 236 for(i=0;i<9;i++)
+ − 237 bTxBuffer[i] = 0;
+ − 238
+ − 239 aTxBuffer[0] = DISPLAY_OFF;
+ − 240 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1);
+ − 241 send((uint8_t*)bTxBuffer, length);
+ − 242 HAL_Delay(5);
+ − 243
+ − 244 aTxBuffer[0] = SLEEP_IN;
+ − 245 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1);
+ − 246 send((uint8_t*)bTxBuffer, length);
+ − 247 }
+ − 248
+ − 249
+ − 250 void display_sleep(void)
+ − 251 {
+ − 252 uint8_t aTxBuffer[1];
+ − 253 uint8_t bTxBuffer[9];
+ − 254 uint16_t i,length;
+ − 255
+ − 256 for(i=0;i<9;i++)
+ − 257 bTxBuffer[i] = 0;
+ − 258
+ − 259 aTxBuffer[0] = SLEEP_IN;
+ − 260 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1);
+ − 261 send((uint8_t*)bTxBuffer, length);
+ − 262 }
+ − 263
+ − 264
+ − 265 void display_sleep_release(void)
+ − 266 {
+ − 267 uint8_t aTxBuffer[1];
+ − 268 uint8_t bTxBuffer[9];
+ − 269 uint16_t i,length;
+ − 270
+ − 271 for(i=0;i<9;i++)
+ − 272 bTxBuffer[i] = 0;
+ − 273
+ − 274 aTxBuffer[0] = SLEEP_OUT;
+ − 275 length = convert8to9to8((uint8_t*)aTxBuffer,(uint8_t*)bTxBuffer,1);
+ − 276 send((uint8_t*)bTxBuffer, length);
+ − 277 }
+ − 278
+ − 279 static void Display_Error_Handler(void)
+ − 280 {
+ − 281 while(1)
+ − 282 {
+ − 283 }
+ − 284 }