From 2dd47239de4464900ca853d8e862d6768156e948 Mon Sep 17 00:00:00 2001 From: Daniel Campora Date: Mon, 25 May 2015 21:06:45 +0200 Subject: [PATCH] cc3200: Make API more similar to stmhal. In general the changes are: 1. Peripheral (UART, SPI, ADC, I2C, Timer) IDs start from 1, not zero. 2. Make I2C and SPI require the ID even when there's only one bus. 3. Make I2C and SPI accept 'mode' parameter even though only MASTER is supported. --- cc3200/boards/LAUNCHXL/mpconfigboard.h | 2 +- cc3200/boards/WIPY-SD/mpconfigboard.h | 4 -- cc3200/boards/WIPY/mpconfigboard.h | 4 -- cc3200/mods/pybadc.c | 14 ++--- cc3200/mods/pybi2c.c | 78 +++++++++++++++++--------- cc3200/mods/pybspi.c | 38 +++++++------ cc3200/mods/pybtimer.c | 12 ++-- cc3200/mods/pybuart.c | 10 ++-- cc3200/qstrdefsport.h | 5 ++ 9 files changed, 96 insertions(+), 71 deletions(-) diff --git a/cc3200/boards/LAUNCHXL/mpconfigboard.h b/cc3200/boards/LAUNCHXL/mpconfigboard.h index 982a15c2ff..d604062ba9 100644 --- a/cc3200/boards/LAUNCHXL/mpconfigboard.h +++ b/cc3200/boards/LAUNCHXL/mpconfigboard.h @@ -34,7 +34,7 @@ #define MICROPY_HW_ENABLE_RNG (1) #define MICROPY_HW_ENABLE_RTC (1) -#define MICROPY_STDIO_UART PYB_UART_0 +#define MICROPY_STDIO_UART 1 #define MICROPY_STDIO_UART_BAUD 115200 #define MICROPY_STDIO_UART_RX_BUF_SIZE 128 diff --git a/cc3200/boards/WIPY-SD/mpconfigboard.h b/cc3200/boards/WIPY-SD/mpconfigboard.h index 92f8e9f38b..dc05c2829a 100644 --- a/cc3200/boards/WIPY-SD/mpconfigboard.h +++ b/cc3200/boards/WIPY-SD/mpconfigboard.h @@ -34,10 +34,6 @@ #define MICROPY_HW_ENABLE_RNG (1) #define MICROPY_HW_ENABLE_RTC (1) -#define MICROPY_STDIO_UART PYB_UART_0 -#define MICROPY_STDIO_UART_BAUD 115200 -#define MICROPY_STDIO_UART_RX_BUF_SIZE 128 - #define MICROPY_SYS_LED_PRCM PRCM_GPIOA3 #define MICROPY_SAFE_BOOT_PRCM PRCM_GPIOA3 #define MICROPY_SYS_LED_PORT GPIOA3_BASE diff --git a/cc3200/boards/WIPY/mpconfigboard.h b/cc3200/boards/WIPY/mpconfigboard.h index 3bcfa0ecbe..6ff6fe35bf 100644 --- a/cc3200/boards/WIPY/mpconfigboard.h +++ b/cc3200/boards/WIPY/mpconfigboard.h @@ -34,10 +34,6 @@ #define MICROPY_HW_ENABLE_RNG (1) #define MICROPY_HW_ENABLE_RTC (1) -#define MICROPY_STDIO_UART PYB_UART_0 -#define MICROPY_STDIO_UART_BAUD 115200 -#define MICROPY_STDIO_UART_RX_BUF_SIZE 128 - #define MICROPY_SYS_LED_PRCM PRCM_GPIOA3 #define MICROPY_SAFE_BOOT_PRCM PRCM_GPIOA3 #define MICROPY_SYS_LED_PORT GPIOA3_BASE diff --git a/cc3200/mods/pybadc.c b/cc3200/mods/pybadc.c index 72ec106296..0d7b753f19 100644 --- a/cc3200/mods/pybadc.c +++ b/cc3200/mods/pybadc.c @@ -57,7 +57,7 @@ /// /// Usage: /// -/// adc = pyb.ADC(channel) # create an adc object on the given channel (0 to 3) +/// adc = pyb.ADC(channel) # create an adc object on the given channel (1 to 4) /// this automatically configures the pin associated to /// that analog channel. /// adc.read() # read channel value @@ -76,7 +76,7 @@ typedef struct { mp_obj_base_t base; byte channel; - byte num; + byte idx; } pyb_adc_obj_t; /****************************************************************************** @@ -102,7 +102,7 @@ STATIC pyb_adc_obj_t pyb_adc_obj[PYB_ADC_NUM_CHANNELS]; STATIC void adc_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { pyb_adc_obj_t *self = self_in; - mp_printf(print, "", self->num); + mp_printf(print, "", (self->idx + 1)); } /// \classmethod \constructor(channel) @@ -113,10 +113,10 @@ STATIC mp_obj_t adc_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_kw, mp_arg_check_num(n_args, n_kw, 1, 1, false); // the first argument is the channel number - uint num = mp_obj_get_int(args[0]); + int32_t idx = mp_obj_get_int(args[0]) - 1; const pin_obj_t *pin; uint channel; - switch (num) { + switch (idx) { case 0: channel = ADC_CH_0; pin = &pin_GPIO2; @@ -139,10 +139,10 @@ STATIC mp_obj_t adc_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_kw, } // disable the callback before re-configuring - pyb_adc_obj_t *self = &pyb_adc_obj[num]; + pyb_adc_obj_t *self = &pyb_adc_obj[idx]; self->base.type = &pyb_adc_type; self->channel = channel; - self->num = num; + self->idx = idx; // configure the pin in analog mode pin_config ((pin_obj_t *)pin, PIN_MODE_0, GPIO_DIR_MODE_IN, PYBPIN_ANALOG_TYPE, PIN_STRENGTH_2MA); diff --git a/cc3200/mods/pybi2c.c b/cc3200/mods/pybi2c.c index 79a425d217..7d4f70e867 100644 --- a/cc3200/mods/pybi2c.c +++ b/cc3200/mods/pybi2c.c @@ -56,10 +56,10 @@ /// /// from pyb import I2C /// -/// i2c = I2C() # create -/// i2c = I2C(50000) # create and init with a 50KHz baudrate -/// i2c.init(100000) # init with a 100KHz baudrate -/// i2c.deinit() # turn off the peripheral +/// i2c = I2C(1) # create +/// i2c = I2C(1, 50000) # create and init with a 50KHz baudrate +/// i2c.init(100000) # init with a 100KHz baudrate +/// i2c.deinit() # turn off the peripheral /// /// Printing the i2c object gives you information about its configuration. /// @@ -76,7 +76,7 @@ /// /// A master must specify the recipient's address: /// -/// i2c.init(100000) +/// i2c.init(1, 100000) /// i2c.send('123', 0x42) # send 3 bytes to slave with address 0x42 /// i2c.send(b'456', addr=0x42) # keyword for address /// @@ -98,6 +98,8 @@ typedef struct _pyb_i2c_obj_t { /****************************************************************************** DEFINE CONSTANTS ******************************************************************************/ +#define PYBI2C_MASTER (0) + #define PYBI2C_MIN_BAUD_RATE_HZ (50000) #define PYBI2C_MAX_BAUD_RATE_HZ (400000) @@ -251,16 +253,35 @@ STATIC bool pyb_i2c_scan_device(byte devAddr) { /******************************************************************************/ /* Micro Python bindings */ /******************************************************************************/ - -/// \method init(100000) -/// -/// Initialise the I2C bus as a master with the given baudrate. -/// -STATIC mp_obj_t pyb_i2c_init_helper(pyb_i2c_obj_t *self_in, mp_obj_t baudrate) { +STATIC void pyb_i2c_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { pyb_i2c_obj_t *self = self_in; + if (self->baudrate > 0) { + mp_printf(print, ")", self->baudrate); + } + else { + mp_print_str(print, ""); + } +} + +/// \method init(mode, *, baudrate=100000) +/// +/// Initialise the I2C bus with the given parameters: +/// +/// - `mode` must be either `I2C.MASTER` or `I2C.SLAVE` +/// - `baudrate` is the SCL clock rate (only sensible for a master) +STATIC const mp_arg_t pyb_i2c_init_args[] = { + { MP_QSTR_mode, MP_ARG_REQUIRED | MP_ARG_INT, }, + { MP_QSTR_baudrate, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 100000} }, +}; +#define PYB_I2C_INIT_NUM_ARGS MP_ARRAY_SIZE(pyb_i2c_init_args) + +STATIC mp_obj_t pyb_i2c_init_helper(pyb_i2c_obj_t *self, mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + // parse args + mp_arg_val_t vals[PYB_I2C_INIT_NUM_ARGS]; + mp_arg_parse_all(n_args, args, kw_args, PYB_I2C_INIT_NUM_ARGS, pyb_i2c_init_args, vals); // make sure the baudrate is between the valid range - self->baudrate = MIN(MAX(mp_obj_get_int(baudrate), PYBI2C_MIN_BAUD_RATE_HZ), PYBI2C_MAX_BAUD_RATE_HZ); + self->baudrate = MIN(MAX(vals[1].u_int, PYBI2C_MIN_BAUD_RATE_HZ), PYBI2C_MAX_BAUD_RATE_HZ); // init the I2C bus i2c_init(self); @@ -273,7 +294,7 @@ STATIC mp_obj_t pyb_i2c_init_helper(pyb_i2c_obj_t *self_in, mp_obj_t baudrate) { /// \classmethod \constructor(bus, ...) /// -/// Construct an I2C object on the given bus. `bus` can only be 0. +/// Construct an I2C object on the given bus. `bus` can only be 1. /// With no additional parameters, the I2C object is created but not /// initialised (it has the settings from the last initialisation of /// the bus, if any). If extra arguments are given, the bus is initialised. @@ -282,32 +303,29 @@ STATIC mp_obj_t pyb_i2c_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n // check arguments mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true); + // work out the i2c bus id + if (mp_obj_get_int(args[0]) != 1) { + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable)); + } + // setup the object pyb_i2c_obj_t *self = &pyb_i2c_obj; self->base.type = &pyb_i2c_type; - if (n_args > 0) { + if (n_args > 1 || n_kw > 0) { // start the peripheral - pyb_i2c_init_helper(self, *args); + mp_map_t kw_args; + mp_map_init_fixed_table(&kw_args, n_kw, args + n_args); + pyb_i2c_init_helper(self, n_args - 1, args + 1, &kw_args); } return (mp_obj_t)self; } -STATIC void pyb_i2c_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { - pyb_i2c_obj_t *self = self_in; - if (self->baudrate > 0) { - mp_printf(print, ")", self->baudrate); - } - else { - mp_print_str(print, ""); - } +STATIC mp_obj_t pyb_i2c_init(mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + return pyb_i2c_init_helper(args[0], n_args - 1, args + 1, kw_args); } - -STATIC mp_obj_t pyb_i2c_init(mp_obj_t self_in, mp_obj_t baudrate) { - return pyb_i2c_init_helper(self_in, baudrate); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(pyb_i2c_init_obj, pyb_i2c_init); +STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pyb_i2c_init_obj, 1, pyb_i2c_init); /// \method deinit() /// Turn off the I2C bus. @@ -529,6 +547,10 @@ STATIC const mp_map_elem_t pyb_i2c_locals_dict_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR_recv), (mp_obj_t)&pyb_i2c_recv_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_mem_read), (mp_obj_t)&pyb_i2c_mem_read_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_mem_write), (mp_obj_t)&pyb_i2c_mem_write_obj }, + + // class constants + /// \constant MASTER - for initialising the bus to master mode + { MP_OBJ_NEW_QSTR(MP_QSTR_MASTER), MP_OBJ_NEW_SMALL_INT(PYBI2C_MASTER) }, }; STATIC MP_DEFINE_CONST_DICT(pyb_i2c_locals_dict, pyb_i2c_locals_dict_table); diff --git a/cc3200/mods/pybspi.c b/cc3200/mods/pybspi.c index bcd673225d..390f6cc343 100644 --- a/cc3200/mods/pybspi.c +++ b/cc3200/mods/pybspi.c @@ -167,24 +167,26 @@ STATIC void pyb_spi_print(const mp_print_t *print, mp_obj_t self_in, mp_print_ki pyb_spi_obj_t *self = self_in; if (self->baudrate > 0) { - mp_printf(print, "", - self->baudrate, self->config, self->submode, (self->wlen * 8)); + mp_printf(print, "", + self->baudrate, self->config, self->submode, (self->wlen * 8)); } else { - mp_print_str(print, ""); + mp_print_str(print, ""); } } -/// \method init(2000000, *, bits=8, submode=0, cs=SPI.ACTIVELOW) +/// \method init(mode, *, baudrate=1000000, bits=8, submode=0, cs=SPI.ACTIVELOW) /// /// Initialise the SPI bus with the given parameters: /// +/// - `mode` must be MASTER. /// - `baudrate` is the SCK clock rate. /// - `bits` is the transfer width size (8, 16, 32). /// - `submode` is the spi mode (0, 1, 2, 3). /// - `cs` can be ACTIVELOW, ACTIVEHIGH, or NONE static const mp_arg_t pybspi_init_args[] = { - { MP_QSTR_baudrate, MP_ARG_REQUIRED | MP_ARG_INT, }, + { MP_QSTR_mode, MP_ARG_REQUIRED | MP_ARG_INT, }, + { MP_QSTR_baudrate, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1000000} }, { MP_QSTR_bits, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 8} }, { MP_QSTR_submode, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} }, { MP_QSTR_cs, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = SPI_CS_ACTIVELOW} }, @@ -195,13 +197,8 @@ STATIC mp_obj_t pyb_spi_init_helper(pyb_spi_obj_t *self, mp_uint_t n_args, const mp_arg_val_t args[MP_ARRAY_SIZE(pybspi_init_args)]; mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(pybspi_init_args), pybspi_init_args, args); - uint submode = args[2].u_int; - uint cs = args[3].u_int; uint bits; - - // save the word length for later use - self->wlen = args[1].u_int / 8; - switch (args[1].u_int) { + switch (args[2].u_int) { case 8: bits = SPI_WL_8; break; @@ -216,16 +213,19 @@ STATIC mp_obj_t pyb_spi_init_helper(pyb_spi_obj_t *self, mp_uint_t n_args, const break; } + uint submode = args[3].u_int; if (submode < SPI_SUB_MODE_0 || submode > SPI_SUB_MODE_3) { nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments)); } + uint cs = args[4].u_int; if (cs != SPI_CS_ACTIVELOW && cs != SPI_CS_ACTIVEHIGH) { nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments)); } // build the configuration - self->baudrate = args[0].u_int; + self->baudrate = args[1].u_int; + self->wlen = args[2].u_int >> 3; self->config = bits | cs | SPI_SW_CTRL_CS | SPI_4PIN_MODE | SPI_TURBO_OFF; self->submode = submode; @@ -240,8 +240,8 @@ STATIC mp_obj_t pyb_spi_init_helper(pyb_spi_obj_t *self, mp_uint_t n_args, const /// \classmethod \constructor(bus, ...) /// -/// Construct an SPI object with the given baudrate. -/// With no parameters, the SPI object is created but not +/// Construct an SPI object with the given baudrate. Bus can only be 1. +/// With no extra parameters, the SPI object is created but not /// initialised (it has the settings from the last initialisation of /// the bus, if any). If extra arguments are given, the bus is initialised. /// See `init` for parameters of initialisation. @@ -250,14 +250,19 @@ STATIC mp_obj_t pyb_spi_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n // check arguments mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true); + // work out the spi bus id + if (mp_obj_get_int(args[0]) != 1) { + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable)); + } + pyb_spi_obj_t *self = &pyb_spi_obj; self->base.type = &pyb_spi_type; - if (n_args > 0 || n_kw > 0) { + if (n_args > 1 || n_kw > 0) { // start the peripheral mp_map_t kw_args; mp_map_init_fixed_table(&kw_args, n_kw, args + n_args); - pyb_spi_init_helper(self, n_args, args, &kw_args); + pyb_spi_init_helper(self, n_args - 1, args + 1, &kw_args); } return self; @@ -396,6 +401,7 @@ STATIC const mp_map_elem_t pyb_spi_locals_dict_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR_send_recv), (mp_obj_t)&pyb_spi_send_recv_obj }, // class constants + { MP_OBJ_NEW_QSTR(MP_QSTR_MASTER), MP_OBJ_NEW_SMALL_INT(SPI_MODE_MASTER) }, { MP_OBJ_NEW_QSTR(MP_QSTR_ACTIVE_LOW), MP_OBJ_NEW_SMALL_INT(SPI_CS_ACTIVELOW) }, { MP_OBJ_NEW_QSTR(MP_QSTR_ACTIVE_HIGH), MP_OBJ_NEW_SMALL_INT(SPI_CS_ACTIVEHIGH) }, }; diff --git a/cc3200/mods/pybtimer.c b/cc3200/mods/pybtimer.c index 786248867f..f8069dc480 100644 --- a/cc3200/mods/pybtimer.c +++ b/cc3200/mods/pybtimer.c @@ -60,7 +60,7 @@ /// /// Example usage to toggle an LED at a fixed frequency: /// -/// tim = pyb.Timer(3) # create a timer object using timer 4 +/// tim = pyb.Timer(4) # create a timer object using timer 4 /// tim.init(mode=Timer.PERIODIC) # initialize it in periodic mode /// tim_ch = tim.channel(Timer.A, freq=2) # configure channel A at a frequency of 2Hz /// tim_ch.callback(handler=lambda t:led.toggle()) # toggle a led on every cycle of the timer @@ -68,7 +68,7 @@ /// Further examples: /// /// tim1 = pyb.Timer(2, mode=Timer.EVENT_COUNT) # initialize it capture mode -/// tim2 = pyb.Timer(0, mode=Timer.PWM) # initialize it in PWM mode +/// tim2 = pyb.Timer(1, mode=Timer.PWM) # initialize it in PWM mode /// tim_ch = tim1.channel(Timer.A, freq=1, polarity=Timer.POSITIVE) # start the PWM on channel B with a 50% duty cycle /// tim_ch = tim2.channel(Timer.B, freq=10000, duty_cycle=50) # start the event counter with a frequency of 1Hz and triggered by positive edges /// tim_ch.time() # get the current time in usec (can also be set) @@ -303,7 +303,7 @@ STATIC void pyb_timer_print(const mp_print_t *print, mp_obj_t self_in, mp_print_ default: break; } - mp_printf(print, "", tim->id, mode_qst); + mp_printf(print, "", (tim->id + 1), mode_qst); } /// \method init(mode, *, width) @@ -360,13 +360,13 @@ error: /// \classmethod \constructor(id, ...) /// Construct a new timer object of the given id. If additional /// arguments are given, then the timer is initialised by `init(...)`. -/// `id` can be 0 to 3 +/// `id` can be 1 to 4 STATIC mp_obj_t pyb_timer_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { // check arguments mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true); // create a new Timer object - uint32_t timer_idx = mp_obj_get_int(args[0]); + int32_t timer_idx = mp_obj_get_int(args[0]) - 1; if (timer_idx < 0 || timer_idx > (PYBTIMER_NUM_TIMERS - 1)) { nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable)); } @@ -579,7 +579,7 @@ STATIC void pyb_timer_channel_print(const mp_print_t *print, mp_obj_t self_in, m } mp_printf(print, "<%q %s, timer=%u, %q=%u", MP_QSTR_TimerChannel, - ch_id, ch->timer->id, MP_QSTR_freq, ch->frequency); + ch_id, (ch->timer->id + 1), MP_QSTR_freq, ch->frequency); uint32_t mode = ch->timer->config & 0xFF; if (mode == TIMER_CFG_A_CAP_COUNT || mode == TIMER_CFG_A_CAP_TIME || mode == TIMER_CFG_A_PWM) { diff --git a/cc3200/mods/pybuart.c b/cc3200/mods/pybuart.c index 87b8b15e7c..bda33fca93 100644 --- a/cc3200/mods/pybuart.c +++ b/cc3200/mods/pybuart.c @@ -62,7 +62,7 @@ /// /// from pyb import UART /// -/// uart = UART(0, 9600) # init with given baudrate +/// uart = UART(1, 9600) # init with given baudrate /// uart.init(9600, bits=8, stop=1, parity=None) # init with given parameters /// /// Bits can be 5, 6, 7, 8, parity can be None, 0 (even), 1 (odd). Stop can be 1 or 2. @@ -316,7 +316,7 @@ STATIC void uart_callback_disable (mp_obj_t self_in) { STATIC void pyb_uart_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { pyb_uart_obj_t *self = self_in; if (self->baudrate > 0) { - mp_printf(print, "timeout, self->timeout_char, self->read_buf_len); } else { - mp_printf(print, "", self->uart_id); + mp_printf(print, "", (self->uart_id + 1)); } } @@ -432,7 +432,7 @@ STATIC mp_obj_t pyb_uart_init_helper(pyb_uart_obj_t *self, mp_uint_t n_args, con /// \classmethod \constructor(bus, ...) /// -/// Construct a UART object on the given bus id. `bus id` can be 0 or 1 +/// Construct a UART object on the given bus id. `bus id` can be 1 or 2 /// With no additional parameters, the UART object is created but not /// initialised (it has the settings from the last initialisation of /// the bus, if any). @@ -448,7 +448,7 @@ STATIC mp_obj_t pyb_uart_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t mp_arg_check_num(n_args, n_kw, 1, MP_ARRAY_SIZE(pyb_uart_init_args), true); // work out the uart id - pyb_uart_id_t uart_id = mp_obj_get_int(args[0]); + int32_t uart_id = mp_obj_get_int(args[0]) - 1; if (uart_id < PYB_UART_0 || uart_id > PYB_UART_1) { nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_resource_not_avaliable)); diff --git a/cc3200/qstrdefsport.h b/cc3200/qstrdefsport.h index c3fdf71f36..4ff13bb239 100644 --- a/cc3200/qstrdefsport.h +++ b/cc3200/qstrdefsport.h @@ -160,6 +160,8 @@ Q(FLOW_TXRX) // for I2C class Q(I2C) +Q(mode) +Q(baudrate) Q(addr) Q(data) Q(memaddr) @@ -172,6 +174,7 @@ Q(send) Q(recv) Q(mem_read) Q(mem_write) +Q(MASTER) // for ADC class Q(ADC) @@ -312,6 +315,7 @@ Q(RTC_WAKE) // for SPI class Q(SPI) +Q(mode) Q(baudrate) Q(bits) Q(submode) @@ -321,6 +325,7 @@ Q(deinit) Q(send) Q(recv) Q(send_recv) +Q(MASTER) Q(ACTIVE_LOW) Q(ACTIVE_HIGH)