mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-20 08:58:52 +09:00
![Simon Glass](/assets/img/avatar_default.png)
Change all files in common/ to use CMD_RET_USAGE instead of calling cmd_usage() directly. I'm not completely sure about this patch since the code since impact is small (100 byte or so on ARM) and it might need splitting into smaller patches. But for now here it is. Signed-off-by: Simon Glass <sjg@chromium.org>
90 lines
1.9 KiB
C
90 lines
1.9 KiB
C
/*
|
|
* 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_RET_USAGE;
|
|
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 */
|
|
if (gpio_request(gpio, "cmd_gpio")) {
|
|
printf("gpio: requesting pin %u failed\n", gpio);
|
|
return -1;
|
|
}
|
|
|
|
/* 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");
|