Fixed bug in gpio driver: /dev/confX device not able to configure the pin mask.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user