Commit 4d7fa05b authored by Daniel Campora's avatar Daniel Campora
Browse files

cc3200: Improve Pin and UART implementation.

Deassign pins af before assigning. Make uart.any() return the
correct value everytime, this requires interrupts to be always
enabled.
parent 4054c4ea
...@@ -60,6 +60,8 @@ DECLARE PRIVATE FUNCTIONS ...@@ -60,6 +60,8 @@ DECLARE PRIVATE FUNCTIONS
******************************************************************************/ ******************************************************************************/
STATIC pin_obj_t *pin_find_named_pin(const mp_obj_dict_t *named_pins, mp_obj_t name); STATIC pin_obj_t *pin_find_named_pin(const mp_obj_dict_t *named_pins, mp_obj_t name);
STATIC pin_obj_t *pin_find_pin_by_port_bit (const mp_obj_dict_t *named_pins, uint port, uint bit); STATIC pin_obj_t *pin_find_pin_by_port_bit (const mp_obj_dict_t *named_pins, uint port, uint bit);
STATIC int8_t pin_obj_find_af (const pin_obj_t* pin, uint8_t fn, uint8_t unit, uint8_t type);
STATIC void pin_deassign (pin_obj_t* pin);
STATIC void pin_obj_configure (const pin_obj_t *self); STATIC void pin_obj_configure (const pin_obj_t *self);
STATIC void pin_get_hibernate_pin_and_idx (const pin_obj_t *self, uint *wake_pin, uint *idx); STATIC void pin_get_hibernate_pin_and_idx (const pin_obj_t *self, uint *wake_pin, uint *idx);
STATIC void pin_extint_enable (mp_obj_t self_in); STATIC void pin_extint_enable (mp_obj_t self_in);
...@@ -68,6 +70,7 @@ STATIC void pin_extint_register(pin_obj_t *self, uint32_t intmode, uint32_t prio ...@@ -68,6 +70,7 @@ STATIC void pin_extint_register(pin_obj_t *self, uint32_t intmode, uint32_t prio
STATIC void pin_validate_mode (uint mode); STATIC void pin_validate_mode (uint mode);
STATIC void pin_validate_pull (uint pull); STATIC void pin_validate_pull (uint pull);
STATIC void pin_validate_drive (uint strength); STATIC void pin_validate_drive (uint strength);
STATIC void pin_validate_af(const pin_obj_t* pin, int8_t idx, uint8_t *fn, uint8_t *unit, uint8_t *type);
STATIC void GPIOA0IntHandler (void); STATIC void GPIOA0IntHandler (void);
STATIC void GPIOA1IntHandler (void); STATIC void GPIOA1IntHandler (void);
STATIC void GPIOA2IntHandler (void); STATIC void GPIOA2IntHandler (void);
...@@ -115,9 +118,7 @@ void pin_init0(void) { ...@@ -115,9 +118,7 @@ void pin_init0(void) {
mp_map_t *named_map = mp_obj_dict_get_map((mp_obj_t)&pin_board_pins_locals_dict); mp_map_t *named_map = mp_obj_dict_get_map((mp_obj_t)&pin_board_pins_locals_dict);
for (uint i = 0; i < named_map->used - 1; i++) { for (uint i = 0; i < named_map->used - 1; i++) {
pin_obj_t * pin = (pin_obj_t *)named_map->table[i].value; pin_obj_t * pin = (pin_obj_t *)named_map->table[i].value;
pin_config (pin, PIN_MODE_0, GPIO_DIR_MODE_IN, PIN_TYPE_STD, -1, PIN_STRENGTH_2MA); pin_deassign (pin);
// mark it as unused again
pin->used = false;
} }
#endif #endif
} }
...@@ -147,10 +148,12 @@ void pin_config (pin_obj_t *self, int af, uint mode, uint pull, int value, uint ...@@ -147,10 +148,12 @@ void pin_config (pin_obj_t *self, int af, uint mode, uint pull, int value, uint
if (af != -1) { if (af != -1) {
self->af = af; self->af = af;
} }
// if value is -1, then we want to keep it as it is // if value is -1, then we want to keep it as it is
if (value != -1) { if (value != -1) {
self->value = value; self->value = value;
} }
// mark the pin as used // mark the pin as used
self->used = true; self->used = true;
pin_obj_configure ((const pin_obj_t *)self); pin_obj_configure ((const pin_obj_t *)self);
...@@ -160,12 +163,27 @@ void pin_config (pin_obj_t *self, int af, uint mode, uint pull, int value, uint ...@@ -160,12 +163,27 @@ void pin_config (pin_obj_t *self, int af, uint mode, uint pull, int value, uint
} }
int8_t pin_find_af_index (const pin_obj_t* pin, uint8_t fn, uint8_t unit, uint8_t type) { int8_t pin_find_af_index (const pin_obj_t* pin, uint8_t fn, uint8_t unit, uint8_t type) {
for (int i = 0; i < pin->num_afs; i++) { int8_t af = pin_obj_find_af(pin, fn, unit, type);
if (pin->af_list[i].fn == fn && pin->af_list[i].unit == unit && pin->af_list[i].type == type) { if (af < 0) {
return pin->af_list[i].idx; nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
}
return af;
}
void pin_free_af_from_pins (uint8_t fn, uint8_t unit, uint8_t type) {
mp_map_t *named_map = mp_obj_dict_get_map((mp_obj_t)&pin_board_pins_locals_dict);
for (uint i = 0; i < named_map->used - 1; i++) {
pin_obj_t * pin = (pin_obj_t *)named_map->table[i].value;
// af is different than GPIO
if (pin->af > PIN_MODE_0) {
// check if the pin supports the target af
int af = pin_obj_find_af(pin, fn, unit, type);
if (af > 0 && af == pin->af) {
// the pin is assigned to the target af, de-assign it
pin_deassign (pin);
}
} }
} }
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
} }
/****************************************************************************** /******************************************************************************
...@@ -191,6 +209,20 @@ STATIC pin_obj_t *pin_find_pin_by_port_bit (const mp_obj_dict_t *named_pins, uin ...@@ -191,6 +209,20 @@ STATIC pin_obj_t *pin_find_pin_by_port_bit (const mp_obj_dict_t *named_pins, uin
return NULL; return NULL;
} }
STATIC int8_t pin_obj_find_af (const pin_obj_t* pin, uint8_t fn, uint8_t unit, uint8_t type) {
for (int i = 0; i < pin->num_afs; i++) {
if (pin->af_list[i].fn == fn && pin->af_list[i].unit == unit && pin->af_list[i].type == type) {
return pin->af_list[i].idx;
}
}
return -1;
}
STATIC void pin_deassign (pin_obj_t* pin) {
pin_config (pin, PIN_MODE_0, GPIO_DIR_MODE_IN, PIN_TYPE_STD, -1, PIN_STRENGTH_4MA);
pin->used = false;
}
STATIC void pin_obj_configure (const pin_obj_t *self) { STATIC void pin_obj_configure (const pin_obj_t *self) {
uint32_t type; uint32_t type;
if (self->mode == PIN_TYPE_ANALOG) { if (self->mode == PIN_TYPE_ANALOG) {
...@@ -370,6 +402,18 @@ STATIC void pin_validate_drive(uint strength) { ...@@ -370,6 +402,18 @@ STATIC void pin_validate_drive(uint strength) {
} }
} }
STATIC void pin_validate_af(const pin_obj_t* pin, int8_t idx, uint8_t *fn, uint8_t *unit, uint8_t *type) {
for (int i = 0; i < pin->num_afs; i++) {
if (pin->af_list[i].idx == idx) {
*fn = pin->af_list[i].fn;
*unit = pin->af_list[i].unit;
*type = pin->af_list[i].type;
return;
}
}
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
}
STATIC void GPIOA0IntHandler (void) { STATIC void GPIOA0IntHandler (void) {
EXTI_Handler(GPIOA0_BASE); EXTI_Handler(GPIOA0_BASE);
} }
...@@ -455,6 +499,12 @@ STATIC mp_obj_t pin_obj_init_helper(pin_obj_t *self, mp_uint_t n_args, const mp_ ...@@ -455,6 +499,12 @@ STATIC mp_obj_t pin_obj_init_helper(pin_obj_t *self, mp_uint_t n_args, const mp_
goto invalid_args; goto invalid_args;
} }
// check for a valid af and then free it from any other pins
if (af > PIN_MODE_0) {
uint8_t fn, unit, type;
pin_validate_af (self, af, &fn, &unit, &type);
pin_free_af_from_pins(fn, unit, type);
}
pin_config (self, af, mode, pull, value, strength); pin_config (self, af, mode, pull, value, strength);
return mp_const_none; return mp_const_none;
......
...@@ -140,5 +140,6 @@ void pin_init0(void); ...@@ -140,5 +140,6 @@ void pin_init0(void);
void pin_config(pin_obj_t *self, int af, uint mode, uint type, int value, uint strength); void pin_config(pin_obj_t *self, int af, uint mode, uint type, int value, uint strength);
pin_obj_t *pin_find(mp_obj_t user_obj); pin_obj_t *pin_find(mp_obj_t user_obj);
int8_t pin_find_af_index(const pin_obj_t* pin, uint8_t fn, uint8_t unit, uint8_t type); int8_t pin_find_af_index(const pin_obj_t* pin, uint8_t fn, uint8_t unit, uint8_t type);
void pin_free_af_from_pins (uint8_t fn, uint8_t unit, uint8_t type);
#endif // PYBPIN_H_ #endif // PYBPIN_H_
...@@ -71,11 +71,18 @@ ...@@ -71,11 +71,18 @@
#define PYBUART_RX_BUFFER_LEN (128) #define PYBUART_RX_BUFFER_LEN (128)
// interrupt triggers
#define E_UART_TRIGGER_RX_ANY (0x01)
#define E_UART_TRIGGER_RX_HALF (0x02)
#define E_UART_TRIGGER_RX_FULL (0x04)
#define E_UART_TRIGGER_TX_DONE (0x08)
/****************************************************************************** /******************************************************************************
DECLARE PRIVATE FUNCTIONS DECLARE PRIVATE FUNCTIONS
******************************************************************************/ ******************************************************************************/
STATIC void uart_init (pyb_uart_obj_t *self); STATIC void uart_init (pyb_uart_obj_t *self);
STATIC bool uart_rx_wait (pyb_uart_obj_t *self); STATIC bool uart_rx_wait (pyb_uart_obj_t *self);
STATIC void uart_check_init(pyb_uart_obj_t *self);
STATIC void UARTGenericIntHandler(uint32_t uart_id); STATIC void UARTGenericIntHandler(uint32_t uart_id);
STATIC void UART0IntHandler(void); STATIC void UART0IntHandler(void);
STATIC void UART1IntHandler(void); STATIC void UART1IntHandler(void);
...@@ -98,6 +105,7 @@ struct _pyb_uart_obj_t { ...@@ -98,6 +105,7 @@ struct _pyb_uart_obj_t {
uint16_t read_buf_tail; // indexes first full slot (not full if equals head) uint16_t read_buf_tail; // indexes first full slot (not full if equals head)
byte peripheral; byte peripheral;
byte irq_trigger; byte irq_trigger;
bool callback_enabled;
}; };
/****************************************************************************** /******************************************************************************
...@@ -244,6 +252,7 @@ STATIC bool uart_rx_wait (pyb_uart_obj_t *self) { ...@@ -244,6 +252,7 @@ STATIC bool uart_rx_wait (pyb_uart_obj_t *self) {
STATIC void UARTGenericIntHandler(uint32_t uart_id) { STATIC void UARTGenericIntHandler(uint32_t uart_id) {
pyb_uart_obj_t *self; pyb_uart_obj_t *self;
uint32_t status; uint32_t status;
bool exec_callback = false;
self = &pyb_uart_obj[uart_id]; self = &pyb_uart_obj[uart_id];
status = MAP_UARTIntStatus(self->reg, true); status = MAP_UARTIntStatus(self->reg, true);
...@@ -266,9 +275,23 @@ STATIC void UARTGenericIntHandler(uint32_t uart_id) { ...@@ -266,9 +275,23 @@ STATIC void UARTGenericIntHandler(uint32_t uart_id) {
} }
} }
} }
// call the user defined handler
mp_obj_t _callback = mpcallback_find(self); if (self->irq_trigger & E_UART_TRIGGER_RX_ANY) {
mpcallback_handler(_callback); exec_callback = true;
}
if (exec_callback && self->callback_enabled) {
// call the user defined handler
mp_obj_t _callback = mpcallback_find(self);
mpcallback_handler(_callback);
}
}
}
STATIC void uart_check_init(pyb_uart_obj_t *self) {
// not initialized
if (!self->baudrate) {
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_request_not_possible));
} }
} }
...@@ -287,11 +310,12 @@ STATIC void uart_callback_enable (mp_obj_t self_in) { ...@@ -287,11 +310,12 @@ STATIC void uart_callback_enable (mp_obj_t self_in) {
MAP_UARTIntClear(self->reg, UART_INT_RX | UART_INT_RT); MAP_UARTIntClear(self->reg, UART_INT_RX | UART_INT_RT);
MAP_UARTIntEnable(self->reg, UART_INT_RX | UART_INT_RT); MAP_UARTIntEnable(self->reg, UART_INT_RX | UART_INT_RT);
} }
self->callback_enabled = true;
} }
STATIC void uart_callback_disable (mp_obj_t self_in) { STATIC void uart_callback_disable (mp_obj_t self_in) {
pyb_uart_obj_t *self = self_in; pyb_uart_obj_t *self = self_in;
MAP_UARTIntDisable(self->reg, UART_INT_RX | UART_INT_RT); self->callback_enabled = false;
} }
/******************************************************************************/ /******************************************************************************/
...@@ -405,6 +429,7 @@ STATIC mp_obj_t pyb_uart_init_helper(pyb_uart_obj_t *self, mp_uint_t n_args, con ...@@ -405,6 +429,7 @@ STATIC mp_obj_t pyb_uart_init_helper(pyb_uart_obj_t *self, mp_uint_t n_args, con
} }
// the pins tuple passed looks good so far // the pins tuple passed looks good so far
for (int i = 0; i < n_pins; i++) { for (int i = 0; i < n_pins; i++) {
pin_free_af_from_pins(PIN_FN_UART, self->uart_id, i);
if (pins_t[i] != mp_const_none) { if (pins_t[i] != mp_const_none) {
pin_obj_t *pin = pin_find(pins_t[i]); pin_obj_t *pin = pin_find(pins_t[i]);
pin_config (pin, pin_find_af_index(pin, PIN_FN_UART, self->uart_id, i), pin_config (pin, pin_find_af_index(pin, PIN_FN_UART, self->uart_id, i),
...@@ -422,6 +447,8 @@ STATIC mp_obj_t pyb_uart_init_helper(pyb_uart_obj_t *self, mp_uint_t n_args, con ...@@ -422,6 +447,8 @@ STATIC mp_obj_t pyb_uart_init_helper(pyb_uart_obj_t *self, mp_uint_t n_args, con
uart_init (self); uart_init (self);
// register it with the sleep module // register it with the sleep module
pybsleep_add ((const mp_obj_t)self, (WakeUpCB_t)uart_init); pybsleep_add ((const mp_obj_t)self, (WakeUpCB_t)uart_init);
// enable the callback
uart_callback_new (self, mp_const_none, INT_PRIORITY_LVL_3, E_UART_TRIGGER_RX_ANY);
return mp_const_none; return mp_const_none;
...@@ -478,12 +505,14 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_uart_deinit_obj, pyb_uart_deinit); ...@@ -478,12 +505,14 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_uart_deinit_obj, pyb_uart_deinit);
STATIC mp_obj_t pyb_uart_any(mp_obj_t self_in) { STATIC mp_obj_t pyb_uart_any(mp_obj_t self_in) {
pyb_uart_obj_t *self = self_in; pyb_uart_obj_t *self = self_in;
uart_check_init(self);
return mp_obj_new_int(uart_rx_any(self)); return mp_obj_new_int(uart_rx_any(self));
} }
STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_uart_any_obj, pyb_uart_any); STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_uart_any_obj, pyb_uart_any);
STATIC mp_obj_t pyb_uart_sendbreak(mp_obj_t self_in) { STATIC mp_obj_t pyb_uart_sendbreak(mp_obj_t self_in) {
pyb_uart_obj_t *self = self_in; pyb_uart_obj_t *self = self_in;
uart_check_init(self);
// send a break signal for at least 2 complete frames // send a break signal for at least 2 complete frames
MAP_UARTBreakCtl(self->reg, true); MAP_UARTBreakCtl(self->reg, true);
UtilsDelay(UTILS_DELAY_US_TO_COUNT(PYBUART_2_FRAMES_TIME_US(self->baudrate))); UtilsDelay(UTILS_DELAY_US_TO_COUNT(PYBUART_2_FRAMES_TIME_US(self->baudrate)));
...@@ -498,6 +527,7 @@ STATIC mp_obj_t pyb_uart_callback (mp_uint_t n_args, const mp_obj_t *pos_args, m ...@@ -498,6 +527,7 @@ STATIC mp_obj_t pyb_uart_callback (mp_uint_t n_args, const mp_obj_t *pos_args, m
// check if any parameters were passed // check if any parameters were passed
pyb_uart_obj_t *self = pos_args[0]; pyb_uart_obj_t *self = pos_args[0];
uart_check_init(self);
mp_obj_t _callback = mpcallback_find((mp_obj_t)self); mp_obj_t _callback = mpcallback_find((mp_obj_t)self);
if (kw_args->used > 0) { if (kw_args->used > 0) {
...@@ -547,6 +577,7 @@ STATIC MP_DEFINE_CONST_DICT(pyb_uart_locals_dict, pyb_uart_locals_dict_table); ...@@ -547,6 +577,7 @@ STATIC MP_DEFINE_CONST_DICT(pyb_uart_locals_dict, pyb_uart_locals_dict_table);
STATIC mp_uint_t pyb_uart_read(mp_obj_t self_in, void *buf_in, mp_uint_t size, int *errcode) { STATIC mp_uint_t pyb_uart_read(mp_obj_t self_in, void *buf_in, mp_uint_t size, int *errcode) {
pyb_uart_obj_t *self = self_in; pyb_uart_obj_t *self = self_in;
byte *buf = buf_in; byte *buf = buf_in;
uart_check_init(self);
// make sure we want at least 1 char // make sure we want at least 1 char
if (size == 0) { if (size == 0) {
...@@ -574,6 +605,7 @@ STATIC mp_uint_t pyb_uart_read(mp_obj_t self_in, void *buf_in, mp_uint_t size, i ...@@ -574,6 +605,7 @@ STATIC mp_uint_t pyb_uart_read(mp_obj_t self_in, void *buf_in, mp_uint_t size, i
STATIC mp_uint_t pyb_uart_write(mp_obj_t self_in, const void *buf_in, mp_uint_t size, int *errcode) { STATIC mp_uint_t pyb_uart_write(mp_obj_t self_in, const void *buf_in, mp_uint_t size, int *errcode) {
pyb_uart_obj_t *self = self_in; pyb_uart_obj_t *self = self_in;
const char *buf = buf_in; const char *buf = buf_in;
uart_check_init(self);
// write the data // write the data
if (!uart_tx_strn(self, buf, size)) { if (!uart_tx_strn(self, buf, size)) {
...@@ -585,6 +617,8 @@ STATIC mp_uint_t pyb_uart_write(mp_obj_t self_in, const void *buf_in, mp_uint_t ...@@ -585,6 +617,8 @@ STATIC mp_uint_t pyb_uart_write(mp_obj_t self_in, const void *buf_in, mp_uint_t
STATIC mp_uint_t pyb_uart_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg, int *errcode) { STATIC mp_uint_t pyb_uart_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg, int *errcode) {
pyb_uart_obj_t *self = self_in; pyb_uart_obj_t *self = self_in;
mp_uint_t ret; mp_uint_t ret;
uart_check_init(self);
if (request == MP_IOCTL_POLL) { if (request == MP_IOCTL_POLL) {
mp_uint_t flags = arg; mp_uint_t flags = arg;
ret = 0; ret = 0;
......
...@@ -28,12 +28,6 @@ ...@@ -28,12 +28,6 @@
#ifndef PYBUART_H_ #ifndef PYBUART_H_
#define PYBUART_H_ #define PYBUART_H_
// interrupt triggers
#define E_UART_TRIGGER_RX_ANY (0x01)
#define E_UART_TRIGGER_RX_HALF (0x02)
#define E_UART_TRIGGER_RX_FULL (0x04)
#define E_UART_TRIGGER_TX_DONE (0x08)
typedef enum { typedef enum {
PYB_UART_0 = 0, PYB_UART_0 = 0,
PYB_UART_1 = 1, PYB_UART_1 = 1,
......
...@@ -145,7 +145,6 @@ soft_reset: ...@@ -145,7 +145,6 @@ soft_reset:
mp_obj_new_int(MICROPY_STDIO_UART_BAUD), mp_obj_new_int(MICROPY_STDIO_UART_BAUD),
}; };
pyb_stdio_uart = pyb_uart_type.make_new((mp_obj_t)&pyb_uart_type, MP_ARRAY_SIZE(args), 0, args); pyb_stdio_uart = pyb_uart_type.make_new((mp_obj_t)&pyb_uart_type, MP_ARRAY_SIZE(args), 0, args);
uart_callback_new (pyb_stdio_uart, mp_const_none, INT_PRIORITY_LVL_3, E_UART_TRIGGER_RX_ANY);
#else #else
pyb_stdio_uart = MP_OBJ_NULL; pyb_stdio_uart = MP_OBJ_NULL;
#endif #endif
......
...@@ -7,10 +7,10 @@ import os ...@@ -7,10 +7,10 @@ import os
machine = os.uname().machine machine = os.uname().machine
if 'LaunchPad' in machine: if 'LaunchPad' in machine:
pin_map = ['GP24', 'GP12', 'GP14', 'GP15', 'GP16', 'GP17', 'GP28', 'GP8', 'GP6', 'GP30', 'GP31', 'GP3', 'GP0', 'GP4', 'GP5'] pin_map = ['GP24', 'GP12', 'GP14', 'GP15', 'GP16', 'GP17', 'GP28', 'GP8', 'GP6', 'GP30', 'GP31', 'GP3', 'GP0', 'GP4', 'GP5']
af_range = range(1, 16) max_af_idx = 15
elif 'WiPy' in machine: elif 'WiPy' in machine:
pin_map = ['GP23', 'GP24', 'GP12', 'GP13', 'GP14', 'GP9', 'GP17', 'GP28', 'GP22', 'GP8', 'GP30', 'GP31', 'GP0', 'GP4', 'GP5'] pin_map = ['GP23', 'GP24', 'GP12', 'GP13', 'GP14', 'GP9', 'GP17', 'GP28', 'GP22', 'GP8', 'GP30', 'GP31', 'GP0', 'GP4', 'GP5']
af_range = range(1, 16) max_af_idx = 15
else: else:
raise Exception('Board not supported!') raise Exception('Board not supported!')
...@@ -28,9 +28,10 @@ def test_pin_read(pull): ...@@ -28,9 +28,10 @@ def test_pin_read(pull):
def test_pin_af(): def test_pin_af():
for p in pin_map: for p in pin_map:
for n in af_range: for af in Pin(p).alt_list():
Pin(p, mode=Pin.ALT, alt=n) if af[1] <= max_af_idx:
Pin(p, mode=Pin.ALT_OPEN_DRAIN, alt=n) Pin(p, mode=Pin.ALT, alt=af[1])
Pin(p, mode=Pin.ALT_OPEN_DRAIN, alt=af[1])
# test un-initialized pins # test un-initialized pins
test_noinit() test_noinit()
...@@ -67,10 +68,6 @@ pin.init(mode=Pin.OUT, pull=Pin.PULL_UP, drive=pin.LOW_POWER) ...@@ -67,10 +68,6 @@ pin.init(mode=Pin.OUT, pull=Pin.PULL_UP, drive=pin.LOW_POWER)
print(pin) print(pin)
pin.init(mode=Pin.OUT, pull=Pin.PULL_UP, drive=pin.HIGH_POWER) pin.init(mode=Pin.OUT, pull=Pin.PULL_UP, drive=pin.HIGH_POWER)
print(pin) print(pin)
pin = Pin(pin_map[0], Pin.ALT, Pin.PULL_NONE, alt=1)
print(pin)
pin = Pin(pin_map[0], Pin.ALT_OPEN_DRAIN, Pin.PULL_NONE, alt=15)
print(pin)
# test value in OUT mode # test value in OUT mode
pin = Pin(pin_map[0], mode=Pin.OUT) pin = Pin(pin_map[0], mode=Pin.OUT)
......
...@@ -32,8 +32,6 @@ Pin('GP23', mode=Pin.IN, pull=Pin.PULL_NONE, drive=Pin.MED_POWER, alt=-1) ...@@ -32,8 +32,6 @@ Pin('GP23', mode=Pin.IN, pull=Pin.PULL_NONE, drive=Pin.MED_POWER, alt=-1)
Pin('GP23', mode=Pin.IN, pull=Pin.PULL_DOWN, drive=Pin.MED_POWER, alt=-1) Pin('GP23', mode=Pin.IN, pull=Pin.PULL_DOWN, drive=Pin.MED_POWER, alt=-1)
Pin('GP23', mode=Pin.OUT, pull=Pin.PULL_UP, drive=Pin.LOW_POWER, alt=-1) Pin('GP23', mode=Pin.OUT, pull=Pin.PULL_UP, drive=Pin.LOW_POWER, alt=-1)
Pin('GP23', mode=Pin.OUT, pull=Pin.PULL_UP, drive=Pin.HIGH_POWER, alt=-1) Pin('GP23', mode=Pin.OUT, pull=Pin.PULL_UP, drive=Pin.HIGH_POWER, alt=-1)
Pin('GP23', mode=Pin.ALT, pull=Pin.PULL_NONE, drive=Pin.MED_POWER, alt=1)
Pin('GP23', mode=Pin.ALT_OPEN_DRAIN, pull=Pin.PULL_NONE, drive=Pin.MED_POWER, alt=15)
1 1
0 0
1 1
......
...@@ -6,6 +6,7 @@ UART0 and UART1 must be connected together for this test to pass. ...@@ -6,6 +6,7 @@ UART0 and UART1 must be connected together for this test to pass.
from pyb import UART from pyb import UART
from pyb import Pin from pyb import Pin
import os import os
import pyb
machine = os.uname().machine machine = os.uname().machine
if 'LaunchPad' in machine: if 'LaunchPad' in machine:
...@@ -25,12 +26,6 @@ for uart_id in uart_id_range: ...@@ -25,12 +26,6 @@ for uart_id in uart_id_range:
uart.init(baudrate=115200, parity=1, pins=uart_pins[uart_id][0]) uart.init(baudrate=115200, parity=1, pins=uart_pins[uart_id][0])
uart.sendbreak() uart.sendbreak()
# assign GP1, GP2, GP3 and GP4 back to GPIO mode
Pin('GP1', mode=Pin.IN)
Pin('GP2', mode=Pin.IN)
Pin('GP3', mode=Pin.IN)
Pin('GP4', mode=Pin.IN)
# now it's time for some loopback tests between the uarts # now it's time for some loopback tests between the uarts
uart0 = UART(0, 1000000, pins=uart_pins[0][0]) uart0 = UART(0, 1000000, pins=uart_pins[0][0])
print(uart0) print(uart0)
...@@ -52,16 +47,16 @@ print(buf) ...@@ -52,16 +47,16 @@ print(buf)
print(uart1.readinto(buf) == 2) print(uart1.readinto(buf) == 2)
print(buf) print(buf)
uart0.write(b'123') uart0.write(b'1234567890')
print(uart1.any() > 0) pyb.delay(2) # because of the fifo interrupt levels
print(uart1.readline() == b'123') print(uart1.any() == 10)
print(uart1.readline() == b'1234567890')
print(uart1.any() == 0) print(uart1.any() == 0)
uart0.write(b'1234567890') uart0.write(b'1234567890')
print(uart1.readall() == b'1234567890') print(uart1.readall() == b'1234567890')
# tx only mode # tx only mode
Pin('GP13', mode=Pin.IN)
uart0 = UART(0, 1000000, pins=('GP12', None)) uart0 = UART(0, 1000000, pins=('GP12', None))
print(uart0.write(b'123456') == 6) print(uart0.write(b'123456') == 6)
print(uart1.read() == b'123456') print(uart1.read() == b'123456')
...@@ -69,17 +64,21 @@ print(uart1.write(b'123') == 3) ...@@ -69,17 +64,21 @@ print(uart1.write(b'123') == 3)
print(uart0.read() == b'') print(uart0.read() == b'')
# rx only mode # rx only mode
Pin('GP12', mode=Pin.IN)
uart0 = UART(0, 1000000, pins=(None, 'GP13')) uart0 = UART(0, 1000000, pins=(None, 'GP13'))
print(uart0.write(b'123456') == 6) print(uart0.write(b'123456') == 6)
print(uart1.read() == b'') print(uart1.read() == b'')
print(uart1.write(b'123') == 3) print(uart1.write(b'123') == 3)
print(uart0.read() == b'123') print(uart0.read() == b'123')
Pin('GP13', mode=Pin.IN) # leave pins as they were (rx only mode)
Pin('GP12', mode=Pin.IN)
# no pin assignemnt
uart0 = UART(0, 1000000, pins=None) uart0 = UART(0, 1000000, pins=None)
print(uart0.write(b'123456') == 6)
print(uart1.read() == b'')
print(uart1.write(b'123') == 3)
print(uart0.read() == b'123')
# no pin assignemnt
uart0 = UART(0, 1000000, pins=(None, None))
print(uart0.write(b'123456789') == 9) print(uart0.write(b'123456789') == 9)
print(uart1.read() == b'') print(uart1.read() == b'')
print(uart1.write(b'123456789') == 9) print(uart1.write(b'123456789') == 9)
...@@ -87,12 +86,46 @@ print(uart0.read() == b'') ...@@ -87,12 +86,46 @@ print(uart0.read() == b'')
print(Pin.board.GP12) print(Pin.board.GP12)
print(Pin.board.GP13) print(Pin.board.GP13)
# check for memory leaks...
for i in range (0, 1000):
uart0 = UART(0, 1000000)
uart1 = UART(1, 1000000)
# next ones must raise # next ones must raise
try: try:
UART(0, 9600, parity=2, pins=('GP12', 'GP13', 'GP7')) UART(0, 9600, parity=2, pins=('GP12', 'GP13', 'GP7'))
except Exception: except Exception:
print('Exception') print('Exception')
try: try:
UART(0, 9600, parity=2, pins=('GP12', 'GP7')) UART(0, 9600, parity=2, pins=('GP12', 'GP7'))
except Exception: except Exception:
print('Exception') print('Exception')