1+ #include < stdio.h>
2+ #include < stdint.h>
3+ #include < bcm2835.h>
4+ #include < unistd.h>
5+ #include " kedei_trash.h"
6+
7+ int spi_open (void ) {
8+ int r;
9+ uint32_t v;
10+
11+ r = bcm2835_init (); // return 0 on fail
12+ if (r != 1 ) return -1 ;
13+
14+ bcm2835_spi_begin ();
15+ bcm2835_spi_setBitOrder (BCM2835_SPI_BIT_ORDER_MSBFIRST); // MSB bit goes first
16+ bcm2835_spi_setDataMode (BCM2835_SPI_MODE3); // mode 0
17+ bcm2835_spi_setClockDivider (BCM2835_SPI_CLOCK_DIVIDER_8 ); // SPI_CLK 31.25MHz - MAX
18+ // bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_64);
19+ bcm2835_spi_chipSelect (BCM2835_SPI_CS1); // CS1 - for now, with TP CS0 will be used too
20+ // setup both SPI.CSx
21+ bcm2835_spi_setChipSelectPolarity (BCM2835_SPI_CS0, LOW); // CS0 - active Low
22+ bcm2835_spi_setChipSelectPolarity (BCM2835_SPI_CS1, LOW); // CS1 - active Low
23+
24+ v = bcm2835_version ();
25+ fprintf (stdout, " bcm2835 library version: %u (0x%08x)\n " , v,v);
26+
27+ return 0 ; // OK!
28+
29+ }
30+
31+ #define bcm2835_peri_set_bits (paddr, a, b ) (*paddr = a | *paddr)
32+ #define bcm2835_peri_read_nb (paddr ) (*paddr)
33+
34+ void spi_write2 (const char * tbuf, const char *tbuf2)
35+ {
36+ volatile static uint32_t * paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4 ;
37+ volatile static uint32_t * fifo = bcm2835_spi0 + BCM2835_SPI0_FIFO/4 ;
38+
39+ bcm2835_peri_set_bits (paddr, BCM2835_SPI0_CS_TA | BCM2835_SPI0_CS_CLEAR, BCM2835_SPI0_CS_TA);
40+ *fifo = tbuf[1 ];
41+ *fifo = tbuf[0 ];
42+ *fifo = tbuf[2 ];
43+ while (!(bcm2835_peri_read_nb (paddr) & BCM2835_SPI0_CS_DONE));
44+ bcm2835_peri_set_bits (paddr, BCM2835_SPI0_CS_TA | BCM2835_SPI0_CS_CLEAR, BCM2835_SPI0_CS_TA);
45+ *fifo = tbuf2[0 ];
46+ *fifo = tbuf2[1 ];
47+ while (!(bcm2835_peri_read_nb (paddr) & BCM2835_SPI0_CS_DONE));
48+
49+ }
50+
51+ void lcd_data8 (uint8_t *data) {
52+ static char b1[3 ] = { 0 , 0 , 0x15 }, b2[2 ] = { 0 , 0x1f };
53+ b1[1 ] = data[0 ];
54+ b1[0 ] = data[1 ];
55+ // printf("%02x", b1[1]);
56+ // printf("%02x,", b1[0]);
57+ spi_write2 (b1, b2);
58+ }
59+
60+ void lcd_data (uint16_t data) {
61+ static char b1[3 ] = { 0 , 0 , 0x15 }, b2[2 ] = { 0 , 0x1f };
62+ *(uint16_t *)b1 = data;
63+ // printf("%02x", b1[1]);
64+ // printf("%02x,", b1[0]);
65+ spi_write2 (b1, b2);
66+ }
67+
68+ void lcd_cmd (uint8_t cmd) {
69+ static char b1[3 ] = { 0 , 0 , 0x11 }, b2[2 ] = { 0 , 0x1B };
70+ b1[0 ] = cmd;
71+ // printf("\n%02x:", cmd);
72+ // b1[0] = ((char *)&data)[1];
73+ // b1[1] = ((char *)&data)[0];
74+ spi_write2 (b1, b2);
75+ }
76+
77+ #define SPI_TRANSFER (cmd, ...) do \
78+ { \
79+ int16_t dbuf[] = { __VA_ARGS__ }; \
80+ int len = sizeof (dbuf)/(sizeof (int16_t )); \
81+ lcd_cmd (cmd); \
82+ for (int ix = 0 ; ix < len; ix++) \
83+ lcd_data (dbuf[ix]); \
84+ } while (0 );
85+
86+ void lcd_setptr (void ) {
87+ lcd_cmd (0x002b );
88+ lcd_data (0x0000 );
89+ lcd_data (0x0000 ); // 0
90+ lcd_data (0x0001 );
91+ lcd_data (0x003f ); // 319
92+
93+ lcd_cmd (0x002a );
94+ lcd_data (0x0000 );
95+ lcd_data (0x0000 ); // 0
96+ lcd_data (0x0001 );
97+ lcd_data (0x00df ); // 479
98+
99+ lcd_cmd (0x002c );
100+ }
101+
102+ void lcd_setarea (uint16_t x, uint16_t y) {
103+ lcd_cmd (0x002b );
104+ lcd_data (y>>8 );
105+ lcd_data (0x00ff &y);
106+ lcd_data (0x0001 );
107+ lcd_data (0x003f );
108+
109+ lcd_cmd (0x002a );
110+ lcd_data (x>>8 ) ;
111+ lcd_data (0x00ff &x) ;
112+ lcd_data (0x0001 );
113+ lcd_data (0x00df );
114+ lcd_cmd (0x002c );
115+ }
116+
117+ void lcd_setarea2 (uint16_t sx, uint16_t sy, uint16_t x, uint16_t y) {
118+
119+ if (sx>479 ) sx=0 ;
120+ if (sy>319 ) sy=0 ;
121+ if (x>479 ) x=479 ;
122+ if (y>319 ) y=319 ;
123+
124+ lcd_cmd (0x002b );
125+ lcd_data (sy>>8 ) ;
126+ lcd_data (0x00ff &sy);
127+ lcd_data (y>>8 );
128+ lcd_data (0x00ff &y);
129+
130+ lcd_cmd (0x002a );
131+ lcd_data (sx>>8 ) ;
132+ lcd_data (0x00ff &sx) ;
133+ lcd_data (x>>8 );
134+ lcd_data (0x00ff &x);
135+
136+ lcd_cmd (0x002c );
137+ }
138+
139+ void lcd_fill (uint16_t color565) {
140+ // static char b1[3] = { 0, 0, 0x15 }, b2[2] = { 0, 0x1f};
141+ // b1[0] = ((char *)&color565)[1];
142+ // b1[1] = ((char *)&color565)[0];
143+ lcd_setptr ();
144+ for (int x=0 ; x<153601 ;x++) {
145+ lcd_data (color565);
146+ // bcm2835_spi_writenb(b1, 3);
147+ // bcm2835_spi_writenb(b2, 2);
148+ }
149+ }
150+
151+ void lcd_fill2 (uint16_t sx, uint16_t sy, uint16_t x, uint16_t y, uint16_t color565) {
152+ uint16_t tmp=0 ;
153+ int cnt;
154+ if (sx>479 ) sx=0 ;
155+ if (sy>319 ) sy=0 ;
156+ if (x>479 ) x=479 ;
157+ if (y>319 ) y=319 ;
158+
159+ if (sx>x) {
160+ tmp=sx;
161+ sx=x;
162+ x=tmp;
163+ }
164+
165+ if (sy>y) {
166+ tmp=sy;
167+ sy=y;
168+ y=tmp;
169+ }
170+
171+ cnt = (y-sy) * (x-sx);
172+ lcd_setarea2 (sx,sy,x,y);
173+ for (int t=0 ;t<cnt;t++) {
174+ lcd_data (color565);
175+ }
176+ }
177+
178+ void lcd_init ()
179+ {
180+ SPI_TRANSFER (0x0 );
181+ usleep (50 );
182+ SPI_TRANSFER (0x1 );
183+ usleep (1000 );
184+ SPI_TRANSFER (0x00B0 , 0x0 );
185+ SPI_TRANSFER (0x0011 );
186+ // lcd_cmd(0x0011);
187+ // SPI_TRANSFER(0x11);
188+ usleep (50 );
189+
190+ SPI_TRANSFER (0x00B0 , 0x02 , 0 , 0 , 0 );
191+ // lcd_cmd(0x00B3);
192+ // lcd_data(0x0002);
193+ // lcd_data(0x0000);
194+ // lcd_data(0x0000);
195+ // lcd_data(0x0000);
196+
197+ SPI_TRANSFER (0xc0 , 0x10 , 0x003B , 0x0000 , 0x0002 , 0x0000 , 0x0001 , 0x0000 , 0x0043 );
198+ // lcd_cmd(0x00C0);
199+ // lcd_data(0x0010);//13
200+ // lcd_data(0x003B);//480
201+ // lcd_data(0x0000);
202+ // lcd_data(0x0002);
203+ // lcd_data(0x0000);
204+ // lcd_data(0x0001);
205+ // lcd_data(0x0000);//NW
206+ // lcd_data(0x0043);
207+
208+ SPI_TRANSFER (0x00C1 , 0x0008 , 0x0016 , 0x0008 , 0x0008 );
209+ // lcd_cmd(0x00C1);
210+ // lcd_data(0x0008);//w_data(0x0008);
211+ // lcd_data(0x0016);//w_data(0x0016);//CLOCK
212+ // lcd_data(0x0008);
213+ // lcd_data(0x0008);
214+
215+ SPI_TRANSFER (0x00C4 , 0x0011 , 0x0007 , 0x0003 , 0x0003 );
216+ // lcd_cmd(0x00C4);
217+ // lcd_data(0x0011);
218+ // lcd_data(0x0007);
219+ // lcd_data(0x0003);
220+ // lcd_data(0x0003);
221+
222+ SPI_TRANSFER (0x00C6 , 0x0000 );
223+ // lcd_cmd(0x00C6);
224+ // lcd_data(0x0000);
225+
226+ SPI_TRANSFER (0x00C8 , 0x0003 , 0x0003 , 0x0013 , 0x005C , \
227+ 0x0003 , 0x0007 , 0x0014 , 0x0008 , 0x0000 , \
228+ 0x0021 , 0x0008 , 0x0014 , 0x0007 , 0x0053 , \
229+ 0x000C , 0x0013 , 0x0003 , 0x0021 , 0x0000 );
230+ lcd_cmd (0x00C8 ); // GAMMA
231+ // lcd_data(0x0003);
232+ // lcd_data(0x0003);
233+ // lcd_data(0x0013);
234+ // lcd_data(0x005C);
235+ // lcd_data(0x0003);
236+ // lcd_data(0x0007);
237+ // lcd_data(0x0014);
238+ // lcd_data(0x0008);
239+ // lcd_data(0x0000);
240+ // lcd_data(0x0021);
241+ // lcd_data(0x0008);
242+ // lcd_data(0x0014);
243+ // lcd_data(0x0007);
244+ // lcd_data(0x0053);
245+ // lcd_data(0x000C);
246+ // lcd_data(0x0013);
247+ // lcd_data(0x0003);
248+ // lcd_data(0x0003);
249+ // lcd_data(0x0021);
250+ // lcd_data(0x0000);
251+
252+ SPI_TRANSFER (0x0035 , 0x0000 );
253+ // lcd_cmd(0x0035);
254+ // lcd_data(0x0000);
255+
256+ SPI_TRANSFER (0x0036 , 0x0028 );
257+ // lcd_cmd(0x0036);
258+ // lcd_data(0x0028);
259+
260+ SPI_TRANSFER (0x003A , 0x0055 );
261+ // lcd_cmd(0x003A);
262+ // lcd_data(0x0055); //55 lgh
263+
264+ SPI_TRANSFER (0x0044 , 0x0000 , 0x0001 );
265+ // lcd_cmd(0x0044);
266+ // lcd_data(0x0000);
267+ // lcd_data(0x0001);
268+
269+ SPI_TRANSFER (0x00B6 , 0x0000 , 0x0002 , 0x003B );
270+ // lcd_cmd(0x00B6);
271+ // lcd_data(0x0000);
272+ // lcd_data(0x0002); //220 GS SS SM ISC[3:0]
273+ // lcd_data(0x003B);
274+
275+ SPI_TRANSFER (0x00D0 , 0x0007 , 0x0007 , 0x001D );
276+ // lcd_cmd(0x00D0);
277+ // lcd_data(0x0007);
278+ // lcd_data(0x0007); //VCI1
279+ // lcd_data(0x001D); //VRH
280+
281+ SPI_TRANSFER (0x00D1 , 0x0000 , 0x0003 , 0x0000 );
282+ // lcd_cmd(0x00D1);
283+ // lcd_data(0x0000);
284+ // lcd_data(0x0003); //VCM
285+ // lcd_data(0x0000); //VDV
286+
287+ SPI_TRANSFER (0x00D2 , 0x0003 , 0x0014 , 0x0004 );
288+ // lcd_cmd(0x00D2);
289+ // lcd_data(0x0003);
290+ // lcd_data(0x0014);
291+ // lcd_data(0x0004);
292+
293+ SPI_TRANSFER (0xE0 , 0x1f , 0x2C , 0x2C , 0x0B , 0x0C , 0x04 , 0x4C , 0x64 , 0x36 , 0x03 , 0x0E , 0x01 , 0x10 , 0x01 , 0x00 );
294+ // lcd_cmd(0xE0);
295+ // lcd_data(0x1f);
296+ // lcd_data(0x2C);
297+ // lcd_data(0x2C);
298+ // lcd_data(0x0B);
299+ // lcd_data(0x0C);
300+ // lcd_data(0x04);
301+ // lcd_data(0x4C);
302+ // lcd_data(0x64);
303+ // lcd_data(0x36);
304+ // lcd_data(0x03);
305+ // lcd_data(0x0E);
306+ // lcd_data(0x01);
307+ // lcd_data(0x10);
308+ // lcd_data(0x01);
309+ // lcd_data(0x00);
310+
311+ SPI_TRANSFER (0XE1 , 0x1f , 0x3f , 0x3f , 0x0f , 0x1f , 0x0f , 0x7f , 0x32 , 0x36 , 0x04 , 0x0B , 0x00 , 0x19 , 0x14 , 0x0F );
312+ // lcd_cmd(0XE1);
313+ // lcd_data(0x1f);
314+ // lcd_data(0x3f);
315+ // lcd_data(0x3f);
316+ // lcd_data(0x0f);
317+ // lcd_data(0x1f);
318+ // lcd_data(0x0f);
319+ // lcd_data(0x7f);
320+ // lcd_data(0x32);
321+ // lcd_data(0x36);
322+ // lcd_data(0x04);
323+ // lcd_data(0x0B);
324+ // lcd_data(0x00);
325+ // lcd_data(0x19);
326+ // lcd_data(0x14);
327+ // lcd_data(0x0F);
328+
329+ SPI_TRANSFER (0xE2 , 0x0f , 0x0f , 0x0f );
330+ // lcd_cmd(0xE2);
331+ // lcd_data(0x0f);
332+ // lcd_data(0x0f);
333+ // lcd_data(0x0f);
334+
335+ SPI_TRANSFER (0xE3 , 0x0f , 0x0f , 0x0f );
336+ // lcd_cmd(0xE3);
337+ // lcd_data(0x0f);
338+ // lcd_data(0x0f);
339+ // lcd_data(0x0f);
340+
341+ SPI_TRANSFER (0x13 );
342+ // lcd_cmd(0x13);
343+
344+ SPI_TRANSFER (0x0029 );
345+ // lcd_cmd(0x0029);
346+ usleep (20 ); // mdelay(20);
347+
348+ SPI_TRANSFER (0x00B4 , 0x0000 );
349+ // lcd_cmd(0x00B4);
350+ // lcd_data(0x0000);
351+ usleep (20 ); // mdelay(20);
352+
353+ SPI_TRANSFER (0x002C );
354+ // lcd_cmd(0x002C);
355+
356+ SPI_TRANSFER (0x00D2 , 0x0003 , 0x0014 , 0x0004 );
357+ // lcd_cmd(0x002A);
358+ // lcd_data(0x0000);
359+ // lcd_data(0x0000);
360+ // lcd_data(0x0001);
361+ // lcd_data(0x000dF);
362+
363+ SPI_TRANSFER (0x002B , 0x0000 , 0x0000 , 0x0001 , 0x003f );
364+ // lcd_cmd(0x002B);
365+ // lcd_data(0x0000);
366+ // lcd_data(0x0000);
367+ // lcd_data(0x0001);
368+ // lcd_data(0x003f);
369+
370+ SPI_TRANSFER (0x002c );
371+ // lcd_cmd(0x002c);
372+ }
373+
374+ extern void ClearScreen ();
375+ void InitKeDeiTrash ()
376+ {
377+ spi_open ();
378+ lcd_init ();
379+ lcd_fill (0xfff );
380+ ClearScreen ();
381+ }
382+
383+ void DeinitSPIDisplay ()
384+ {
385+ ClearScreen ();
386+ }
0 commit comments