[U-Boot] [PATCH V3 0/9] display and keypad support for nhk8815

This patch series is very similar to V2 I sent on Nov 25th, only 2/9 and 9/9 are different.
Changes from V2:
* the clcd driver using a C structure instead of numeric defines for register offsets. Renamed previous clcdc_regs to clcd_config, since regs is now the hardware-description structure.
* added "address" field to clcd_config, so clcd.c doesn't include anithing specific to Nomadik and can be use unchanged by other clcd-equipped SoCs.
ps: Wolfgang: while I understand patches must be posted, I offered to avoid extra traffic if it was only a matter of removing printf. Won't do that again, lesson learnt.
Alessandro Rubini (9): nhk8815: change the order of initialization video: add amba-clcd prime-cell include/nomadik.h: add physical address for cldc drivers/misc: add stmpe2401 port extender and keypad controller nhk8815.h: define we need stmpe lcd: make 16bpp work nhk8815: added keypad nhk8815: start lower in RAM, so the 800x480 frame buffer fits nhk8815: added lcd support
board/st/nhk8815/Makefile | 6 +- board/st/nhk8815/config.mk | 8 +- board/st/nhk8815/keypad.c | 99 +++++++++++++++++++ board/st/nhk8815/lcd.c | 88 +++++++++++++++++ board/st/nhk8815/nhk8815-devices.h | 8 ++ board/st/nhk8815/nhk8815.c | 38 +++++-- common/lcd.c | 27 ++++- drivers/misc/Makefile | 1 + drivers/misc/stmpe2401.c | 191 ++++++++++++++++++++++++++++++++++++ drivers/video/Makefile | 1 + drivers/video/amba.c | 79 +++++++++++++++ include/amba_clcd.h | 77 +++++++++++++++ include/configs/nhk8815.h | 20 ++++- include/nomadik.h | 1 + include/stmpe2401.h | 66 ++++++++++++ 15 files changed, 687 insertions(+), 23 deletions(-) create mode 100644 board/st/nhk8815/keypad.c create mode 100644 board/st/nhk8815/lcd.c create mode 100644 board/st/nhk8815/nhk8815-devices.h create mode 100644 drivers/misc/stmpe2401.c create mode 100644 drivers/video/amba.c create mode 100644 include/amba_clcd.h create mode 100644 include/stmpe2401.h

From: Alessandro Rubini rubini@unipv.it
Some inizialization was in board_late_init(), but to satisfy drivers added in the next patches must be performed in normal board_init. This patch leaves board_late_init() empty, but later patches fill it.
Signed-off-by: Alessandro Rubini rubini@unipv.it Acked-by: Andrea Gallo andrea.gallo@stericsson.com --- board/st/nhk8815/nhk8815.c | 31 +++++++++++++++++++++---------- 1 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/board/st/nhk8815/nhk8815.c b/board/st/nhk8815/nhk8815.c index faef810..eadce40 100644 --- a/board/st/nhk8815/nhk8815.c +++ b/board/st/nhk8815/nhk8815.c @@ -60,22 +60,26 @@ int board_init(void) writel(0x02100551, NOMADIK_FSMC_BASE + 0x04); /* FSMC_BTR0 */
icache_enable(); - return 0; -}
-int board_late_init(void) -{ + /* + * Configure I2C pins, as we will use I2C in a later commit + */ + /* Set the two I2C gpio lines to be gpio high */ nmk_gpio_set(__SCL, 1); nmk_gpio_set(__SDA, 1); nmk_gpio_dir(__SCL, 1); nmk_gpio_dir(__SDA, 1); nmk_gpio_af(__SCL, GPIO_GPIO); nmk_gpio_af(__SDA, GPIO_GPIO);
- /* Reset the I2C port expander, on GPIO77 */ - nmk_gpio_af(77, GPIO_GPIO); - nmk_gpio_dir(77, 1); - nmk_gpio_set(77, 0); - udelay(10); - nmk_gpio_set(77, 1); + /* Put the two I2C port expanders out of reset, on GPIO77 and 79 */ + { + int n[2]={77, 79}; + int i; + for (i = 0; i < ARRAY_SIZE(n); i++) { + nmk_gpio_af(n[i], GPIO_GPIO); + nmk_gpio_dir(n[i], 1); + nmk_gpio_set(n[i], 1); + } + }
return 0; } @@ -101,3 +105,10 @@ int board_eth_init(bd_t *bis) return rc; } #endif + +/* Initialization callback, from lib_arm/board.c */ +int board_late_init(void) +{ + return 0; +} +

From: Alessandro Rubini rubini@unipv.it
This adds support for the CLCD logic cell. It accepts precompiled register values for specific configuration through a board-supplied data structure. It is used by the Nomadik nhk8815, added by a later patch in this series.
Signed-off-by: Alessandro Rubini rubini@unipv.it Acked-by: Andrea Gallo andrea.gallo@stericsson.com --- drivers/video/Makefile | 1 + drivers/video/amba.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++ include/amba_clcd.h | 77 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 0 deletions(-) create mode 100644 drivers/video/amba.c create mode 100644 include/amba_clcd.h
diff --git a/drivers/video/Makefile b/drivers/video/Makefile index bb6b5a0..a5e339a 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile @@ -29,6 +29,7 @@ COBJS-$(CONFIG_ATI_RADEON_FB) += ati_radeon_fb.o COBJS-$(CONFIG_ATMEL_LCD) += atmel_lcdfb.o COBJS-$(CONFIG_CFB_CONSOLE) += cfb_console.o COBJS-$(CONFIG_S6E63D6) += s6e63d6.o +COBJS-$(CONFIG_VIDEO_AMBA) += amba.o COBJS-$(CONFIG_VIDEO_CT69000) += ct69000.o COBJS-$(CONFIG_VIDEO_MB862xx) += mb862xx.o COBJS-$(CONFIG_VIDEO_MX3) += mx3fb.o diff --git a/drivers/video/amba.c b/drivers/video/amba.c new file mode 100644 index 0000000..ffa1c39 --- /dev/null +++ b/drivers/video/amba.c @@ -0,0 +1,79 @@ +/* + * Driver for AMBA PrimeCell CLCD + * + * Copyright (C) 2009 Alessandro Rubini + * + * 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 <asm/io.h> +#include <lcd.h> +#include <amba_clcd.h> + +/* These variables are required by lcd.c -- although it sets them by itself */ +int lcd_line_length; +int lcd_color_fg; +int lcd_color_bg; +void *lcd_base; +void *lcd_console_address; +short console_col; +short console_row; + +/* + * To use this driver you need to provide the following in board files: + * a panel_info definition + * an lcd_enable function (can't define a weak default with current code) + */ + +/* There is nothing to do with color registers, we use true color */ +void lcd_setcolreg(ushort regno, ushort red, ushort green, ushort blue) +{ + return; +} + +/* Low level initialization of the logic cell: depends on panel_info */ +void lcd_ctrl_init(void *lcdbase) +{ + struct clcd_config *config; + struct clcd_registers *regs; + u32 cntl; + + config = panel_info.priv; + regs = config->address; + cntl = config->cntl & ~CNTL_LCDEN; + + /* Lazily, just copy the registers over: first control with disable */ + writel(cntl, ®s->cntl); + + writel(config->tim0, ®s->tim0); + writel(config->tim1, ®s->tim1); + writel(config->tim2, ®s->tim2); + writel(config->tim3, ®s->tim3); + writel((u32)lcdbase, ®s->ubas); + /* finally, enable */ + writel(cntl | CNTL_LCDEN, ®s->cntl); +} + +/* This is trivial, and copied from atmel_lcdfb.c */ +ulong calc_fbsize(void) +{ + return ((panel_info.vl_col * panel_info.vl_row * + NBITS(panel_info.vl_bpix)) / 8) + PAGE_SIZE; +} diff --git a/include/amba_clcd.h b/include/amba_clcd.h new file mode 100644 index 0000000..db80517 --- /dev/null +++ b/include/amba_clcd.h @@ -0,0 +1,77 @@ +/* + * Register definitions for the AMBA CLCD logic cell. + * + * derived from David A Rusling, although rearranged as a C structure + * linux/include/asm-arm/hardware/amba_clcd.h -- Integrator LCD panel. + * + * Copyright (C) 2001 ARM Limited + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive + * for more details. + */ + +/* + * CLCD Controller Internal Register addresses + */ +struct clcd_registers { + u32 tim0; /* 0x00 */ + u32 tim1; + u32 tim2; + u32 tim3; + u32 ubas; /* 0x10 */ + u32 lbas; +#if !defined(CONFIG_ARCH_VERSATILE) && !defined(CONFIG_ARCH_REALVIEW) + u32 ienb; + u32 cntl; +#else /* Someone rearranged these two registers on the Versatile */ + u32 cntl; + u32 ienb; +#endif + u32 stat; /* 0x20 */ + u32 intr; + u32 ucur; + u32 lcur; + u32 unused[0x74]; /* 0x030..0x1ff */ + u32 palette[0x80]; /* 0x200..0x3ff */ +}; + +/* Bit definition for TIM2 */ +#define TIM2_CLKSEL (1 << 5) +#define TIM2_IVS (1 << 11) +#define TIM2_IHS (1 << 12) +#define TIM2_IPC (1 << 13) +#define TIM2_IOE (1 << 14) +#define TIM2_BCD (1 << 26) + +/* Bit definitions for control register */ +#define CNTL_LCDEN (1 << 0) +#define CNTL_LCDBPP1 (0 << 1) +#define CNTL_LCDBPP2 (1 << 1) +#define CNTL_LCDBPP4 (2 << 1) +#define CNTL_LCDBPP8 (3 << 1) +#define CNTL_LCDBPP16 (4 << 1) +#define CNTL_LCDBPP16_565 (6 << 1) +#define CNTL_LCDBPP24 (5 << 1) +#define CNTL_LCDBW (1 << 4) +#define CNTL_LCDTFT (1 << 5) +#define CNTL_LCDMONO8 (1 << 6) +#define CNTL_LCDDUAL (1 << 7) +#define CNTL_BGR (1 << 8) +#define CNTL_BEBO (1 << 9) +#define CNTL_BEPO (1 << 10) +#define CNTL_LCDPWR (1 << 11) +#define CNTL_LCDVCOMP(x) ((x) << 12) +#define CNTL_LDMAFIFOTIME (1 << 15) +#define CNTL_WATERMARK (1 << 16) + +/* u-boot specific: information passed by the board file */ +struct clcd_config { + struct clcd_registers *address; + u32 tim0; + u32 tim1; + u32 tim2; + u32 tim3; + u32 cntl; + unsigned long pixclock; +};

On Sat, 5 Dec 2009 13:39:31 +0100 Alessandro Rubini rubini-list@gnudd.com wrote:
From: Alessandro Rubini rubini@unipv.it
This adds support for the CLCD logic cell. It accepts precompiled register values for specific configuration through a board-supplied data structure. It is used by the Nomadik nhk8815, added by a later patch in this series.
Signed-off-by: Alessandro Rubini rubini@unipv.it Acked-by: Andrea Gallo andrea.gallo@stericsson.com
drivers/video/Makefile | 1 + drivers/video/amba.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++ include/amba_clcd.h | 77 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 0 deletions(-) create mode 100644 drivers/video/amba.c create mode 100644 include/amba_clcd.h
Applied to u-boot-video/next. Thanks!
Best regards, Anatolij

From: Alessandro Rubini rubini@unipv.it
Signed-off-by: Alessandro Rubini rubini@unipv.it Acked-by: Andrea Gallo andrea.gallo@stericsson.com --- include/nomadik.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/include/nomadik.h b/include/nomadik.h index d9405fd..ea65b2d 100644 --- a/include/nomadik.h +++ b/include/nomadik.h @@ -4,6 +4,7 @@ #define __NOMADIK_H__
/* Base addresses of our peripherals */ +#define NOMADIK_CLCDC_BASE 0x10120000 /* CLCD Controller */ #define NOMADIK_SRC_BASE 0x101E0000 /* System and Reset Cnt */ #define NOMADIK_PMU_BASE 0x101E9000 /* Power Management Unit */ #define NOMADIK_MPMC_BASE 0x10110000 /* SDRAM Controller */

On Sat, 5 Dec 2009 13:39:41 +0100 Alessandro Rubini rubini-list@gnudd.com wrote:
From: Alessandro Rubini rubini@unipv.it
Signed-off-by: Alessandro Rubini rubini@unipv.it Acked-by: Andrea Gallo andrea.gallo@stericsson.com
include/nomadik.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
Applied to u-boot-video/next. Thanks!
Best regards, Anatolij

From: Alessandro Rubini rubini@unipv.it
This driver is an i2c device acting as a port extender. Since the keypad can be configured to act on specific row and column lines, the specific setup is passed by the board file. This is used by the Nomadik nhk8815, through a later patch in this series.
Signed-off-by: Alessandro Rubini rubini@unipv.it Acked-by: Andrea Gallo andrea.gallo@stericsson.com --- drivers/misc/Makefile | 1 + drivers/misc/stmpe2401.c | 191 ++++++++++++++++++++++++++++++++++++++++++++++ include/stmpe2401.h | 66 ++++++++++++++++ 3 files changed, 258 insertions(+), 0 deletions(-) create mode 100644 drivers/misc/stmpe2401.c create mode 100644 include/stmpe2401.h
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index f6df60f..76c009a 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -30,6 +30,7 @@ COBJS-$(CONFIG_DS4510) += ds4510.o COBJS-$(CONFIG_FSL_LAW) += fsl_law.o COBJS-$(CONFIG_NS87308) += ns87308.o COBJS-$(CONFIG_STATUS_LED) += status_led.o +COBJS-$(CONFIG_STMPE2401) += stmpe2401.o COBJS-$(CONFIG_TWL4030_LED) += twl4030_led.o
COBJS := $(COBJS-y) diff --git a/drivers/misc/stmpe2401.c b/drivers/misc/stmpe2401.c new file mode 100644 index 0000000..f347d07 --- /dev/null +++ b/drivers/misc/stmpe2401.c @@ -0,0 +1,191 @@ +/* + * board/st/nhk8815/egpio.c: extended gpio as found on nhk8815 board + * + * Copyright 2009 Alessandro Rubini rubini@unipv.it + * + * 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 <i2c.h> +#include <stmpe2401.h> + +/* + * First, an interface to set and read registers, used in this file as well + */ +int pe_getreg(int addr, int reg) +{ + unsigned char val8 = reg; + int ret; + + ret = i2c_read(addr, reg, 1 /* len */, &val8, 1); + if (ret < 0) + return ret; + return val8; +} + +int pe_setreg(int addr, int reg, int val) +{ + unsigned char val8 = val; + + return i2c_write(addr, reg, 1, &val8, 1); +} + +/* + * Generic higher-level GPIO interface + */ +int pe_gpio_af(int addr, int pin, int af) +{ + int regval; + + regval = pe_getreg(addr, PE_GPIO_AFR(pin)); + if (regval < 0) + return regval; + regval &= ~PE_GPIO_AF_MASK(pin); + regval |= af << PE_GPIO_AF_SHIFT(pin); + return pe_setreg(addr, PE_GPIO_AFR(pin), regval); +} + +int pe_gpio_dir(int addr, int pin, int dir) +{ + int regval; + + /* 0 == input, 1 == output */ + regval = pe_getreg(addr, PE_GPIO_GPDR(pin)); + if (regval < 0) + return regval; + regval &= ~PE_GPIO_MASK(pin); + if (dir) + regval |= PE_GPIO_MASK(pin); + return pe_setreg(addr, PE_GPIO_GPDR(pin), regval); +} + +int pe_gpio_pud(int addr, int pin, int pu, int pd) +{ + int regval, mask = PE_GPIO_MASK(pin); + + /* change pullup */ + regval = pe_getreg(addr, PE_GPIO_GPPUR(pin)); + if (regval < 0) + return regval; + if (pu) + regval |= mask; + else + regval &= ~mask; + regval = pe_setreg(addr, PE_GPIO_GPPUR(pin), regval); + if (regval < 0) + return regval; + + /* change pulldown */ + regval = pe_getreg(addr, PE_GPIO_GPPDR(pin)); + if (regval < 0) + return regval; + if (pu) + regval |= mask; + else + regval &= ~mask; + regval = pe_setreg(addr, PE_GPIO_GPPDR(pin), regval); + if (regval < 0) + return regval; + + return 0; +} + +int pe_gpio_set(int addr, int pin, int val) +{ + int reg; + + if (val) + reg = PE_GPIO_GPSR(pin); + else + reg = PE_GPIO_GPCR(pin); + + return pe_setreg(addr, reg, PE_GPIO_MASK(pin)); +} + +int pe_gpio_get(int addr, int pin) +{ + int regval; + + regval = pe_getreg(addr, PE_GPIO_GPMR(pin)); + if (regval < 0) + return regval; + return (regval & PE_GPIO_MASK(pin)) ? 1 : 0; +} + +/* + * Generic higher-level keypad interface: we have 12 rows out, 8 columns in + */ +int pe_kpc_init(int addr, int rowmask, int colmask, int debounce_ms) +{ + int i; + /* note that gpio15 is missing in the rows, so use tables */ + static unsigned char row_to_gpio[12] = { + 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20}; + static unsigned char col_to_gpio[8] = { + 0, 1, 2, 3, 4, 5, 6, 7}; + + /* First, configure pins for alternate functions (and pullup) */ + for (i = 0; i < ARRAY_SIZE(row_to_gpio); i++) { + if (rowmask & (1 << i)) { + pe_gpio_dir(addr, row_to_gpio[i], 1 /* out */); + pe_gpio_af(addr, row_to_gpio[i], PE_GPIO_AF_AF1); + pe_gpio_pud(addr, row_to_gpio[i], 0, 0); + } + } + for (i = 0; i < ARRAY_SIZE(col_to_gpio); i++) { + if (colmask & (1 << i)) { + pe_gpio_dir(addr, col_to_gpio[i], 0 /* in */); + pe_gpio_af(addr, col_to_gpio[i], PE_GPIO_AF_AF1); + pe_gpio_pud(addr, col_to_gpio[i], 1, 0); + } + } + + /* Set configuration for kpc: no support for dedicated keys */ + pe_setreg(addr, PE_KPC_COL, colmask); + pe_setreg(addr, PE_KPC_ROW_MSB, 0xc0 | (rowmask >> 8)); + pe_setreg(addr, PE_KPC_ROW_LSB, rowmask & 0xff); + pe_setreg(addr, PE_KPC_CTRL_MSB, 0x30 /* scan count is 3 */); + pe_setreg(addr, PE_KPC_CTRL_LSB, debounce_ms << 1); + + /* Configure interrupt controller */ + pe_setreg(addr, PE_ICR_LSB, 0x1); /* level, active low */ + pe_setreg(addr, PE_IER_LSB, 0x2); /* bit1: keypad */ + + /* Start scanning */ + pe_setreg(addr, PE_KPC_CTRL_LSB, (debounce_ms << 1) | 1); + return 0; +} + +int pe_kpc_getkey(int addr, int *row, int *col) +{ + int key0, key1; + + /* ack irq: bit 1 is keypad */ + pe_setreg(addr, PE_ISR_LSB, 0x2); + /* get data -- one key only at a time: ignore key1*/ + key0 = pe_getreg(addr, PE_KPC_DATA0); + key1 = pe_getreg(addr, PE_KPC_DATA1); + if (key0 & 0x80) /* release: return error */ + return -1; + if ((key0 & 0x78) == 0x78) /* no key reported */ + return -1; + *row = ((key0 & 0x78) >> 3); + *col = key0 & 0x07; + return 0; +} diff --git a/include/stmpe2401.h b/include/stmpe2401.h new file mode 100644 index 0000000..3f513df --- /dev/null +++ b/include/stmpe2401.h @@ -0,0 +1,66 @@ +/* + * Defines and rototypes for port extender STMPE2401. Use "PE_" as short prefix. + */ + +#ifndef __STMPE2401_H +#define __STMPE2401_H + +/* + * registers for the EGPIO blocks: we have groups of three registers, + * starting from MSB, so use negative offsets from LSB. + */ +#define PE_GPIO_OFFSET(gpio) (- (gpio) / 8) +#define PE_GPIO_MASK(gpio) (1 << ((gpio) & 7)) + +#define PE_GPIO_GPMR(gpio) (0xa4 + PE_GPIO_OFFSET(gpio)) /* monitor */ +#define PE_GPIO_GPCR(gpio) (0x88 + PE_GPIO_OFFSET(gpio)) /* clear */ +#define PE_GPIO_GPSR(gpio) (0x85 + PE_GPIO_OFFSET(gpio)) /* set */ +#define PE_GPIO_GPDR(gpio) (0x8b + PE_GPIO_OFFSET(gpio)) /* direction */ +#define PE_GPIO_GPPUR(gpio) (0x97 + PE_GPIO_OFFSET(gpio)) /* pull-up */ +#define PE_GPIO_GPPDR(gpio) (0x9a + PE_GPIO_OFFSET(gpio)) /* pull-down */ + +/* for alternate function, we have two bits per gpio, so 6 registers */ +#define PE_GPIO_AF_OFFSET(gpio) (- (gpio) / 4) +#define PE_GPIO_AF_SHIFT(gpio) (2 * ((gpio) & 3)) +#define PE_GPIO_AF_MASK(gpio) (3 << PE_GPIO_AF_SHIFT(gpio)) +#define PE_GPIO_AFR(gpio) (0xa0 + PE_GPIO_AF_OFFSET(gpio)) + +enum egpio_af { + PE_GPIO_AF_GPIO = 0, + PE_GPIO_AF_AF1, + PE_GPIO_AF_AF2, + PE_GPIO_AF_AF3 +}; + +/* keypad controller registers */ +#define PE_KPC_COL 0x60 +#define PE_KPC_ROW_MSB 0x61 +#define PE_KPC_ROW_LSB 0x62 +#define PE_KPC_CTRL_MSB 0x63 +#define PE_KPC_CTRL_LSB 0x64 +#define PE_KPC_DATA0 0x68 +#define PE_KPC_DATA1 0x69 +#define PE_KPC_DATA2 0x6a + +/* interrupt controller registers (not all of them: we only need the LSB) */ +#define PE_ICR_LSB 0x11 /* control reg */ +#define PE_IER_LSB 0x13 /* enable reg */ +#define PE_ISR_LSB 0x15 /* status reg */ + +/* + * prototypes of public functions + */ +extern int pe_getreg(int addr, int reg); +extern int pe_setreg(int addr, int reg, int val); + +extern int pe_gpio_af(int addr, int gpio, int af); +extern int pe_gpio_dir(int addr, int gpio, int dir); +extern int pe_gpio_pud(int addr, int gpio, int pu, int pd); +extern int pe_gpio_set(int addr, int gpio, int val); +extern int pe_gpio_get(int addr, int gpio); + +/* here, rowmask is bits 0..11 for outputs, colmask is bits 0..7, for inputs */ +extern int pe_kpc_init(int addr, int rowmask, int colmask, int debounce_ms); +extern int pe_kpc_getkey(int addr, int *row, int *col); + +#endif /* __STMPE2401_H */

From: Alessandro Rubini rubini@unipv.it
Signed-off-by: Alessandro Rubini rubini@unipv.it Acked-by: Andrea Gallo andrea.gallo@stericsson.com --- include/configs/nhk8815.h | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-)
diff --git a/include/configs/nhk8815.h b/include/configs/nhk8815.h index a00c2fb..e1be45b 100644 --- a/include/configs/nhk8815.h +++ b/include/configs/nhk8815.h @@ -110,7 +110,7 @@ #define CONFIG_PL01x_PORTS { (void *)CFG_SERIAL0, (void *)CFG_SERIAL1 } #define CONFIG_PL011_CLOCK 48000000
-/* i2c, for the port extenders (uses gpio.c in board directory) */ +/* i2c, for the stmpe2401 port extenders (uses gpio.c in board directory) */ #ifndef __ASSEMBLY__ #include <asm/arch/gpio.h> #define CONFIG_CMD_I2C @@ -126,6 +126,11 @@ #define I2C_DELAY (udelay(2)) #endif /* __ASSEMBLY__ */
+/* Activate port extenders and define their i2c address */ +#define CONFIG_STMPE2401 +#define STMPE0 0x43 +#define STMPE1 0x44 + /* Ethernet */ #define PCI_MEMORY_VADDR 0xe8000000 #define PCI_IO_VADDR 0xee000000

From: Alessandro Rubini rubini@unipv.it
Support for 16bpp was supposed to be in the code but was not working. This makes it work and has been tested in the nhk8815 board.
Signed-off-by: Alessandro Rubini rubini@unipv.it Acked-by: Andrea Gallo andrea.gallo@stericsson.com --- common/lcd.c | 27 +++++++++++++++++++++------ 1 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/common/lcd.c b/common/lcd.c index 4e31618..3d9bfdf 100644 --- a/common/lcd.c +++ b/common/lcd.c @@ -63,7 +63,7 @@ /************************************************************************/ #ifdef CONFIG_LCD_LOGO # include <bmp_logo.h> /* Get logo data, width and height */ -# if (CONSOLE_COLOR_WHITE >= BMP_LOGO_OFFSET) +# if (CONSOLE_COLOR_WHITE >= BMP_LOGO_OFFSET) && (LCD_BPP != LCD_COLOR16) # error Default Color Map overlaps with Logo Color Map # endif #endif @@ -218,8 +218,12 @@ static void lcd_drawchars (ushort x, ushort y, uchar *str, int count)
for (row=0; row < VIDEO_FONT_HEIGHT; ++row, dest += lcd_line_length) { uchar *s = str; - uchar *d = dest; int i; +#if LCD_BPP == LCD_COLOR16 + ushort *d = (ushort *)dest; +#else + uchar *d = dest; +#endif
#if LCD_BPP == LCD_MONOCHROME uchar rest = *d & -(1 << (8-off)); @@ -244,9 +248,8 @@ static void lcd_drawchars (ushort x, ushort y, uchar *str, int count) bits <<= 1; } #elif LCD_BPP == LCD_COLOR16 - for (c=0; c<16; ++c) { - *d++ = (bits & 0x80) ? - lcd_color_fg : lcd_color_bg; + for (c=0; c<8; ++c) { + *d++ = (bits & 0x80) ? 0xffff : 0; bits <<= 1; } #endif @@ -529,6 +532,13 @@ void bitmap_plot (int x, int y) cmap = (ushort *)&(cp->lcd_cmap[BMP_LOGO_OFFSET*sizeof(ushort)]); #elif defined(CONFIG_ATMEL_LCD) cmap = (uint *) (panel_info.mmio + ATMEL_LCDC_LUT(0)); +#else + /* + * default case: generic system with no cmap (most likely 16bpp) + * We set cmap to the source palette, so no change is done. + * This avoids even more ifdef in the next stanza + */ + cmap = bmp_logo_palette; #endif
WATCHDOG_RESET(); @@ -567,10 +577,15 @@ void bitmap_plot (int x, int y) } } else { /* true color mode */ + u16 col16; fb16 = (ushort *)(lcd_base + y * lcd_line_length + x); for (i=0; i<BMP_LOGO_HEIGHT; ++i) { for (j=0; j<BMP_LOGO_WIDTH; j++) { - fb16[j] = bmp_logo_palette[(bmap[j])]; + col16 = bmp_logo_palette[(bmap[j]-16)]; + fb16[j] = + ((col16 & 0x000F) << 1) | + ((col16 & 0x00F0) << 3) | + ((col16 & 0x0F00) << 4); } bmap += BMP_LOGO_WIDTH; fb16 += panel_info.vl_col;

Sorry for this late though about lcd issues.
lcd_color_fg : lcd_color_bg;
*d++ = (bits & 0x80) ? 0xffff : 0;
Here my patch uses hardwired 0 and ~0 for 16-bit pixels. Anatolij suggested to use lcd_color_fg and lcd_color_bg as in the original code, but unfortunately it doesn't work.
lcd_color_fg is set by common/lcd.c itself, using this function:
static void lcd_setfgcolor (int color) { #ifdef CONFIG_ATMEL_LCD lcd_color_fg = color; #else lcd_color_fg = color & 0x0F; #endif }
So, however white I declare my color, it turns out blue. While I'd understand a difference based on LCD_COLOR8 and LCD_COLOR16 (but even in that case I'd request the caller to do the right thing avoiding this late "fix"), I really can't tell why the atmel display is different from other ones.
It's true that I can force lcd_color_fg to whatever I want, but only after lcd_clear() is called. Moreover, if there's centralized I wouldn't cowardly change it behind it's back.
This is one of the reasons why my original post was an RFC. common/lcd.c is quite a mess and touching it is difficult.
At this point I still think forcing 0xffff and 0, ignoring lcd_color_fg, is the right thing to do at least until atmel specifics are removed from common/lcd.c.
BTW: I have a 9263ek an a 9261ek, so I might be able to try to propose an atmel-related cleanup in the future, but not on short term, unfortunately.
/alessandro

Not all boards defining LCD_COLOR16 are able to set lcd_color_fg/lcd_color_bg correctly. The issue seems to be caused by CONFIG_ATMEL_LCD ifdefs in lcd_setfgcolor() and lcd_setbgcolor(). Actually, the color values passed to these functions are already correct, we don't need to fix them. So remove ifdefs here.
Reported-by: Alessandro Rubini rubini@unipv.it Signed-off-by: Anatolij Gustschin agust@denx.de --- Alessandro, please test. Thanks.
common/lcd.c | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-)
diff --git a/common/lcd.c b/common/lcd.c index 4e31618..db799db 100644 --- a/common/lcd.c +++ b/common/lcd.c @@ -456,22 +456,14 @@ ulong lcd_setmem (ulong addr)
static void lcd_setfgcolor (int color) { -#ifdef CONFIG_ATMEL_LCD lcd_color_fg = color; -#else - lcd_color_fg = color & 0x0F; -#endif }
/*----------------------------------------------------------------------*/
static void lcd_setbgcolor (int color) { -#ifdef CONFIG_ATMEL_LCD lcd_color_bg = color; -#else - lcd_color_bg = color & 0x0F; -#endif }
/*----------------------------------------------------------------------*/

On Sat, 12 Dec 2009 21:52:23 +0100 Anatolij Gustschin agust@denx.de wrote:
Not all boards defining LCD_COLOR16 are able to set lcd_color_fg/lcd_color_bg correctly. The issue seems to be caused by CONFIG_ATMEL_LCD ifdefs in lcd_setfgcolor() and lcd_setbgcolor(). Actually, the color values passed to these functions are already correct, we don't need to fix them. So remove ifdefs here.
Reported-by: Alessandro Rubini rubini@unipv.it Signed-off-by: Anatolij Gustschin agust@denx.de
Applied to u-boot-video/master
Anatolij

Applied to u-boot-video/master
Thanks.
Then my "[PATCH V3 6/9] lcd: make 16bpp work" can use :
? lcd_color_fg : lcd_color_bg;
instead of this worse choice that I sent in:
? 0xffff : 0;
I don't feel like I should resend, but if asked to I'll resend.
/alessandro

From: Alessandro Rubini rubini@unipv.it
Support for 16bpp was supposed to be in the code but was not working. This makes it work and has been tested in the nhk8815 board.
Signed-off-by: Alessandro Rubini rubini@unipv.it Acked-by: Andrea Gallo andrea.gallo@stericsson.com Signed-off-by: Anatolij Gustschin agust@denx.de --- common/lcd.c | 24 ++++++++++++++++++++---- 1 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/common/lcd.c b/common/lcd.c index db799db..64fb1c6 100644 --- a/common/lcd.c +++ b/common/lcd.c @@ -63,7 +63,7 @@ /************************************************************************/ #ifdef CONFIG_LCD_LOGO # include <bmp_logo.h> /* Get logo data, width and height */ -# if (CONSOLE_COLOR_WHITE >= BMP_LOGO_OFFSET) +# if (CONSOLE_COLOR_WHITE >= BMP_LOGO_OFFSET) && (LCD_BPP != LCD_COLOR16) # error Default Color Map overlaps with Logo Color Map # endif #endif @@ -218,8 +218,12 @@ static void lcd_drawchars (ushort x, ushort y, uchar *str, int count)
for (row=0; row < VIDEO_FONT_HEIGHT; ++row, dest += lcd_line_length) { uchar *s = str; - uchar *d = dest; int i; +#if LCD_BPP == LCD_COLOR16 + ushort *d = (ushort *)dest; +#else + uchar *d = dest; +#endif
#if LCD_BPP == LCD_MONOCHROME uchar rest = *d & -(1 << (8-off)); @@ -244,7 +248,7 @@ static void lcd_drawchars (ushort x, ushort y, uchar *str, int count) bits <<= 1; } #elif LCD_BPP == LCD_COLOR16 - for (c=0; c<16; ++c) { + for (c=0; c<8; ++c) { *d++ = (bits & 0x80) ? lcd_color_fg : lcd_color_bg; bits <<= 1; @@ -521,6 +525,13 @@ void bitmap_plot (int x, int y) cmap = (ushort *)&(cp->lcd_cmap[BMP_LOGO_OFFSET*sizeof(ushort)]); #elif defined(CONFIG_ATMEL_LCD) cmap = (uint *) (panel_info.mmio + ATMEL_LCDC_LUT(0)); +#else + /* + * default case: generic system with no cmap (most likely 16bpp) + * We set cmap to the source palette, so no change is done. + * This avoids even more ifdef in the next stanza + */ + cmap = bmp_logo_palette; #endif
WATCHDOG_RESET(); @@ -559,10 +570,15 @@ void bitmap_plot (int x, int y) } } else { /* true color mode */ + u16 col16; fb16 = (ushort *)(lcd_base + y * lcd_line_length + x); for (i=0; i<BMP_LOGO_HEIGHT; ++i) { for (j=0; j<BMP_LOGO_WIDTH; j++) { - fb16[j] = bmp_logo_palette[(bmap[j])]; + col16 = bmp_logo_palette[(bmap[j]-16)]; + fb16[j] = + ((col16 & 0x000F) << 1) | + ((col16 & 0x00F0) << 3) | + ((col16 & 0x0F00) << 4); } bmap += BMP_LOGO_WIDTH; fb16 += panel_info.vl_col;

Thank Anatolij. I re-tested it as first patch applied on master.
This is my current sequence (git log --reverse ...). The first is yours, the next is my pending stack.
f2a4dcb... lcd: make 16bpp work 79e3c0e... Nomadik: fix reset_timer() be8fb55... nhk8815: change the order of initialization e6a9a8a... drivers/misc: add stmpe2401 port extender and keypad controller aaf173b... nhk8815.h: define we need stmpe b6ce3d2... nhk8815: added keypad ce173d5... nhk8815: start lower in RAM, so the 800x480 frame buffer fits f6b2955... nhk8815: added lcd support
The latter patches had no conflicts during rebase, so I don't think I need to post them again. I re-run "./MAKEALL arm" with no related issues, either.
As Wolfgang noted, I'm now up to you and Tom (added to Cc:). If there's any step needed on my side, please tell me.
Thanks /alessandro

On Sat, 13 Mar 2010 17:44:08 +0100 Anatolij Gustschin agust@denx.de wrote:
From: Alessandro Rubini rubini@unipv.it
Support for 16bpp was supposed to be in the code but was not working. This makes it work and has been tested in the nhk8815 board.
Signed-off-by: Alessandro Rubini rubini@unipv.it Acked-by: Andrea Gallo andrea.gallo@stericsson.com Signed-off-by: Anatolij Gustschin agust@denx.de
common/lcd.c | 24 ++++++++++++++++++++---- 1 files changed, 20 insertions(+), 4 deletions(-)
Applied to u-boot-video/master. Thanks.

From: Alessandro Rubini rubini@unipv.it
This patch adds keypad support for the nhk8815 board, based on the stmpe2401 driver. The keypad hosts 16 keys, so each of them sends a string instead of a single key. The provided keymap is only an example and must be customized according to the use case.
Signed-off-by: Alessandro Rubini rubini@unipv.it Acked-by: Andrea Gallo andrea.gallo@stericsson.com --- board/st/nhk8815/Makefile | 5 ++- board/st/nhk8815/keypad.c | 99 ++++++++++++++++++++++++++++++++++++ board/st/nhk8815/nhk8815-devices.h | 7 +++ board/st/nhk8815/nhk8815.c | 4 ++ include/configs/nhk8815.h | 3 + 5 files changed, 117 insertions(+), 1 deletions(-) create mode 100644 board/st/nhk8815/keypad.c create mode 100644 board/st/nhk8815/nhk8815-devices.h
diff --git a/board/st/nhk8815/Makefile b/board/st/nhk8815/Makefile index b37fe53..1bb1d2c 100644 --- a/board/st/nhk8815/Makefile +++ b/board/st/nhk8815/Makefile @@ -29,7 +29,10 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(BOARD).a
-COBJS := nhk8815.o +COBJS-y := nhk8815.o +COBJS-$(CONFIG_NHK8815_KEYPAD) += keypad.o + +COBJS := $(COBJS-y) SOBJS := platform.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) diff --git a/board/st/nhk8815/keypad.c b/board/st/nhk8815/keypad.c new file mode 100644 index 0000000..4bbcce6 --- /dev/null +++ b/board/st/nhk8815/keypad.c @@ -0,0 +1,99 @@ +/* + * board/st/nhk8815/keypad.c: keypad on nhk8815 board, based on STMPE2401 + * + * Copyright 2009 Alessandro Rubini rubini@unipv.it + * + * 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 <stdio_dev.h> +#include <i2c.h> +#include <stmpe2401.h> + +/* + * Keymap for our 4x4 matrix: since we have just + * a few keys, use a string for each of the keys. + */ +static char *keymap[4][4] = { + {"", "back", "ffw", "left"}, + {"", "tvout", "playpause", "right"}, + {"vol-", "lock", "rew", "up"}, + {"vol+", "start", "ok", "down"} +}; + +/* this keeps track of the string being returned */ +static char *nextchar = ""; + +/* This getc can return failure, not permitted in the caller */ +static int __nhk8815_getc(void) +{ + int row, col, res; + + res = pe_kpc_getkey(STMPE0, &row, &col); + if (res < 0) + return res; /* invalid */ + nextchar = keymap[row][col]; + return 0; +} + +/* This is low level: may not report a valid key (a release, for example) */ +static int __nhk8815_tstc(void) +{ + /* the interrupt is active low */ + int gpio = nmk_gpio_get(76); + return !gpio; +} + +/* This is the one that is being called, it reads the pending string */ +static int nhk8815_tstc(void) +{ + if (*nextchar) /* there's already data */ + return 1; + if (!__nhk8815_tstc()) /* no new data? */ + return 0; + __nhk8815_getc(); /* get (or not) new data */ + return (nextchar[0] != '\0'); +} + +/* So this is only called when there is data in the currenct string */ +static int nhk8815_getc(void) +{ + return *(nextchar++); +} + +/* called from late init */ +int nhk8815_keypad_init(void) +{ + struct stdio_dev dev; + + /* The keypad is on EXP0, columns 0..3, rows 0..3 */ + pe_kpc_init(STMPE0, 0x0f, 0x0f, 30 /* ms */); + + /* Keypad interrupt: GPIO76 */ + nmk_gpio_af(76, GPIO_GPIO); + nmk_gpio_dir(76, 0); + + memset (&dev, 0, sizeof (dev)); + dev.flags = DEV_FLAGS_INPUT; + dev.getc = nhk8815_getc; + dev.tstc = nhk8815_tstc; + strcpy(dev.name, "keypad"); + stdio_register(&dev); + return 0; +} diff --git a/board/st/nhk8815/nhk8815-devices.h b/board/st/nhk8815/nhk8815-devices.h new file mode 100644 index 0000000..78252ed --- /dev/null +++ b/board/st/nhk8815/nhk8815-devices.h @@ -0,0 +1,7 @@ +#ifndef __NHK8815_DEVICES__ +#define __NHK8815_DEVICES__ + +/* Prototypes for functions exported by device files in this directory */ +extern int nhk8815_keypad_init(void); /* ./keypad.c */ + +#endif /* __NHK8815_DEVICES__ */ diff --git a/board/st/nhk8815/nhk8815.c b/board/st/nhk8815/nhk8815.c index eadce40..fbabd15 100644 --- a/board/st/nhk8815/nhk8815.c +++ b/board/st/nhk8815/nhk8815.c @@ -29,6 +29,7 @@ #include <netdev.h> #include <asm/io.h> #include <asm/arch/gpio.h> +#include "nhk8815-devices.h"
DECLARE_GLOBAL_DATA_PTR;
@@ -109,6 +110,9 @@ int board_eth_init(bd_t *bis) /* Initialization callback, from lib_arm/board.c */ int board_late_init(void) { +#ifdef CONFIG_NHK8815_KEYPAD + nhk8815_keypad_init(); +#endif return 0; }
diff --git a/include/configs/nhk8815.h b/include/configs/nhk8815.h index e1be45b..f9dbd7a 100644 --- a/include/configs/nhk8815.h +++ b/include/configs/nhk8815.h @@ -131,6 +131,9 @@ #define STMPE0 0x43 #define STMPE1 0x44
+/* Keypad using stmpe2401 */ +#define CONFIG_NHK8815_KEYPAD + /* Ethernet */ #define PCI_MEMORY_VADDR 0xe8000000 #define PCI_IO_VADDR 0xee000000

From: Alessandro Rubini rubini@unipv.it
This simply moves u-boot to a lower address, as the frame buffer is allocated after u-boot itself in memory.
Signed-off-by: Alessandro Rubini rubini@unipv.it Acked-by: Andrea Gallo andrea.gallo@stericsson.com --- board/st/nhk8815/config.mk | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/board/st/nhk8815/config.mk b/board/st/nhk8815/config.mk index 590393b..6e5e358 100644 --- a/board/st/nhk8815/config.mk +++ b/board/st/nhk8815/config.mk @@ -18,9 +18,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# -# -# image should be loaded at 0x01000000 -#
-TEXT_BASE = 0x03F80000 +# Start 4MB before the end, as the frame buffer is allocate after +# u-boot. 800x480 @ 32bpp takes 1.5MB alone, so let's play safe. +TEXT_BASE = 0x03c00000

From: Alessandro Rubini rubini@unipv.it
This adds lcd support for the board. It includes defines for 32-bit parameter as well, although support for LCD_COLOR32 is not yet in u-boot. This uses the stmpe2401 to turn on display backlight.
Signed-off-by: Alessandro Rubini rubini@unipv.it Acked-by: Andrea Gallo andrea.gallo@stericsson.com --- board/st/nhk8815/Makefile | 1 + board/st/nhk8815/lcd.c | 88 ++++++++++++++++++++++++++++++++++++ board/st/nhk8815/nhk8815-devices.h | 1 + board/st/nhk8815/nhk8815.c | 3 + include/configs/nhk8815.h | 10 ++++ 5 files changed, 103 insertions(+), 0 deletions(-) create mode 100644 board/st/nhk8815/lcd.c
diff --git a/board/st/nhk8815/Makefile b/board/st/nhk8815/Makefile index 1bb1d2c..7155f12 100644 --- a/board/st/nhk8815/Makefile +++ b/board/st/nhk8815/Makefile @@ -31,6 +31,7 @@ LIB = $(obj)lib$(BOARD).a
COBJS-y := nhk8815.o COBJS-$(CONFIG_NHK8815_KEYPAD) += keypad.o +COBJS-$(CONFIG_LCD) += lcd.o
COBJS := $(COBJS-y) SOBJS := platform.o diff --git a/board/st/nhk8815/lcd.c b/board/st/nhk8815/lcd.c new file mode 100644 index 0000000..d3acb48 --- /dev/null +++ b/board/st/nhk8815/lcd.c @@ -0,0 +1,88 @@ +/* + * board/st/nhk8815/lcd.c: use amba clcd and STMPE2401 for backlight/reset + * + * Copyright 2009 Alessandro Rubini rubini@unipv.it + * + * 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 <lcd.h> +#include <amba_clcd.h> +#include <stmpe2401.h> + +/* Two configurations are supported: 32bpp and 16bpp */ +#if LCD_BPP == LCD_COLOR32 +# define CLCD_CNTL_VAL 0x0019182b +# define CLCD_BPIX_VAL 5 /* 1<<5 = 32 */ +#elif LCD_BPP == LCD_COLOR16 +# define CLCD_CNTL_VAL 0x001d1829 +# define CLCD_BPIX_VAL 4 /* 1<<4 = 16 */ +#else +# error "Invalid LCD_BPP in config file" +#endif + +/* Horribly, these are precomputed registers */ +struct clcd_config nhk8815_clcd_config = { + .address = (struct clcd_registers *)NOMADIK_CLCDC_BASE, + .tim0 = 0xd52600c4, /* horizontal timings */ + .tim1 = 0x220a01df, /* vertical timings */ + .tim2 = 0x031f1821, /* clock and signal polarity */ + .tim3 = 0, /* not used */ + .cntl = CLCD_CNTL_VAL, /* control, pixel size etc */ + .pixclock = 18*1000*1000, /* 18 MHz */ +}; + +/* This is the panel_info for generic boards. Too little info, actually */ +vidinfo_t panel_info = { + .vl_col = 800, + .vl_row = 480, + .vl_bpix = CLCD_BPIX_VAL, + .priv = &nhk8815_clcd_config, +}; + +/* Don't turn on (too early), but configure data lines and remove reset */ +void lcd_enable(void) +{ + int i; + + /* Turn the alternate functions as needed */ + for (i = 32; i <= 39; i++) + nmk_gpio_af(i, GPIO_ALT_B); + + /* EXP1_GPIO_5 = output high -- remove reset from display */ + pe_gpio_af(STMPE1, 5, PE_GPIO_AF_GPIO); + pe_gpio_dir(STMPE1, 5, 1); + pe_gpio_set(STMPE1, 5, 1); +} + +/* Called from late_init: we turn on the backlight through port expander */ +int nhk8815_backlight_on(void) +{ + int i; + + /* Turn the alternate functions as needed */ + for (i = 32; i <= 39; i++) + nmk_gpio_af(i, GPIO_ALT_B); + + /* EXP0_GPIO_21 = output high -- backlight */ + pe_gpio_af(STMPE0, 21, PE_GPIO_AF_GPIO); + pe_gpio_dir(STMPE0, 21, 1); + pe_gpio_set(STMPE0, 21, 1); + return 0; +} diff --git a/board/st/nhk8815/nhk8815-devices.h b/board/st/nhk8815/nhk8815-devices.h index 78252ed..aec5825 100644 --- a/board/st/nhk8815/nhk8815-devices.h +++ b/board/st/nhk8815/nhk8815-devices.h @@ -3,5 +3,6 @@
/* Prototypes for functions exported by device files in this directory */ extern int nhk8815_keypad_init(void); /* ./keypad.c */ +extern int nhk8815_backlight_on(void); /* in ./lcd.c */
#endif /* __NHK8815_DEVICES__ */ diff --git a/board/st/nhk8815/nhk8815.c b/board/st/nhk8815/nhk8815.c index fbabd15..fedb3c0 100644 --- a/board/st/nhk8815/nhk8815.c +++ b/board/st/nhk8815/nhk8815.c @@ -113,6 +113,9 @@ int board_late_init(void) #ifdef CONFIG_NHK8815_KEYPAD nhk8815_keypad_init(); #endif +#ifdef CONFIG_LCD + nhk8815_backlight_on(); +#endif return 0; }
diff --git a/include/configs/nhk8815.h b/include/configs/nhk8815.h index f9dbd7a..ad098d9 100644 --- a/include/configs/nhk8815.h +++ b/include/configs/nhk8815.h @@ -134,6 +134,16 @@ /* Keypad using stmpe2401 */ #define CONFIG_NHK8815_KEYPAD
+/* Display support */ +#define CONFIG_LCD +#define CONFIG_LCD_LOGO +#define CONFIG_LCD_INFO_BELOW_LOGO +#define CONFIG_SYS_WHITE_ON_BLACK +#define LCD_BPP LCD_COLOR16 +#define CONFIG_VIDEO_AMBA +#define CONFIG_SYS_CONSOLE_IS_IN_ENV 1 +#define CONFIG_CONSOLE_MUX + /* Ethernet */ #define PCI_MEMORY_VADDR 0xe8000000 #define PCI_IO_VADDR 0xee000000
participants (3)
-
Alessandro Rubini
-
Alessandro Rubini
-
Anatolij Gustschin