void _pal_lld_setgroupmode(ioportid_t port, ioportmask_t mask, uint32_t mode) { int i; switch (mode) { case PAL_MODE_INPUT: set_gpio_in(port, mask); set_gpio_pud(port, mask, GPIO_PUD_OFF); break; case PAL_MODE_INPUT_PULLUP: set_gpio_in(port, mask); set_gpio_pud(port, mask, GPIO_PUD_PULLUP); break; case PAL_MODE_INPUT_PULLDOWN: set_gpio_in(port, mask); set_gpio_pud(port, mask, GPIO_PUD_PULLDOWN); break; case PAL_MODE_OUTPUT: case PAL_MODE_OUTPUT_PUSHPULL: case PAL_MODE_OUTPUT_OPENDRAIN: for (i = 0; i < 32; i++) { unsigned int bit = mask & 1; if (bit) bcm2835_gpio_fnsel(i + port->pin_base, GPFN_OUT); mask >>= 1; } break; } }
static int gpio_proc_write(struct file *file, const char *buffer, unsigned long count, void *data) { u32 reg = 0; /* get buffer size */ procfs_buffer_size = count; if (procfs_buffer_size > PROCFS_MAX_SIZE) { procfs_buffer_size = PROCFS_MAX_SIZE; } /* write data to the buffer */ if (copy_from_user(procfs_buffer, buffer, procfs_buffer_size)) { return -EFAULT; } procfs_buffer[procfs_buffer_size] = 0; if (procfs_buffer[0] == '0' || procfs_buffer[0] == 'i') reg = 0; if (procfs_buffer[0] == '1' || procfs_buffer[0] == 'o') reg = 1; if ((unsigned int)data & GPIO_IN) { set_gpio_in(((unsigned int)data) & PIN_MASK, reg); } if ((unsigned int)data & GPIO_OUT) { set_gpio_out(((unsigned int)data) & PIN_MASK, reg); } if ((unsigned int)data & GPIO_DIR) { set_dir(((unsigned int)data) & PIN_MASK, reg); } return procfs_buffer_size; }
void _pal_lld_init(const PALConfig* config) { (void)config; IOPORT0.gpset = &GPSET0; IOPORT0.gpclr = &GPCLR0; IOPORT0.gplev = &GPLEV0; IOPORT0.gppudclk = &GPPUDCLK0; set_gpio_in(&IOPORT0, 0xFFFFFFFF); IOPORT1.gpset = &GPSET1; IOPORT1.gpclr = &GPCLR1; IOPORT1.gplev = &GPLEV1; IOPORT1.gppudclk = &GPPUDCLK1; IOPORT1.pin_base = 32; set_gpio_in(&IOPORT1, 0xFFFFFFFF); }