diff options
Diffstat (limited to 'example-fs-bb48/touch.c')
-rw-r--r-- | example-fs-bb48/touch.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/example-fs-bb48/touch.c b/example-fs-bb48/touch.c new file mode 100644 index 0000000..895c6bd --- /dev/null +++ b/example-fs-bb48/touch.c @@ -0,0 +1,89 @@ +#include <stdint.h> +#include <stdlib.h> +#include <chopstx.h> +#include <mcu/mkl27z.h> + +struct TPM { + volatile uint32_t SC; + volatile uint32_t CNT; + volatile uint32_t MOD; + volatile uint32_t C0SC; + volatile uint32_t C0V; + volatile uint32_t C1SC; + volatile uint32_t C1V; + uint32_t rsvd0[14]; + volatile uint32_t STATUS; + uint32_t rsvd1[7]; + volatile uint32_t POL; + uint32_t rsvd2[4]; + volatile uint32_t CONF; +}; + +static struct TPM *const TPM1 = (struct TPM *const)0x40039000; + +static chopstx_intr_t tpm1_intr; +#define INTR_REQ_TPM1 18 + +void +touch_init (void) +{ + chopstx_claim_irq (&tpm1_intr, INTR_REQ_TPM1); + + PORTB->PCR1 = (1<<3) /* TPM1_CH1 */ + | (0<<6) /* DriveStrengthEnable=0 */ + | (0<<4) /* PassiveFilterEnable=0 */ + | (1<<2) /* SlewRateEnable = slow */ + | (0<<1) /* pull enable = 0 */ + | (0<<0) /* puddselect= 0 */ + ; + + /* TOF clear, TOIE=1, CPWMS=0, CMOD=1, PS=000. */ + TPM1->SC = 0xc4; + + /* Input capture mode: MSB = 0, MSA = 0 */ + /* Rising edge: ELSB=0 ELSA=1 */ + TPM1->C1SC = 0x82; + TPM1->POL=0; + + /* Triggered by TPM1_CH1. */ + /* channel 1: TRGSEL=0010 */ + /* external: TRGSRC=0 */ + /* active low:TRGPOL=1 */ + /* stop on overflow: CSOO=1 */ + /* start on trigger: CSOT=1 */ + TPM1->CONF = 0x02c30000; + + /* Wait overflow. */ + chopstx_intr_wait (&tpm1_intr); + + /* Clear overflow. */ + TPM1->SC |= 0x80; +} + +uint16_t +touch_get (void) +{ + /* Assert LOW. */ + PORTB->PCR1 = (1<<8) /* GPIO */ + | (0<<6) /* DriveStrengthEnable=0 */ + | (0<<4) /* PassiveFilterEnable=0 */ + | (1<<2) /* SlewRateEnable = slow */ + | (0<<1) /* pull enable = 0 */ + | (0<<0) /* puddselect= 0 */ + ; + + /* Let the register to pull it up. */ + PORTB->PCR1 = (1<<3) /* TPM1_CH1 */ + | (0<<6) /* DriveStrengthEnable=0 */ + | (0<<4) /* PassiveFilterEnable=0 */ + | (1<<2) /* SlewRateEnable = slow */ + | (0<<1) /* pull enable = 0 */ + | (0<<0) /* puddselect= 0 */ + ; + + chopstx_intr_wait (&tpm1_intr); + /* Clear overflow. */ + TPM1->SC |= 0x80; + + return TPM1->C1V; +} |