atmel-samd & esp8266: Make sure pins are not already in use.
This prevents corrupting previous functional objects by stealing their pins out from under them. It prevents this by ensuring that pins are in default state before claiming them. It also verifies pins are released correctly and reset on soft reset. Fixes #4, instantiating a second class will fail. Fixes #29, pins are now reset too.
This commit is contained in:
parent
bb9c751b50
commit
0ae344841f
|
@ -7,6 +7,9 @@
|
|||
#define MICROPY_HW_LED_TX PIN_PA27
|
||||
#define MICROPY_HW_LED_RX PIN_PB03
|
||||
|
||||
#define MICROPY_PORT_A (PORT_PA24 | PORT_PA25 | PORT_PA27)
|
||||
#define MICROPY_PORT_B (PORT_PB03)
|
||||
|
||||
#define AUTORESET_DELAY_MS 500
|
||||
|
||||
#include "internal_flash.h"
|
||||
|
|
|
@ -17,6 +17,9 @@
|
|||
#define SPI_FLASH_CS PIN_PB08
|
||||
#define SPI_FLASH_SERCOM SERCOM4
|
||||
|
||||
#define MICROPY_PORT_A (PORT_PA12 | PORT_PA24 | PORT_PA25)
|
||||
#define MICROPY_PORT_B (PORT_PB08 | PORT_PB10 | PORT_PB11)
|
||||
|
||||
#define AUTORESET_DELAY_MS 500
|
||||
|
||||
#include "spi_flash.h"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// LEDs
|
||||
#define MICROPY_HW_LED_MSC PIN_PA17 // red
|
||||
//#define MICROPY_HW_LED_MSC PIN_PA17 // red
|
||||
// #define UART_REPL
|
||||
#define USB_REPL
|
||||
|
||||
|
@ -8,6 +8,9 @@
|
|||
|
||||
#define AUTORESET_DELAY_MS 500
|
||||
|
||||
#define MICROPY_PORT_A (PORT_PA24 | PORT_PA25)
|
||||
#define MICROPY_PORT_B (0)
|
||||
|
||||
#include "internal_flash.h"
|
||||
|
||||
#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// LEDs
|
||||
#define MICROPY_HW_LED_MSC PIN_PA17 // red
|
||||
//#define MICROPY_HW_LED_MSC PIN_PA17 // red
|
||||
// #define UART_REPL
|
||||
#define USB_REPL
|
||||
|
||||
|
@ -8,6 +8,9 @@
|
|||
|
||||
#define AUTORESET_DELAY_MS 500
|
||||
|
||||
#define MICROPY_PORT_A (PORT_PA24 | PORT_PA25)
|
||||
#define MICROPY_PORT_B (0)
|
||||
|
||||
#include "internal_flash.h"
|
||||
|
||||
#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000)
|
||||
|
|
|
@ -18,6 +18,9 @@
|
|||
#define SPI_FLASH_CS PIN_PA13
|
||||
#define SPI_FLASH_SERCOM SERCOM4
|
||||
|
||||
#define MICROPY_PORT_A (PORT_PA12 | PORT_PA13 | PORT_PA14 | PORT_PA24 | PORT_PA25)
|
||||
#define MICROPY_PORT_B (PORT_PB10 | PORT_PB11)
|
||||
|
||||
#define AUTORESET_DELAY_MS 500
|
||||
|
||||
#include "spi_flash.h"
|
||||
|
|
|
@ -3,8 +3,12 @@
|
|||
#define MICROPY_HW_BOARD_NAME "Adafruit Gemma M0 (Experimental)"
|
||||
#define MICROPY_HW_MCU_NAME "samd21e18"
|
||||
|
||||
#define MICROPY_HW_APA102_MOSI &pin_PA04
|
||||
#define MICROPY_HW_APA102_SCK &pin_PA05
|
||||
#define MICROPY_HW_APA102_SERCOM SERCOM0
|
||||
#define MICROPY_HW_APA102_MOSI &pin_PA04
|
||||
#define MICROPY_HW_APA102_SCK &pin_PA05
|
||||
|
||||
#define MICROPY_PORT_A (PORT_PA04 | PORT_PA05 | PORT_PA24 | PORT_PA25)
|
||||
#define MICROPY_PORT_B (0)
|
||||
|
||||
#define AUTORESET_DELAY_MS 500
|
||||
|
||||
|
|
|
@ -32,6 +32,9 @@
|
|||
#define SPI_FLASH_CS PIN_PA13
|
||||
#define SPI_FLASH_SERCOM SERCOM4
|
||||
|
||||
#define MICROPY_PORT_A (PORT_PA12 | PORT_PA13 |PORT_PA24 | PORT_PA25 | PORT_PA27 | PORT_PA30)
|
||||
#define MICROPY_PORT_B (PORT_PB03 | PORT_PB10 | PORT_PB11)
|
||||
|
||||
#define AUTORESET_DELAY_MS 500
|
||||
|
||||
#include "spi_flash.h"
|
||||
|
|
|
@ -3,8 +3,12 @@
|
|||
#define MICROPY_HW_BOARD_NAME "Adafruit Trinket M0 (Experimental)"
|
||||
#define MICROPY_HW_MCU_NAME "samd21e18"
|
||||
|
||||
#define MICROPY_HW_APA102_MOSI &pin_PA04
|
||||
#define MICROPY_HW_APA102_SCK &pin_PA05
|
||||
#define MICROPY_HW_APA102_SERCOM SERCOM0
|
||||
#define MICROPY_HW_APA102_MOSI &pin_PA04
|
||||
#define MICROPY_HW_APA102_SCK &pin_PA05
|
||||
|
||||
#define MICROPY_PORT_A (PORT_PA04 | PORT_PA05 | PORT_PA24 | PORT_PA25)
|
||||
#define MICROPY_PORT_B (0)
|
||||
|
||||
#define AUTORESET_DELAY_MS 500
|
||||
|
||||
|
|
|
@ -1 +1,36 @@
|
|||
// Pins have no behavior.
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2016 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 "shared-bindings/microcontroller/Pin.h"
|
||||
|
||||
bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t* pin) {
|
||||
PortGroup *const port = system_pinmux_get_group_from_gpio_pin(pin->pin);
|
||||
uint32_t pin_index = (pin->pin);
|
||||
PORT_PINCFG_Type state = port->PINCFG[pin_index];
|
||||
|
||||
return state.bit.PMUXEN == 0 && state.bit.INEN == 0 &&
|
||||
state.bit.PULLEN == 0 && (port->DIR.reg & (1 << pin_index)) == 0;
|
||||
}
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include "shared-bindings/nativeio/AnalogIn.h"
|
||||
|
||||
#include "asf/sam0/drivers/adc/adc.h"
|
||||
#include "samd21_pins.h"
|
||||
|
||||
void common_hal_nativeio_analogin_construct(nativeio_analogin_obj_t* self,
|
||||
const mcu_pin_obj_t *pin) {
|
||||
|
@ -55,6 +56,13 @@ void common_hal_nativeio_analogin_construct(nativeio_analogin_obj_t* self,
|
|||
adc_init(&self->adc_instance, ADC, &config_adc);
|
||||
}
|
||||
|
||||
void common_hal_nativeio_analogin_deinit(nativeio_analogin_obj_t *self) {
|
||||
// TODO(tannewt): Count how many pins are in use and only reset the ADC when
|
||||
// none are used.
|
||||
adc_reset(&self->adc_instance);
|
||||
reset_pin(self->pin->pin);
|
||||
}
|
||||
|
||||
// TODO(tannewt): Don't turn it all on just for one read. This simplifies
|
||||
// handling of reading multiple inputs and surviving sleep though so for now its
|
||||
// ok.
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include "shared-bindings/nativeio/AnalogOut.h"
|
||||
|
||||
#include "asf/sam0/drivers/dac/dac.h"
|
||||
#include "samd21_pins.h"
|
||||
|
||||
void common_hal_nativeio_analogout_construct(nativeio_analogout_obj_t* self,
|
||||
const mcu_pin_obj_t *pin) {
|
||||
|
@ -61,6 +62,7 @@ void common_hal_nativeio_analogout_construct(nativeio_analogout_obj_t* self,
|
|||
void common_hal_nativeio_analogout_deinit(nativeio_analogout_obj_t *self) {
|
||||
dac_disable(&self->dac_instance);
|
||||
dac_chan_disable(&self->dac_instance, DAC_CHANNEL_0);
|
||||
reset_pin(PIN_PA02);
|
||||
}
|
||||
|
||||
void common_hal_nativeio_analogout_set_value(nativeio_analogout_obj_t *self,
|
||||
|
|
|
@ -77,6 +77,9 @@ void common_hal_nativeio_i2c_construct(nativeio_i2c_obj_t *self,
|
|||
config_i2c_master.pinmux_pad1 = scl_pinmux; // SCL
|
||||
config_i2c_master.buffer_timeout = 10000;
|
||||
|
||||
self->sda_pin = sda->pin;
|
||||
self->scl_pin = scl->pin;
|
||||
|
||||
enum status_code status = i2c_master_init(&self->i2c_master_instance,
|
||||
sercom, &config_i2c_master);
|
||||
if (status != STATUS_OK) {
|
||||
|
@ -88,6 +91,8 @@ void common_hal_nativeio_i2c_construct(nativeio_i2c_obj_t *self,
|
|||
|
||||
void common_hal_nativeio_i2c_deinit(nativeio_i2c_obj_t *self) {
|
||||
i2c_master_disable(&self->i2c_master_instance);
|
||||
reset_pin(self->sda_pin);
|
||||
reset_pin(self->scl_pin);
|
||||
}
|
||||
|
||||
bool common_hal_nativeio_i2c_probe(nativeio_i2c_obj_t *self, uint8_t addr) {
|
||||
|
|
|
@ -88,6 +88,7 @@ extern void common_hal_nativeio_pwmout_deinit(nativeio_pwmout_obj_t* self) {
|
|||
} else {
|
||||
tcc_disable(&self->tcc_instance);
|
||||
}
|
||||
reset_pin(self->pin->pin);
|
||||
}
|
||||
|
||||
extern void common_hal_nativeio_pwmout_set_duty_cycle(nativeio_pwmout_obj_t* self, uint16_t duty) {
|
||||
|
|
|
@ -124,11 +124,16 @@ void common_hal_nativeio_spi_construct(nativeio_spi_obj_t *self,
|
|||
&config_spi_master.pinmux_pad2,
|
||||
&config_spi_master.pinmux_pad3};
|
||||
*pinmuxes[clock_pad] = clock_pinmux;
|
||||
self->clock_pin = clock->pin;
|
||||
self->MOSI_pin = 0;
|
||||
if (!mosi_none) {
|
||||
*pinmuxes[mosi_pad] = mosi_pinmux;
|
||||
self->MOSI_pin = mosi->pin;
|
||||
}
|
||||
self->MISO_pin = 0;
|
||||
if (!miso_none) {
|
||||
*pinmuxes[miso_pad] = miso_pinmux;
|
||||
self->MISO_pin = miso->pin;
|
||||
}
|
||||
|
||||
spi_init(&self->spi_master_instance, sercom, &config_spi_master);
|
||||
|
@ -138,6 +143,9 @@ void common_hal_nativeio_spi_construct(nativeio_spi_obj_t *self,
|
|||
|
||||
void common_hal_nativeio_spi_deinit(nativeio_spi_obj_t *self) {
|
||||
spi_disable(&self->spi_master_instance);
|
||||
reset_pin(self->clock_pin);
|
||||
reset_pin(self->MOSI_pin);
|
||||
reset_pin(self->MISO_pin);
|
||||
}
|
||||
|
||||
bool common_hal_nativeio_spi_configure(nativeio_spi_obj_t *self,
|
||||
|
|
|
@ -69,12 +69,17 @@ typedef struct {
|
|||
mp_obj_base_t base;
|
||||
struct i2c_master_module i2c_master_instance;
|
||||
bool has_lock;
|
||||
uint8_t scl_pin;
|
||||
uint8_t sda_pin;
|
||||
} nativeio_i2c_obj_t;
|
||||
|
||||
typedef struct _machine_spi_obj_t {
|
||||
typedef struct {
|
||||
mp_obj_base_t base;
|
||||
struct spi_module spi_master_instance;
|
||||
bool has_lock;
|
||||
uint8_t clock_pin;
|
||||
uint8_t MOSI_pin;
|
||||
uint8_t MISO_pin;
|
||||
} nativeio_spi_obj_t;
|
||||
|
||||
typedef struct {
|
||||
|
|
|
@ -163,10 +163,22 @@ void reset_samd21(void) {
|
|||
continue;
|
||||
}
|
||||
#endif
|
||||
#ifdef MICROPY_HW_APA102_SERCOM
|
||||
if (sercom_instances[i] == MICROPY_HW_APA102_SERCOM) {
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
sercom_instances[i]->SPI.CTRLA.bit.SWRST = 1;
|
||||
}
|
||||
|
||||
// TODO(tannewt): Reset all of the pins too.
|
||||
struct system_pinmux_config config;
|
||||
system_pinmux_get_config_defaults(&config);
|
||||
config.powersave = true;
|
||||
|
||||
uint32_t pin_mask[2] = PORT_OUT_IMPLEMENTED;
|
||||
|
||||
system_pinmux_group_set_config(&(PORT->Group[0]), pin_mask[0] & ~MICROPY_PORT_A, &config);
|
||||
system_pinmux_group_set_config(&(PORT->Group[1]), pin_mask[1] & ~MICROPY_PORT_B, &config);
|
||||
}
|
||||
|
||||
bool maybe_run(const char* filename, int* ret) {
|
||||
|
|
|
@ -44,6 +44,13 @@ const mcu_pin_obj_t pin_## p_name = { \
|
|||
|
||||
#define NO_ADC_INPUT (0)
|
||||
|
||||
void reset_pin(uint8_t pin) {
|
||||
struct system_pinmux_config config;
|
||||
system_pinmux_get_config_defaults(&config);
|
||||
config.powersave = true;
|
||||
system_pinmux_pin_set_config(pin, &config);
|
||||
}
|
||||
|
||||
// Pins in datasheet order.
|
||||
#ifdef PIN_PA00
|
||||
PIN(PA00, false, NO_ADC_INPUT, \
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
|
||||
#include "common-hal/microcontroller/types.h"
|
||||
|
||||
void reset_pin(uint8_t pin);
|
||||
|
||||
#define MUX_C 2
|
||||
#define MUX_D 3
|
||||
#define MUX_E 4
|
||||
|
|
|
@ -1 +1,51 @@
|
|||
// Pins have no behavior.
|
||||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2016 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 "common-hal/microcontroller/__init__.h"
|
||||
#include "shared-bindings/microcontroller/Pin.h"
|
||||
|
||||
#include "eagle_soc.h"
|
||||
|
||||
extern volatile bool adc_in_use;
|
||||
|
||||
bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t* pin) {
|
||||
return (pin == &pin_TOUT && adc_in_use) ||
|
||||
((READ_PERI_REG(pin->peripheral) &
|
||||
(PERIPHS_IO_MUX_FUNC<<PERIPHS_IO_MUX_FUNC_S)) == 0 &&
|
||||
(GPIO_REG_READ(GPIO_ENABLE_ADDRESS) & (1 << pin->gpio_number)) == 0 &&
|
||||
(READ_PERI_REG(pin->peripheral) & PERIPHS_IO_MUX_PULLUP) == 0 );
|
||||
}
|
||||
|
||||
void reset_pins(void) {
|
||||
for (int i = 0; i < 17; i++) {
|
||||
if (i == 0 || (i > 6 && i < 13) || i == 12) {
|
||||
continue;
|
||||
}
|
||||
uint32_t peripheral = PERIPHS_IO_MUX + i * 4;
|
||||
PIN_FUNC_SELECT(peripheral, 0);
|
||||
PIN_PULLUP_DIS(peripheral);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* This file is part of the MicroPython project, http://micropython.org/
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2016 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.
|
||||
*/
|
||||
|
||||
#ifndef __MICROPY_INCLUDED_ESP8266_COMMON_HAL_MICROCONTROLLER_PIN_H__
|
||||
#define __MICROPY_INCLUDED_ESP8266_COMMON_HAL_MICROCONTROLLER_PIN_H__
|
||||
|
||||
void reset_pins(void);
|
||||
|
||||
#endif // __MICROPY_INCLUDED_ESP8266_COMMON_HAL_MICROCONTROLLER_PIN_H__
|
|
@ -31,12 +31,23 @@
|
|||
#include "py/runtime.h"
|
||||
#include "py/binary.h"
|
||||
#include "py/mphal.h"
|
||||
#include "common-hal/microcontroller/__init__.h"
|
||||
#include "shared-bindings/nativeio/AnalogIn.h"
|
||||
|
||||
#include "user_interface.h"
|
||||
|
||||
volatile bool adc_in_use = false;
|
||||
|
||||
void common_hal_nativeio_analogin_construct(nativeio_analogin_obj_t* self,
|
||||
const mcu_pin_obj_t *pin) {
|
||||
if (pin != &pin_TOUT) {
|
||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "Pin %q does not have ADC capabilities", pin->name));
|
||||
}
|
||||
adc_in_use = true;
|
||||
}
|
||||
|
||||
void common_hal_nativeio_analogin_deinit(nativeio_analogin_obj_t* self) {
|
||||
adc_in_use = false;
|
||||
}
|
||||
|
||||
uint16_t common_hal_nativeio_analogin_get_value(nativeio_analogin_obj_t *self) {
|
||||
|
|
|
@ -42,8 +42,12 @@ digitalinout_result_t common_hal_nativeio_digitalinout_construct(
|
|||
}
|
||||
|
||||
void common_hal_nativeio_digitalinout_deinit(nativeio_digitalinout_obj_t* self) {
|
||||
uint32_t pin_mask = 1 << self->pin->gpio_number;
|
||||
gpio_output_set(0x0, 0x0, 0x0, pin_mask);
|
||||
if (self->pin->gpio_number < 16) {
|
||||
uint32_t pin_mask = 1 << self->pin->gpio_number;
|
||||
gpio_output_set(0x0, 0x0, 0x0, pin_mask);
|
||||
PIN_FUNC_SELECT(self->pin->peripheral, 0);
|
||||
PIN_PULLUP_DIS(self->pin->peripheral);
|
||||
}
|
||||
}
|
||||
|
||||
void common_hal_nativeio_digitalinout_switch_to_input(
|
||||
|
|
|
@ -32,6 +32,10 @@
|
|||
#include "py/runtime.h"
|
||||
#include "shared-bindings/nativeio/PWMOut.h"
|
||||
|
||||
#include "eagle_soc.h"
|
||||
#include "c_types.h"
|
||||
#include "gpio.h"
|
||||
|
||||
// Shared with pybpwm
|
||||
extern bool pwm_inited;
|
||||
|
||||
|
@ -45,6 +49,7 @@ void common_hal_nativeio_pwmout_construct(nativeio_pwmout_obj_t* self, const mcu
|
|||
self->channel = pwm_add(pin->gpio_number,
|
||||
pin->peripheral,
|
||||
pin->gpio_function);
|
||||
self->pin = pin;
|
||||
if (self->channel == -1) {
|
||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError,
|
||||
"PWM not supported on pin %d", pin->gpio_number));
|
||||
|
@ -54,6 +59,12 @@ void common_hal_nativeio_pwmout_construct(nativeio_pwmout_obj_t* self, const mcu
|
|||
extern void common_hal_nativeio_pwmout_deinit(nativeio_pwmout_obj_t* self) {
|
||||
pwm_delete(self->channel);
|
||||
pwm_start();
|
||||
if (self->pin->gpio_number < 16) {
|
||||
uint32_t pin_mask = 1 << self->pin->gpio_number;
|
||||
gpio_output_set(0x0, 0x0, 0x0, pin_mask);
|
||||
PIN_FUNC_SELECT(self->pin->peripheral, 0);
|
||||
PIN_PULLUP_DIS(self->pin->peripheral);
|
||||
}
|
||||
}
|
||||
|
||||
extern void common_hal_nativeio_pwmout_set_duty_cycle(nativeio_pwmout_obj_t* self, uint16_t duty) {
|
||||
|
|
|
@ -31,6 +31,8 @@
|
|||
#include "py/nlr.h"
|
||||
|
||||
#include "eagle_soc.h"
|
||||
#include "c_types.h"
|
||||
#include "gpio.h"
|
||||
|
||||
extern const mcu_pin_obj_t pin_MTMS;
|
||||
extern const mcu_pin_obj_t pin_MTCK;
|
||||
|
@ -48,8 +50,16 @@ void common_hal_nativeio_spi_construct(nativeio_spi_obj_t *self,
|
|||
|
||||
void common_hal_nativeio_spi_deinit(nativeio_spi_obj_t *self) {
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 0);
|
||||
PIN_PULLUP_DIS(PERIPHS_IO_MUX_MTDI_U);
|
||||
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 0);
|
||||
PIN_PULLUP_DIS(PERIPHS_IO_MUX_MTCK_U);
|
||||
|
||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 0);
|
||||
PIN_PULLUP_DIS(PERIPHS_IO_MUX_MTMS_U);
|
||||
|
||||
// Turn off outputs 12 - 14.
|
||||
gpio_output_set(0x0, 0x0, 0x0, 0x7 << 12);
|
||||
}
|
||||
|
||||
bool common_hal_nativeio_spi_configure(nativeio_spi_obj_t *self,
|
||||
|
|
|
@ -64,6 +64,7 @@ typedef struct {
|
|||
typedef struct {
|
||||
mp_obj_base_t base;
|
||||
int channel;
|
||||
const mcu_pin_obj_t* pin;
|
||||
} nativeio_pwmout_obj_t;
|
||||
|
||||
#endif // __MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_NATIVEIO_TYPES_H__
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include "lib/utils/pyexec.h"
|
||||
#include "gccollect.h"
|
||||
#include "user_interface.h"
|
||||
#include "common-hal/microcontroller/Pin.h"
|
||||
|
||||
STATIC char heap[36 * 1024];
|
||||
|
||||
|
@ -58,6 +59,7 @@ STATIC void mp_reset(void) {
|
|||
MP_STATE_PORT(mp_kbd_exception) = mp_obj_new_exception(&mp_type_KeyboardInterrupt);
|
||||
MP_STATE_PORT(term_obj) = MP_OBJ_NULL;
|
||||
MP_STATE_PORT(dupterm_arr_obj) = MP_OBJ_NULL;
|
||||
reset_pins();
|
||||
pin_init0();
|
||||
readline_init0();
|
||||
dupterm_task_init();
|
||||
|
|
|
@ -53,3 +53,9 @@ void assert_pin(mp_obj_t obj, bool none_ok) {
|
|||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "Expected a Pin"));
|
||||
}
|
||||
}
|
||||
|
||||
void assert_pin_free(const mcu_pin_obj_t* pin) {
|
||||
if (pin != NULL && !common_hal_mcu_pin_is_free(pin)) {
|
||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "Pin %q in use", pin->name));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,11 +27,15 @@
|
|||
#ifndef __MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER_PIN_H__
|
||||
#define __MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER_PIN_H__
|
||||
|
||||
#include "common-hal/microcontroller/types.h"
|
||||
#include "py/obj.h"
|
||||
|
||||
// Type object used in Python. Should be shared between ports.
|
||||
extern const mp_obj_type_t mcu_pin_type;
|
||||
|
||||
void assert_pin(mp_obj_t obj, bool none_ok);
|
||||
void assert_pin_free(const mcu_pin_obj_t* pin);
|
||||
|
||||
bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t* pin);
|
||||
|
||||
#endif // __MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER_PIN_H__
|
||||
|
|
|
@ -66,11 +66,43 @@ STATIC mp_obj_t nativeio_analogin_make_new(const mp_obj_type_t *type,
|
|||
nativeio_analogin_obj_t *self = m_new_obj(nativeio_analogin_obj_t);
|
||||
self->base.type = &nativeio_analogin_type;
|
||||
const mcu_pin_obj_t *pin = MP_OBJ_TO_PTR(pin_obj);
|
||||
assert_pin_free(pin);
|
||||
common_hal_nativeio_analogin_construct(self, pin);
|
||||
|
||||
return (mp_obj_t) self;
|
||||
}
|
||||
|
||||
//| .. method:: deinit()
|
||||
//|
|
||||
//| Turn off the AnalogIn and release the pin for other use.
|
||||
//|
|
||||
STATIC mp_obj_t nativeio_analogin_deinit(mp_obj_t self_in) {
|
||||
nativeio_analogin_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
common_hal_nativeio_analogin_deinit(self);
|
||||
return mp_const_none;
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(nativeio_analogin_deinit_obj, nativeio_analogin_deinit);
|
||||
|
||||
//| .. method:: __enter__()
|
||||
//|
|
||||
//| No-op used by Context Managers.
|
||||
//|
|
||||
STATIC mp_obj_t nativeio_analogin___enter__(mp_obj_t self_in) {
|
||||
return self_in;
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(nativeio_analogin___enter___obj, nativeio_analogin___enter__);
|
||||
|
||||
//| .. method:: __exit__()
|
||||
//|
|
||||
//| Automatically deinitializes the hardware when exiting a context.
|
||||
//|
|
||||
STATIC mp_obj_t nativeio_analogin___exit__(size_t n_args, const mp_obj_t *args) {
|
||||
(void)n_args;
|
||||
common_hal_nativeio_analogin_deinit(args[0]);
|
||||
return mp_const_none;
|
||||
}
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(nativeio_analogin___exit___obj, 4, 4, nativeio_analogin___exit__);
|
||||
|
||||
//| .. attribute:: value
|
||||
//|
|
||||
//| Read the value on the analog pin and return it. The returned value
|
||||
|
@ -95,6 +127,9 @@ mp_obj_property_t nativeio_analogin_value_obj = {
|
|||
};
|
||||
|
||||
STATIC const mp_rom_map_elem_t nativeio_analogin_locals_dict_table[] = {
|
||||
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&nativeio_analogin_deinit_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&nativeio_analogin___enter___obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&nativeio_analogin___exit___obj) },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_value), MP_ROM_PTR(&nativeio_analogin_value_obj)},
|
||||
};
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
extern const mp_obj_type_t nativeio_analogin_type;
|
||||
|
||||
void common_hal_nativeio_analogin_construct(nativeio_analogin_obj_t* self, const mcu_pin_obj_t *pin);
|
||||
void common_hal_nativeio_analogin_deinit(nativeio_analogin_obj_t* self);
|
||||
uint16_t common_hal_nativeio_analogin_get_value(nativeio_analogin_obj_t *self);
|
||||
|
||||
#endif // __MICROPY_INCLUDED_SHARED_BINDINGS_NATIVEIO_ANALOGIN_H__
|
||||
|
|
|
@ -63,7 +63,7 @@ STATIC mp_obj_t nativeio_analogout_make_new(const mp_obj_type_t *type, mp_uint_t
|
|||
|
||||
nativeio_analogout_obj_t *self = m_new_obj(nativeio_analogout_obj_t);
|
||||
self->base.type = &nativeio_analogout_type;
|
||||
|
||||
assert_pin_free(pin);
|
||||
common_hal_nativeio_analogout_construct(self, pin);
|
||||
|
||||
return self;
|
||||
|
@ -82,6 +82,26 @@ STATIC mp_obj_t nativeio_analogout_deinit(mp_obj_t self_in) {
|
|||
}
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(nativeio_analogout_deinit_obj, nativeio_analogout_deinit);
|
||||
|
||||
//| .. method:: __enter__()
|
||||
//|
|
||||
//| No-op used by Context Managers.
|
||||
//|
|
||||
STATIC mp_obj_t nativeio_analogout___enter__(mp_obj_t self_in) {
|
||||
return self_in;
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(nativeio_analogout___enter___obj, nativeio_analogout___enter__);
|
||||
|
||||
//| .. method:: __exit__()
|
||||
//|
|
||||
//| Automatically deinitializes the hardware when exiting a context.
|
||||
//|
|
||||
STATIC mp_obj_t nativeio_analogout___exit__(size_t n_args, const mp_obj_t *args) {
|
||||
(void)n_args;
|
||||
common_hal_nativeio_analogout_deinit(args[0]);
|
||||
return mp_const_none;
|
||||
}
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(nativeio_analogout___exit___obj, 4, 4, nativeio_analogout___exit__);
|
||||
|
||||
//| .. attribute:: value
|
||||
//|
|
||||
//| The value on the analog pin. The value must be between 0 and 65535
|
||||
|
@ -107,7 +127,9 @@ mp_obj_property_t nativeio_analogout_value_obj = {
|
|||
|
||||
STATIC const mp_rom_map_elem_t nativeio_analogout_locals_dict_table[] = {
|
||||
// instance methods
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_deinit), (mp_obj_t)&nativeio_analogout_deinit_obj },
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&nativeio_analogout_deinit_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&nativeio_analogout___enter___obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&nativeio_analogout___exit___obj) },
|
||||
|
||||
// Properties
|
||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_value), (mp_obj_t)&nativeio_analogout_value_obj },
|
||||
|
|
|
@ -63,6 +63,7 @@ STATIC mp_obj_t nativeio_digitalinout_make_new(const mp_obj_type_t *type,
|
|||
|
||||
assert_pin(args[0], false);
|
||||
mcu_pin_obj_t *pin = MP_OBJ_TO_PTR(args[0]);
|
||||
assert_pin_free(pin);
|
||||
common_hal_nativeio_digitalinout_construct(self, pin);
|
||||
|
||||
return (mp_obj_t)self;
|
||||
|
|
|
@ -63,7 +63,9 @@ STATIC mp_obj_t nativeio_i2c_make_new(const mp_obj_type_t *type, size_t n_args,
|
|||
assert_pin(args[ARG_scl].u_obj, false);
|
||||
assert_pin(args[ARG_sda].u_obj, false);
|
||||
const mcu_pin_obj_t* scl = MP_OBJ_TO_PTR(args[ARG_scl].u_obj);
|
||||
assert_pin_free(scl);
|
||||
const mcu_pin_obj_t* sda = MP_OBJ_TO_PTR(args[ARG_sda].u_obj);
|
||||
assert_pin_free(sda);
|
||||
common_hal_nativeio_i2c_construct(self, scl, sda, args[ARG_frequency].u_int);
|
||||
return (mp_obj_t)self;
|
||||
}
|
||||
|
|
|
@ -51,6 +51,7 @@ STATIC mp_obj_t nativeio_pwmout_make_new(const mp_obj_type_t *type, size_t n_arg
|
|||
mp_obj_t pin_obj = args[0];
|
||||
assert_pin(pin_obj, false);
|
||||
const mcu_pin_obj_t *pin = MP_OBJ_TO_PTR(pin_obj);
|
||||
assert_pin_free(pin);
|
||||
|
||||
// create PWM object from the given pin
|
||||
nativeio_pwmout_obj_t *self = m_new_obj(nativeio_pwmout_obj_t);
|
||||
|
@ -135,9 +136,9 @@ mp_obj_property_t nativeio_pwmout_duty_cycle_obj = {
|
|||
|
||||
STATIC const mp_rom_map_elem_t nativeio_pwmout_locals_dict_table[] = {
|
||||
// Methods
|
||||
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&nativeio_pwmout_deinit_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&nativeio_pwmout___enter___obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&nativeio_pwmout___exit___obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&nativeio_pwmout_deinit_obj) },
|
||||
|
||||
// Properties
|
||||
{ MP_ROM_QSTR(MP_QSTR_duty_cycle), MP_ROM_PTR(&nativeio_pwmout_duty_cycle_obj) },
|
||||
|
|
|
@ -77,8 +77,11 @@ STATIC mp_obj_t nativeio_spi_make_new(const mp_obj_type_t *type, size_t n_args,
|
|||
assert_pin(args[ARG_MOSI].u_obj, true);
|
||||
assert_pin(args[ARG_MISO].u_obj, true);
|
||||
const mcu_pin_obj_t* clock = MP_OBJ_TO_PTR(args[ARG_clock].u_obj);
|
||||
assert_pin_free(clock);
|
||||
const mcu_pin_obj_t* mosi = MP_OBJ_TO_PTR(args[ARG_MOSI].u_obj);
|
||||
assert_pin_free(mosi);
|
||||
const mcu_pin_obj_t* miso = MP_OBJ_TO_PTR(args[ARG_MISO].u_obj);
|
||||
assert_pin_free(miso);
|
||||
common_hal_nativeio_spi_construct(self, clock, mosi, miso);
|
||||
return (mp_obj_t)self;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue