From fadb5a102426182f1412adbbe9d57268882f8b5f Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Sat, 23 Mar 2019 18:34:42 -0700 Subject: Added option to toggle cs in displayio init sequence --- shared-module/displayio/Display.c | 8 +++++++- shared-module/displayio/Display.h | 3 +++ shared-module/displayio/FourWire.c | 5 +++++ 3 files changed, 15 insertions(+), 1 deletion(-) (limited to 'shared-module') diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c index 0e76a868f..f82d94799 100644 --- a/shared-module/displayio/Display.c +++ b/shared-module/displayio/Display.c @@ -44,7 +44,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, mp_obj_t bus, uint16_t width, uint16_t height, int16_t colstart, int16_t rowstart, uint16_t rotation, uint16_t color_depth, uint8_t set_column_command, uint8_t set_row_command, uint8_t write_ram_command, uint8_t set_vertical_scroll, uint8_t* init_sequence, uint16_t init_sequence_len, - const mcu_pin_obj_t* backlight_pin) { + const mcu_pin_obj_t* backlight_pin, bool init_cs_toggle) { self->color_depth = color_depth; self->set_column_command = set_column_command; self->set_row_command = set_row_command; @@ -54,6 +54,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, self->colstart = colstart; self->rowstart = rowstart; self->auto_brightness = false; + self->init_cs_toggle = init_cs_toggle; if (MP_OBJ_IS_TYPE(bus, &displayio_parallelbus_type)) { self->begin_transaction = common_hal_displayio_parallelbus_begin_transaction; @@ -63,6 +64,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, self->begin_transaction = common_hal_displayio_fourwire_begin_transaction; self->send = common_hal_displayio_fourwire_send; self->end_transaction = common_hal_displayio_fourwire_end_transaction; + self->set_cs = common_hal_displayio_fourwire_set_cs; } else { mp_raise_ValueError(translate("Unsupported display bus type")); } @@ -82,6 +84,10 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, uint8_t *data = cmd + 2; self->send(self->bus, true, cmd, 1); self->send(self->bus, false, data, data_size); + if (self->init_cs_toggle && self->set_cs != NULL) { + self->set_cs(self->bus, true); + self->set_cs(self->bus, false); + } uint16_t delay_length_ms = 10; if (delay) { data_size++; diff --git a/shared-module/displayio/Display.h b/shared-module/displayio/Display.h index 04da68b63..250f44031 100644 --- a/shared-module/displayio/Display.h +++ b/shared-module/displayio/Display.h @@ -34,6 +34,7 @@ typedef bool (*display_bus_begin_transaction)(mp_obj_t bus); typedef void (*display_bus_send)(mp_obj_t bus, bool command, uint8_t *data, uint32_t data_length); typedef void (*display_bus_end_transaction)(mp_obj_t bus); +typedef void (*display_bus_set_cs)(mp_obj_t bus, bool high); typedef struct { mp_obj_base_t base; @@ -49,9 +50,11 @@ typedef struct { uint64_t last_refresh; int16_t colstart; int16_t rowstart; + bool init_cs_toggle; display_bus_begin_transaction begin_transaction; display_bus_send send; display_bus_end_transaction end_transaction; + display_bus_set_cs set_cs; union { digitalio_digitalinout_obj_t backlight_inout; pulseio_pwmout_obj_t backlight_pwm; diff --git a/shared-module/displayio/FourWire.c b/shared-module/displayio/FourWire.c index 9da5c0701..ae1fde7ca 100644 --- a/shared-module/displayio/FourWire.c +++ b/shared-module/displayio/FourWire.c @@ -87,3 +87,8 @@ void common_hal_displayio_fourwire_end_transaction(mp_obj_t obj) { common_hal_digitalio_digitalinout_set_value(&self->chip_select, true); common_hal_busio_spi_unlock(self->bus); } + +void common_hal_displayio_fourwire_set_cs(mp_obj_t obj, bool high) { + displayio_fourwire_obj_t* self = MP_OBJ_TO_PTR(obj); + common_hal_digitalio_digitalinout_set_value(&self->chip_select, high); +} -- cgit v1.2.3 From b25c4baeecc885ac31f2e92686179b4f2385cdc6 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Sat, 23 Mar 2019 21:04:25 -0700 Subject: Moving Toggle to before command fixes driver issue --- shared-module/displayio/Display.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'shared-module') diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c index f82d94799..8ebe4b543 100644 --- a/shared-module/displayio/Display.c +++ b/shared-module/displayio/Display.c @@ -60,6 +60,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, self->begin_transaction = common_hal_displayio_parallelbus_begin_transaction; self->send = common_hal_displayio_parallelbus_send; self->end_transaction = common_hal_displayio_parallelbus_end_transaction; + self->set_cs = NULL; } else if (MP_OBJ_IS_TYPE(bus, &displayio_fourwire_type)) { self->begin_transaction = common_hal_displayio_fourwire_begin_transaction; self->send = common_hal_displayio_fourwire_send; @@ -82,12 +83,12 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, bool delay = (data_size & DELAY) != 0; data_size &= ~DELAY; uint8_t *data = cmd + 2; - self->send(self->bus, true, cmd, 1); - self->send(self->bus, false, data, data_size); if (self->init_cs_toggle && self->set_cs != NULL) { self->set_cs(self->bus, true); self->set_cs(self->bus, false); } + self->send(self->bus, true, cmd, 1); + self->send(self->bus, false, data, data_size); uint16_t delay_length_ms = 10; if (delay) { data_size++; -- cgit v1.2.3 From c3329e224ddf352131568a5dd914943bc5194d4d Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Sun, 24 Mar 2019 23:59:28 -0700 Subject: Added Single Byte Boundaries option for certain displays --- .../atmel-samd/boards/hallowing_m0_express/board.c | 3 ++- ports/atmel-samd/boards/pybadge/board.c | 3 ++- ports/atmel-samd/boards/pyportal/board.c | 4 +++- shared-bindings/displayio/Display.c | 11 +++++---- shared-bindings/displayio/Display.h | 3 ++- shared-module/displayio/Display.c | 26 +++++++++++++++------- shared-module/displayio/Display.h | 1 + 7 files changed, 35 insertions(+), 16 deletions(-) (limited to 'shared-module') diff --git a/ports/atmel-samd/boards/hallowing_m0_express/board.c b/ports/atmel-samd/boards/hallowing_m0_express/board.c index 4f073e270..aa4f96d15 100644 --- a/ports/atmel-samd/boards/hallowing_m0_express/board.c +++ b/ports/atmel-samd/boards/hallowing_m0_express/board.c @@ -94,7 +94,8 @@ void board_init(void) { display_init_sequence, sizeof(display_init_sequence), &pin_PA00, - true); + true, // init_cs_toggle + false); // single_byte_bounds common_hal_displayio_display_set_auto_brightness(display, true); } diff --git a/ports/atmel-samd/boards/pybadge/board.c b/ports/atmel-samd/boards/pybadge/board.c index ce8c42a43..0c55e41e2 100644 --- a/ports/atmel-samd/boards/pybadge/board.c +++ b/ports/atmel-samd/boards/pybadge/board.c @@ -100,7 +100,8 @@ void board_init(void) { display_init_sequence, sizeof(display_init_sequence), &pin_PA00, - true); + true, // init_cs_toggle + false); // single_byte_bounds common_hal_displayio_display_set_auto_brightness(display, true); } diff --git a/ports/atmel-samd/boards/pyportal/board.c b/ports/atmel-samd/boards/pyportal/board.c index 3a306b0b4..14a4dadbe 100644 --- a/ports/atmel-samd/boards/pyportal/board.c +++ b/ports/atmel-samd/boards/pyportal/board.c @@ -91,7 +91,9 @@ void board_init(void) { display_init_sequence, sizeof(display_init_sequence), &pin_PB31, - true); + true, // init_cs_toggle + false); // single_byte_bounds + common_hal_displayio_display_set_auto_brightness(display, true); } diff --git a/shared-bindings/displayio/Display.c b/shared-bindings/displayio/Display.c index 8fed5129f..af2c27149 100644 --- a/shared-bindings/displayio/Display.c +++ b/shared-bindings/displayio/Display.c @@ -50,7 +50,7 @@ //| Most people should not use this class directly. Use a specific display driver instead that will //| contain the initialization sequence at minimum. //| -//| .. class:: Display(display_bus, init_sequence, *, width, height, colstart=0, rowstart=0, rotation=0, color_depth=16, set_column_command=0x2a, set_row_command=0x2b, write_ram_command=0x2c, set_vertical_scroll=0, backlight_pin=None, init_cs_toggle=False) +//| .. class:: Display(display_bus, init_sequence, *, width, height, colstart=0, rowstart=0, rotation=0, color_depth=16, set_column_command=0x2a, set_row_command=0x2b, write_ram_command=0x2c, set_vertical_scroll=0, backlight_pin=None, init_cs_toggle=True, single_byte_bounds=False) //| //| Create a Display object on the given display bus (`displayio.FourWire` or `displayio.ParallelBus`). //| @@ -91,10 +91,11 @@ //| :param int write_ram_command: Command used to write pixels values into the update region //| :param int set_vertical_scroll: Command used to set the first row to show //| :param microcontroller.Pin backlight_pin: Pin connected to the display's backlight -//| :param bool init_cs_toggle: Toggle the Chip Select between each initialization command. +//| :param bool init_cs_toggle: Toggle the Chip Select between each initialization command +//| :param bool single_byte_bounds: Display column and row commands use single bytes //| STATIC mp_obj_t displayio_display_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - enum { ARG_display_bus, ARG_init_sequence, ARG_width, ARG_height, ARG_colstart, ARG_rowstart, ARG_rotation, ARG_color_depth, ARG_set_column_command, ARG_set_row_command, ARG_write_ram_command, ARG_set_vertical_scroll, ARG_backlight_pin, ARG_init_cs_toggle }; + enum { ARG_display_bus, ARG_init_sequence, ARG_width, ARG_height, ARG_colstart, ARG_rowstart, ARG_rotation, ARG_color_depth, ARG_set_column_command, ARG_set_row_command, ARG_write_ram_command, ARG_set_vertical_scroll, ARG_backlight_pin, ARG_init_cs_toggle, ARG_single_byte_bounds }; static const mp_arg_t allowed_args[] = { { MP_QSTR_display_bus, MP_ARG_REQUIRED | MP_ARG_OBJ }, { MP_QSTR_init_sequence, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -110,6 +111,7 @@ STATIC mp_obj_t displayio_display_make_new(const mp_obj_type_t *type, size_t n_a { MP_QSTR_set_vertical_scroll, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x0} }, { MP_QSTR_backlight_pin, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, { MP_QSTR_init_cs_toggle, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = true} }, + { MP_QSTR_single_byte_bounds, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); @@ -149,7 +151,8 @@ STATIC mp_obj_t displayio_display_make_new(const mp_obj_type_t *type, size_t n_a args[ARG_write_ram_command].u_int, args[ARG_set_vertical_scroll].u_int, bufinfo.buf, bufinfo.len, MP_OBJ_TO_PTR(backlight_pin), - args[ARG_init_cs_toggle].u_bool); + args[ARG_init_cs_toggle].u_bool, + args[ARG_single_byte_bounds].u_bool); return self; } diff --git a/shared-bindings/displayio/Display.h b/shared-bindings/displayio/Display.h index 407afe1c3..617686445 100644 --- a/shared-bindings/displayio/Display.h +++ b/shared-bindings/displayio/Display.h @@ -40,7 +40,8 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, mp_obj_t bus, uint16_t width, uint16_t height, int16_t colstart, int16_t rowstart, uint16_t rotation, uint16_t color_depth, uint8_t set_column_command, uint8_t set_row_command, uint8_t write_ram_command, uint8_t set_vertical_scroll, - uint8_t* init_sequence, uint16_t init_sequence_len, const mcu_pin_obj_t* backlight_pin, bool init_cs_toggle); + uint8_t* init_sequence, uint16_t init_sequence_len, const mcu_pin_obj_t* backlight_pin, bool init_cs_toggle, + bool single_byte_bounds); int32_t common_hal_displayio_display_wait_for_frame(displayio_display_obj_t* self); diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c index 8ebe4b543..3936f3b17 100644 --- a/shared-module/displayio/Display.c +++ b/shared-module/displayio/Display.c @@ -44,7 +44,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, mp_obj_t bus, uint16_t width, uint16_t height, int16_t colstart, int16_t rowstart, uint16_t rotation, uint16_t color_depth, uint8_t set_column_command, uint8_t set_row_command, uint8_t write_ram_command, uint8_t set_vertical_scroll, uint8_t* init_sequence, uint16_t init_sequence_len, - const mcu_pin_obj_t* backlight_pin, bool init_cs_toggle) { + const mcu_pin_obj_t* backlight_pin, bool init_cs_toggle, bool single_byte_bounds) { self->color_depth = color_depth; self->set_column_command = set_column_command; self->set_row_command = set_row_command; @@ -55,6 +55,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, self->rowstart = rowstart; self->auto_brightness = false; self->init_cs_toggle = init_cs_toggle; + self->single_byte_bounds = single_byte_bounds; if (MP_OBJ_IS_TYPE(bus, &displayio_parallelbus_type)) { self->begin_transaction = common_hal_displayio_parallelbus_begin_transaction; @@ -218,16 +219,25 @@ void displayio_display_end_transaction(displayio_display_obj_t* self) { } void displayio_display_set_region_to_update(displayio_display_obj_t* self, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { - // TODO(tannewt): Handle displays with single byte bounds. uint16_t data[2]; self->send(self->bus, true, &self->set_column_command, 1); - data[0] = __builtin_bswap16(x0 + self->colstart); - data[1] = __builtin_bswap16(x1 - 1 + self->colstart); - self->send(self->bus, false, (uint8_t*) data, 4); + if (self->single_byte_bounds) { + data[0] = __builtin_bswap16((x0 + self->colstart) << 8 | (x1 - 1 + self->colstart) && 0xFF); + self->send(self->bus, false, (uint8_t*) data, 2); + } else { + data[0] = __builtin_bswap16(x0 + self->colstart); + data[1] = __builtin_bswap16(x1 - 1 + self->colstart); + self->send(self->bus, false, (uint8_t*) data, 4); + } self->send(self->bus, true, &self->set_row_command, 1); - data[0] = __builtin_bswap16(y0 + self->rowstart); - data[1] = __builtin_bswap16(y1 - 1 + self->rowstart); - self->send(self->bus, false, (uint8_t*) data, 4); + if (self->single_byte_bounds) { + data[0] = __builtin_bswap16((y0 + self->rowstart) << 8 | (y1 - 1 + self->rowstart) && 0xFF); + self->send(self->bus, false, (uint8_t*) data, 2); + } else { + data[0] = __builtin_bswap16(y0 + self->rowstart); + data[1] = __builtin_bswap16(y1 - 1 + self->rowstart); + self->send(self->bus, false, (uint8_t*) data, 4); + } self->send(self->bus, true, &self->write_ram_command, 1); } diff --git a/shared-module/displayio/Display.h b/shared-module/displayio/Display.h index 250f44031..18118bc72 100644 --- a/shared-module/displayio/Display.h +++ b/shared-module/displayio/Display.h @@ -51,6 +51,7 @@ typedef struct { int16_t colstart; int16_t rowstart; bool init_cs_toggle; + bool single_byte_bounds; display_bus_begin_transaction begin_transaction; display_bus_send send; display_bus_end_transaction end_transaction; -- cgit v1.2.3 From cc96c39e6d15503d121778f9110d521ffe55a458 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Mon, 25 Mar 2019 23:58:58 -0700 Subject: Fixed wrong operator --- shared-module/displayio/Display.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'shared-module') diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c index 3936f3b17..b7ed2c64c 100644 --- a/shared-module/displayio/Display.c +++ b/shared-module/displayio/Display.c @@ -222,7 +222,7 @@ void displayio_display_set_region_to_update(displayio_display_obj_t* self, uint1 uint16_t data[2]; self->send(self->bus, true, &self->set_column_command, 1); if (self->single_byte_bounds) { - data[0] = __builtin_bswap16((x0 + self->colstart) << 8 | (x1 - 1 + self->colstart) && 0xFF); + data[0] = __builtin_bswap16(((x0 + self->colstart) << 8) | ((x1 - 1 + self->colstart) & 0xFF)); self->send(self->bus, false, (uint8_t*) data, 2); } else { data[0] = __builtin_bswap16(x0 + self->colstart); @@ -231,7 +231,7 @@ void displayio_display_set_region_to_update(displayio_display_obj_t* self, uint1 } self->send(self->bus, true, &self->set_row_command, 1); if (self->single_byte_bounds) { - data[0] = __builtin_bswap16((y0 + self->rowstart) << 8 | (y1 - 1 + self->rowstart) && 0xFF); + data[0] = __builtin_bswap16(((y0 + self->rowstart) << 8) | ((y1 - 1 + self->rowstart) & 0xFF)); self->send(self->bus, false, (uint8_t*) data, 2); } else { data[0] = __builtin_bswap16(y0 + self->rowstart); -- cgit v1.2.3 From 09a1f06bbf6b333aaa3a76dbd93e0a5f5c9d7ef4 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Tue, 26 Mar 2019 07:39:40 -0700 Subject: Added small delay inside toggle for edge cases --- shared-module/displayio/Display.c | 1 + 1 file changed, 1 insertion(+) (limited to 'shared-module') diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c index 8ebe4b543..bbc23b7b0 100644 --- a/shared-module/displayio/Display.c +++ b/shared-module/displayio/Display.c @@ -85,6 +85,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, uint8_t *data = cmd + 2; if (self->init_cs_toggle && self->set_cs != NULL) { self->set_cs(self->bus, true); + common_hal_time_delay_ms(1); self->set_cs(self->bus, false); } self->send(self->bus, true, cmd, 1); -- cgit v1.2.3 From a54493b4ae41210f12cb940db019be87d68253a1 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Tue, 26 Mar 2019 07:45:17 -0700 Subject: Added small delay inside toggle for edge cases --- shared-module/displayio/Display.c | 1 + 1 file changed, 1 insertion(+) (limited to 'shared-module') diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c index b7ed2c64c..70e5bc8ed 100644 --- a/shared-module/displayio/Display.c +++ b/shared-module/displayio/Display.c @@ -86,6 +86,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, uint8_t *data = cmd + 2; if (self->init_cs_toggle && self->set_cs != NULL) { self->set_cs(self->bus, true); + common_hal_time_delay_ms(1); self->set_cs(self->bus, false); } self->send(self->bus, true, cmd, 1); -- cgit v1.2.3 From b2ad16f5c84cd4dc853114e5fc526ab1827580a4 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Tue, 26 Mar 2019 18:34:07 -0700 Subject: Removed parameter so CS is always toggled --- ports/atmel-samd/boards/hallowing_m0_express/board.c | 3 +-- ports/atmel-samd/boards/pybadge/board.c | 3 +-- ports/atmel-samd/boards/pyportal/board.c | 3 +-- shared-bindings/displayio/Display.c | 6 ++---- shared-bindings/displayio/Display.h | 2 +- shared-module/displayio/Display.c | 5 ++--- shared-module/displayio/Display.h | 1 - 7 files changed, 8 insertions(+), 15 deletions(-) (limited to 'shared-module') diff --git a/ports/atmel-samd/boards/hallowing_m0_express/board.c b/ports/atmel-samd/boards/hallowing_m0_express/board.c index 4f073e270..23b119413 100644 --- a/ports/atmel-samd/boards/hallowing_m0_express/board.c +++ b/ports/atmel-samd/boards/hallowing_m0_express/board.c @@ -93,8 +93,7 @@ void board_init(void) { 0x37, // set vertical scroll command display_init_sequence, sizeof(display_init_sequence), - &pin_PA00, - true); + &pin_PA00); common_hal_displayio_display_set_auto_brightness(display, true); } diff --git a/ports/atmel-samd/boards/pybadge/board.c b/ports/atmel-samd/boards/pybadge/board.c index ce8c42a43..0881d8f45 100644 --- a/ports/atmel-samd/boards/pybadge/board.c +++ b/ports/atmel-samd/boards/pybadge/board.c @@ -99,8 +99,7 @@ void board_init(void) { 0x37, // set vertical scroll command display_init_sequence, sizeof(display_init_sequence), - &pin_PA00, - true); + &pin_PA00); common_hal_displayio_display_set_auto_brightness(display, true); } diff --git a/ports/atmel-samd/boards/pyportal/board.c b/ports/atmel-samd/boards/pyportal/board.c index 3a306b0b4..d2c328850 100644 --- a/ports/atmel-samd/boards/pyportal/board.c +++ b/ports/atmel-samd/boards/pyportal/board.c @@ -90,8 +90,7 @@ void board_init(void) { 0x37, // Set vertical scroll command display_init_sequence, sizeof(display_init_sequence), - &pin_PB31, - true); + &pin_PB31); common_hal_displayio_display_set_auto_brightness(display, true); } diff --git a/shared-bindings/displayio/Display.c b/shared-bindings/displayio/Display.c index 9cefb9532..ddca9ffd8 100644 --- a/shared-bindings/displayio/Display.c +++ b/shared-bindings/displayio/Display.c @@ -94,7 +94,7 @@ //| :param bool init_cs_toggle: Toggle the Chip Select between each initialization command //| STATIC mp_obj_t displayio_display_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - enum { ARG_display_bus, ARG_init_sequence, ARG_width, ARG_height, ARG_colstart, ARG_rowstart, ARG_rotation, ARG_color_depth, ARG_set_column_command, ARG_set_row_command, ARG_write_ram_command, ARG_set_vertical_scroll, ARG_backlight_pin, ARG_init_cs_toggle }; + enum { ARG_display_bus, ARG_init_sequence, ARG_width, ARG_height, ARG_colstart, ARG_rowstart, ARG_rotation, ARG_color_depth, ARG_set_column_command, ARG_set_row_command, ARG_write_ram_command, ARG_set_vertical_scroll, ARG_backlight_pin }; static const mp_arg_t allowed_args[] = { { MP_QSTR_display_bus, MP_ARG_REQUIRED | MP_ARG_OBJ }, { MP_QSTR_init_sequence, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -109,7 +109,6 @@ STATIC mp_obj_t displayio_display_make_new(const mp_obj_type_t *type, size_t n_a { MP_QSTR_write_ram_command, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x2c} }, { MP_QSTR_set_vertical_scroll, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x0} }, { MP_QSTR_backlight_pin, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, - { MP_QSTR_init_cs_toggle, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = true} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); @@ -148,8 +147,7 @@ STATIC mp_obj_t displayio_display_make_new(const mp_obj_type_t *type, size_t n_a args[ARG_color_depth].u_int, args[ARG_set_column_command].u_int, args[ARG_set_row_command].u_int, args[ARG_write_ram_command].u_int, args[ARG_set_vertical_scroll].u_int, - bufinfo.buf, bufinfo.len, MP_OBJ_TO_PTR(backlight_pin), - args[ARG_init_cs_toggle].u_bool); + bufinfo.buf, bufinfo.len, MP_OBJ_TO_PTR(backlight_pin)); return self; } diff --git a/shared-bindings/displayio/Display.h b/shared-bindings/displayio/Display.h index 407afe1c3..7d6444a2d 100644 --- a/shared-bindings/displayio/Display.h +++ b/shared-bindings/displayio/Display.h @@ -40,7 +40,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, mp_obj_t bus, uint16_t width, uint16_t height, int16_t colstart, int16_t rowstart, uint16_t rotation, uint16_t color_depth, uint8_t set_column_command, uint8_t set_row_command, uint8_t write_ram_command, uint8_t set_vertical_scroll, - uint8_t* init_sequence, uint16_t init_sequence_len, const mcu_pin_obj_t* backlight_pin, bool init_cs_toggle); + uint8_t* init_sequence, uint16_t init_sequence_len, const mcu_pin_obj_t* backlight_pin); int32_t common_hal_displayio_display_wait_for_frame(displayio_display_obj_t* self); diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c index bbc23b7b0..c693d3c90 100644 --- a/shared-module/displayio/Display.c +++ b/shared-module/displayio/Display.c @@ -44,7 +44,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, mp_obj_t bus, uint16_t width, uint16_t height, int16_t colstart, int16_t rowstart, uint16_t rotation, uint16_t color_depth, uint8_t set_column_command, uint8_t set_row_command, uint8_t write_ram_command, uint8_t set_vertical_scroll, uint8_t* init_sequence, uint16_t init_sequence_len, - const mcu_pin_obj_t* backlight_pin, bool init_cs_toggle) { + const mcu_pin_obj_t* backlight_pin) { self->color_depth = color_depth; self->set_column_command = set_column_command; self->set_row_command = set_row_command; @@ -54,7 +54,6 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, self->colstart = colstart; self->rowstart = rowstart; self->auto_brightness = false; - self->init_cs_toggle = init_cs_toggle; if (MP_OBJ_IS_TYPE(bus, &displayio_parallelbus_type)) { self->begin_transaction = common_hal_displayio_parallelbus_begin_transaction; @@ -83,7 +82,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, bool delay = (data_size & DELAY) != 0; data_size &= ~DELAY; uint8_t *data = cmd + 2; - if (self->init_cs_toggle && self->set_cs != NULL) { + if (self->set_cs != NULL) { self->set_cs(self->bus, true); common_hal_time_delay_ms(1); self->set_cs(self->bus, false); diff --git a/shared-module/displayio/Display.h b/shared-module/displayio/Display.h index 250f44031..70308daa2 100644 --- a/shared-module/displayio/Display.h +++ b/shared-module/displayio/Display.h @@ -50,7 +50,6 @@ typedef struct { uint64_t last_refresh; int16_t colstart; int16_t rowstart; - bool init_cs_toggle; display_bus_begin_transaction begin_transaction; display_bus_send send; display_bus_end_transaction end_transaction; -- cgit v1.2.3 From 9232ec50f1adcc9d192b6fdda2746c0305c9ced5 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Wed, 27 Mar 2019 15:23:20 -0700 Subject: Fix HID buffer lookup The previous code assumed HID report ids were consecutive. This is not true in the CircuitPython descriptor where report ids are fixed for each report type. Fixes #1617 --- shared-module/usb_hid/Device.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'shared-module') diff --git a/shared-module/usb_hid/Device.c b/shared-module/usb_hid/Device.c index 820e14ad0..0e256cb5e 100644 --- a/shared-module/usb_hid/Device.c +++ b/shared-module/usb_hid/Device.c @@ -60,27 +60,33 @@ void common_hal_usb_hid_device_send_report(usb_hid_device_obj_t *self, uint8_t* } } +static usb_hid_device_obj_t* get_hid_device(uint8_t report_id) { + for (uint8_t i = 0; i < USB_HID_NUM_DEVICES; i++) { + if (usb_hid_devices[i].report_id == report_id) { + return &usb_hid_devices[i]; + } + } + return NULL; +} + // Callbacks invoked when receive Get_Report request through control endpoint uint16_t tud_hid_generic_get_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) { // only support Input Report if ( report_type != HID_REPORT_TYPE_INPUT ) return 0; - // index is ID-1 - uint8_t idx = ( report_id ? (report_id-1) : 0 ); - // fill buffer with current report - memcpy(buffer, usb_hid_devices[idx].report_buffer, reqlen); + memcpy(buffer, get_hid_device(report_id)->report_buffer, reqlen); return reqlen; } // Callbacks invoked when receive Set_Report request through control endpoint void tud_hid_generic_set_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) { - // index is ID-1 - uint8_t idx = ( report_id ? (report_id-1) : 0 ); + usb_hid_device_obj_t* hid_device = get_hid_device(report_id); if ( report_type == HID_REPORT_TYPE_OUTPUT ) { // Check if it is Keyboard device - if ( (usb_hid_devices[idx].usage_page == HID_USAGE_PAGE_DESKTOP) && (usb_hid_devices[idx].usage == HID_USAGE_DESKTOP_KEYBOARD) ) { + if (hid_device->usage_page == HID_USAGE_PAGE_DESKTOP && + hid_device->usage == HID_USAGE_DESKTOP_KEYBOARD) { // This is LED indicator (CapsLock, NumLock) // TODO Light up some LED here } -- cgit v1.2.3 From f3ec0514cdfc818c57274cd80025f582ad562f22 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Wed, 27 Mar 2019 20:11:32 -0700 Subject: Simplified into fourwire only --- shared-bindings/displayio/FourWire.h | 2 -- shared-module/displayio/Display.c | 7 ------- shared-module/displayio/Display.h | 2 -- shared-module/displayio/FourWire.c | 11 ++++++----- 4 files changed, 6 insertions(+), 16 deletions(-) (limited to 'shared-module') diff --git a/shared-bindings/displayio/FourWire.h b/shared-bindings/displayio/FourWire.h index a7fda2638..b8b00372c 100644 --- a/shared-bindings/displayio/FourWire.h +++ b/shared-bindings/displayio/FourWire.h @@ -47,6 +47,4 @@ void common_hal_displayio_fourwire_send(mp_obj_t self, bool command, uint8_t *da void common_hal_displayio_fourwire_end_transaction(mp_obj_t self); -void common_hal_displayio_fourwire_set_cs(mp_obj_t self, bool high); - #endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYBUSIO_FOURWIRE_H diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c index c693d3c90..0e76a868f 100644 --- a/shared-module/displayio/Display.c +++ b/shared-module/displayio/Display.c @@ -59,12 +59,10 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, self->begin_transaction = common_hal_displayio_parallelbus_begin_transaction; self->send = common_hal_displayio_parallelbus_send; self->end_transaction = common_hal_displayio_parallelbus_end_transaction; - self->set_cs = NULL; } else if (MP_OBJ_IS_TYPE(bus, &displayio_fourwire_type)) { self->begin_transaction = common_hal_displayio_fourwire_begin_transaction; self->send = common_hal_displayio_fourwire_send; self->end_transaction = common_hal_displayio_fourwire_end_transaction; - self->set_cs = common_hal_displayio_fourwire_set_cs; } else { mp_raise_ValueError(translate("Unsupported display bus type")); } @@ -82,11 +80,6 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self, bool delay = (data_size & DELAY) != 0; data_size &= ~DELAY; uint8_t *data = cmd + 2; - if (self->set_cs != NULL) { - self->set_cs(self->bus, true); - common_hal_time_delay_ms(1); - self->set_cs(self->bus, false); - } self->send(self->bus, true, cmd, 1); self->send(self->bus, false, data, data_size); uint16_t delay_length_ms = 10; diff --git a/shared-module/displayio/Display.h b/shared-module/displayio/Display.h index 70308daa2..04da68b63 100644 --- a/shared-module/displayio/Display.h +++ b/shared-module/displayio/Display.h @@ -34,7 +34,6 @@ typedef bool (*display_bus_begin_transaction)(mp_obj_t bus); typedef void (*display_bus_send)(mp_obj_t bus, bool command, uint8_t *data, uint32_t data_length); typedef void (*display_bus_end_transaction)(mp_obj_t bus); -typedef void (*display_bus_set_cs)(mp_obj_t bus, bool high); typedef struct { mp_obj_base_t base; @@ -53,7 +52,6 @@ typedef struct { display_bus_begin_transaction begin_transaction; display_bus_send send; display_bus_end_transaction end_transaction; - display_bus_set_cs set_cs; union { digitalio_digitalinout_obj_t backlight_inout; pulseio_pwmout_obj_t backlight_pwm; diff --git a/shared-module/displayio/FourWire.c b/shared-module/displayio/FourWire.c index ae1fde7ca..043f68e26 100644 --- a/shared-module/displayio/FourWire.c +++ b/shared-module/displayio/FourWire.c @@ -30,6 +30,7 @@ #include "shared-bindings/busio/SPI.h" #include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/time/__init__.h" #include "tick.h" @@ -78,6 +79,11 @@ bool common_hal_displayio_fourwire_begin_transaction(mp_obj_t obj) { void common_hal_displayio_fourwire_send(mp_obj_t obj, bool command, uint8_t *data, uint32_t data_length) { displayio_fourwire_obj_t* self = MP_OBJ_TO_PTR(obj); + if (command) { + common_hal_digitalio_digitalinout_set_value(&self->chip_select, true); + common_hal_time_delay_ms(1); + common_hal_digitalio_digitalinout_set_value(&self->chip_select, false); + } common_hal_digitalio_digitalinout_set_value(&self->command, !command); common_hal_busio_spi_write(self->bus, data, data_length); } @@ -87,8 +93,3 @@ void common_hal_displayio_fourwire_end_transaction(mp_obj_t obj) { common_hal_digitalio_digitalinout_set_value(&self->chip_select, true); common_hal_busio_spi_unlock(self->bus); } - -void common_hal_displayio_fourwire_set_cs(mp_obj_t obj, bool high) { - displayio_fourwire_obj_t* self = MP_OBJ_TO_PTR(obj); - common_hal_digitalio_digitalinout_set_value(&self->chip_select, high); -} -- cgit v1.2.3 From 8b4ca24e56b6d7a7c8c15ce30bb2272123bea95e Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Sun, 31 Mar 2019 14:17:54 -0700 Subject: Improved readability of Single Byte Bounds code --- shared-module/displayio/Display.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'shared-module') diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c index c2c98853d..df6af07b4 100644 --- a/shared-module/displayio/Display.c +++ b/shared-module/displayio/Display.c @@ -212,21 +212,27 @@ void displayio_display_end_transaction(displayio_display_obj_t* self) { } void displayio_display_set_region_to_update(displayio_display_obj_t* self, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { - uint16_t data[2]; + self->send(self->bus, true, &self->set_column_command, 1); if (self->single_byte_bounds) { - data[0] = __builtin_bswap16(((x0 + self->colstart) << 8) | ((x1 - 1 + self->colstart) & 0xFF)); + uint8_t data[2]; + data[0] = (x0 + self->colstart) & 0xFF; + data[1] = (x1 - 1 + self->colstart) & 0xFF; self->send(self->bus, false, (uint8_t*) data, 2); } else { + uint16_t data[2]; data[0] = __builtin_bswap16(x0 + self->colstart); data[1] = __builtin_bswap16(x1 - 1 + self->colstart); self->send(self->bus, false, (uint8_t*) data, 4); } self->send(self->bus, true, &self->set_row_command, 1); if (self->single_byte_bounds) { - data[0] = __builtin_bswap16(((y0 + self->rowstart) << 8) | ((y1 - 1 + self->rowstart) & 0xFF)); + uint8_t data[2]; + data[0] = (y0 + self->rowstart) & 0xFF; + data[1] = (y1 - 1 + self->rowstart) & 0xFF; self->send(self->bus, false, (uint8_t*) data, 2); } else { + uint16_t data[2]; data[0] = __builtin_bswap16(y0 + self->rowstart); data[1] = __builtin_bswap16(y1 - 1 + self->rowstart); self->send(self->bus, false, (uint8_t*) data, 4); -- cgit v1.2.3 From f1e4a2ffb9f32f84f08dc57b6c121351db9acb64 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Mon, 1 Apr 2019 19:52:35 -0700 Subject: Removed unnecessary bit-ANDing --- shared-module/displayio/Display.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'shared-module') diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c index df6af07b4..eccb2d0ef 100644 --- a/shared-module/displayio/Display.c +++ b/shared-module/displayio/Display.c @@ -216,8 +216,8 @@ void displayio_display_set_region_to_update(displayio_display_obj_t* self, uint1 self->send(self->bus, true, &self->set_column_command, 1); if (self->single_byte_bounds) { uint8_t data[2]; - data[0] = (x0 + self->colstart) & 0xFF; - data[1] = (x1 - 1 + self->colstart) & 0xFF; + data[0] = x0 + self->colstart; + data[1] = x1 - 1 + self->colstart; self->send(self->bus, false, (uint8_t*) data, 2); } else { uint16_t data[2]; @@ -228,8 +228,8 @@ void displayio_display_set_region_to_update(displayio_display_obj_t* self, uint1 self->send(self->bus, true, &self->set_row_command, 1); if (self->single_byte_bounds) { uint8_t data[2]; - data[0] = (y0 + self->rowstart) & 0xFF; - data[1] = (y1 - 1 + self->rowstart) & 0xFF; + data[0] = y0 + self->rowstart; + data[1] = y1 - 1 + self->rowstart; self->send(self->bus, false, (uint8_t*) data, 2); } else { uint16_t data[2]; -- cgit v1.2.3