|
@@ -23,54 +23,31 @@
|
|
|
#include <getopt.h>
|
|
|
#include <sys/ioctl.h>
|
|
|
#include <linux/gpio.h>
|
|
|
+#include "gpio-utils.h"
|
|
|
|
|
|
int hammer_device(const char *device_name, unsigned int *lines, int nlines,
|
|
|
unsigned int loops)
|
|
|
{
|
|
|
- struct gpiohandle_request req;
|
|
|
struct gpiohandle_data data;
|
|
|
- char *chrdev_name;
|
|
|
char swirr[] = "-\\|/";
|
|
|
int fd;
|
|
|
int ret;
|
|
|
int i, j;
|
|
|
unsigned int iteration = 0;
|
|
|
|
|
|
- ret = asprintf(&chrdev_name, "/dev/%s", device_name);
|
|
|
+ memset(&data.values, 0, sizeof(data.values));
|
|
|
+ ret = gpiotools_request_linehandle(device_name, lines, nlines,
|
|
|
+ GPIOHANDLE_REQUEST_OUTPUT, &data,
|
|
|
+ "gpio-hammler");
|
|
|
if (ret < 0)
|
|
|
- return -ENOMEM;
|
|
|
+ goto exit_error;
|
|
|
+ else
|
|
|
+ fd = ret;
|
|
|
|
|
|
- fd = open(chrdev_name, 0);
|
|
|
- if (fd == -1) {
|
|
|
- ret = -errno;
|
|
|
- fprintf(stderr, "Failed to open %s\n", chrdev_name);
|
|
|
- goto exit_close_error;
|
|
|
- }
|
|
|
-
|
|
|
- /* Request lines as output */
|
|
|
- for (i = 0; i < nlines; i++)
|
|
|
- req.lineoffsets[i] = lines[i];
|
|
|
- req.flags = GPIOHANDLE_REQUEST_OUTPUT; /* Request as output */
|
|
|
- strcpy(req.consumer_label, "gpio-hammer");
|
|
|
- req.lines = nlines;
|
|
|
- ret = ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &req);
|
|
|
- if (ret == -1) {
|
|
|
- ret = -errno;
|
|
|
- fprintf(stderr, "Failed to issue GET LINEHANDLE "
|
|
|
- "IOCTL (%d)\n",
|
|
|
- ret);
|
|
|
+ ret = gpiotools_get_values(fd, &data);
|
|
|
+ if (ret < 0)
|
|
|
goto exit_close_error;
|
|
|
- }
|
|
|
|
|
|
- /* Read initial states */
|
|
|
- ret = ioctl(req.fd, GPIOHANDLE_GET_LINE_VALUES_IOCTL, &data);
|
|
|
- if (ret == -1) {
|
|
|
- ret = -errno;
|
|
|
- fprintf(stderr, "Failed to issue GPIOHANDLE GET LINE "
|
|
|
- "VALUES IOCTL (%d)\n",
|
|
|
- ret);
|
|
|
- goto exit_close_error;
|
|
|
- }
|
|
|
fprintf(stdout, "Hammer lines [");
|
|
|
for (i = 0; i < nlines; i++) {
|
|
|
fprintf(stdout, "%d", lines[i]);
|
|
@@ -92,23 +69,14 @@ int hammer_device(const char *device_name, unsigned int *lines, int nlines,
|
|
|
for (i = 0; i < nlines; i++)
|
|
|
data.values[i] = !data.values[i];
|
|
|
|
|
|
- ret = ioctl(req.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &data);
|
|
|
- if (ret == -1) {
|
|
|
- ret = -errno;
|
|
|
- fprintf(stderr, "Failed to issue GPIOHANDLE SET LINE "
|
|
|
- "VALUES IOCTL (%d)\n",
|
|
|
- ret);
|
|
|
+ ret = gpiotools_set_values(fd, &data);
|
|
|
+ if (ret < 0)
|
|
|
goto exit_close_error;
|
|
|
- }
|
|
|
+
|
|
|
/* Re-read values to get status */
|
|
|
- ret = ioctl(req.fd, GPIOHANDLE_GET_LINE_VALUES_IOCTL, &data);
|
|
|
- if (ret == -1) {
|
|
|
- ret = -errno;
|
|
|
- fprintf(stderr, "Failed to issue GPIOHANDLE GET LINE "
|
|
|
- "VALUES IOCTL (%d)\n",
|
|
|
- ret);
|
|
|
+ ret = gpiotools_get_values(fd, &data);
|
|
|
+ if (ret < 0)
|
|
|
goto exit_close_error;
|
|
|
- }
|
|
|
|
|
|
fprintf(stdout, "[%c] ", swirr[j]);
|
|
|
j++;
|
|
@@ -132,9 +100,8 @@ int hammer_device(const char *device_name, unsigned int *lines, int nlines,
|
|
|
ret = 0;
|
|
|
|
|
|
exit_close_error:
|
|
|
- if (close(fd) == -1)
|
|
|
- perror("Failed to close GPIO character device file");
|
|
|
- free(chrdev_name);
|
|
|
+ gpiotools_release_linehandle(fd);
|
|
|
+exit_error:
|
|
|
return ret;
|
|
|
}
|
|
|
|