From 581ab61262378efd18beaf14425ff5bbbaf30b47 Mon Sep 17 00:00:00 2001 From: Serge Vakulenko Date: Thu, 14 May 2015 12:38:04 -0700 Subject: [PATCH] Fixed bug in gpio driver: /dev/confX device not able to configure the pin mask. --- sys/pic32/gpio.c | 33 +++++++++++++++---------- sys/pic32/maximite-color/MAXIMITE-COLOR | 2 +- sys/pic32/maximite-color/Makefile | 16 ++---------- 3 files changed, 23 insertions(+), 28 deletions(-) diff --git a/sys/pic32/gpio.c b/sys/pic32/gpio.c index 0fe7dd3..df63a18 100644 --- a/sys/pic32/gpio.c +++ b/sys/pic32/gpio.c @@ -245,7 +245,7 @@ gpio_print (dev, buf) register u_int mask, conf, tris; register char c; - conf = gpio_confmask [unit]; + conf = gpio_confmask[unit]; tris = reg->tris; if (minor(dev) & MINOR_CONF) { /* /dev/confX device: port configuration mask */ @@ -293,28 +293,35 @@ gpio_parse (dev, buf) c = *buf++; if (c <= ' ' || c > '~') break; - if (c == 'x' || c == 'X') - gpio_confmask [unit] &= ~mask; - else if (c == 'i' || c == 'I') + + if (c == 'x' || c == 'X') { + gpio_confmask[unit] &= ~mask; reg->trisset = mask; - else if (c == 'o' || c == 'O') { + } else if (c == 'i' || c == 'I') { + gpio_confmask[unit] |= mask; + reg->trisset = mask; + } else if (c == 'o' || c == 'O') { + gpio_confmask[unit] |= mask; reg->odcclr = mask; reg->trisclr = mask; } else if (c == 'd' || c == 'D') { + gpio_confmask[unit] |= mask; reg->odcset = mask; reg->trisclr = mask; } } } else { /* /dev/portX device: port value mask */ - u_int conf = gpio_confmask [unit]; + u_int conf = gpio_confmask[unit]; u_int tris = reg->tris; for (mask=1<<(NPINS-1); mask; mask>>=1) { c = *buf++; if (c <= ' ' || c > '~') break; + if (! (conf & mask) || (tris & mask)) continue; + if (c == '0') reg->latclr = mask; else @@ -555,16 +562,16 @@ gpioioctl (dev, cmd, addr, flag) if (cmd & GPIO_COMMAND & (GPIO_CONFIN | GPIO_CONFOUT | GPIO_CONFOD)) mask = gpio_filter (mask, unit); else - mask &= gpio_confmask [unit]; + mask &= gpio_confmask[unit]; if (cmd & GPIO_COMMAND & GPIO_CONFIN) { /* configure as input */ PRINTDBG ("TRIS%cSET %p := %04x\n", unit+'A', ®->trisset, mask); reg->trisset = mask; - gpio_confmask [unit] |= mask; + gpio_confmask[unit] |= mask; /* skip output-only bits */ - gpio_confmask [unit] ^= mask & ~reg->tris; + gpio_confmask[unit] ^= mask & ~reg->tris; } if (cmd & GPIO_COMMAND & (GPIO_CONFOUT | GPIO_CONFOD)) { if (cmd & GPIO_COMMAND & GPIO_CONFOUT) { @@ -578,20 +585,20 @@ gpioioctl (dev, cmd, addr, flag) } PRINTDBG ("TRIS%cCLR %p := %04x\n", unit+'A', ®->trisclr, mask); reg->trisclr = mask; - gpio_confmask [unit] |= mask; + gpio_confmask[unit] |= mask; /* skip input-only bits */ - gpio_confmask [unit] ^= mask & reg->tris; + gpio_confmask[unit] ^= mask & reg->tris; } if (cmd & GPIO_COMMAND & GPIO_DECONF) { /* deconfigure */ - gpio_confmask [unit] &= ~mask; + gpio_confmask[unit] &= ~mask; } if (cmd & GPIO_COMMAND & GPIO_STORE) { /* store all outputs */ value = reg->lat; PRINTDBG ("LAT%c %p -> %04x\n", unit+'A', ®->lat, value); - value &= ~gpio_confmask [unit]; + value &= ~gpio_confmask[unit]; value |= mask; PRINTDBG ("LAT%c %p := %04x\n", unit+'A', ®->lat, value); reg->lat = value; diff --git a/sys/pic32/maximite-color/MAXIMITE-COLOR b/sys/pic32/maximite-color/MAXIMITE-COLOR index 8d29d77..010864c 100644 --- a/sys/pic32/maximite-color/MAXIMITE-COLOR +++ b/sys/pic32/maximite-color/MAXIMITE-COLOR @@ -20,4 +20,4 @@ device sd0 port=4 cs=A1 device gpio -device bootloader button=C13 user=0x1d005000 led=E1 +#device bootloader button=C13 user=0x1d005000 led=E1 diff --git a/sys/pic32/maximite-color/Makefile b/sys/pic32/maximite-color/Makefile index 856905a..5895249 100644 --- a/sys/pic32/maximite-color/Makefile +++ b/sys/pic32/maximite-color/Makefile @@ -6,13 +6,9 @@ S = ../../../tools/configsys/../../sys/kernel vpath %.c $(M):$(S) vpath %.S $(M):$(S) -KERNOBJ += clock.o cons.o devsw.o exception.o exec_aout.o exec_conf.o exec_elf.o exec_script.o exec_subr.o gpio.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o rd_sd.o rdisk.o signal.o spi_bus.o startup.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o usb_device.o usb_function_cdc.o usb_uart.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o -EXTRA_TARGETS = bootloader +KERNOBJ += clock.o cons.o devcfg.o devsw.o exception.o exec_aout.o exec_conf.o exec_elf.o exec_script.o exec_subr.o gpio.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o rd_sd.o rdisk.o signal.o spi_bus.o startup.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o usb_device.o usb_function_cdc.o usb_uart.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o +EXTRA_TARGETS = -DEFS += -DBL_BUTTON_PIN=13 -DEFS += -DBL_BUTTON_PORT=TRISC -DEFS += -DBL_LED_PIN=1 -DEFS += -DBL_LED_PORT=TRISE DEFS += -DBUS_DIV=1 DEFS += -DBUS_KHZ='CPU_KHZ/BUS_DIV' DEFS += -DCONSOLE_DEVICE=ttyUSB0 @@ -48,14 +44,7 @@ DEFS += -DDC3_VBUSON=DEVCFG3_FVBUSONIO DEFS += -DEXEC_AOUT DEFS += -DEXEC_ELF DEFS += -DEXEC_SCRIPT -DEFS += -DFLASH_USER=0x1d005000 DEFS += -DGPIO_ENABLED=YES -DEFS += -DHID_FEATURE_REPORT_BYTES=2 -DEFS += -DHID_INPUT_REPORT_BYTES=2 -DEFS += -DHID_INT_IN_EP_SIZE=64 -DEFS += -DHID_INT_OUT_EP_SIZE=64 -DEFS += -DHID_OUTPUT_REPORT_BYTES=2 -DEFS += -DHID_RPT01_SIZE=29 DEFS += -DKERNEL DEFS += -DLED_DISK_PIN=1 DEFS += -DLED_DISK_PORT=TRISE @@ -68,7 +57,6 @@ DEFS += -DSD0_CS_PORT=TRISA DEFS += -DSD0_PORT=4 DEFS += -DUARTUSB_ENABLED=YES DEFS += -DUCB_METER -DEFS += -DUSB_EP0_BUFF_SIZE=8 DEFS += -DUSB_MAX_EP_NUMBER=3 DEFS += -DUSB_NUM_STRING_DESCRIPTORS=3