|
10 | 10 | #include "py/obj.h" |
11 | 11 | #include "py/runtime.h" |
12 | 12 | #include "py/objarray.h" |
13 | | -#include "mphalport.h" // for mp_hal_pin_output |
14 | 13 |
|
15 | 14 | //#include "mpconfigport.h" |
16 | 15 | //#include "modmachine.h" |
|
73 | 72 | mp_hal_pin_write(self->bus_config.data_gpio_nums[1], (buf[0] >> 1) & 1); \ |
74 | 73 | mp_hal_pin_write(self->bus_config.data_gpio_nums[0], buf[0] & 1); \ |
75 | 74 | } |
| 75 | + |
| 76 | + // sleep_us(1) to ensure minimum WR pulse width, so that I can follow it with my logic analyzer |
| 77 | + // can be eliminated after debugging |
| 78 | + #define WR_PULSE() { mp_hal_pin_write(self->bus_config.wr_gpio_num, 0)/*; sleep_us(1)*/; mp_hal_pin_write(self->bus_config.wr_gpio_num, 1);; } |
| 79 | + |
76 | 80 | /* end macros */ |
77 | 81 |
|
78 | 82 |
|
|
103 | 107 | */ |
104 | 108 | static mp_obj_t mp_lcd_i80_bus_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) |
105 | 109 | { |
106 | | - enum { |
| 110 | + enum { |
107 | 111 | ARG_dc, |
108 | 112 | ARG_wr, |
109 | 113 | ARG_data0, |
|
128 | 132 | ARG_dc_cmd_high, |
129 | 133 | ARG_dc_dummy_high, |
130 | 134 | ARG_dc_data_high, |
131 | | - ARG_cmd_bits, |
132 | | - ARG_param_bits, |
| 135 | + //ARG_cmd_bits, |
| 136 | + //ARG_param_bits, |
133 | 137 | ARG_cs_active_high, |
134 | 138 | ARG_reverse_color_bits, |
135 | 139 | ARG_swap_color_bytes, |
|
199 | 203 |
|
200 | 204 | self->callback = mp_const_none; |
201 | 205 |
|
202 | | - #if !defined(mp_hal_pin_output) && !defined(IDF_VER) |
| 206 | + // mp_hal_pin_output if a function for rp2, so I have added PICO_HEAP_SIZE |
| 207 | + #if !defined(mp_hal_pin_output) && !defined(IDF_VER) && !defined(PICO_HEAP_SIZE) |
203 | 208 | mp_raise_msg(&mp_type_NotImplementedError, MP_ERROR_TEXT("LCD I80 but is not available for this MCU")); |
204 | 209 | #else |
205 | 210 | self->panel_io_config.user_ctx = self; |
|
220 | 225 | #endif /* defined(MP_HAL_PIN_SPEED_VERY_HIGH) && !defined(MICROPY_INCLUDED_MIMXRT_MPHALPORT_H) */ |
221 | 226 |
|
222 | 227 | mp_hal_pin_write(self->bus_config.dc_gpio_num, self->panel_io_config.dc_levels.dc_data_level); |
223 | | - mp_hal_pin_write(self->bus_config.wr_gpio_num, 0); |
| 228 | + mp_hal_pin_write(self->bus_config.wr_gpio_num, !self->panel_io_config.flags.cs_active_high); |
224 | 229 |
|
225 | 230 | self->bus_config.data_gpio_nums[0] = (mp_hal_pin_obj_t)mp_hal_get_pin_obj(args[ARG_data0].u_obj); |
226 | 231 | self->bus_config.data_gpio_nums[1] = (mp_hal_pin_obj_t)mp_hal_get_pin_obj(args[ARG_data1].u_obj); |
|
285 | 290 |
|
286 | 291 | CS_LOW(); |
287 | 292 | DC_CMD(); |
288 | | - |
| 293 | + |
289 | 294 | if (self->bus_config.bus_width == 8) { |
290 | | - uint8_t *buf = NULL; |
| 295 | + uint8_t buf[1]; |
291 | 296 | if (self->panel_io_config.lcd_cmd_bits == 8) { |
292 | 297 | buf[0] = (uint8_t)lcd_cmd; |
293 | 298 | WRITE8(); |
294 | 299 | } else { |
295 | 300 | buf[0] = (uint8_t)((uint16_t)lcd_cmd >> 8); |
296 | 301 | WRITE8(); |
297 | | - WR_LOW(); |
298 | | - WR_HIGH(); |
| 302 | + WR_PULSE(); |
299 | 303 | buf[0] = (uint8_t)((uint16_t)lcd_cmd & 0xFF); |
300 | 304 | WRITE8(); |
301 | 305 | } |
302 | 306 | } else { |
303 | | - uint16_t *buf = NULL; |
| 307 | + uint16_t buf[1]; |
304 | 308 | buf[0] = (uint16_t)lcd_cmd; |
305 | 309 | WRITE16(); |
306 | 310 | } |
307 | | - |
308 | | - WR_LOW(); |
309 | | - WR_HIGH(); |
| 311 | + |
| 312 | + WR_PULSE(); |
310 | 313 |
|
311 | 314 | DC_DATA(); |
312 | 315 |
|
313 | | - if (param != NULL) { |
314 | | - if (self->bus_config.bus_width == 8) { |
315 | | - uint8_t *buf = (uint8_t *)param; |
316 | | - uint16_t len = (uint16_t)param_size; |
317 | | - while (len--) { |
318 | | - WRITE8(); |
319 | | - WR_LOW(); |
320 | | - WR_HIGH(); |
321 | | - buf++; |
322 | | - } |
323 | | - } else { |
324 | | - uint16_t *buf = (uint16_t *)param; |
325 | | - uint16_t len = (uint16_t)(param_size / 2); |
326 | | - while (len--) { |
327 | | - WRITE16(); |
328 | | - WR_LOW(); |
329 | | - WR_HIGH(); |
330 | | - buf++; |
| 316 | + if (param_size > 0 ) { |
| 317 | + if (self->bus_config.bus_width == 8) { |
| 318 | + if (self->panel_io_config.lcd_cmd_bits == 8) { |
| 319 | + // 8 bit param over 8 bit bus |
| 320 | + uint8_t *buf = (uint8_t *)param; |
| 321 | + uint16_t len = (uint16_t)param_size; |
| 322 | + while (len--) { |
| 323 | + WRITE8(); |
| 324 | + WR_PULSE(); |
| 325 | + buf++; |
| 326 | + } |
| 327 | + } else { |
| 328 | + // 16 bit param over 8 bit bus |
| 329 | + uint16_t buf[1]; |
| 330 | + uint16_t *p = (uint16_t *)param; |
| 331 | + uint16_t len = (uint16_t)(param_size / 2); |
| 332 | + while (len--) { |
| 333 | + buf[0] = (uint8_t)(*p >> 8); |
| 334 | + WRITE8(); |
| 335 | + WR_PULSE(); |
| 336 | + buf[0] = (uint8_t)(*p & 0xFF); |
| 337 | + WRITE8(); |
| 338 | + WR_PULSE(); |
| 339 | + p++; |
| 340 | + } |
331 | 341 | } |
332 | | - } |
| 342 | + } else { |
| 343 | + if (self->panel_io_config.lcd_cmd_bits == 8) { |
| 344 | + // 8 bit param over 16 bit bus |
| 345 | + uint16_t buf[1]; |
| 346 | + uint8_t *p = (uint8_t *)param; |
| 347 | + uint16_t len = (uint16_t)param_size; |
| 348 | + while (len--) { |
| 349 | + buf[0] = (uint16_t)(*p); |
| 350 | + WRITE16(); |
| 351 | + WR_PULSE(); |
| 352 | + //WR_LOW(); |
| 353 | + //WR_HIGH(); |
| 354 | + p++; |
| 355 | + } |
| 356 | + } else { |
| 357 | + // 16 bit param over 16 bit bus |
| 358 | + uint16_t *buf = (uint16_t *)param; |
| 359 | + uint16_t len = (uint16_t)(param_size); |
| 360 | + while (len--) { |
| 361 | + WRITE16(); |
| 362 | + WR_PULSE(); |
| 363 | + buf++; |
| 364 | + } |
| 365 | + } |
| 366 | + } |
333 | 367 | } |
334 | 368 |
|
335 | 369 | CS_HIGH(); |
|
361 | 395 | DC_CMD(); |
362 | 396 |
|
363 | 397 | if (self->bus_config.bus_width == 8) { |
364 | | - uint8_t *buf = NULL; |
| 398 | + uint8_t buf[1]; |
365 | 399 | if (self->panel_io_config.lcd_cmd_bits == 8) { |
366 | 400 | buf[0] = (uint8_t)lcd_cmd; |
367 | 401 | WRITE8(); |
368 | 402 | } else { |
369 | 403 | buf[0] = (uint8_t)((uint16_t)lcd_cmd >> 8); |
370 | 404 | WRITE8(); |
371 | | - WR_LOW(); |
372 | | - WR_HIGH(); |
| 405 | + WR_PULSE(); |
373 | 406 | buf[0] = (uint8_t)((uint16_t)lcd_cmd & 0xFF); |
374 | 407 | WRITE8(); |
375 | 408 | } |
376 | 409 | } else { |
377 | | - uint16_t *buf = NULL; |
| 410 | + uint16_t buf[1]; |
378 | 411 | buf[0] = (uint16_t)lcd_cmd; |
379 | 412 | WRITE16(); |
380 | 413 | } |
381 | | - WR_LOW(); |
382 | | - WR_HIGH(); |
| 414 | + WR_PULSE(); |
383 | 415 | DC_DATA(); |
384 | 416 |
|
385 | 417 | self->write_color(self, color, color_size); |
|
464 | 496 | WRITE8(); |
465 | 497 | } |
466 | 498 | buf++; |
467 | | - WR_LOW(); |
468 | | - WR_HIGH(); |
| 499 | + WR_PULSE(); |
469 | 500 | } |
470 | 501 | } |
471 | 502 |
|
|
482 | 513 | WRITE16(); |
483 | 514 | } |
484 | 515 | buf++; |
485 | | - WR_LOW(); |
486 | | - WR_HIGH(); |
| 516 | + WR_PULSE(); |
487 | 517 | } |
488 | 518 | } |
489 | 519 |
|
|
501 | 531 | last = buf[0]; |
502 | 532 | WRITE8(); |
503 | 533 | } |
504 | | - WR_LOW(); |
505 | | - WR_HIGH(); |
| 534 | + WR_PULSE(); |
506 | 535 |
|
507 | 536 | buf = &bd[i * 2]; |
508 | 537 |
|
509 | 538 | if (buf[0] != last) { |
510 | 539 | last = buf[0]; |
511 | 540 | WRITE8(); |
512 | 541 | } |
513 | | - WR_LOW(); |
514 | | - WR_HIGH(); |
| 542 | + WR_PULSE(); |
515 | 543 | } |
516 | 544 | } |
517 | 545 |
|
|
529 | 557 | last = buf[0]; |
530 | 558 | WRITE16(); |
531 | 559 | } |
532 | | - WR_LOW(); |
533 | | - WR_HIGH(); |
| 560 | + WR_PULSE(); |
534 | 561 |
|
535 | 562 | buf = &bd[i * 2]; |
536 | 563 |
|
537 | 564 | if (buf[0] != last) { |
538 | 565 | last = buf[0]; |
539 | 566 | WRITE16(); |
540 | 567 | } |
541 | | - WR_LOW(); |
542 | | - WR_HIGH(); |
| 568 | + WR_PULSE(); |
543 | 569 | } |
544 | 570 | } |
545 | 571 |
|
|
556 | 582 | last = bd[0]; |
557 | 583 | *buf = bd[0] << 8; |
558 | 584 | WRITE8(); |
559 | | - WR_LOW(); |
560 | | - WR_HIGH(); |
| 585 | + WR_PULSE(); |
561 | 586 | *buf = bd[0] >> 8; |
562 | 587 | WRITE8(); |
563 | 588 | WR_LOW(); |
564 | 589 | WR_HIGH(); |
565 | 590 | } |
566 | | - WR_LOW(); |
567 | | - WR_HIGH(); |
| 591 | + WR_PULSE(); |
568 | 592 | bd++; |
569 | 593 | } |
570 | 594 | } |
|
582 | 606 | last = buf[0]; |
583 | 607 | WRITE16(); |
584 | 608 | } |
585 | | - WR_LOW(); |
586 | | - WR_HIGH(); |
| 609 | + WR_PULSE(); |
587 | 610 | buf++; |
588 | 611 | } |
589 | 612 | } |
|
0 commit comments