summaryrefslogtreecommitdiff
path: root/shared-module
diff options
context:
space:
mode:
Diffstat (limited to 'shared-module')
-rw-r--r--shared-module/displayio/Display.c34
-rw-r--r--shared-module/displayio/Display.h1
-rw-r--r--shared-module/displayio/FourWire.c6
-rw-r--r--shared-module/usb_hid/Device.c20
4 files changed, 45 insertions, 16 deletions
diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c
index 0e76a868f..eccb2d0ef 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 single_byte_bounds) {
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->single_byte_bounds = single_byte_bounds;
if (MP_OBJ_IS_TYPE(bus, &displayio_parallelbus_type)) {
self->begin_transaction = common_hal_displayio_parallelbus_begin_transaction;
@@ -211,16 +212,31 @@ 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) {
+ uint8_t data[2];
+ 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];
+ 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) {
+ uint8_t data[2];
+ 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];
+ 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 04da68b63..4ccae37bf 100644
--- a/shared-module/displayio/Display.h
+++ b/shared-module/displayio/Display.h
@@ -49,6 +49,7 @@ typedef struct {
uint64_t last_refresh;
int16_t colstart;
int16_t rowstart;
+ bool single_byte_bounds;
display_bus_begin_transaction begin_transaction;
display_bus_send send;
display_bus_end_transaction end_transaction;
diff --git a/shared-module/displayio/FourWire.c b/shared-module/displayio/FourWire.c
index 9da5c0701..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);
}
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
}