All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marek Vasut <marex@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] i.MX6Q: mx6qsabrelite: Add keypress support to alter boot flow
Date: Thu, 26 Apr 2012 02:17:09 +0200	[thread overview]
Message-ID: <201204260217.09215.marex@denx.de> (raw)
In-Reply-To: <1335399244-31122-1-git-send-email-eric.nelson@boundarydevices.com>

Dear Eric Nelson,

> Uses the 'magic_keys' idiom as described in doc/README.kbd:
> 	http://lists.denx.de/pipermail/u-boot/2012-April/122502.html


If this is a V2 of a patch, please send is as "in-reply-to" and descibe the 
changes below (at spot marked V2 (and V3 etc))... Also, change the keywork 
"PATCH" in teh subject to teh "PATCH V2" etc ;-)

> 
> Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
> Acked-by: Marek Vasut <marex@denx.de>
> ---

V2: <changes>

This is just a nitpick though (and I got about similar scolding in the LAKML 
today, so don't let it bother you ;-) ), thanks for your work ;-)

>  board/freescale/mx6qsabrelite/mx6qsabrelite.c |  122
> ++++++++++++++++++++++++- include/configs/mx6qsabrelite.h               | 
>   3 +
>  2 files changed, 123 insertions(+), 2 deletions(-)
> 
> diff --git a/board/freescale/mx6qsabrelite/mx6qsabrelite.c
> b/board/freescale/mx6qsabrelite/mx6qsabrelite.c index db5e775..f63cef7
> 100644
> --- a/board/freescale/mx6qsabrelite/mx6qsabrelite.c
> +++ b/board/freescale/mx6qsabrelite/mx6qsabrelite.c
> @@ -52,6 +52,10 @@ DECLARE_GLOBAL_DATA_PTR;
>  	PAD_CTL_PUS_100K_DOWN | PAD_CTL_SPEED_MED |		\
>  	PAD_CTL_DSE_40ohm     | PAD_CTL_SRE_FAST)
> 
> +#define BUTTON_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE |		\
> +	PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED   |		\
> +	PAD_CTL_DSE_40ohm   | PAD_CTL_HYS)
> +
>  int dram_init(void)
>  {
>         gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
> @@ -124,6 +128,22 @@ iomux_v3_cfg_t enet_pads2[] = {
>  	MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
>  };
> 
> +/* Button assignments for J14 */
> +static iomux_v3_cfg_t button_pads[] = {
> +	/* Menu */
> +	MX6Q_PAD_NANDF_D1__GPIO_2_1	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
> +	/* Back */
> +	MX6Q_PAD_NANDF_D2__GPIO_2_2	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
> +	/* Labelled Search (mapped to Power under Android) */
> +	MX6Q_PAD_NANDF_D3__GPIO_2_3	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
> +	/* Home */
> +	MX6Q_PAD_NANDF_D4__GPIO_2_4	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
> +	/* Volume Down */
> +	MX6Q_PAD_GPIO_19__GPIO_4_5	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
> +	/* Volume Up */
> +	MX6Q_PAD_GPIO_18__GPIO_7_13	| MUX_PAD_CTRL(BUTTON_PAD_CTRL),
> +};
> +
>  static void setup_iomux_enet(void)
>  {
>  	gpio_direction_output(87, 0);  /* GPIO 3-23 */
> @@ -295,11 +315,18 @@ int setup_sata(void)
>  }
>  #endif
> 
> +static void setup_buttons(void)
> +{
> +	imx_iomux_v3_setup_multiple_pads(button_pads,
> +					 ARRAY_SIZE(button_pads));
> +}
> +
>  int board_early_init_f(void)
>  {
> -       setup_iomux_uart();
> +	setup_iomux_uart();
> +	setup_buttons();
> 
> -       return 0;
> +	return 0;
>  }
> 
>  int board_init(void)
> @@ -324,3 +351,94 @@ int checkboard(void)
> 
>         return 0;
>  }
> +
> +struct button_key {
> +	char const	*name;
> +	unsigned	gpnum;
> +	char		ident;
> +};
> +
> +static struct button_key const buttons[] = {
> +	{"back",	GPIO_NUMBER(2, 2),	'B'},
> +	{"home",	GPIO_NUMBER(2, 4),	'H'},
> +	{"menu",	GPIO_NUMBER(2, 1),	'M'},
> +	{"search",	GPIO_NUMBER(2, 3),	'S'},
> +	{"volup",	GPIO_NUMBER(7, 13),	'V'},
> +	{"voldown",	GPIO_NUMBER(4, 5),	'v'},
> +};
> +
> +/*
> + * generate a null-terminated string containing the buttons pressed
> + * returns number of keys pressed
> + */
> +static int read_keys(char *buf)
> +{
> +	int i, numpressed = 0;
> +	for (i = 0; i < ARRAY_SIZE(buttons); i++) {
> +		if (!gpio_get_value(buttons[i].gpnum))
> +			buf[numpressed++] = buttons[i].ident;
> +	}
> +	buf[numpressed] = '\0';
> +	return numpressed;
> +}
> +
> +static int do_kbd(cmd_tbl_t *cmdtp, int flag, int argc, char * const
> argv[]) +{
> +	char envvalue[ARRAY_SIZE(buttons)+1];
> +	int numpressed = read_keys(envvalue);
> +	setenv("keybd", envvalue);
> +	return numpressed == 0;
> +}
> +
> +U_BOOT_CMD(
> +	kbd, 1, 1, do_kbd,
> +	"Tests for keypresses, sets 'keybd' environment variable",
> +	"Returns 0 (true) to shell if key is pressed."
> +);
> +
> +#ifdef CONFIG_PREBOOT
> +static char const kbd_magic_prefix[] = "key_magic";
> +static char const kbd_command_prefix[] = "key_cmd";
> +
> +static void preboot_keys(void)
> +{
> +	int numpressed;
> +	char keypress[ARRAY_SIZE(buttons)+1];
> +	numpressed = read_keys(keypress);
> +	if (numpressed) {
> +		char *kbd_magic_keys = getenv("magic_keys");
> +		char *suffix;
> +		/*
> +		 * loop over all magic keys
> +		 */
> +		for (suffix = kbd_magic_keys; *suffix; ++suffix) {
> +			char *keys;
> +			char magic[sizeof(kbd_magic_prefix) + 1];
> +			sprintf(magic, "%s%c", kbd_magic_prefix, *suffix);
> +			keys = getenv(magic);
> +			if (keys) {
> +				if (!strcmp(keys, keypress))
> +					break;
> +			}
> +		}
> +		if (*suffix) {
> +			char cmd_name[sizeof(kbd_command_prefix) + 1];
> +			char *cmd;
> +			sprintf(cmd_name, "%s%c", kbd_command_prefix, *suffix);
> +			cmd = getenv(cmd_name);
> +			if (cmd) {
> +				setenv("preboot", cmd);
> +				return;
> +			}
> +		}
> +	}
> +}
> +#endif
> +
> +int misc_init_r(void)
> +{
> +#ifdef CONFIG_PREBOOT
> +	preboot_keys();
> +#endif
> +	return 0;
> +}
> diff --git a/include/configs/mx6qsabrelite.h
> b/include/configs/mx6qsabrelite.h index 50b5c31..c0511c7 100644
> --- a/include/configs/mx6qsabrelite.h
> +++ b/include/configs/mx6qsabrelite.h
> @@ -42,6 +42,7 @@
> 
>  #define CONFIG_ARCH_CPU_INIT
>  #define CONFIG_BOARD_EARLY_INIT_F
> +#define CONFIG_MISC_INIT_R
>  #define CONFIG_MXC_GPIO
> 
>  #define CONFIG_MXC_UART
> @@ -123,6 +124,8 @@
> 
>  #define CONFIG_BOOTDELAY	       3
> 
> +#define CONFIG_PREBOOT                 ""
> +
>  #define CONFIG_LOADADDR			       0x10800000
>  #define CONFIG_SYS_TEXT_BASE	       0x17800000

  reply	other threads:[~2012-04-26  0:17 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <http://lists.denx.de/pipermail/u-boot/2012-April/#122514>
2012-04-26  0:14 ` [U-Boot] [PATCH] i.MX6Q: mx6qsabrelite: Add keypress support to alter boot flow Eric Nelson
2012-04-26  0:17   ` Marek Vasut [this message]
2012-04-26  0:31     ` Eric Nelson
2012-04-26 10:12       ` Marek Vasut
2012-04-29 14:54         ` Stefano Babic
2012-04-29 14:59   ` Stefano Babic
2012-04-29 18:24     ` Eric Nelson
2012-04-29 18:37       ` stefano babic

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201204260217.09215.marex@denx.de \
    --to=marex@denx.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.