diff options
| author | Mike Frysinger <vapier@gentoo.org> | 2010-06-02 04:34:49 -0400 | 
|---|---|---|
| committer | Mike Frysinger <vapier@gentoo.org> | 2010-07-05 05:30:07 -0400 | 
| commit | c5530555f82f6fbaf51656e9ba10e295d3c5f195 (patch) | |
| tree | 4ab43198bd54949c9defa91b1cf5ab2ccf02b7cf | |
| parent | 4638b21f2ebc3781def51e82fb4e425a468f2e49 (diff) | |
| download | olio-uboot-2014.01-c5530555f82f6fbaf51656e9ba10e295d3c5f195.tar.xz olio-uboot-2014.01-c5530555f82f6fbaf51656e9ba10e295d3c5f195.zip | |
Blackfin: unify custom gpio commands
Now that we have a unified gpio layer, the misc partial gpio commands
can be unified and made complete (support all possible gpios).
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
| -rw-r--r-- | arch/blackfin/cpu/Makefile | 1 | ||||
| -rw-r--r-- | arch/blackfin/cpu/cmd_gpio.c | 120 | ||||
| -rw-r--r-- | board/bf537-stamp/Makefile | 2 | ||||
| -rw-r--r-- | board/bf537-stamp/cmd_bf537led.c | 201 | ||||
| -rw-r--r-- | board/cm-bf527/Makefile | 2 | ||||
| -rw-r--r-- | board/cm-bf527/gpio.c | 74 | ||||
| -rw-r--r-- | board/cm-bf537e/Makefile | 2 | ||||
| -rw-r--r-- | board/cm-bf537e/flash.c | 34 | ||||
| -rw-r--r-- | board/cm-bf537u/Makefile | 2 | ||||
| -rw-r--r-- | board/cm-bf537u/flash.c | 34 | ||||
| -rw-r--r-- | board/tcm-bf537/Makefile | 2 | ||||
| -rw-r--r-- | board/tcm-bf537/flash.c | 37 | ||||
| -rw-r--r-- | include/configs/bf537-stamp.h | 2 | ||||
| -rw-r--r-- | include/configs/bfin_adi_common.h | 1 | 
14 files changed, 127 insertions, 387 deletions
| diff --git a/arch/blackfin/cpu/Makefile b/arch/blackfin/cpu/Makefile index 91797c798..b7f991dea 100644 --- a/arch/blackfin/cpu/Makefile +++ b/arch/blackfin/cpu/Makefile @@ -18,6 +18,7 @@ CEXTRA   := initcode.o  SEXTRA   := start.o  SOBJS    := interrupt.o cache.o  COBJS-$(CONFIG_BOOTCOUNT_LIMIT) += bootcount.o +COBJS-$(CONFIG_CMD_GPIO) += cmd_gpio.o  COBJS-y  += cpu.o  COBJS-y  += gpio.o  COBJS-y  += interrupts.o diff --git a/arch/blackfin/cpu/cmd_gpio.c b/arch/blackfin/cpu/cmd_gpio.c new file mode 100644 index 000000000..9e505b661 --- /dev/null +++ b/arch/blackfin/cpu/cmd_gpio.c @@ -0,0 +1,120 @@ +/* + * Control GPIO pins on the fly + * + * Copyright (c) 2008-2010 Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#include <common.h> +#include <command.h> + +#include <asm/blackfin.h> +#include <asm/gpio.h> + +enum { +	GPIO_INPUT, +	GPIO_SET, +	GPIO_CLEAR, +	GPIO_TOGGLE, +}; + +int do_gpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ +	if (argc == 2 && !strcmp(argv[1], "status")) { +		bfin_gpio_labels(); +		return 0; +	} + +	if (argc != 3) { + show_usage: +		printf("Usage:\n%s\n", cmdtp->usage); +		return 1; +	} + +	/* parse the behavior */ +	ulong sub_cmd; +	switch (argv[1][0]) { +		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; +	} + +	/* parse the pin with format: [p][port]<#> */ +	const char *str_pin = argv[2]; + +	/* grab the [p]<port> portion */ +	ulong port_base; +	if (*str_pin == 'p') ++str_pin; +	switch (*str_pin) { +#ifdef GPIO_PA0 +		case 'a': port_base = GPIO_PA0; break; +#endif +#ifdef GPIO_PB0 +		case 'b': port_base = GPIO_PB0; break; +#endif +#ifdef GPIO_PC0 +		case 'c': port_base = GPIO_PC0; break; +#endif +#ifdef GPIO_PD0 +		case 'd': port_base = GPIO_PD0; break; +#endif +#ifdef GPIO_PE0 +		case 'e': port_base = GPIO_PE0; break; +#endif +#ifdef GPIO_PF0 +		case 'f': port_base = GPIO_PF0; break; +#endif +#ifdef GPIO_PG0 +		case 'g': port_base = GPIO_PG0; break; +#endif +#ifdef GPIO_PH0 +		case 'h': port_base = GPIO_PH0; break; +#endif +#ifdef GPIO_PI0 +		case 'i': port_base = GPIO_PI0; break; +#endif +#ifdef GPIO_PJ +		case 'j': port_base = GPIO_PJ0; break; +#endif +		default:  goto show_usage; +	} + +	/* grab the <#> portion */ +	ulong pin = simple_strtoul(str_pin + 1, NULL, 10); +	if (pin > 15) +		goto show_usage; + +	/* grab the pin before we tweak it */ +	ulong gpio = port_base + pin; +	gpio_request(gpio, "cmd_gpio"); + +	/* finally, let's do it: set direction and exec command */ +	if (sub_cmd == GPIO_INPUT) { +		gpio_direction_input(gpio); +		printf("gpio: pin %lu on port %c set to input\n", pin, *str_pin); +		return 0; +	} + +	ulong value; +	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 %lu on port %c (gpio %lu) value is %lu\n", +		pin, *str_pin, gpio, value); + +	gpio_free(gpio); + +	return 0; +} + +U_BOOT_CMD(gpio, 3, 0, do_gpio, +	"set/clear/toggle gpio output pins", +	"<set|clear|toggle> <port><pin>\n" +	"    - set/clear/toggle the specified pin (e.g. PF10)"); diff --git a/board/bf537-stamp/Makefile b/board/bf537-stamp/Makefile index 0e15062ba..4f8985b2a 100644 --- a/board/bf537-stamp/Makefile +++ b/board/bf537-stamp/Makefile @@ -29,7 +29,7 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(BOARD).a -COBJS-y	:= $(BOARD).o cmd_bf537led.o +COBJS-y	:= $(BOARD).o  COBJS-$(CONFIG_BFIN_IDE)   += ide-cf.o  COBJS-$(CONFIG_POST)       += post.o post-memory.o diff --git a/board/bf537-stamp/cmd_bf537led.c b/board/bf537-stamp/cmd_bf537led.c deleted file mode 100644 index 7d8f3eadf..000000000 --- a/board/bf537-stamp/cmd_bf537led.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - * U-boot - cmd_bf537led.c - * - * Copyright (C) 2006 Aaron Gage, Ocean Optics Inc. - * - * See file CREDITS for list of people who contributed to this - * project. - * - * 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, - * MA 02111-1307 USA - */ -#include <common.h> -#include <config.h> -#include <command.h> -#include <asm/blackfin.h> -#include <asm/string.h> -#ifdef CONFIG_BF537_STAMP_LEDCMD - -/* Define the command usage in a reusable way */ -#define USAGE_LONG \ -	"led <number> <action>\n" \ -	"    <number>  - Index (0-5) of LED to change, or \"all\"\n" \ -	"    <action>  - Must be one of:\n" \ -	"		on off toggle" - -/* Number of LEDs supported by the board */ -#define NUMBER_LEDS     6 -/* The BF537 stamp has 6 LEDs.  This mask indicates that all should be lit. */ -#define LED_ALL_MASK    0x003F - -void show_cmd_usage(void); -void set_led_state(int index, int state); -void configure_GPIO_to_output(int index); - -/* Map of LEDs according to their GPIO ports.  This can be rearranged or - * otherwise changed to account for different GPIO configurations. - */ -int led_ports[] = { PF6, PF7, PF8, PF9, PF10, PF11 }; - -#define ACTION_TOGGLE   -1 -#define ACTION_OFF      0 -#define ACTION_ON       1 - -#define LED_STATE_OFF   0 -#define LED_STATE_ON    1 - -/* This is a trivial atoi implementation since we don't have one available */ -int atoi(char *string) -{ -	int length; -	int retval = 0; -	int i; -	int sign = 1; - -	length = strlen(string); -	for (i = 0; i < length; i++) { -		if (0 == i && string[0] == '-') { -			sign = -1; -			continue; -		} -		if (string[i] > '9' || string[i] < '0') { -			break; -		} -		retval *= 10; -		retval += string[i] - '0'; -	} -	retval *= sign; -	return retval; -} - -int do_bf537led(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) -{ -	int led_mask = 0; -	int led_current_state = 0; -	int action = ACTION_OFF; -	int temp; - -	if (3 != argc) { -		/* Not enough arguments, so just show usage information */ -		show_cmd_usage(); -		return 1; -	} - -	if (strcmp(argv[1], "all") == 0) { -		led_mask = LED_ALL_MASK; -	} else { -		temp = atoi(argv[1]); -		if (temp < 0 || temp >= NUMBER_LEDS) { -			printf("Invalid LED number [%s]\n", argv[1]); -			show_cmd_usage(); -			return 2; -		} -		led_mask |= (1 << temp); -	} - -	if (strcmp(argv[2], "off") == 0) { -		action = ACTION_OFF; -	} else if (strcmp(argv[2], "on") == 0) { -		action = ACTION_ON; -	} else if (strcmp(argv[2], "toggle") == 0) { -		action = ACTION_TOGGLE; -	} else { -		printf("Invalid action [%s]\n", argv[2]); -		show_cmd_usage(); -		return 3; -	} - -	for (temp = 0; temp < NUMBER_LEDS; temp++) { -		if ((led_mask & (1 << temp)) > 0) { -			/* -			 * It is possible that the user has wired one of PF6-PF11 to -			 * something other than an LED, so this will only change a pin -			 * to output if the user has indicated a state change.  This may -			 * happen a lot, but this way is safer than just setting all pins -			 * to output. -			 */ -			configure_GPIO_to_output(temp); - -			led_current_state = -			    ((*pPORTFIO & led_ports[temp]) > -			     0) ? LED_STATE_ON : LED_STATE_OFF; -	/* -		printf("LED state for index %d (%x) is %d\n", temp, led_ports[temp], -			led_current_state); -		printf("*pPORTFIO is %x\n", *pPORTFIO); -	*/ -			if (ACTION_ON == action -			    || (ACTION_TOGGLE == action -				&& 0 == led_current_state)) { -				printf("Turning LED %d on\n", temp); -				set_led_state(temp, LED_STATE_ON); -			} else { -				printf("Turning LED %d off\n", temp); -				set_led_state(temp, LED_STATE_OFF); -			} -		} -	} - -	return 0; -} - -/* - * The GPIO pins that go to the LEDs on the BF537 stamp must be configured - * as output.  This function simply configures them that way.  This could - * be done to all of the GPIO lines at once, but if a user is using a - * custom board, this will try to be nice and only change the GPIO lines - * that the user specifically names. - */ -void configure_GPIO_to_output(int index) -{ -	int port; - -	port = led_ports[index]; - -	/* Clear the Port F Function Enable Register */ -	*pPORTF_FER &= ~port; -	/* Set the Port F I/O direction register */ -	*pPORTFIO_DIR |= port; -	/* Clear the Port F I/O Input Enable Register */ -	*pPORTFIO_INEN &= ~port; -} - -/* Enforce the given state on the GPIO line for the indicated LED */ -void set_led_state(int index, int state) -{ -	int port; - -	port = led_ports[index]; - -	if (LED_STATE_OFF == state) { -		/* Clear the bit to turn off the LED */ -		*pPORTFIO &= ~port; -	} else { -		/* Set the bit to turn on the LED */ -		*pPORTFIO |= port; -	} -} - -/* Display usage information */ -void show_cmd_usage() -{ -	printf("Usage:\n%s\n", USAGE_LONG); -} - -/* Register information for u-boot to find this command */ -U_BOOT_CMD(led, 3, 1, do_bf537led, -	   "Control BF537 stamp LEDs", USAGE_LONG); - -#endif diff --git a/board/cm-bf527/Makefile b/board/cm-bf527/Makefile index c2cd244cf..bad018aa3 100644 --- a/board/cm-bf527/Makefile +++ b/board/cm-bf527/Makefile @@ -29,7 +29,7 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(BOARD).a -COBJS-y	:= $(BOARD).o gpio.o gpio_cfi_flash.o +COBJS-y	:= $(BOARD).o gpio_cfi_flash.o  SRCS	:= $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)  OBJS	:= $(addprefix $(obj),$(COBJS-y)) diff --git a/board/cm-bf527/gpio.c b/board/cm-bf527/gpio.c deleted file mode 100644 index 7e0babe89..000000000 --- a/board/cm-bf527/gpio.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Control GPIO pins on the fly - * - * Copyright (c) 2008 Analog Devices Inc. - * - * Licensed under the GPL-2 or later. - */ - -#include <common.h> -#include <command.h> - -#include <asm/blackfin.h> - -int do_gpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ -	if (argc != 3) { - show_usage: -		printf("Usage:\n%s\n", cmdtp->usage); -		return 1; -	} - -	/* parse the behavior */ -	ulong port_cmd = 0; -	switch (argv[1][0]) { -		case 'i': break; -		case 's': port_cmd = (PORTFIO_SET - PORTFIO); break; -		case 'c': port_cmd = (PORTFIO_CLEAR - PORTFIO); break; -		case 't': port_cmd = (PORTFIO_TOGGLE - PORTFIO); break; -		default:  goto show_usage; -	} - -	/* parse the pin with format: [p]<fgh><#> */ -	const char *str_pin = argv[2]; - -	/* grab the [p]<fgh> portion */ -	ulong port_base; -	if (*str_pin == 'p') ++str_pin; -	switch (*str_pin) { -		case 'f': port_base = PORTFIO; break; -		case 'g': port_base = PORTGIO; break; -		case 'h': port_base = PORTHIO; break; -		default:  goto show_usage; -	} - -	/* grab the <#> portion */ -	ulong pin = simple_strtoul(str_pin+1, NULL, 10); -	ulong pin_mask = (1 << pin); -	if (pin > 15) -		goto show_usage; - -	/* finally, let's do it: set direction and exec command */ -	switch (*str_pin) { -		case 'f': bfin_write_PORTF_FER(bfin_read_PORTF_FER() & ~pin_mask); break; -		case 'g': bfin_write_PORTG_FER(bfin_read_PORTG_FER() & ~pin_mask); break; -		case 'h': bfin_write_PORTH_FER(bfin_read_PORTH_FER() & ~pin_mask); break; -	} - -	ulong port_dir = port_base + (PORTFIO_DIR - PORTFIO); -	if (argv[1][0] == 'i') -		bfin_write16(port_dir, bfin_read16(port_dir) & ~pin_mask); -	else { -		bfin_write16(port_dir, bfin_read16(port_dir) | pin_mask); -		bfin_write16(port_base + port_cmd, pin_mask); -	} - -	printf("gpio: pin %li on port %c has been %c\n", pin, *str_pin, argv[1][0]); - -	return 0; -} - -U_BOOT_CMD(gpio, 3, 0, do_gpio, -	"gpio    - set/clear/toggle gpio output pins\n", -	"<s|c|t> <port><pin>\n" -	"    - set/clear/toggle the specified pin\n"); diff --git a/board/cm-bf537e/Makefile b/board/cm-bf537e/Makefile index 3812ba1e7..bad018aa3 100644 --- a/board/cm-bf537e/Makefile +++ b/board/cm-bf537e/Makefile @@ -29,7 +29,7 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(BOARD).a -COBJS-y	:= $(BOARD).o flash.o gpio_cfi_flash.o +COBJS-y	:= $(BOARD).o gpio_cfi_flash.o  SRCS	:= $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)  OBJS	:= $(addprefix $(obj),$(COBJS-y)) diff --git a/board/cm-bf537e/flash.c b/board/cm-bf537e/flash.c deleted file mode 100644 index a4c1ec06c..000000000 --- a/board/cm-bf537e/flash.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * flash.c - helper commands for working with GPIO-assisted flash - * - * Copyright (c) 2005-2009 Analog Devices Inc. - * - * Licensed under the GPL-2 or later. - */ - -#include <common.h> -#include <command.h> -#include <asm/blackfin.h> -#include "gpio_cfi_flash.h" - -int do_pf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ -	ulong faddr = CONFIG_SYS_FLASH_BASE; -	ushort data; -	ulong dflg; - -	if (argc > 1) { -		dflg = simple_strtoul(argv[1], NULL, 16); -		faddr |= (dflg << 21); -		gpio_cfi_flash_swizzle((void *)faddr); -	} else { -		data = bfin_read_PORTFIO(); -		printf("Port F data %04x (PF4:%i)\n", data, !!(data & PF4)); -	} - -	return 0; -} - -U_BOOT_CMD(pf, 3, 0, do_pf, -	"set/clear PF4 GPIO flash bank switch\n", -	"<pf4> - set PF4 GPIO pin state\n"); diff --git a/board/cm-bf537u/Makefile b/board/cm-bf537u/Makefile index 3812ba1e7..bad018aa3 100644 --- a/board/cm-bf537u/Makefile +++ b/board/cm-bf537u/Makefile @@ -29,7 +29,7 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(BOARD).a -COBJS-y	:= $(BOARD).o flash.o gpio_cfi_flash.o +COBJS-y	:= $(BOARD).o gpio_cfi_flash.o  SRCS	:= $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)  OBJS	:= $(addprefix $(obj),$(COBJS-y)) diff --git a/board/cm-bf537u/flash.c b/board/cm-bf537u/flash.c deleted file mode 100644 index 52abe790a..000000000 --- a/board/cm-bf537u/flash.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * flash.c - helper commands for working with GPIO-assisted flash - * - * Copyright (c) 2005-2009 Analog Devices Inc. - * - * Licensed under the GPL-2 or later. - */ - -#include <common.h> -#include <command.h> -#include <asm/blackfin.h> -#include "gpio_cfi_flash.h" - -int do_ph(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ -	ulong faddr = CONFIG_SYS_FLASH_BASE; -	ushort data; -	ulong dflg; - -	if (argc > 1) { -		dflg = simple_strtoul(argv[1], NULL, 16); -		faddr |= (dflg << 21); -		gpio_cfi_flash_swizzle((void *)faddr); -	} else { -		data = bfin_read_PORTHIO(); -		printf("Port H data %04x (PH0:%i)\n", data, !!(data & PH0)); -	} - -	return 0; -} - -U_BOOT_CMD(ph, 3, 0, do_ph, -	"set/clear PH0 GPIO flash bank switch\n", -	"<ph0> - set PH0 GPIO pin state\n"); diff --git a/board/tcm-bf537/Makefile b/board/tcm-bf537/Makefile index 3812ba1e7..bad018aa3 100644 --- a/board/tcm-bf537/Makefile +++ b/board/tcm-bf537/Makefile @@ -29,7 +29,7 @@ include $(TOPDIR)/config.mk  LIB	= $(obj)lib$(BOARD).a -COBJS-y	:= $(BOARD).o flash.o gpio_cfi_flash.o +COBJS-y	:= $(BOARD).o gpio_cfi_flash.o  SRCS	:= $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)  OBJS	:= $(addprefix $(obj),$(COBJS-y)) diff --git a/board/tcm-bf537/flash.c b/board/tcm-bf537/flash.c deleted file mode 100644 index 14055c617..000000000 --- a/board/tcm-bf537/flash.c +++ /dev/null @@ -1,37 +0,0 @@ -/* - * flash.c - helper commands for working with GPIO-assisted flash - * - * Copyright (c) 2005-2009 Analog Devices Inc. - * - * Licensed under the GPL-2 or later. - */ - -#include <common.h> -#include <command.h> -#include <asm/blackfin.h> -#include "gpio_cfi_flash.h" - -int do_pf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ -	ulong faddr = CONFIG_SYS_FLASH_BASE; -	ushort data; -	ulong dflg; - -	if (argc == 3) { -		dflg = simple_strtoul(argv[1], NULL, 16); -		faddr |= (dflg << 21); -		dflg = simple_strtoul(argv[2], NULL, 16); -		faddr |= (dflg << 22); -		gpio_cfi_flash_swizzle((void *)faddr); -	} else { -		data = bfin_read_PORTFIO(); -		printf("Port F data %04x (PF4:%i PF5:%i)\n", data, -			!!(data & PF4), !!(data & PF5)); -	} - -	return 0; -} - -U_BOOT_CMD(pf, 3, 0, do_pf, -	"set/clear PF4/PF5 GPIO flash bank switch\n", -	"<pf4> <pf5> - set PF4/PF5 GPIO pin state\n"); diff --git a/include/configs/bf537-stamp.h b/include/configs/bf537-stamp.h index 92ceb3815..cba4ac054 100644 --- a/include/configs/bf537-stamp.h +++ b/include/configs/bf537-stamp.h @@ -268,8 +268,6 @@  #define CONFIG_RTC_BFIN  #define CONFIG_UART_CONSOLE	0 -/* #define CONFIG_BF537_STAMP_LEDCMD	1 */ -  /* Define if want to do post memory test */  #undef CONFIG_POST  #ifdef CONFIG_POST diff --git a/include/configs/bfin_adi_common.h b/include/configs/bfin_adi_common.h index 1896cf53d..fa1e69486 100644 --- a/include/configs/bfin_adi_common.h +++ b/include/configs/bfin_adi_common.h @@ -83,6 +83,7 @@  # define CONFIG_CMD_CPLBINFO  # define CONFIG_CMD_ELF  # define CONFIG_ELF_SIMPLE_LOAD +# define CONFIG_CMD_GPIO  # define CONFIG_CMD_KGDB  # define CONFIG_CMD_REGINFO  # define CONFIG_CMD_STRINGS |