diff options
| author | Dan Halbert <halbert@halwitz.org> | 2018-05-23 14:20:15 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-05-23 14:20:15 -0400 |
| commit | 6af5fc2796f670543fccac972f612c3a0275d989 (patch) | |
| tree | 99af04c3b6fc5a1f47d093539fd3d88a8a6e7d58 | |
| parent | e274a02ff0b10487b1ce17a29bcc4c5e079f3e7d (diff) | |
| parent | 641caaa6dd4d600be22219d4f5105ef84a96794b (diff) | |
Merge pull request #861 from tannewt/touchio3
Turn on touchio for M0 boards.
| -rw-r--r-- | ports/atmel-samd/Makefile | 7 | ||||
| -rw-r--r-- | ports/atmel-samd/common-hal/touchio/TouchIn.c | 41 | ||||
| m--------- | ports/atmel-samd/freetouch | 0 | ||||
| -rw-r--r-- | ports/atmel-samd/mpconfigport.h | 8 | ||||
| -rw-r--r-- | ports/atmel-samd/supervisor/port.c | 5 |
5 files changed, 47 insertions, 14 deletions
diff --git a/ports/atmel-samd/Makefile b/ports/atmel-samd/Makefile index 86f656a42..d627e7641 100644 --- a/ports/atmel-samd/Makefile +++ b/ports/atmel-samd/Makefile @@ -112,8 +112,7 @@ else # -finline-limit=80 or so is similar to not having it on. # There is no simple default value, though. ifdef INTERNAL_FLASH_FILESYSTEM - ## Not currently needed - ## CFLAGS += -finline-limit=50 + CFLAGS += -finline-limit=60 endif CFLAGS += -flto endif @@ -274,7 +273,7 @@ SRC_C = \ lib/libc/string0.c \ lib/mp-readline/readline.c \ $(BUILD)/autogen_usb_descriptor.c \ - # freetouch/adafruit_ptc.c + freetouch/adafruit_ptc.c # Choose which flash filesystem impl to use. # (Right now INTERNAL_FLASH_FILESYSTEM and SPI_FLASH_FILESYSTEM are mutually exclusive. @@ -321,7 +320,7 @@ SRC_COMMON_HAL = \ usb_hid/Device.c \ audioio/__init__.c \ audioio/AudioOut.c \ -# touchio/__init__.c \ + touchio/__init__.c \ touchio/TouchIn.c \ ifeq ($(INTERNAL_LIBM),1) diff --git a/ports/atmel-samd/common-hal/touchio/TouchIn.c b/ports/atmel-samd/common-hal/touchio/TouchIn.c index 6bb96ff00..eda1b72c4 100644 --- a/ports/atmel-samd/common-hal/touchio/TouchIn.c +++ b/ports/atmel-samd/common-hal/touchio/TouchIn.c @@ -33,11 +33,18 @@ #include "py/mphal.h" #include "shared-bindings/touchio/TouchIn.h" +#ifdef SAMD21 +#include "hpl/pm/hpl_pm_base.h" +#endif + +#include "clocks.h" #include "samd21_pins.h" #include "tick.h" #include "adafruit_ptc.h" +bool touch_enabled = false; + static uint16_t get_raw_reading(touchio_touchin_obj_t *self) { adafruit_ptc_start_conversion(PTC, &self->config); @@ -58,13 +65,21 @@ void common_hal_touchio_touchin_construct(touchio_touchin_obj_t* self, } claim_pin(pin); - /* Setup and enable generic clock source for PTC module. */ - struct system_gclk_chan_config gclk_chan_conf; - system_gclk_chan_get_config_defaults(&gclk_chan_conf); - gclk_chan_conf.source_generator = GCLK_GENERATOR_3; - system_gclk_chan_set_config(PTC_GCLK_ID, &gclk_chan_conf); - system_gclk_chan_enable(PTC_GCLK_ID); - system_apb_clock_set_mask(SYSTEM_CLOCK_APB_APBC, PM_APBCMASK_PTC); + // Turn on the PTC if its not in use. We won't turn it off until reset. + #ifdef SAMD21 + if ((( Ptc *) PTC)->CTRLA.bit.ENABLE == 0) { + // We run the PTC at 8mhz so divide the 48mhz clock by 6. + uint8_t gclk = find_free_gclk(6); + if (gclk > GCLK_GEN_NUM) { + mp_raise_RuntimeError("No free GCLKs"); + } + enable_clock_generator(gclk, CLOCK_48MHZ, 6); + + /* Setup and enable generic clock source for PTC module. */ + connect_gclk_to_peripheral(gclk, PTC_GCLK_ID); + + _pm_enable_bus_clock(PM_BUS_APBC, PTC); + } adafruit_ptc_get_config_default(&self->config); self->config.pin = pin->pin; @@ -80,6 +95,7 @@ void common_hal_touchio_touchin_construct(touchio_touchin_obj_t* self, // but for touches using fruit or other objects, the difference is much less. self->threshold = get_raw_reading(self) + 100; + #endif } bool common_hal_touchio_touchin_deinited(touchio_touchin_obj_t* self) { @@ -91,12 +107,21 @@ void common_hal_touchio_touchin_deinit(touchio_touchin_obj_t* self) { if (common_hal_touchio_touchin_deinited(self)) { return; } + // We leave the clocks running because they may be in use by others. + reset_pin(self->config.pin); self->config.pin = NO_PIN; } void touchin_reset() { - // TODO(tannewt): Reset the PTC. + Ptc* ptc = ((Ptc *) PTC); + if (ptc->CTRLA.bit.ENABLE == 1) { + ptc->CTRLA.bit.ENABLE = 0; + while (ptc->CTRLA.bit.ENABLE == 1) {} + + ptc->CTRLA.bit.SWRESET = 1; + while (ptc->CTRLA.bit.SWRESET == 1) {} + } } bool common_hal_touchio_touchin_get_value(touchio_touchin_obj_t *self) { diff --git a/ports/atmel-samd/freetouch b/ports/atmel-samd/freetouch -Subproject c3deba11eb4be397ec719cfbfba1abcaecda2c0 +Subproject 5d8c33e084996d48134eaf7d4b200d1a806cb9e diff --git a/ports/atmel-samd/mpconfigport.h b/ports/atmel-samd/mpconfigport.h index e1683f234..0d07e0009 100644 --- a/ports/atmel-samd/mpconfigport.h +++ b/ports/atmel-samd/mpconfigport.h @@ -238,9 +238,14 @@ extern const struct _mp_obj_module_t usb_hid_module; #endif // Disabled for now. -// { MP_OBJ_NEW_QSTR(MP_QSTR_touchio), (mp_obj_t)&touchio_module }, // { MP_OBJ_NEW_QSTR(MP_QSTR__stage), (mp_obj_t)&stage_module }, +#ifdef SAMD21 +#define TOUCHIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_touchio), (mp_obj_t)&touchio_module }, +#endif +#ifdef SAMD51 +#define TOUCHIO_MODULE +#endif #define MICROPY_PORT_BUILTIN_MODULES \ { MP_OBJ_NEW_QSTR(MP_QSTR_analogio), (mp_obj_t)&analogio_module }, \ @@ -260,6 +265,7 @@ extern const struct _mp_obj_module_t usb_hid_module; { MP_OBJ_NEW_QSTR(MP_QSTR_math), (mp_obj_t)&math_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR_usb_hid),(mp_obj_t)&usb_hid_module }, \ + TOUCHIO_MODULE \ EXTRA_BUILTIN_MODULES #define MICROPY_PORT_BUILTIN_DEBUG_MODULES \ diff --git a/ports/atmel-samd/supervisor/port.c b/ports/atmel-samd/supervisor/port.c index 8e6f2b185..cd122843d 100644 --- a/ports/atmel-samd/supervisor/port.c +++ b/ports/atmel-samd/supervisor/port.c @@ -53,6 +53,7 @@ #include "common-hal/pulseio/PulseOut.h" #include "common-hal/pulseio/PWMOut.h" #include "common-hal/rtc/RTC.h" +#include "common-hal/touchio/TouchIn.h" #include "common-hal/usb_hid/Device.h" #include "shared-bindings/rtc/__init__.h" #include "clocks.h" @@ -240,9 +241,11 @@ void reset_port(void) { i2sout_reset(); #endif audio_dma_reset(); -// touchin_reset(); //pdmin_reset(); #endif +#ifdef SAMD21 + touchin_reset(); +#endif pulsein_reset(); pulseout_reset(); pwmout_reset(); |
