[U-Boot] [PATCH 1/6] h2200: Add support for iPAQ h2200

Marek Vasut marex at denx.de
Wed Sep 19 23:02:49 CEST 2012


Dear Łukasz Dałek,

[ Joe, see the bottom of my babble here ]

> Signed-off-by: Łukasz Dałek <luk0104 at gmail.com>
> ---
>  arch/arm/include/asm/mach-types.h |    1 +
>  board/h2200/Makefile              |   51 ++++++++++
>  board/h2200/h2200-header.S        |   27 +++++
>  board/h2200/h2200.c               |  197
> +++++++++++++++++++++++++++++++++++++ board/h2200/h2200.h               | 
>  28 +++++
>  boards.cfg                        |    2 +
>  include/configs/h2200.h           |  168 +++++++++++++++++++++++++++++++
>  7 files changed, 474 insertions(+), 0 deletions(-)
>  create mode 100644 board/h2200/Makefile
>  create mode 100644 board/h2200/h2200-header.S
>  create mode 100644 board/h2200/h2200.c
>  create mode 100644 board/h2200/h2200.h
>  create mode 100644 include/configs/h2200.h
> 
> diff --git a/arch/arm/include/asm/mach-types.h
> b/arch/arm/include/asm/mach-types.h index 2d5c3bc..b03f385 100644
> --- a/arch/arm/include/asm/mach-types.h
> +++ b/arch/arm/include/asm/mach-types.h
> @@ -74,6 +74,7 @@ extern unsigned int __machine_arch_type;
>  #define MACH_TYPE_IXDP2801             300
>  #define MACH_TYPE_IQ31244              327
>  #define MACH_TYPE_BAST                 331
> +#define MACH_TYPE_H2200                341
>  #define MACH_TYPE_H1940                347
>  #define MACH_TYPE_ENP2611              356
>  #define MACH_TYPE_S3C2440              362

How come it's not in the mach-types already? Was it removed? If so, define 
CONFIG_MACH_TYPE in your h2200.h (see m28evk.h for example)

> diff --git a/board/h2200/Makefile b/board/h2200/Makefile
> new file mode 100644
> index 0000000..39da114
> --- /dev/null
> +++ b/board/h2200/Makefile
> @@ -0,0 +1,51 @@
> +#
> +# h2200 Support
> +#
> +# Copyright (C) 2012 Łukasz Dałek <luk0104 at gmail.com>

Can we cut the crappy unicode and stick to ascii?
[...]

> +
> +	.org 0x40
> +	.ascii "ECEC"

ECEC ... looks familiar, what is it though? WinCE bootloader signature ?

> +	.org 0x1000 - 1
> +	.byte 0x0
> diff --git a/board/h2200/h2200.c b/board/h2200/h2200.c
> new file mode 100644
> index 0000000..d31c67f
> --- /dev/null
> +++ b/board/h2200/h2200.c
> @@ -0,0 +1,197 @@
> +/*
> + * iPAQ h2200 board configuration
> + *
> + * Copyright (C) 2012 Łukasz Dałek <luk0104 at gmail.com>
> + *
> + * 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/arch/pxa.h>
> +#include <asm/arch/pxa-regs.h>
> +#include <asm/io.h>
> +#include "h2200.h"
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#ifdef CONFIG_H2200_USBETH
> +int board_eth_init(bd_t *bis)
> +{
> +	usb_eth_initialize(bis);
> +	return 0;
> +}
> +#endif
> +
> +int board_early_init_f(void)
> +{
> +	/* Enable serial */
> +	setbits_le32(GPDR0, 1 << 24);
> +	writel(1 << 24, GPSR0);

Shitty ... doesn't the board do GPIO setup in arch/arm/cpu/pxa/pxa2xx.c already?

GPIOlib driver would come handy (see drivers/gpio/)

> +	/* Enable serial transreceiver */
> +	setbits_le32(GPDR2, 1 << 16);
> +	writel(1 << 16, GPSR2);
> +
> +	return 0;
> +}
> +
> +int board_init(void)
> +{
> +	/* We have RAM, disable cache */
> +	dcache_disable();
> +	icache_disable();
> +	/* arch number of Lubbock-Board */

Lubbock, yea ...

> +	gd->bd->bi_arch_number = MACH_TYPE_H2200;
> +
> +	/* adress of boot parameters */
> +	gd->bd->bi_boot_params = 0xa0000100;
> +
> +#if defined(CONFIG_H2200_USBETH)
> +	udc_disconnect();
> +	mdelay(500);

Comment won't hurt here

> +#endif
> +
> +	return 0;
> +}
> +
> +/*
> + * iPAQ h2200 has two stage bootloader.
> + * We only replace 2nd stage, so u-boot needs to be
> + * adpopted to the way how 1st stage bootloader works.
> + * Firstly, code needs to have first 4 bytes equal to
> + * 0xea0003fe (arm instruction b 0x1000)

GCC/GAS won't generate it so you use .word ?

> and at the offset
> + * 0x40 ascii characters 'ECEC', secondly 1st stage
> + * loads code from flash into SDRAM at address 0xa0040000
> + * so all instructions which reinitializes memory
> + * controller have to be disabled.
> + */
> +
> +static inline void writelrb(uint32_t val, uint32_t addr)

Replace this with clrsetbits_le32()

> +{
> +	writel(val, addr);
> +	asm volatile("" : : : "memory");
> +	readl(addr);
> +	asm volatile("" : : : "memory");
> +}
> +
> +static void h2200_pxa2xx_dram_init(void)

Why do you duplicate it ?!

[...]

> +}
> +
> +int dram_init(void)
> +{
> +	h2200_pxa2xx_dram_init();
> +	gd->ram_size = PHYS_SDRAM_1_SIZE;
> +	return 0;
> +}
> +
> +void dram_init_banksize(void)
> +{
> +	gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
> +	gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;

Isn't there weak alias for this function in arch/arm/lib/board.c that does 
exactly this?

[...]

> diff --git a/include/configs/h2200.h b/include/configs/h2200.h
> new file mode 100644
> index 0000000..fb4ec05
> --- /dev/null
> +++ b/include/configs/h2200.h
> @@ -0,0 +1,168 @@

Missing license header.

> +#ifndef __CONFIG_H
> +#define __CONFIG_H
> +
> +#define CONFIG_CPU_PXA25X		1
> +#define CONFIG_BOARD_H2200		1
> +
> +#define CONFIG_SYS_NO_FLASH		1
> +
> +#define CONFIG_SYS_HZ			1000
> +
> +#define CONFIG_NR_DRAM_BANKS		1
> +#define PHYS_SDRAM_1			0xa0000000 /* SDRAM Bank #1 */
> +#define PHYS_SDRAM_1_SIZE		0x04000000 /* 64 MB */
> +
> +#define CONFIG_SYS_DRAM_BASE		PHYS_SDRAM_1
> +#define CONFIG_SYS_DRAM_SIZE		PHYS_SDRAM_1_SIZE
> +
> +#define CONFIG_SYS_SDRAM_BASE		PHYS_SDRAM_1
> +#define CONFIG_SYS_INIT_SP_ADDR		0xfffff800
> +
> +#define CONFIG_ENV_SIZE			0x00040000
> +#define CONFIG_SYS_MALLOC_LEN		(CONFIG_ENV_SIZE + 128*1024)
> +
> +#define CONFIG_ENV_IS_NOWHERE		1
> +#define CONFIG_SYS_MAXARGS		16
> +#define CONFIG_SYS_LOAD_ADDR		0xa3000000 /* default load address */
> +
> +/*
> + * iPAQ 1st stage bootloader loads 2nd stage bootloader
> + * at address 0xa0040000 but bootloader requires header
> + * which is 0x1000 long.
> + *
> + * --- Header begin ---
> + *	.word 0xea0003fe ; b 0x1000
> + *
> + *	.org 0x40
> + *	.ascii "ECEC"
> + *
> + *	.org 0x1000
> + * --- Header end ---
> + */
> +
> +#define CONFIG_SYS_TEXT_BASE		0xa0041000
> +#define CONFIG_BOARD_EARLY_INIT_F	1

Just define it, not set to 1
[...]

> +#define CONFIG_BAUDRATE			115200
> +#define CONFIG_SYS_BAUDRATE_TABLE	{ 115200 }

115200 only?

> +/*
> + * USB device configuration
> + */
> +
> +#define CONFIG_SYS_CONSOLE_IS_IN_ENV	1
> +#define CONFIG_USB_DEV_PULLUP_GPIO	33
> +/* USB VBUS GPIO 3 */
> +
> +#define CONFIG_CMD_LOADB		1
> +#define CONFIG_CMD_IMPORTENV		1
> +#define CONFIG_CMD_SOURCE		1
> +#define CONFIG_CMD_RUN			1
> +#define CONFIG_CMD_IMI			1
> +
> +/* Monitor Command Prompt */
> +#define CONFIG_SYS_PROMPT		"> "
> +
> +/* Console I/O Buffer Size */
> +#define CONFIG_SYS_CBSIZE		256
> +
> +/* Print Buffer Size */
> +#define CONFIG_SYS_PBSIZE		(CONFIG_SYS_CBSIZE + \
> +					sizeof(CONFIG_SYS_PROMPT) + 16)
> +
> +#define CONFIG_BOOTARGS "root=/dev/ram0 ro console=ttyS0,115200n8"
> +
> +#ifdef CONFIG_H2200_USBETH
> +# define CONFIG_USB_ETH_SUBSET		1
> +# define CONFIG_SYS_HUSH_PARSER		1
> +# define CONFIG_SYS_PROMPT_HUSH_PS2	"$ "
> +
> +# define CONFIG_CMD_NET			1
> +# define CONFIG_CMD_PING		1
> +
> +# define CONFIG_BOOTDELAY		2
> +
> +# define CONFIG_BOOTCOMMAND		\
> +	"setenv downloaded 0 ; while test $downloaded -eq 0 ; do " \
> +	"if bootp ; then setenv downloaded 1 ; fi ; done ; " \
> +	"source :script ; " \
> +	"bootm ; "
> +
> +# define CONFIG_USB_GADGET_PXA2XX	1
> +
> +# define CONFIG_FIT			1
> +# define CONFIG_SETUP_MEMORY_TAGS	1
> +# define CONFIG_CMDLINE_TAG		1
> +# define CONFIG_INITRD_TAG		1
> +
> +# define CONFIG_USB_ETHER		1
> +# define CONFIG_USBNET_DEV_ADDR		"de:ad:be:ef:00:01"
> +# define CONFIG_USBNET_HOST_ADDR	"de:ad:be:ef:00:02"

Definitelly not, any mac address setting should not be present, Joe ?

> +# define CONFIG_EXTRA_ENV_SETTINGS \
> +	"stdin=serial\0" \
> +	"stdout=serial\0" \
> +	"stderr=serial\0"
> +#endif
> +
> +#endif /* __CONFIG_H */


More information about the U-Boot mailing list