Fixed bug in gpio driver: /dev/confX device not able to configure the pin mask.

This commit is contained in:
Serge Vakulenko
2015-05-14 12:38:04 -07:00
parent ff4a186025
commit 581ab61262
3 changed files with 23 additions and 28 deletions

View File

@@ -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', &reg->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', &reg->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', &reg->lat, value);
value &= ~gpio_confmask [unit];
value &= ~gpio_confmask[unit];
value |= mask;
PRINTDBG ("LAT%c %p := %04x\n", unit+'A', &reg->lat, value);
reg->lat = value;

View File

@@ -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

View File

@@ -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