From 82677dd9669d41df89be89dbef931b8e2c2ce80c Mon Sep 17 00:00:00 2001 From: jposada202020 Date: Sat, 15 May 2021 12:06:08 -0400 Subject: [PATCH 01/19] adding parameter documentation explanation. --- docs/design_guide.rst | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/design_guide.rst b/docs/design_guide.rst index 0c3beb8550..8c3c8cc842 100644 --- a/docs/design_guide.rst +++ b/docs/design_guide.rst @@ -332,6 +332,32 @@ To add different types outside CircuitPython you need to include them in the int The intersphinx_mapping above includes references to Python, BusDevice and CircuitPython Documentation +When the parameter have two different types, you should reference them as follows:: + + + class Character_LCD: + """Base class for character LCD + + :param ~digitalio.DigitalInOut rs: The reset data line + :param ~pwmio.PWMOut,~digitalio.DigitalInOut blue: Blue RGB Anode + + """ + + def __init__(self, rs, blue): + self._rc = rs + self.blue = blue + + +Renders as: + +.. py:class:: Character_LCD(rs, blue) + :noindex: + + Base class for character LCD + + :param ~digitalio.DigitalInOut rs: The reset data line + :param ~pwmio.PWMOut,~digitalio.DigitalInOut blue: Blue RGB Anode + param_name ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 11ef36d09dbbe24aa8dd4f50f732b862d73f765b Mon Sep 17 00:00:00 2001 From: root Date: Mon, 17 May 2021 16:24:45 -0500 Subject: [PATCH 02/19] Implement pulseout for RP2040 --- ports/raspberrypi/Makefile | 2 +- .../raspberrypi/common-hal/pulseio/PulseOut.c | 46 ++++++++++++------- .../raspberrypi/common-hal/pulseio/PulseOut.h | 4 +- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/ports/raspberrypi/Makefile b/ports/raspberrypi/Makefile index 9333f5d1f4..ac13a061b7 100644 --- a/ports/raspberrypi/Makefile +++ b/ports/raspberrypi/Makefile @@ -106,7 +106,7 @@ INC += -I. \ -I$(BUILD) # Pico specific configuration -CFLAGS += -DRASPBERRYPI -DPICO_ON_DEVICE=1 -DPICO_NO_BINARY_INFO=0 -DPICO_TIME_DEFAULT_ALARM_POOL_DISABLED=1 -DPICO_DIVIDER_CALL_IDIV0=0 -DPICO_DIVIDER_CALL_LDIV0=0 -DPICO_DIVIDER_HARDWARE=1 -DPICO_DOUBLE_ROM=1 -DPICO_FLOAT_ROM=1 -DPICO_MULTICORE=1 -DPICO_BITS_IN_RAM=0 -DPICO_DIVIDER_IN_RAM=0 -DPICO_DOUBLE_PROPAGATE_NANS=0 -DPICO_DOUBLE_IN_RAM=0 -DPICO_MEM_IN_RAM=0 -DPICO_FLOAT_IN_RAM=0 -DPICO_FLOAT_PROPAGATE_NANS=1 -DPICO_NO_FLASH=0 -DPICO_COPY_TO_RAM=0 -DPICO_DISABLE_SHARED_IRQ_HANDLERS=0 -DPICO_NO_BI_BOOTSEL_VIA_DOUBLE_RESET=0 +CFLAGS += -DRASPBERRYPI -DPICO_ON_DEVICE=1 -DPICO_NO_BINARY_INFO=0 -DPICO_TIME_DEFAULT_ALARM_POOL_DISABLED=0 -DPICO_DIVIDER_CALL_IDIV0=0 -DPICO_DIVIDER_CALL_LDIV0=0 -DPICO_DIVIDER_HARDWARE=1 -DPICO_DOUBLE_ROM=1 -DPICO_FLOAT_ROM=1 -DPICO_MULTICORE=1 -DPICO_BITS_IN_RAM=0 -DPICO_DIVIDER_IN_RAM=0 -DPICO_DOUBLE_PROPAGATE_NANS=0 -DPICO_DOUBLE_IN_RAM=0 -DPICO_MEM_IN_RAM=0 -DPICO_FLOAT_IN_RAM=0 -DPICO_FLOAT_PROPAGATE_NANS=1 -DPICO_NO_FLASH=0 -DPICO_COPY_TO_RAM=0 -DPICO_DISABLE_SHARED_IRQ_HANDLERS=0 -DPICO_NO_BI_BOOTSEL_VIA_DOUBLE_RESET=0 OPTIMIZATION_FLAGS ?= -O3 # TinyUSB defines CFLAGS += -DTUD_OPT_RP2040_USB_DEVICE_ENUMERATION_FIX=1 -DCFG_TUSB_MCU=OPT_MCU_RP2040 -DCFG_TUD_MIDI_RX_BUFSIZE=128 -DCFG_TUD_CDC_RX_BUFSIZE=256 -DCFG_TUD_MIDI_TX_BUFSIZE=128 -DCFG_TUD_CDC_TX_BUFSIZE=256 -DCFG_TUD_MSC_BUFSIZE=1024 diff --git a/ports/raspberrypi/common-hal/pulseio/PulseOut.c b/ports/raspberrypi/common-hal/pulseio/PulseOut.c index c3536af04b..1a7b5892c1 100644 --- a/ports/raspberrypi/common-hal/pulseio/PulseOut.c +++ b/ports/raspberrypi/common-hal/pulseio/PulseOut.c @@ -27,31 +27,38 @@ #include "common-hal/pulseio/PulseOut.h" #include - -#include "src/rp2_common/hardware_gpio/include/hardware/gpio.h" - #include "mpconfigport.h" -#include "py/gc.h" #include "py/runtime.h" #include "shared-bindings/pulseio/PulseOut.h" +#include "shared-bindings/pwmio/PWMOut.h" +#include "common-hal/pwmio/PWMOut.h" #include "supervisor/shared/translate.h" +#include "src/rp2_common/hardware_pwm/include/hardware/pwm.h" +#include "src/common/pico_time/include/pico/time.h" static uint8_t refcount = 0; - - static uint16_t *pulse_buffer = NULL; static volatile uint16_t pulse_index = 0; static uint16_t pulse_length; -static volatile uint32_t current_compare = 0; +pwmio_pwmout_obj_t *pwmout_obj; +volatile uint16_t current_duty_cycle; void pulse_finish(void) { pulse_index++; - - // Always turn it off. + // Turn pwm pin off by settting duty cyle to 1. + common_hal_pwmio_pwmout_set_duty_cycle(pwmout_obj,1); if (pulse_index >= pulse_length) { return; } - current_compare = (current_compare + pulse_buffer[pulse_index] * 3 / 4) & 0xffff; + add_alarm_in_us( pulse_buffer[pulse_index], pulseout_interrupt_handler, NULL, false); + if (pulse_index % 2 == 0) { + common_hal_pwmio_pwmout_set_duty_cycle(pwmout_obj,current_duty_cycle); + } +} + +int64_t pulseout_interrupt_handler(alarm_id_t id, void *user_data) { + pulse_finish(); + return 0; } void pulseout_reset() { @@ -63,12 +70,13 @@ void common_hal_pulseio_pulseout_construct(pulseio_pulseout_obj_t *self, const mcu_pin_obj_t *pin, uint32_t frequency, uint16_t duty_cycle) { - mp_raise_NotImplementedError(translate("Unsupported operation")); refcount++; - + pwmout_obj = (pwmio_pwmout_obj_t *)carrier; + current_duty_cycle = common_hal_pwmio_pwmout_get_duty_cycle(pwmout_obj); self->pin = carrier->pin->number; - + self->slice = carrier->slice; + pwm_set_enabled (pwmout_obj->slice,false); } bool common_hal_pulseio_pulseout_deinited(pulseio_pulseout_obj_t *self) { @@ -79,8 +87,6 @@ void common_hal_pulseio_pulseout_deinit(pulseio_pulseout_obj_t *self) { if (common_hal_pulseio_pulseout_deinited(self)) { return; } - - refcount--; self->pin = NO_PIN; } @@ -90,6 +96,14 @@ void common_hal_pulseio_pulseout_send(pulseio_pulseout_obj_t *self, uint16_t *pu pulse_index = 0; pulse_length = length; - current_compare = pulses[0] * 3 / 4; + add_alarm_in_us( pulses[0], pulseout_interrupt_handler, NULL, false); + common_hal_pwmio_pwmout_set_duty_cycle(pwmout_obj,current_duty_cycle); + pwm_set_enabled (pwmout_obj->slice,true); + while(pulse_index < length) { + // Do other things while we wait. The interrupts will handle sending the + // signal. + RUN_BACKGROUND_TASKS; + } + pwm_set_enabled (pwmout_obj->slice,false); } diff --git a/ports/raspberrypi/common-hal/pulseio/PulseOut.h b/ports/raspberrypi/common-hal/pulseio/PulseOut.h index 4f1bb9fa7a..8dcebdba98 100644 --- a/ports/raspberrypi/common-hal/pulseio/PulseOut.h +++ b/ports/raspberrypi/common-hal/pulseio/PulseOut.h @@ -28,6 +28,7 @@ #define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_PULSEIO_PULSEOUT_H #include "common-hal/microcontroller/Pin.h" +#include "src/common/pico_time/include/pico/time.h" #include "py/obj.h" @@ -36,9 +37,10 @@ typedef struct { mp_obj_base_t base; uint8_t pin; + uint8_t slice; } pulseio_pulseout_obj_t; void pulseout_reset(void); -void pulseout_interrupt_handler(uint8_t index); +int64_t pulseout_interrupt_handler(alarm_id_t id, void *user_data); #endif // MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_PULSEIO_PULSEOUT_H From ff4b1b28d2f222f660e21228c6ca80c4894d54ec Mon Sep 17 00:00:00 2001 From: root Date: Mon, 17 May 2021 16:43:55 -0500 Subject: [PATCH 03/19] iFormatting fixes --- ports/raspberrypi/common-hal/pulseio/PulseOut.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ports/raspberrypi/common-hal/pulseio/PulseOut.c b/ports/raspberrypi/common-hal/pulseio/PulseOut.c index 1a7b5892c1..99f59b2520 100644 --- a/ports/raspberrypi/common-hal/pulseio/PulseOut.c +++ b/ports/raspberrypi/common-hal/pulseio/PulseOut.c @@ -50,9 +50,9 @@ void pulse_finish(void) { if (pulse_index >= pulse_length) { return; } - add_alarm_in_us( pulse_buffer[pulse_index], pulseout_interrupt_handler, NULL, false); + add_alarm_in_us(pulse_buffer[pulse_index], pulseout_interrupt_handler, NULL, false); if (pulse_index % 2 == 0) { - common_hal_pwmio_pwmout_set_duty_cycle(pwmout_obj,current_duty_cycle); + common_hal_pwmio_pwmout_set_duty_cycle(pwmout_obj,current_duty_cycle); } } @@ -76,7 +76,7 @@ void common_hal_pulseio_pulseout_construct(pulseio_pulseout_obj_t *self, current_duty_cycle = common_hal_pwmio_pwmout_get_duty_cycle(pwmout_obj); self->pin = carrier->pin->number; self->slice = carrier->slice; - pwm_set_enabled (pwmout_obj->slice,false); + pwm_set_enabled(pwmout_obj->slice,false); } bool common_hal_pulseio_pulseout_deinited(pulseio_pulseout_obj_t *self) { @@ -96,14 +96,14 @@ void common_hal_pulseio_pulseout_send(pulseio_pulseout_obj_t *self, uint16_t *pu pulse_index = 0; pulse_length = length; - add_alarm_in_us( pulses[0], pulseout_interrupt_handler, NULL, false); + add_alarm_in_us(pulses[0], pulseout_interrupt_handler, NULL, false); common_hal_pwmio_pwmout_set_duty_cycle(pwmout_obj,current_duty_cycle); - pwm_set_enabled (pwmout_obj->slice,true); + pwm_set_enabled(pwmout_obj->slice,true); - while(pulse_index < length) { + while (pulse_index < length) { // Do other things while we wait. The interrupts will handle sending the // signal. RUN_BACKGROUND_TASKS; } - pwm_set_enabled (pwmout_obj->slice,false); + pwm_set_enabled(pwmout_obj->slice,false); } From 9393467819c1c13509d2ba5f6c2ee52f17ae63f1 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 17 May 2021 22:13:00 -0500 Subject: [PATCH 04/19] Update comment for spelling --- ports/raspberrypi/common-hal/pulseio/PulseOut.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ports/raspberrypi/common-hal/pulseio/PulseOut.c b/ports/raspberrypi/common-hal/pulseio/PulseOut.c index 99f59b2520..7a1b709b4c 100644 --- a/ports/raspberrypi/common-hal/pulseio/PulseOut.c +++ b/ports/raspberrypi/common-hal/pulseio/PulseOut.c @@ -45,7 +45,7 @@ volatile uint16_t current_duty_cycle; void pulse_finish(void) { pulse_index++; - // Turn pwm pin off by settting duty cyle to 1. + // Turn pwm pin off by setting duty cyle to 1. common_hal_pwmio_pwmout_set_duty_cycle(pwmout_obj,1); if (pulse_index >= pulse_length) { return; From da248d159428194d55753439cb2dc5398df0501c Mon Sep 17 00:00:00 2001 From: Kamil Tomaszewski Date: Tue, 18 May 2021 17:02:16 +0200 Subject: [PATCH 05/19] spresense: Fix USB CDC and MSC --- ports/cxd56/mpconfigport.h | 2 +- shared-module/storage/__init__.c | 8 ++++++++ shared-module/usb_cdc/__init__.c | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ports/cxd56/mpconfigport.h b/ports/cxd56/mpconfigport.h index 4c332577e6..3560e72855 100644 --- a/ports/cxd56/mpconfigport.h +++ b/ports/cxd56/mpconfigport.h @@ -37,7 +37,7 @@ // so define these before #include'ing that file. #define USB_CDC_EP_NUM_NOTIFICATION (3) #define USB_CDC_EP_NUM_DATA_OUT (2) -#define USB_CDC_EP_NUM_DATA_IN (2) +#define USB_CDC_EP_NUM_DATA_IN (1) #define USB_MSC_EP_NUM_OUT (5) #define USB_MSC_EP_NUM_IN (4) diff --git a/shared-module/storage/__init__.c b/shared-module/storage/__init__.c index cbe72c6f16..da90a40355 100644 --- a/shared-module/storage/__init__.c +++ b/shared-module/storage/__init__.c @@ -63,7 +63,11 @@ static const uint8_t usb_msc_descriptor_template[] = { 0xFF, // 11 bEndpointAddress (IN/D2H) [SET AT RUNTIME: 0x80 | number] #define MSC_IN_ENDPOINT_INDEX (11) 0x02, // 12 bmAttributes (Bulk) +#if USB_HIGHSPEED + 0x00, 0x02, // 13,14 wMaxPacketSize 512 +#else 0x40, 0x00, // 13,14 wMaxPacketSize 64 +#endif 0x00, // 15 bInterval 0 (unit depends on device speed) // MSC Endpoint OUT Descriptor @@ -72,7 +76,11 @@ static const uint8_t usb_msc_descriptor_template[] = { 0xFF, // 18 bEndpointAddress (OUT/H2D) [SET AT RUNTIME] #define MSC_OUT_ENDPOINT_INDEX (18) 0x02, // 19 bmAttributes (Bulk) +#if USB_HIGHSPEED + 0x00, 0x02, // 20,21 wMaxPacketSize 512 +#else 0x40, 0x00, // 20,21 wMaxPacketSize 64 +#endif 0x00, // 22 bInterval 0 (unit depends on device speed) }; diff --git a/shared-module/usb_cdc/__init__.c b/shared-module/usb_cdc/__init__.c index c5da1f41e0..5b2275280e 100644 --- a/shared-module/usb_cdc/__init__.c +++ b/shared-module/usb_cdc/__init__.c @@ -121,7 +121,11 @@ static const uint8_t usb_cdc_descriptor_template[] = { 0xFF, // 54 bEndpointAddress (OUT/H2D) [SET AT RUNTIME] #define CDC_DATA_OUT_ENDPOINT_INDEX 54 0x02, // 55 bmAttributes (Bulk) +#if USB_HIGHSPEED + 0x00, 0x02, // 56,57 wMaxPacketSize 512 +#else 0x40, 0x00, // 56,57 wMaxPacketSize 64 +#endif 0x00, // 58 bInterval 0 (unit depends on device speed) // CDC Data IN Endpoint Descriptor @@ -130,7 +134,11 @@ static const uint8_t usb_cdc_descriptor_template[] = { 0xFF, // 61 bEndpointAddress (IN/D2H) [SET AT RUNTIME: 0x80 | number] #define CDC_DATA_IN_ENDPOINT_INDEX 61 0x02, // 62 bmAttributes (Bulk) +#if USB_HIGHSPEED + 0x00, 0x02, // 63,64 wMaxPacketSize 512 +#else 0x40, 0x00, // 63,64 wMaxPacketSize 64 +#endif 0x00, // 65 bInterval 0 (unit depends on device speed) }; From cec9015e198c7cb688862858e3dc1f3b750bc3ca Mon Sep 17 00:00:00 2001 From: ladyada Date: Mon, 17 May 2021 13:05:08 -0400 Subject: [PATCH 06/19] iz makropad with oled --- .../boards/adafruit_macropad_rp2040/board.c | 40 +++++++++++++++++++ .../adafruit_macropad_rp2040/mpconfigboard.h | 7 ++++ .../adafruit_macropad_rp2040/mpconfigboard.mk | 9 +++++ .../boards/adafruit_macropad_rp2040/pins.c | 35 ++++++++++++++++ 4 files changed, 91 insertions(+) create mode 100644 ports/raspberrypi/boards/adafruit_macropad_rp2040/board.c create mode 100644 ports/raspberrypi/boards/adafruit_macropad_rp2040/mpconfigboard.h create mode 100644 ports/raspberrypi/boards/adafruit_macropad_rp2040/mpconfigboard.mk create mode 100644 ports/raspberrypi/boards/adafruit_macropad_rp2040/pins.c diff --git a/ports/raspberrypi/boards/adafruit_macropad_rp2040/board.c b/ports/raspberrypi/boards/adafruit_macropad_rp2040/board.c new file mode 100644 index 0000000000..c4021a83e9 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_macropad_rp2040/board.c @@ -0,0 +1,40 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2021 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/board.h" + +#include "shared-bindings/microcontroller/Pin.h" +#include "src/rp2_common/hardware_gpio/include/hardware/gpio.h" + +void board_init(void) { +} + +bool board_requests_safe_mode(void) { + return false; +} + +void reset_board(void) { +} diff --git a/ports/raspberrypi/boards/adafruit_macropad_rp2040/mpconfigboard.h b/ports/raspberrypi/boards/adafruit_macropad_rp2040/mpconfigboard.h new file mode 100644 index 0000000000..5900003713 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_macropad_rp2040/mpconfigboard.h @@ -0,0 +1,7 @@ +#define MICROPY_HW_BOARD_NAME "Adafruit Macropad RP2040" +#define MICROPY_HW_MCU_NAME "rp2040" + +#define MICROPY_HW_NEOPIXEL (&pin_GPIO16) + +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO25) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO24) diff --git a/ports/raspberrypi/boards/adafruit_macropad_rp2040/mpconfigboard.mk b/ports/raspberrypi/boards/adafruit_macropad_rp2040/mpconfigboard.mk new file mode 100644 index 0000000000..4d708bcf79 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_macropad_rp2040/mpconfigboard.mk @@ -0,0 +1,9 @@ +USB_VID = 0x239A +USB_PID = 0x8108 +USB_PRODUCT = "Macropad RP2040" +USB_MANUFACTURER = "Adafruit" + +CHIP_VARIANT = RP2040 +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "W25Q64JVxQ" diff --git a/ports/raspberrypi/boards/adafruit_macropad_rp2040/pins.c b/ports/raspberrypi/boards/adafruit_macropad_rp2040/pins.c new file mode 100644 index 0000000000..51f2a2ad33 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_macropad_rp2040/pins.c @@ -0,0 +1,35 @@ +#include "shared-bindings/board/__init__.h" + +STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_KEY1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_KEY2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_KEY3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_KEY4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_KEY5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_KEY6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_KEY7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_KEY8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_KEY9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_KEY10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_KEY11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_KEY12), MP_ROM_PTR(&pin_GPIO12) }, + + { MP_ROM_QSTR(MP_QSTR_ENCODER_SWITCH), MP_ROM_PTR(&pin_GPIO0) }, + + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_ENCODER_A), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_ENCODER_B), MP_ROM_PTR(&pin_GPIO18) }, + + { MP_ROM_QSTR(MP_QSTR_OLED_RESET), MP_ROM_PTR(&pin_GPIO23) }, + + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO24) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO25) }, + + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table); From 38ffc4352d18c59a10d490a75bdb521ac4e8c8fc Mon Sep 17 00:00:00 2001 From: ladyada Date: Mon, 17 May 2021 13:05:54 -0400 Subject: [PATCH 07/19] add workflow for makropad --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9df017ce3a..194c8a7261 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -176,6 +176,7 @@ jobs: - "TG-Watch" - "adafruit_feather_rp2040" - "adafruit_itsybitsy_rp2040" + - "adafruit_macropad_rp2040" - "adafruit_neokey_trinkey_m0" - "adafruit_proxlight_trinkey_m0" - "adafruit_qt2040_trinkey" From fdbd3bc8c2fb9dd46708c7ee237b72bfb621d272 Mon Sep 17 00:00:00 2001 From: lady ada Date: Tue, 18 May 2021 11:09:31 -0400 Subject: [PATCH 08/19] add missing AREF pin --- ports/atmel-samd/boards/feather_m0_express/pins.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ports/atmel-samd/boards/feather_m0_express/pins.c b/ports/atmel-samd/boards/feather_m0_express/pins.c index 19320ca794..aea705a493 100644 --- a/ports/atmel-samd/boards/feather_m0_express/pins.c +++ b/ports/atmel-samd/boards/feather_m0_express/pins.c @@ -1,6 +1,7 @@ #include "shared-bindings/board/__init__.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_AREF), MP_ROM_PTR(&pin_PA03) }, { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PB08) }, { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PB09) }, From d8b895f1d7a5b1e3d75034cb682cfaaf305fd76d Mon Sep 17 00:00:00 2001 From: lady ada Date: Tue, 18 May 2021 20:53:13 -0400 Subject: [PATCH 09/19] add LED and speaker - natch! --- ports/raspberrypi/boards/adafruit_macropad_rp2040/pins.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ports/raspberrypi/boards/adafruit_macropad_rp2040/pins.c b/ports/raspberrypi/boards/adafruit_macropad_rp2040/pins.c index 51f2a2ad33..8ce16c0e9c 100644 --- a/ports/raspberrypi/boards/adafruit_macropad_rp2040/pins.c +++ b/ports/raspberrypi/boards/adafruit_macropad_rp2040/pins.c @@ -14,6 +14,9 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_KEY11), MP_ROM_PTR(&pin_GPIO11) }, { MP_ROM_QSTR(MP_QSTR_KEY12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_SPEAKER), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_ENCODER_SWITCH), MP_ROM_PTR(&pin_GPIO0) }, { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO16) }, From 9a70aa1e8de62baf65d932355b20676002c66ccc Mon Sep 17 00:00:00 2001 From: lady ada Date: Tue, 18 May 2021 22:20:38 -0400 Subject: [PATCH 10/19] figure out the AREF thing later --- ports/atmel-samd/boards/feather_m0_express/pins.c | 1 - 1 file changed, 1 deletion(-) diff --git a/ports/atmel-samd/boards/feather_m0_express/pins.c b/ports/atmel-samd/boards/feather_m0_express/pins.c index aea705a493..19320ca794 100644 --- a/ports/atmel-samd/boards/feather_m0_express/pins.c +++ b/ports/atmel-samd/boards/feather_m0_express/pins.c @@ -1,7 +1,6 @@ #include "shared-bindings/board/__init__.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { - { MP_ROM_QSTR(MP_QSTR_AREF), MP_ROM_PTR(&pin_PA03) }, { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PB08) }, { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PB09) }, From aebee2de7309be36bbaca7ad690c680dc804d728 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Wed, 19 May 2021 07:35:17 -0400 Subject: [PATCH 11/19] Handle USB_HIGHSPEED for MIDI also --- shared-module/storage/__init__.c | 12 ++++++------ shared-module/usb_cdc/__init__.c | 12 ++++++------ shared-module/usb_midi/__init__.c | 10 +++++++++- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/shared-module/storage/__init__.c b/shared-module/storage/__init__.c index da90a40355..5857432a52 100644 --- a/shared-module/storage/__init__.c +++ b/shared-module/storage/__init__.c @@ -63,11 +63,11 @@ static const uint8_t usb_msc_descriptor_template[] = { 0xFF, // 11 bEndpointAddress (IN/D2H) [SET AT RUNTIME: 0x80 | number] #define MSC_IN_ENDPOINT_INDEX (11) 0x02, // 12 bmAttributes (Bulk) -#if USB_HIGHSPEED + #if USB_HIGHSPEED 0x00, 0x02, // 13,14 wMaxPacketSize 512 -#else + #else 0x40, 0x00, // 13,14 wMaxPacketSize 64 -#endif + #endif 0x00, // 15 bInterval 0 (unit depends on device speed) // MSC Endpoint OUT Descriptor @@ -76,11 +76,11 @@ static const uint8_t usb_msc_descriptor_template[] = { 0xFF, // 18 bEndpointAddress (OUT/H2D) [SET AT RUNTIME] #define MSC_OUT_ENDPOINT_INDEX (18) 0x02, // 19 bmAttributes (Bulk) -#if USB_HIGHSPEED + #if USB_HIGHSPEED 0x00, 0x02, // 20,21 wMaxPacketSize 512 -#else + #else 0x40, 0x00, // 20,21 wMaxPacketSize 64 -#endif + #endif 0x00, // 22 bInterval 0 (unit depends on device speed) }; diff --git a/shared-module/usb_cdc/__init__.c b/shared-module/usb_cdc/__init__.c index 5b2275280e..769a2ce87f 100644 --- a/shared-module/usb_cdc/__init__.c +++ b/shared-module/usb_cdc/__init__.c @@ -121,11 +121,11 @@ static const uint8_t usb_cdc_descriptor_template[] = { 0xFF, // 54 bEndpointAddress (OUT/H2D) [SET AT RUNTIME] #define CDC_DATA_OUT_ENDPOINT_INDEX 54 0x02, // 55 bmAttributes (Bulk) -#if USB_HIGHSPEED + #if USB_HIGHSPEED 0x00, 0x02, // 56,57 wMaxPacketSize 512 -#else + #else 0x40, 0x00, // 56,57 wMaxPacketSize 64 -#endif + #endif 0x00, // 58 bInterval 0 (unit depends on device speed) // CDC Data IN Endpoint Descriptor @@ -134,11 +134,11 @@ static const uint8_t usb_cdc_descriptor_template[] = { 0xFF, // 61 bEndpointAddress (IN/D2H) [SET AT RUNTIME: 0x80 | number] #define CDC_DATA_IN_ENDPOINT_INDEX 61 0x02, // 62 bmAttributes (Bulk) -#if USB_HIGHSPEED + #if USB_HIGHSPEED 0x00, 0x02, // 63,64 wMaxPacketSize 512 -#else + #else 0x40, 0x00, // 63,64 wMaxPacketSize 64 -#endif + #endif 0x00, // 65 bInterval 0 (unit depends on device speed) }; diff --git a/shared-module/usb_midi/__init__.c b/shared-module/usb_midi/__init__.c index ac2e05adcb..8cac2ba8af 100644 --- a/shared-module/usb_midi/__init__.c +++ b/shared-module/usb_midi/__init__.c @@ -127,7 +127,11 @@ static const uint8_t usb_midi_descriptor_template[] = { 0xFF, // 66 bEndpointAddress (OUT/H2D) [SET AT RUNTIME] #define MIDI_STREAMING_OUT_ENDPOINT_INDEX (66) 0x02, // 67 bmAttributes (Bulk) + #if USB_HIGHSPEED + 0x00, 0x02, // 68,69 wMaxPacketSize (512) + #else 0x40, 0x00, // 68,69 wMaxPacketSize (64) + #endif 0x00, // 70 bInterval 0 (unit depends on device speed) // MIDI Data Endpoint Descriptor @@ -143,7 +147,11 @@ static const uint8_t usb_midi_descriptor_template[] = { 0xFF, // 78 bEndpointAddress (IN/D2H) [SET AT RUNTIME: 0x80 | number] #define MIDI_STREAMING_IN_ENDPOINT_INDEX (78) 0x02, // 79 bmAttributes (Bulk) - 0x40, 0x00, // 8081 wMaxPacketSize 64 + #if USB_HIGHSPEED + 0x00, 0x02, // 80, 81 wMaxPacketSize (512) + #else + 0x40, 0x00, // 80, 81 wMaxPacketSize (64) + #endif 0x00, // 82 bInterval 0 (unit depends on device speed) // MIDI Data Endpoint Descriptor From 9dabe882f14f4e8d29e517fab2a6cf8d483eda08 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Tue, 18 May 2021 17:37:21 -0700 Subject: [PATCH 12/19] Fix safe mode on rp2040 --- ports/raspberrypi/supervisor/port.c | 6 +++--- supervisor/shared/safe_mode.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ports/raspberrypi/supervisor/port.c b/ports/raspberrypi/supervisor/port.c index 9b3e140a85..443cfc2715 100644 --- a/ports/raspberrypi/supervisor/port.c +++ b/ports/raspberrypi/supervisor/port.c @@ -196,13 +196,13 @@ uint32_t *port_heap_get_top(void) { return port_stack_get_top(); } +extern uint32_t __scratch_x_start__; void port_set_saved_word(uint32_t value) { - // NOTE: This doesn't survive pressing the reset button (aka toggling RUN). - watchdog_hw->scratch[0] = value; + __scratch_x_start__ = value; } uint32_t port_get_saved_word(void) { - return watchdog_hw->scratch[0]; + return __scratch_x_start__; } uint64_t port_get_raw_ticks(uint8_t *subticks) { diff --git a/supervisor/shared/safe_mode.c b/supervisor/shared/safe_mode.c index ec85ea9d43..ca95b0d487 100644 --- a/supervisor/shared/safe_mode.c +++ b/supervisor/shared/safe_mode.c @@ -78,7 +78,7 @@ safe_mode_t wait_for_safe_mode_reset(void) { #endif uint64_t start_ticks = supervisor_ticks_ms64(); uint64_t diff = 0; - while (diff < 700) { + while (diff < 1000) { #ifdef MICROPY_HW_LED_STATUS // Blink on for 100, off for 100, on for 100, off for 100 and on for 200 common_hal_digitalio_digitalinout_set_value(&status_led, diff > 100 && diff / 100 != 2 && diff / 100 != 4); From 7dee378ade00b14a9eca5503ccc12527f653541f Mon Sep 17 00:00:00 2001 From: gabewillen Date: Wed, 30 Sep 2020 12:01:19 -0500 Subject: [PATCH 13/19] Update Adapter.h Added support for setting transmitter power --- shared-bindings/_bleio/Adapter.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shared-bindings/_bleio/Adapter.h b/shared-bindings/_bleio/Adapter.h index 81b9ec3130..acbbf1ae2b 100644 --- a/shared-bindings/_bleio/Adapter.h +++ b/shared-bindings/_bleio/Adapter.h @@ -44,6 +44,8 @@ void common_hal_bleio_adapter_construct_hci_uart(bleio_adapter_obj_t *self, busi extern bool common_hal_bleio_adapter_get_advertising(bleio_adapter_obj_t *self); extern bool common_hal_bleio_adapter_get_enabled(bleio_adapter_obj_t *self); extern void common_hal_bleio_adapter_set_enabled(bleio_adapter_obj_t *self, bool enabled); +extern mp_int_t common_hal_bleio_adapter_get_tx_power(bleio_adapter_obj_t *self); +extern void common_hal_bleio_adapter_set_tx_power(bleio_adapter_obj_t *self, mp_int_t tx_power); extern bool common_hal_bleio_adapter_get_connected(bleio_adapter_obj_t *self); extern bleio_address_obj_t *common_hal_bleio_adapter_get_address(bleio_adapter_obj_t *self); extern bool common_hal_bleio_adapter_set_address(bleio_adapter_obj_t *self, bleio_address_obj_t *address); From 806b39fb22d696d9dd9c7259ba06d03cd96a471b Mon Sep 17 00:00:00 2001 From: gabewillen Date: Wed, 30 Sep 2020 12:01:58 -0500 Subject: [PATCH 14/19] Update Adapter.c Added support for setting transmitter power --- shared-bindings/_bleio/Adapter.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/shared-bindings/_bleio/Adapter.c b/shared-bindings/_bleio/Adapter.c index 9c0cbb71ad..e8975c57ea 100644 --- a/shared-bindings/_bleio/Adapter.c +++ b/shared-bindings/_bleio/Adapter.c @@ -142,6 +142,34 @@ const mp_obj_property_t bleio_adapter_enabled_obj = { MP_ROM_NONE }, }; +//| +//| tx_power: int +//| """transmitter power""" +//| + +STATIC mp_obj_t bleio_adapter_get_tx_power(mp_obj_t self) { +return mp_obj_new_int(common_hal_bleio_adapter_get_tx_power(self)); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_adapter_get_tx_power_obj, bleio_adapter_get_tx_power); + +static mp_obj_t bleio_adapter_set_tx_power(mp_obj_t self, mp_obj_t value) { + const mp_int_t tx_power = mp_obj_get_int(value); + + common_hal_bleio_adapter_set_tx_power(self, tx_power); + + return mp_const_none; +} + +STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_adapter_set_tx_power_obj, bleio_adapter_set_tx_power); + +const mp_obj_property_t bleio_adapter_tx_power_obj = { + .base.type = &mp_type_property, + .proxy = { (mp_obj_t)&bleio_adapter_get_tx_power_obj, + (mp_obj_t)&bleio_adapter_set_tx_power_obj, + (mp_obj_t)&mp_const_none_obj }, +}; + + //| address: Address //| """MAC address of the BLE adapter.""" //| @@ -457,6 +485,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_adapter_erase_bonding_obj, bleio_adapter_ STATIC const mp_rom_map_elem_t bleio_adapter_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_enabled), MP_ROM_PTR(&bleio_adapter_enabled_obj) }, + { MP_ROM_QSTR(MP_QSTR_tx_power), MP_ROM_PTR(&bleio_adapter_tx_power_obj) }, { MP_ROM_QSTR(MP_QSTR_address), MP_ROM_PTR(&bleio_adapter_address_obj) }, { MP_ROM_QSTR(MP_QSTR_name), MP_ROM_PTR(&bleio_adapter_name_obj) }, From 6b39df406a453243d99b5ac31601267f21d779cd Mon Sep 17 00:00:00 2001 From: gabewillen Date: Wed, 30 Sep 2020 12:03:30 -0500 Subject: [PATCH 15/19] Update Adapter.c Added support for setting transmitter power currently done during every time advertising starts as implemented in the Arduino library --- ports/nrf/common-hal/_bleio/Adapter.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/ports/nrf/common-hal/_bleio/Adapter.c b/ports/nrf/common-hal/_bleio/Adapter.c index 26555e24da..dc1ceae677 100644 --- a/ports/nrf/common-hal/_bleio/Adapter.c +++ b/ports/nrf/common-hal/_bleio/Adapter.c @@ -333,6 +333,10 @@ STATIC void bleio_adapter_reset_name(bleio_adapter_obj_t *self) { common_hal_bleio_adapter_set_name(self, (char *)default_ble_name); } + +// The nRF SD 6.1.0 can only do one concurrent advertisement so share the advertising handle. +uint8_t adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET; + void common_hal_bleio_adapter_set_enabled(bleio_adapter_obj_t *self, bool enabled) { const bool is_enabled = common_hal_bleio_adapter_get_enabled(self); @@ -386,6 +390,14 @@ bool common_hal_bleio_adapter_get_enabled(bleio_adapter_obj_t *self) { return is_enabled; } +void common_hal_bleio_adapter_set_tx_power(bleio_adapter_obj_t *self, mp_int_t tx_power) { + self->tx_power = tx_power; +} + +mp_int_t common_hal_bleio_adapter_get_tx_power(bleio_adapter_obj_t *self) { + return self->tx_power; +} + bleio_address_obj_t *common_hal_bleio_adapter_get_address(bleio_adapter_obj_t *self) { common_hal_bleio_adapter_set_enabled(self, true); @@ -619,8 +631,6 @@ mp_obj_t common_hal_bleio_adapter_connect(bleio_adapter_obj_t *self, bleio_addre return mp_const_none; } -// The nRF SD 6.1.0 can only do one concurrent advertisement so share the advertising handle. -uint8_t adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET; STATIC void check_data_fit(size_t data_len, bool connectable) { if (data_len > BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_MAX_SUPPORTED || @@ -725,7 +735,10 @@ uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, } ble_drv_add_event_handler(advertising_on_ble_evt, self); - + err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, adv_handle, self->tx_power); + if (err_code != NRF_SUCCESS) { + return err_code; + } vm_used_ble = true; err_code = sd_ble_gap_adv_start(adv_handle, BLE_CONN_CFG_TAG_CUSTOM); if (err_code != NRF_SUCCESS) { From e29158483e7c1410ae04218db9fee7b800e80e64 Mon Sep 17 00:00:00 2001 From: gabewillen Date: Wed, 30 Sep 2020 15:22:32 -0500 Subject: [PATCH 16/19] Update Adapter.h Added the tx_power to the adapter object --- ports/nrf/common-hal/_bleio/Adapter.h | 1 + 1 file changed, 1 insertion(+) diff --git a/ports/nrf/common-hal/_bleio/Adapter.h b/ports/nrf/common-hal/_bleio/Adapter.h index 68a8b48644..ce56b27083 100644 --- a/ports/nrf/common-hal/_bleio/Adapter.h +++ b/ports/nrf/common-hal/_bleio/Adapter.h @@ -48,6 +48,7 @@ typedef struct { uint8_t *current_advertising_data; bleio_scanresults_obj_t *scan_results; mp_obj_t name; + mp_int_t tx_power; mp_obj_tuple_t *connection_objs; ble_drv_evt_handler_entry_t handler_entry; } bleio_adapter_obj_t; From ee7a701487a55d6c1ceb354e4f7b8d6095b2b50f Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Wed, 19 May 2021 12:21:48 -0700 Subject: [PATCH 17/19] Switch to start_advertising arg --- devices/ble_hci/common-hal/_bleio/Adapter.c | 11 ++++-- ports/nrf/common-hal/_bleio/Adapter.c | 27 ++++++-------- ports/nrf/common-hal/_bleio/Adapter.h | 1 - shared-bindings/_bleio/Adapter.c | 39 ++++----------------- shared-bindings/_bleio/Adapter.h | 4 +-- 5 files changed, 27 insertions(+), 55 deletions(-) diff --git a/devices/ble_hci/common-hal/_bleio/Adapter.c b/devices/ble_hci/common-hal/_bleio/Adapter.c index 14938e8a1d..bc928cc7b9 100644 --- a/devices/ble_hci/common-hal/_bleio/Adapter.c +++ b/devices/ble_hci/common-hal/_bleio/Adapter.c @@ -645,7 +645,7 @@ STATIC void check_data_fit(size_t data_len, bool connectable) { // return true; // } -uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, uint32_t timeout, float interval, uint8_t *advertising_data, uint16_t advertising_data_len, uint8_t *scan_response_data, uint16_t scan_response_data_len) { +uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, uint32_t timeout, float interval, uint8_t *advertising_data, uint16_t advertising_data_len, uint8_t *scan_response_data, uint16_t scan_response_data_len, mp_int_t tx_power) { check_enabled(self); if (self->now_advertising) { @@ -769,7 +769,7 @@ uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, return 0; } -void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, uint32_t timeout, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo) { +void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, uint32_t timeout, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo, mp_int_t tx_power) { check_enabled(self); // interval value has already been validated. @@ -793,12 +793,17 @@ void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool } } + if (tx_power != 0) { + mp_raise_NotImplementedError(); + } + const uint32_t result = _common_hal_bleio_adapter_start_advertising( self, connectable, anonymous, timeout, interval, advertising_data_bufinfo->buf, advertising_data_bufinfo->len, scan_response_data_bufinfo->buf, - scan_response_data_bufinfo->len); + scan_response_data_bufinfo->len, + tx_power); if (result) { mp_raise_bleio_BluetoothError(translate("Already advertising")); diff --git a/ports/nrf/common-hal/_bleio/Adapter.c b/ports/nrf/common-hal/_bleio/Adapter.c index dc1ceae677..bfcaf461a0 100644 --- a/ports/nrf/common-hal/_bleio/Adapter.c +++ b/ports/nrf/common-hal/_bleio/Adapter.c @@ -333,10 +333,6 @@ STATIC void bleio_adapter_reset_name(bleio_adapter_obj_t *self) { common_hal_bleio_adapter_set_name(self, (char *)default_ble_name); } - -// The nRF SD 6.1.0 can only do one concurrent advertisement so share the advertising handle. -uint8_t adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET; - void common_hal_bleio_adapter_set_enabled(bleio_adapter_obj_t *self, bool enabled) { const bool is_enabled = common_hal_bleio_adapter_get_enabled(self); @@ -390,14 +386,6 @@ bool common_hal_bleio_adapter_get_enabled(bleio_adapter_obj_t *self) { return is_enabled; } -void common_hal_bleio_adapter_set_tx_power(bleio_adapter_obj_t *self, mp_int_t tx_power) { - self->tx_power = tx_power; -} - -mp_int_t common_hal_bleio_adapter_get_tx_power(bleio_adapter_obj_t *self) { - return self->tx_power; -} - bleio_address_obj_t *common_hal_bleio_adapter_get_address(bleio_adapter_obj_t *self) { common_hal_bleio_adapter_set_enabled(self, true); @@ -639,6 +627,9 @@ STATIC void check_data_fit(size_t data_len, bool connectable) { } } +// The nRF SD 6.1.0 can only do one concurrent advertisement so share the advertising handle. +uint8_t adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET; + STATIC bool advertising_on_ble_evt(ble_evt_t *ble_evt, void *self_in) { bleio_adapter_obj_t *self = (bleio_adapter_obj_t *)self_in; @@ -657,7 +648,10 @@ STATIC bool advertising_on_ble_evt(ble_evt_t *ble_evt, void *self_in) { return true; } -uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, uint32_t timeout, float interval, uint8_t *advertising_data, uint16_t advertising_data_len, uint8_t *scan_response_data, uint16_t scan_response_data_len) { +uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, + bool anonymous, uint32_t timeout, float interval, uint8_t *advertising_data, + uint16_t advertising_data_len, uint8_t *scan_response_data, uint16_t scan_response_data_len, + mp_int_t tx_power) { if (self->current_advertising_data != NULL && self->current_advertising_data == self->advertising_data) { return NRF_ERROR_BUSY; } @@ -735,7 +729,7 @@ uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, } ble_drv_add_event_handler(advertising_on_ble_evt, self); - err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, adv_handle, self->tx_power); + err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, adv_handle, tx_power); if (err_code != NRF_SUCCESS) { return err_code; } @@ -749,7 +743,7 @@ uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, } -void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, uint32_t timeout, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo) { +void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, uint32_t timeout, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo, mp_int_t tx_power) { if (self->current_advertising_data != NULL && self->current_advertising_data == self->advertising_data) { mp_raise_bleio_BluetoothError(translate("Already advertising.")); } @@ -797,7 +791,8 @@ void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool self->advertising_data, advertising_data_bufinfo->len, self->scan_response_data, - scan_response_data_bufinfo->len)); + scan_response_data_bufinfo->len, + tx_power)); } void common_hal_bleio_adapter_stop_advertising(bleio_adapter_obj_t *self) { diff --git a/ports/nrf/common-hal/_bleio/Adapter.h b/ports/nrf/common-hal/_bleio/Adapter.h index ce56b27083..68a8b48644 100644 --- a/ports/nrf/common-hal/_bleio/Adapter.h +++ b/ports/nrf/common-hal/_bleio/Adapter.h @@ -48,7 +48,6 @@ typedef struct { uint8_t *current_advertising_data; bleio_scanresults_obj_t *scan_results; mp_obj_t name; - mp_int_t tx_power; mp_obj_tuple_t *connection_objs; ble_drv_evt_handler_entry_t handler_entry; } bleio_adapter_obj_t; diff --git a/shared-bindings/_bleio/Adapter.c b/shared-bindings/_bleio/Adapter.c index e8975c57ea..1c16cc7d87 100644 --- a/shared-bindings/_bleio/Adapter.c +++ b/shared-bindings/_bleio/Adapter.c @@ -142,34 +142,6 @@ const mp_obj_property_t bleio_adapter_enabled_obj = { MP_ROM_NONE }, }; -//| -//| tx_power: int -//| """transmitter power""" -//| - -STATIC mp_obj_t bleio_adapter_get_tx_power(mp_obj_t self) { -return mp_obj_new_int(common_hal_bleio_adapter_get_tx_power(self)); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_adapter_get_tx_power_obj, bleio_adapter_get_tx_power); - -static mp_obj_t bleio_adapter_set_tx_power(mp_obj_t self, mp_obj_t value) { - const mp_int_t tx_power = mp_obj_get_int(value); - - common_hal_bleio_adapter_set_tx_power(self, tx_power); - - return mp_const_none; -} - -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_adapter_set_tx_power_obj, bleio_adapter_set_tx_power); - -const mp_obj_property_t bleio_adapter_tx_power_obj = { - .base.type = &mp_type_property, - .proxy = { (mp_obj_t)&bleio_adapter_get_tx_power_obj, - (mp_obj_t)&bleio_adapter_set_tx_power_obj, - (mp_obj_t)&mp_const_none_obj }, -}; - - //| address: Address //| """MAC address of the BLE adapter.""" //| @@ -218,7 +190,7 @@ const mp_obj_property_t bleio_adapter_name_obj = { MP_ROM_NONE }, }; -//| def start_advertising(self, data: ReadableBuffer, *, scan_response: Optional[ReadableBuffer] = None, connectable: bool = True, anonymous: bool = False, timeout: int = 0, interval: float = 0.1) -> None: +//| def start_advertising(self, data: ReadableBuffer, *, scan_response: Optional[ReadableBuffer] = None, connectable: bool = True, anonymous: bool = False, timeout: int = 0, interval: float = 0.1, tx_power: int = 0) -> None: //| """Starts advertising until `stop_advertising` is called or if connectable, another device //| connects to us. //| @@ -233,13 +205,14 @@ const mp_obj_property_t bleio_adapter_name_obj = { //| :param bool connectable: If `True` then other devices are allowed to connect to this peripheral. //| :param bool anonymous: If `True` then this device's MAC address is randomized before advertising. //| :param int timeout: If set, we will only advertise for this many seconds. Zero means no timeout. -//| :param float interval: advertising interval, in seconds""" +//| :param float interval: advertising interval, in seconds +//| :param tx_power int: transmitter power while advertising in dBm""" //| ... //| STATIC mp_obj_t bleio_adapter_start_advertising(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { bleio_adapter_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); - enum { ARG_data, ARG_scan_response, ARG_connectable, ARG_anonymous, ARG_timeout, ARG_interval }; + enum { ARG_data, ARG_scan_response, ARG_connectable, ARG_anonymous, ARG_timeout, ARG_interval, ARG_tx_power }; static const mp_arg_t allowed_args[] = { { MP_QSTR_data, MP_ARG_REQUIRED | MP_ARG_OBJ }, { MP_QSTR_scan_response, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, @@ -247,6 +220,7 @@ STATIC mp_obj_t bleio_adapter_start_advertising(mp_uint_t n_args, const mp_obj_t { MP_QSTR_anonymous, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} }, { MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} }, { MP_QSTR_interval, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_tx_power, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; @@ -279,7 +253,7 @@ STATIC mp_obj_t bleio_adapter_start_advertising(mp_uint_t n_args, const mp_obj_t } common_hal_bleio_adapter_start_advertising(self, connectable, anonymous, timeout, interval, - &data_bufinfo, &scan_response_bufinfo); + &data_bufinfo, &scan_response_bufinfo, args[ARG_tx_power].u_int); return mp_const_none; } @@ -485,7 +459,6 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_adapter_erase_bonding_obj, bleio_adapter_ STATIC const mp_rom_map_elem_t bleio_adapter_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_enabled), MP_ROM_PTR(&bleio_adapter_enabled_obj) }, - { MP_ROM_QSTR(MP_QSTR_tx_power), MP_ROM_PTR(&bleio_adapter_tx_power_obj) }, { MP_ROM_QSTR(MP_QSTR_address), MP_ROM_PTR(&bleio_adapter_address_obj) }, { MP_ROM_QSTR(MP_QSTR_name), MP_ROM_PTR(&bleio_adapter_name_obj) }, diff --git a/shared-bindings/_bleio/Adapter.h b/shared-bindings/_bleio/Adapter.h index acbbf1ae2b..06dc47311b 100644 --- a/shared-bindings/_bleio/Adapter.h +++ b/shared-bindings/_bleio/Adapter.h @@ -53,9 +53,9 @@ extern bool common_hal_bleio_adapter_set_address(bleio_adapter_obj_t *self, blei extern mp_obj_str_t *common_hal_bleio_adapter_get_name(bleio_adapter_obj_t *self); extern void common_hal_bleio_adapter_set_name(bleio_adapter_obj_t *self, const char *name); -extern uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, uint32_t timeout, float interval, uint8_t *advertising_data, uint16_t advertising_data_len, uint8_t *scan_response_data, uint16_t scan_response_data_len); +extern uint32_t _common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, uint32_t timeout, float interval, uint8_t *advertising_data, uint16_t advertising_data_len, uint8_t *scan_response_data, uint16_t scan_response_data_len, mp_int_t tx_power); -extern void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, uint32_t timeout, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo); +extern void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool connectable, bool anonymous, uint32_t timeout, mp_float_t interval, mp_buffer_info_t *advertising_data_bufinfo, mp_buffer_info_t *scan_response_data_bufinfo, mp_int_t tx_power); extern void common_hal_bleio_adapter_stop_advertising(bleio_adapter_obj_t *self); extern mp_obj_t common_hal_bleio_adapter_start_scan(bleio_adapter_obj_t *self, uint8_t *prefixes, size_t prefix_length, bool extended, mp_int_t buffer_size, mp_float_t timeout, mp_float_t interval, mp_float_t window, mp_int_t minimum_rssi, bool active); From 42ee48ccb5e0e67455a8949023c490087abe57d0 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Wed, 19 May 2021 14:09:11 -0700 Subject: [PATCH 18/19] Improve error for invalid parameters --- locale/circuitpython.pot | 6 +++++- ports/nrf/common-hal/_bleio/__init__.c | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index d96c4f60cf..1da8b1783c 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -1211,6 +1211,10 @@ msgstr "" msgid "Invalid AuthMode" msgstr "" +#: ports/nrf/common-hal/_bleio/__init__.c +msgid "Invalid BLE parameter" +msgstr "" + #: shared-module/displayio/OnDiskBitmap.c msgid "Invalid BMP file" msgstr "" @@ -2316,7 +2320,7 @@ msgstr "" msgid "Unsupported format" msgstr "" -#: ports/raspberrypi/common-hal/pulseio/PulseOut.c py/moduerrno.c +#: py/moduerrno.c msgid "Unsupported operation" msgstr "" diff --git a/ports/nrf/common-hal/_bleio/__init__.c b/ports/nrf/common-hal/_bleio/__init__.c index 72a8e91370..8c28b970c4 100644 --- a/ports/nrf/common-hal/_bleio/__init__.c +++ b/ports/nrf/common-hal/_bleio/__init__.c @@ -52,6 +52,9 @@ void check_nrf_error(uint32_t err_code) { case NRF_ERROR_TIMEOUT: mp_raise_msg(&mp_type_TimeoutError, NULL); return; + case NRF_ERROR_INVALID_PARAM: + mp_raise_ValueError(translate("Invalid BLE parameter")); + return; case BLE_ERROR_INVALID_CONN_HANDLE: mp_raise_ConnectionError(translate("Not connected")); return; From 65813ef35835e9137801815c9b7e1721f7d4e2bd Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Wed, 19 May 2021 14:14:32 -0700 Subject: [PATCH 19/19] Fix ble_hci builds --- devices/ble_hci/common-hal/_bleio/Adapter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devices/ble_hci/common-hal/_bleio/Adapter.c b/devices/ble_hci/common-hal/_bleio/Adapter.c index bc928cc7b9..97468339b0 100644 --- a/devices/ble_hci/common-hal/_bleio/Adapter.c +++ b/devices/ble_hci/common-hal/_bleio/Adapter.c @@ -794,7 +794,7 @@ void common_hal_bleio_adapter_start_advertising(bleio_adapter_obj_t *self, bool } if (tx_power != 0) { - mp_raise_NotImplementedError(); + mp_raise_NotImplementedError(translate("Only tx_power=0 supported")); } const uint32_t result = _common_hal_bleio_adapter_start_advertising(