void gpio_set_input(const char GPIO[]) { const char M_PORT = gpio_get_port(GPIO); const char M_PIN_NUMBER = gpio_get_pin(GPIO); // Mettre à 1 le bit dans TRISx switch(M_PORT) { case 'B': TRISB |= (1<<M_PIN_NUMBER); break; case 'C': TRISC |= (1<<M_PIN_NUMBER); break; case 'D': TRISD |= (1<<M_PIN_NUMBER); break; case 'E': TRISE |= (1<<M_PIN_NUMBER); break; case 'F': TRISF |= (1<<M_PIN_NUMBER); break; case 'G': TRISG |= (1<<M_PIN_NUMBER); break; default: break; } }
void gpio_set_output(const char GPIO[]) { // Mise à 0 du bit dans TRISx const char M_PORT = gpio_get_port(GPIO); const char M_PIN_NUMBER = gpio_get_pin(GPIO); switch (M_PORT) { case 'B': TRISB &= ~(1 << M_PIN_NUMBER); break; case 'C': TRISC &= ~(1 << M_PIN_NUMBER); break; case 'D': TRISD &= ~(1 << M_PIN_NUMBER); break; case 'E': TRISE &= ~(1 << M_PIN_NUMBER); break; case 'F': TRISF &= ~(1 << M_PIN_NUMBER); break; case 'G': TRISG &= ~(1 << M_PIN_NUMBER); break; default: break; } }
void gpio_toggle(const char GPIO[]) { const char M_PORT = gpio_get_port(GPIO); const char M_PIN_NUMBER = gpio_get_pin(GPIO); switch (M_PORT) { case 'B': LATB ^= (1 << M_PIN_NUMBER); break; case 'C': LATC ^= (1 << M_PIN_NUMBER); break; case 'D': LATD ^= (1 << M_PIN_NUMBER); break; case 'E': LATE ^= (1 << M_PIN_NUMBER); break; case 'F': LATF ^= (1 << M_PIN_NUMBER); break; case 'G': LATG ^= (1 << M_PIN_NUMBER); break; default: break; } }
void gpio_set_high(const char GPIO[]) { const char M_PORT = gpio_get_port(GPIO); const char M_PIN_NUMBER = gpio_get_pin(GPIO); switch (M_PORT) { case 'B': LATB |= (1 << M_PIN_NUMBER); break; case 'C': LATC |= (1 << M_PIN_NUMBER); break; case 'D': LATD |= (1 << M_PIN_NUMBER); break; case 'E': LATE |= (1 << M_PIN_NUMBER); break; case 'F': LATF |= (1 << M_PIN_NUMBER); break; case 'G': LATG |= (1 << M_PIN_NUMBER); break; default: break; } }
void gpio_set_low(const char GPIO[]) { const char M_PORT = gpio_get_port(GPIO); const char M_PIN_NUMBER = gpio_get_pin(GPIO); switch (M_PORT) { case 'B': LATB &= ~(1 << M_PIN_NUMBER); break; case 'C': LATC &= ~(1 << M_PIN_NUMBER); break; case 'D': LATD &= ~(1 << M_PIN_NUMBER); break; case 'E': LATE &= ~(1 << M_PIN_NUMBER); break; case 'F': LATF &= ~(1 << M_PIN_NUMBER); break; case 'G': LATG &= ~(1 << M_PIN_NUMBER); break; default: break; } }
int gpio_get_value(unsigned gpio) { struct gpio_port *port = gpio_get_port(gpio); const int shift = gpio % 8; u32 val; if (!port) return -EINVAL; val = readl(port->dr); return val & (1 << shift) ? 1 : 0; }
int gpio_direction_input(unsigned gpio) { struct gpio_port *port = gpio_get_port(gpio); const int shift = gpio % 8; u32 val; if (!port) return -EINVAL; val = readl(port->ddr); val &= ~(1 << shift); writel(val, port->ddr); return 0; }
int gpio_direction_output(unsigned gpio, int value) { struct gpio_port *port = gpio_get_port(gpio); const int shift = gpio % 8; u32 val; if (!port) return -EINVAL; gpio_set_value(gpio, value); val = readl(port->ddr); val |= 1 << shift; writel(val, port->ddr); return 0; }
void gpio_set_value(unsigned gpio, int value) { struct gpio_port *port = gpio_get_port(gpio); const int shift = gpio % 8; u32 val; if (!port) return; val = readl(port->dr); if (value) val |= 1 << shift; else val &= ~(1 << shift); writel(val, port->dr); }
/************************************************* * Lecture ************************************************/ bool gpio_read(const char GPIO[]) { const char M_PORT = gpio_get_port(GPIO); const char M_PIN_NUMBER = gpio_get_pin(GPIO); switch (M_PORT) { case 'B': return ((PORTB & (1 << M_PIN_NUMBER))) >> M_PIN_NUMBER; case 'C': return ((PORTC & (1 << M_PIN_NUMBER))) >> M_PIN_NUMBER; case 'D': return ((PORTD & (1 << M_PIN_NUMBER))) >> M_PIN_NUMBER; case 'E': return ((PORTE & (1 << M_PIN_NUMBER))) >> M_PIN_NUMBER; case 'F': return ((PORTF & (1 << M_PIN_NUMBER))) >> M_PIN_NUMBER; case 'G': return ((PORTG & (1 << M_PIN_NUMBER))) >> M_PIN_NUMBER; default: return 0; } return 0; }