add userspace tool for gpio_dev

SVN-Revision: 10267
This commit is contained in:
John Crispin 2008-01-26 04:24:05 +00:00
parent d7b86662f7
commit 8f39c35159
4 changed files with 145 additions and 2 deletions

43
package/gpioctl/Makefile Normal file
View file

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

View file

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

View file

@ -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 <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/gpio_dev.h>
#include <linux/ioctl.h>
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;
}

View file

@ -44,7 +44,7 @@ gpio_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned
{ {
int retval = 0; int retval = 0;
if ((arg & gpio_access_mask) != arg) if (((1 << arg) & gpio_access_mask) != (1 << arg))
{ {
retval = -EINVAL; retval = -EINVAL;
goto out; goto out;
@ -57,7 +57,7 @@ gpio_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned
break; break;
case GPIO_SET: case GPIO_SET:
gpio_set_value(arg, 0); gpio_set_value(arg, 1);
break; break;
case GPIO_CLEAR: case GPIO_CLEAR: