forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This creates GPIO tools under tools/gpio/* and adds a single example program to list the GPIOs on a system. When proper devices are created it provides this minimal output: Cc: Johan Hovold <[email protected]> Cc: Michael Welling <[email protected]> Cc: Markus Pargmann <[email protected]> Signed-off-by: Linus Walleij <[email protected]>
- Loading branch information
Showing
6 changed files
with
182 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4820,6 +4820,7 @@ F: include/linux/gpio/ | |
F: include/linux/gpio.h | ||
F: include/asm-generic/gpio.h | ||
F: include/uapi/linux/gpio.h | ||
F: tools/gpio/ | ||
|
||
GRE DEMULTIPLEXER DRIVER | ||
M: Dmitry Kozlov <[email protected]> | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
CC = $(CROSS_COMPILE)gcc | ||
CFLAGS += -Wall -g -D_GNU_SOURCE | ||
|
||
all: lsgpio | ||
|
||
lsgpio: lsgpio.o gpio-utils.o | ||
|
||
%.o: %.c gpio-utils.h | ||
|
||
.PHONY: clean | ||
clean: | ||
rm -f *.o lsgpio |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
/* | ||
* GPIO tools - helpers library for the GPIO tools | ||
* | ||
* Copyright (C) 2015 Linus Walleij | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published by | ||
* the Free Software Foundation. | ||
*/ | ||
|
||
#include "gpio-utils.h" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
/* | ||
* GPIO tools - utility helpers library for the GPIO tools | ||
* | ||
* Copyright (C) 2015 Linus Walleij | ||
* | ||
* Portions copied from iio_utils and lssio: | ||
* Copyright (c) 2010 Manuel Stahl <[email protected]> | ||
* Copyright (c) 2008 Jonathan Cameron | ||
* * | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published by | ||
* the Free Software Foundation. | ||
*/ | ||
#ifndef _GPIO_UTILS_H_ | ||
#define _GPIO_UTILS_H_ | ||
|
||
#include <string.h> | ||
|
||
static inline int check_prefix(const char *str, const char *prefix) | ||
{ | ||
return strlen(str) > strlen(prefix) && | ||
strncmp(str, prefix, strlen(prefix)) == 0; | ||
} | ||
|
||
#endif /* _GPIO_UTILS_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
/* | ||
* lsgpio - example on how to list the GPIO lines on a system | ||
* | ||
* Copyright (C) 2015 Linus Walleij | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published by | ||
* the Free Software Foundation. | ||
* | ||
* Usage: | ||
* lsgpio <-n device-name> | ||
*/ | ||
|
||
#include <unistd.h> | ||
#include <stdlib.h> | ||
#include <stdbool.h> | ||
#include <stdio.h> | ||
#include <dirent.h> | ||
#include <errno.h> | ||
#include <string.h> | ||
#include <poll.h> | ||
#include <fcntl.h> | ||
#include <getopt.h> | ||
#include <sys/ioctl.h> | ||
#include <linux/gpio.h> | ||
|
||
#include "gpio-utils.h" | ||
|
||
int list_device(const char *device_name) | ||
{ | ||
struct gpiochip_info cinfo; | ||
char *chrdev_name; | ||
int fd; | ||
int ret; | ||
|
||
ret = asprintf(&chrdev_name, "/dev/%s", device_name); | ||
if (ret < 0) | ||
return -ENOMEM; | ||
|
||
fd = open(chrdev_name, 0); | ||
if (fd == -1) { | ||
ret = -errno; | ||
fprintf(stderr, "Failed to open %s\n", chrdev_name); | ||
goto free_chrdev_name; | ||
} | ||
|
||
/* Inspect this GPIO chip */ | ||
ret = ioctl(fd, GPIO_GET_CHIPINFO_IOCTL, &cinfo); | ||
if (ret == -1) { | ||
ret = -errno; | ||
fprintf(stderr, "Failed to retrieve GPIO fd\n"); | ||
if (close(fd) == -1) | ||
perror("Failed to close GPIO character device file"); | ||
|
||
goto free_chrdev_name; | ||
} | ||
fprintf(stdout, "GPIO chip: %s, %u GPIO lines\n", | ||
cinfo.name, cinfo.lines); | ||
|
||
if (close(fd) == -1) { | ||
ret = -errno; | ||
goto free_chrdev_name; | ||
} | ||
|
||
free_chrdev_name: | ||
free(chrdev_name); | ||
|
||
return ret; | ||
|
||
} | ||
|
||
void print_usage(void) | ||
{ | ||
fprintf(stderr, "Usage: lsgpio [options]...\n" | ||
"List GPIO chips, lines and states\n" | ||
" -n <name> List GPIOs on a named device\n" | ||
" -? This helptext\n" | ||
); | ||
} | ||
|
||
int main(int argc, char **argv) | ||
{ | ||
const char *device_name; | ||
int ret; | ||
int c; | ||
|
||
while ((c = getopt(argc, argv, "n:")) != -1) { | ||
switch (c) { | ||
case 'n': | ||
device_name = optarg; | ||
break; | ||
case '?': | ||
print_usage(); | ||
return -1; | ||
} | ||
} | ||
|
||
if (device_name) | ||
ret = list_device(device_name); | ||
else { | ||
const struct dirent *ent; | ||
DIR *dp; | ||
|
||
/* List all GPIO devices one at a time */ | ||
dp = opendir("/dev"); | ||
if (!dp) { | ||
ret = -errno; | ||
goto error_out; | ||
} | ||
|
||
ret = -ENOENT; | ||
while (ent = readdir(dp), ent) { | ||
if (check_prefix(ent->d_name, "gpiochip")) { | ||
ret = list_device(ent->d_name); | ||
if (ret) | ||
break; | ||
} | ||
} | ||
|
||
ret = 0; | ||
if (closedir(dp) == -1) { | ||
perror("scanning devices: Failed to close directory"); | ||
ret = -errno; | ||
} | ||
} | ||
error_out: | ||
return ret; | ||
} |