diff --git a/package/gpioctl/Makefile b/package/gpioctl/Makefile new file mode 100644 index 0000000000..f288ec9150 --- /dev/null +++ b/package/gpioctl/Makefile @@ -0,0 +1,43 @@ +# +# Copyright (C) 2008 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# +# $Id$ + +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/kernel.mk + +PKG_NAME:=gpioctl +PKG_RELEASE:=1 +PKG_VERSION:=1.0 + +include $(INCLUDE_DIR)/package.mk + +define Package/gpioctl + SECTION:=utils + CATEGORY:=Utilities + TITLE:=Tool for controlling gpio pins +endef + +define Package/gpioctl/description + Tool for controlling gpio pins +endef + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) + $(CP) ./src/* $(PKG_BUILD_DIR)/ +endef + +define Build/Compile + $(MAKE) -C $(PKG_BUILD_DIR) \ + $(TARGET_CONFIGURE_OPTS) CFLAGS="$(TARGET_CFLAGS) -I$(LINUX_DIR)/include" +endef + +define Package/gpioctl/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/gpioctl $(1)/usr/bin/ +endef + +$(eval $(call BuildPackage,gpioctl)) diff --git a/package/gpioctl/src/Makefile b/package/gpioctl/src/Makefile new file mode 100644 index 0000000000..467697410a --- /dev/null +++ b/package/gpioctl/src/Makefile @@ -0,0 +1,24 @@ +PROGS = gpioctl + +INSTDIR = $(prefix)/usr/bin +INSTMODE = 0755 +INSTOWNER = root +INSTGROUP = root + +OBJS = main.o + +all: $(PROGS) +$(PROGS): $(OBJS) + $(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@ + $(STRIP) $@ + +%.o: %.c + $(CC) -c $(CFLAGS) $^ -o $@ + +install: $(PROGS) + $(INSTALL) -d $(INSTDIR) + $(INSTALL) -m $(INSTMODE) -o $(INSTOWNER) -g $(INSTGROUP) $(PROGS) $(INSTDIR) + +clean: + rm -f $(PROGS) *.o core + diff --git a/package/gpioctl/src/main.c b/package/gpioctl/src/main.c new file mode 100644 index 0000000000..9aa317350f --- /dev/null +++ b/package/gpioctl/src/main.c @@ -0,0 +1,76 @@ +/* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA02111-1307USA +* +* Feedback, Bugs... blogic@openwrt.org +* +*/ + +#include +#include +#include +#include +#include +#include +#include + +void +print_usage() +{ + printf("gpioctl dirin|dirout|get|set|clear gpio\n"); + exit(0); +} + +int +main(int argc, char **argv) +{ + int gpio_pin; + int fd; + int result = 0; + + if (argc != 3) + { + print_usage(); + } + + if ((fd = open("/dev/gpio", O_RDWR)) < 0) + { + printf("Error whilst opening /dev/gpio\n"); + return -1; + } + + gpio_pin = atoi(argv[2]); + + printf("using gpio pin %d\n", gpio_pin); + + if (!strcmp(argv[1], "dirin")) + { + ioctl(fd, GPIO_DIR_IN, gpio_pin); + } else if (!strcmp(argv[1], "dirout")) + { + ioctl(fd, GPIO_DIR_OUT, gpio_pin); + } else if (!strcmp(argv[1], "get")) + { + result = ioctl(fd, GPIO_GET, gpio_pin); + printf("Pin %d is %s\n", (result ? "HIGH" : "LOW")); + } else if (!strcmp(argv[1], "set")) + { + ioctl(fd, GPIO_SET, gpio_pin); + } else if (!strcmp(argv[1], "clear")) + { + ioctl(fd, GPIO_CLEAR, gpio_pin); + } else print_usage(); + + return result; +} diff --git a/target/linux/generic-2.6/files/drivers/gpio/gpio_dev.c b/target/linux/generic-2.6/files/drivers/gpio/gpio_dev.c index 2adbb96d40..690a3fb8c5 100644 --- a/target/linux/generic-2.6/files/drivers/gpio/gpio_dev.c +++ b/target/linux/generic-2.6/files/drivers/gpio/gpio_dev.c @@ -44,7 +44,7 @@ gpio_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned { int retval = 0; - if ((arg & gpio_access_mask) != arg) + if (((1 << arg) & gpio_access_mask) != (1 << arg)) { retval = -EINVAL; goto out; @@ -57,7 +57,7 @@ gpio_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned break; case GPIO_SET: - gpio_set_value(arg, 0); + gpio_set_value(arg, 1); break; case GPIO_CLEAR: