mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-09 03:21:51 +00:00
gpio: generalize for all generic gpio providers
The Blackfin gpio command isn't terribly Blackfin-specific. So generalize the few pieces into two new optional helpers: name_to_gpio() - turn a string name into a GPIO # gpio_status() - display current pin bindings (think /proc/gpio) Once these pieces are pulled out, we can relocate the cmd_gpio.c into the common directory. Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
parent
c3d2a17c1e
commit
a972b8d701
5 changed files with 140 additions and 119 deletions
86
common/cmd_gpio.c
Normal file
86
common/cmd_gpio.c
Normal file
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
* Control GPIO pins on the fly
|
||||
*
|
||||
* Copyright (c) 2008-2011 Analog Devices Inc.
|
||||
*
|
||||
* Licensed under the GPL-2 or later.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
|
||||
#include <asm/gpio.h>
|
||||
|
||||
#ifndef name_to_gpio
|
||||
#define name_to_gpio(name) simple_strtoul(name, NULL, 10)
|
||||
#endif
|
||||
|
||||
enum gpio_cmd {
|
||||
GPIO_INPUT,
|
||||
GPIO_SET,
|
||||
GPIO_CLEAR,
|
||||
GPIO_TOGGLE,
|
||||
};
|
||||
|
||||
static int do_gpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
int gpio;
|
||||
enum gpio_cmd sub_cmd;
|
||||
ulong value;
|
||||
const char *str_cmd, *str_gpio;
|
||||
|
||||
#ifdef gpio_status
|
||||
if (argc == 2 && !strcmp(argv[1], "status")) {
|
||||
gpio_status();
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (argc != 3)
|
||||
show_usage:
|
||||
return cmd_usage(cmdtp);
|
||||
str_cmd = argv[1];
|
||||
str_gpio = argv[2];
|
||||
|
||||
/* parse the behavior */
|
||||
switch (*str_cmd) {
|
||||
case 'i': sub_cmd = GPIO_INPUT; break;
|
||||
case 's': sub_cmd = GPIO_SET; break;
|
||||
case 'c': sub_cmd = GPIO_CLEAR; break;
|
||||
case 't': sub_cmd = GPIO_TOGGLE; break;
|
||||
default: goto show_usage;
|
||||
}
|
||||
|
||||
/* turn the gpio name into a gpio number */
|
||||
gpio = name_to_gpio(str_gpio);
|
||||
if (gpio < 0)
|
||||
goto show_usage;
|
||||
|
||||
/* grab the pin before we tweak it */
|
||||
gpio_request(gpio, "cmd_gpio");
|
||||
|
||||
/* finally, let's do it: set direction and exec command */
|
||||
if (sub_cmd == GPIO_INPUT) {
|
||||
gpio_direction_input(gpio);
|
||||
value = gpio_get_value(gpio);
|
||||
} else {
|
||||
switch (sub_cmd) {
|
||||
case GPIO_SET: value = 1; break;
|
||||
case GPIO_CLEAR: value = 0; break;
|
||||
case GPIO_TOGGLE: value = !gpio_get_value(gpio); break;
|
||||
default: goto show_usage;
|
||||
}
|
||||
gpio_direction_output(gpio, value);
|
||||
}
|
||||
printf("gpio: pin %s (gpio %i) value is %lu\n",
|
||||
str_gpio, gpio, value);
|
||||
|
||||
gpio_free(gpio);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
U_BOOT_CMD(gpio, 3, 0, do_gpio,
|
||||
"input/set/clear/toggle gpio pins",
|
||||
"<input|set|clear|toggle> <pin>\n"
|
||||
" - input/set/clear/toggle the specified pin");
|
Loading…
Add table
Add a link
Reference in a new issue