comparison Discovery/Src/display.c @ 38:5f11787b4f42

include in ostc4 repository
author heinrichsweikamp
date Sat, 28 Apr 2018 11:52:34 +0200
parents
children 5ca177d2df5d
comparison
equal deleted inserted replaced
37:ccc45c0e1ea2 38:5f11787b4f42
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 }