Ejemplo n.º 1
0
static void
init(void)
{
        /* set modes before to enable the port */
        gpio_dir(PROG_BUTTON, GPIO_INPUT);
        pin_mode(PROG_BUTTON, PIN_MODE_PULLUP);
        gpio_dir(TARGET_RESET, GPIO_INPUT);
        gpio_dir(TARGET_LED, GPIO_INPUT);

        /* set digital debounce/filter */
        pin_physport_from_pin(PROG_BUTTON)->dfcr.cs = PORT_CS_LPO;
        pin_physport_from_pin(PROG_BUTTON)->dfwr.filt = 31;

        /* button interrupt */
        pin_physport_from_pin(PROG_BUTTON)->dfer |= 1 << pin_physpin_from_pin(PROG_BUTTON);
        pin_physport_from_pin(PROG_BUTTON)->pcr[pin_physpin_from_pin(PROG_BUTTON)].irqc = PCR_IRQC_INT_FALLING;

        /* reset interrupt */
        pin_physport_from_pin(TARGET_RESET)->pcr[pin_physpin_from_pin(TARGET_RESET)].irqc = PCR_IRQC_INT_RISING;

        /* LED interrupt */
        pin_physport_from_pin(TARGET_LED)->pcr[pin_physpin_from_pin(TARGET_LED)].irqc = PCR_IRQC_INT_FALLING;

        int_enable(IRQ_PORTD);

        gpio_dir(LED_SUCCESS, GPIO_OUTPUT);
        gpio_dir(LED_FAIL, GPIO_OUTPUT);

        timeout_init();
}
Ejemplo n.º 2
0
void
PORTD_Handler(void)
{
        if (pin_physport_from_pin(PROG_BUTTON)->pcr[pin_physpin_from_pin(PROG_BUTTON)].isf) {
                pin_physport_from_pin(PROG_BUTTON)->pcr[pin_physpin_from_pin(PROG_BUTTON)].raw |= 0; /* clear isf */
                statemachine(ev_button);
        }
        if (pin_physport_from_pin(TARGET_RESET)->pcr[pin_physpin_from_pin(TARGET_RESET)].isf) {
                pin_physport_from_pin(TARGET_RESET)->pcr[pin_physpin_from_pin(TARGET_RESET)].raw |= 0; /* clear isf */
                statemachine(ev_reset);
        }
        if (pin_physport_from_pin(TARGET_LED)->pcr[pin_physpin_from_pin(TARGET_LED)].isf) {
                pin_physport_from_pin(TARGET_LED)->pcr[pin_physpin_from_pin(TARGET_LED)].raw |= 0; /* clear isf */
                statemachine(ev_led);
        }
}
Ejemplo n.º 3
0
Archivo: pin.c Proyecto: relayr/mchck
void
pin_mode(enum pin_id pin, enum pin_mode mode)
{
        int pinnum = pin_physpin_from_pin(pin);

        /* enable port clock */
        SIM.scgc5.raw |= 1 << (pin_portnum_from_pin(pin) + 8);

        struct PCR_t pcr = pin_physport_from_pin(pin)->pcr[pinnum];

        if (mode & PIN_MODE_RESET) {
                pcr.raw &= ~0xff;
                pcr.mux = 0;
        }

        if (mode & PIN_MODE__SLEW) {
                switch (mode & PIN_MODE__SLEW_MASK) {
                case PIN_MODE_SLEW_FAST:
                        pcr.sre = 0;
                        break;
                case PIN_MODE_SLEW_SLOW:
                        pcr.sre = 1;
                        break;
                }
        }

        if (mode & PIN_MODE__PULL) {
                switch (mode & PIN_MODE__PULL_MASK) {
                case PIN_MODE_PULL_OFF:
                        pcr.pe = 0;
                        break;
                case PIN_MODE_PULLDOWN:
                        pcr.pe = 1;
                        pcr.ps = PCR_PULLDOWN;
                        break;
                case PIN_MODE_PULLUP:
                        pcr.pe = 1;
                        pcr.ps = PCR_PULLUP;
                        break;
                }
        }

        if (mode & PIN_MODE__DRIVE) {
                switch (mode & PIN_MODE__DRIVE_MASK) {
                case PIN_MODE_DRIVE_LOW:
                        pcr.dse = 0;
                        break;
                case PIN_MODE_DRIVE_HIGH:
                        pcr.dse = 1;
                        break;
                }
        }

        if (mode & PIN_MODE__FILTER) {
                switch (mode & PIN_MODE__FILTER_MASK) {
                case PIN_MODE_FILTER_OFF:
                        pcr.pfe = 0;
                        break;
                case PIN_MODE_FILTER_ON:
                        pcr.pfe = 1;
                        break;
                }
        }

        if (mode & PIN_MODE__OPEN_DRAIN) {
                switch (mode & PIN_MODE__OPEN_DRAIN_MASK) {
                case PIN_MODE_OPEN_DRAIN_OFF:
                        pcr.ode = 0;
                        break;
                case PIN_MODE_OPEN_DRAIN_ON:
                        pcr.ode = 1;
                        break;
                }
        }

        if (mode & PIN_MODE__MUX) {
                pcr.mux = (mode & PIN_MODE__MUX_MASK) >> 13; /* XXX */
        }