summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2018-05-23 14:20:15 -0400
committerGitHub <noreply@github.com>2018-05-23 14:20:15 -0400
commit6af5fc2796f670543fccac972f612c3a0275d989 (patch)
tree99af04c3b6fc5a1f47d093539fd3d88a8a6e7d58
parente274a02ff0b10487b1ce17a29bcc4c5e079f3e7d (diff)
parent641caaa6dd4d600be22219d4f5105ef84a96794b (diff)
Merge pull request #861 from tannewt/touchio3
Turn on touchio for M0 boards.
-rw-r--r--ports/atmel-samd/Makefile7
-rw-r--r--ports/atmel-samd/common-hal/touchio/TouchIn.c41
m---------ports/atmel-samd/freetouch0
-rw-r--r--ports/atmel-samd/mpconfigport.h8
-rw-r--r--ports/atmel-samd/supervisor/port.c5
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();