Apollon BSP support
PATCH 3/3 Apollon BSP support
Apollon BSP support
The Apollon based on OMAP2420 is designed for OneNAND development. It's similar with OMAP2420 H4 except some peripherals.
Now this board is maintained at mainline kernel.
---
board/apollon/mem.c new file +229 -0
@@ -0,0 +1,229 @@ +/* +* (C) Copyright 2005-2007 +* Samsung Electronics, +* Kyungmin Park <[email protected]> +* +* Derived from omap2420 +* +* 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/omap2420.h> +#include <asm/io.h> +#include <asm/arch/bits.h> +#include <asm/arch/mux.h> +#include <asm/arch/mem.h> +#include <asm/arch/clocks.h> +#include <asm/arch/sys_proto.h> +#include <asm/arch/sys_info.h> + +#include "mem.h" + +/************************************************************ +* sdelay() - simple spin loop. Will be constant time as +* its generally used in 12MHz bypass conditions only. This +* is necessary until timers are accessible. +* +* not inline to increase chances its in cache when called +*************************************************************/ +void sdelay (unsigned long loops) +{ + __asm__volatile ("1:\n" "subs %0, %1, #1\n" +"bne 1b" :"=r" (loops):"0" (loops)); +} + +/********************************************************************************* +* prcm_init() - inits clocks for PRCM as defined in clocks.h (config II default). +* -- called from SRAM, or Flash (using temp SRAM stack). +*********************************************************************************/ +void prcm_init (void ) +{ +} + +/************************************************************************** +* make_cs1_contiguous() - for es2 and above remap cs1 behind cs0 to allow +* command line mem=xyz use all memory with out discontigious support +* compiled in. Could do it at the ATAG, but there really is two banks... +* Called as part of 2nd phase DDR init. +**************************************************************************/ +void make_cs1_contiguous (void ) +{ +u32 size, a_add_low, a_add_high; + + size =get_sdr_cs_size (SDRC_CS0_OSET ); + size /=SZ_32M ;/* find size to offset CS1 */ + a_add_high = (size &3 ) <<8 ;/* set up low field */ + a_add_low = (size &0x3C ) >>2 ;/* set up high field */ +__raw_writel ((a_add_high | a_add_low),SDRC_CS_CFG ); + +} + +/******************************************************** +* mem_ok() - test used to see if timings are correct +* for a part. Helps in gussing which part +* we are currently using. +*******************************************************/ +u32 mem_ok (void ) +{ +u32 val1, val2; +u32 pattern =0x12345678 ; + +__raw_writel (0x0 ,OMAP2420_SDRC_CS0 +0x400 );/* clear pos A */ +__raw_writel (pattern,OMAP2420_SDRC_CS0 );/* pattern to pos B */ +__raw_writel (0x0 ,OMAP2420_SDRC_CS0 +4 );/* remove pattern off the bus */ + val1 =__raw_readl (OMAP2420_SDRC_CS0 +0x400 );/* get pos A value */ + val2 =__raw_readl (OMAP2420_SDRC_CS0 );/* get val2 */ + +if ((val1 !=0 ) || (val2 != pattern))/* see if pos A value changed */ +return (0 ); +else +return (1 ); +} + +/******************************************************** +* sdrc_init() - init the sdrc chip selects CS0 and CS1 +* - early init routines, called from flash or +* SRAM. +*******************************************************/ +void sdrc_init (void ) +{ +#define EARLY_INIT 1 +/* only init up first bank here */ +do_sdrc_init (SDRC_CS0_OSET ,EARLY_INIT ); +} + +/************************************************************************* +* do_sdrc_init(): initialize the SDRAM for use. +* -called from low level code with stack only. +* -code sets up SDRAM timing and muxing for 2422 or 2420. +* -optimal settings can be placed here, or redone after i2c +* inspection of board info +* +* This is a bit ugly, but should handle all memory moduels +* used with the APOLLON. The first time though this code from s_init() +* we configure the first chip select. Later on we come back and +* will configure the 2nd chip select if it exists. +* +**************************************************************************/ +void do_sdrc_init (u32 offset,u32 early) +{ +} + +/***************************************************** +* gpmc_init(): init gpmc bus +* Init GPMC for x16, MuxMode (SDRAM in x32). +* This code can only be executed from SRAM or SDRAM. +*****************************************************/ +void gpmc_init (void ) +{ +u32 mux =0 , mtype, mwidth, rev, tval; + + rev =get_cpu_rev (); +if (rev ==CPU_2420_2422_ES1 ) + tval =1 ; +else + tval =0 ;/* disable bit switched meaning */ + +/* global settings */ +__raw_writel (0x10 ,GPMC_SYSCONFIG );/* smart idle */ +__raw_writel (0x0 ,GPMC_IRQENABLE );/* isr's sources masked */ +__raw_writel (tval,GPMC_TIMEOUT_CONTROL );/* timeout disable */ +#ifdef CFG_NAND_BOOT +__raw_writel (0x001 ,GPMC_CONFIG );/* set nWP, disable limited addr */ +#else +__raw_writel (0x111 ,GPMC_CONFIG );/* set nWP, disable limited addr */ +#endif + +/* discover bus connection from sysboot */ +if (is_gpmc_muxed () ==GPMC_MUXED ) + mux =BIT9 ; + mtype =get_gpmc0_type (); + mwidth =get_gpmc0_width (); + +/* setup cs0 */ +__raw_writel (0x0 ,GPMC_CONFIG7_0 );/* disable current map */ +sdelay (1000 ); + +#ifdef CFG_NOR_BOOT +__raw_writel (APOLLON_24XX_GPMC_CONFIG1_3 ,GPMC_CONFIG1_0 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG2_3 ,GPMC_CONFIG2_0 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG3_3 ,GPMC_CONFIG3_0 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG4_3 ,GPMC_CONFIG4_0 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG5_3 ,GPMC_CONFIG5_0 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG6_3 ,GPMC_CONFIG6_0 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG7_3 ,GPMC_CONFIG7_0 ); +#else +__raw_writel (APOLLON_24XX_GPMC_CONFIG1_0 | mux | mtype | mwidth, +GPMC_CONFIG1_0 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG2_0 ,GPMC_CONFIG2_0 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG3_0 ,GPMC_CONFIG3_0 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG4_0 ,GPMC_CONFIG4_0 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG5_0 ,GPMC_CONFIG5_0 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG6_0 ,GPMC_CONFIG6_0 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG7_0 ,GPMC_CONFIG7_0 );/* enable new mapping */ +#endif +sdelay (2000 ); + +/* setup cs1 */ +__raw_writel (0 ,GPMC_CONFIG7_1 );/* disable any mapping */ +sdelay (1000 ); + +__raw_writel (APOLLON_24XX_GPMC_CONFIG1_1 ,GPMC_CONFIG1_1 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG2_1 ,GPMC_CONFIG2_1 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG3_1 ,GPMC_CONFIG3_1 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG4_1 ,GPMC_CONFIG4_1 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG5_1 ,GPMC_CONFIG5_1 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG6_1 ,GPMC_CONFIG6_1 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG7_1 ,GPMC_CONFIG7_1 ); +sdelay (2000 ); + +/* setup cs2 */ +__raw_writel (APOLLON_24XX_GPMC_CONFIG1_0 | mux | mtype | mwidth, +GPMC_CONFIG1_2 ); +/* It's same as cs 0 */ +__raw_writel (APOLLON_24XX_GPMC_CONFIG2_0 ,GPMC_CONFIG2_2 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG3_0 ,GPMC_CONFIG3_2 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG4_0 ,GPMC_CONFIG4_2 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG5_0 ,GPMC_CONFIG5_2 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG6_0 ,GPMC_CONFIG6_2 ); +#ifdef CFG_NOR_BOOT +__raw_writel (APOLLON_24XX_GPMC_CONFIG7_0 ,GPMC_CONFIG7_2 ); +#else +__raw_writel (APOLLON_24XX_GPMC_CONFIG7_2 ,GPMC_CONFIG7_2 ); +#endif + +#ifndef CFG_NOR_BOOT +/* setup cs3 */ +__raw_writel (0 ,GPMC_CONFIG7_3 );/* disable any mapping */ +sdelay (1000 ); + +__raw_writel (APOLLON_24XX_GPMC_CONFIG1_3 ,GPMC_CONFIG1_3 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG2_3 ,GPMC_CONFIG2_3 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG3_3 ,GPMC_CONFIG3_3 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG4_3 ,GPMC_CONFIG4_3 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG5_3 ,GPMC_CONFIG5_3 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG6_3 ,GPMC_CONFIG6_3 ); +__raw_writel (APOLLON_24XX_GPMC_CONFIG7_3 ,GPMC_CONFIG7_3 ); +#endif + +#ifndef ASYNC_NOR +__raw_writew (0xaa , (APOLLON_CS3_BASE +0xaaa )); +__raw_writew (0x55 , (APOLLON_CS3_BASE +0x554 )); +__raw_writew (0xc0 , (APOLLON_CS3_BASE |SYNC_NOR_VALUE )); +#endif +sdelay (2000 ); +}
board/apollon/mem.h new file +170 -0
170 lines not on this page · raw message
include/asm-arm/arch-arm1136/mux.h +2 -0
@@ -28,6 +28,7 @@ typedef unsigned int uint32;void muxSetupSDRC (void );void muxSetupGPMC (void );void muxSetupUsb0 (void ); +void muxSetupUsbHost (void );void muxSetupUart3 (void );void muxSetupI2C1 (void );void muxSetupUART1 (void );
@@ -70,6 +71,7 @@ void muxSetupHDQ(void);#define CONTROL_PADCONF_SPI1_SIMO ((volatile unsigned char *)0x48000100)#define CONTROL_PADCONF_SPI1_SOMI ((volatile unsigned char *)0x48000101)#define CONTROL_PADCONF_SPI1_NCS0 ((volatile unsigned char *)0x48000102) +#define CONTROL_PADCONF_SPI1_NCS1 ((volatile unsigned char *)0x48000103)#define CONTROL_PADCONF_MCBSP1_FSR ((volatile unsigned char *)0x4800010B)
include/asm-arm/arch-arm1136/omap2420.h +29 -4
@@ -77,6 +77,20 @@#define GPMC_CONFIG5_1 (OMAP2420_GPMC_BASE+0xA0)#define GPMC_CONFIG6_1 (OMAP2420_GPMC_BASE+0xA4)#define GPMC_CONFIG7_1 (OMAP2420_GPMC_BASE+0xA8) +#define GPMC_CONFIG1_2 (OMAP2420_GPMC_BASE+0xC0) +#define GPMC_CONFIG2_2 (OMAP2420_GPMC_BASE+0xC4) +#define GPMC_CONFIG3_2 (OMAP2420_GPMC_BASE+0xC8) +#define GPMC_CONFIG4_2 (OMAP2420_GPMC_BASE+0xCC) +#define GPMC_CONFIG5_2 (OMAP2420_GPMC_BASE+0xD0) +#define GPMC_CONFIG6_2 (OMAP2420_GPMC_BASE+0xD4) +#define GPMC_CONFIG7_2 (OMAP2420_GPMC_BASE+0xD8) +#define GPMC_CONFIG1_3 (OMAP2420_GPMC_BASE+0xF0) +#define GPMC_CONFIG2_3 (OMAP2420_GPMC_BASE+0xF4) +#define GPMC_CONFIG3_3 (OMAP2420_GPMC_BASE+0xF8) +#define GPMC_CONFIG4_3 (OMAP2420_GPMC_BASE+0xFC) +#define GPMC_CONFIG5_3 (OMAP2420_GPMC_BASE+0x100) +#define GPMC_CONFIG6_3 (OMAP2420_GPMC_BASE+0x104) +#define GPMC_CONFIG7_3 (OMAP2420_GPMC_BASE+0x108)/* SMS */ #define OMAP2420_SMS_BASE 0x68008000
@@ -209,13 +223,24 @@#define SRAM_OFFSET2 0x0000F800#define SRAM_VECT_CODE (SRAM_OFFSET0|SRAM_OFFSET1|SRAM_OFFSET2) -#define LOW_LEVEL_SRAM_STACK 0x4020FFFC - -#define PERIFERAL_PORT_BASE 0x480FE003 -/* FPGA on Debug board.*/ #define ETH_CONTROL_REG (H4_CS1_BASE+0x30b)#define LAN_RESET_REGISTER (H4_CS1_BASE+0x1c)#endif /* endif CONFIG_2420H4 */ +#if defined(CONFIG_APOLLON ) +#define APOLLON_CS0_BASE 0x00000000/* OneNAND */ +#define APOLLON_CS1_BASE 0x08000000/* ethernet */ +#define APOLLON_CS2_BASE 0x10000000/* OneNAND */ +#define APOLLON_CS3_BASE 0x18000000/* NOR */ + +#define ETH_CONTROL_REG (APOLLON_CS1_BASE + 0x30b) +#define LAN_RESET_REGISTER (APOLLON_CS1_BASE + 0x1c) +#endif /* endif CONFIG_APOLLON */ + +/* Common */ +#define LOW_LEVEL_SRAM_STACK 0x4020FFFC + +#define PERIFERAL_PORT_BASE 0x480FE003 +#endif
include/asm-arm/mach-types.h +13 -0
@@ -737,6 +737,7 @@ extern unsigned int __machine_arch_type;#define MACH_TYPE_CB3RUFC 726#define MACH_TYPE_MP2USB 727#define MACH_TYPE_AT91SAM9261EK 848 +#define MACH_TYPE_OMAP_APOLLON 919#define MACH_TYPE_PDNB3 1002#define MACH_TYPE_AT91SAM9260EK 1099#define MACH_TYPE_AT91RM9200DF 1119
@@ -6826,6 +6827,18 @@ extern unsigned int __machine_arch_type;# define machine_is_omap_h4 () (0)#endif +#ifdef CONFIG_MACH_OMAP_APOLLON +# ifdef machine_arch_type +# undef machine_arch_type +# define machine_arch_type __machine_arch_type +# else +# define machine_arch_type MACH_TYPE_OMAP_APOLLON +# endif +# define machine_is_omap_apollon () (machine_arch_type == MACH_TYPE_OMAP_APOLLON) +#else +# define machine_is_omap_apollon () (0) +#endif +#ifdef CONFIG_MACH_N10 # ifdef machine_arch_type# undef machine_arch_type
include/configs/apollon.h new file +239 -0
239 lines not on this page · raw message
PATCH 3/3 Apollon BSP support
Quoted 14 lines · In message <20070914005221.GA14750@party> you wrote:
Apollon BSP support
The Apollon based on OMAP2420 is designed for OneNAND development. It's similar with OMAP2420 H4 except some peripherals.
Now this board is maintained at mainline kernel.
Signed-off-by Kyungmin Park <[email protected]>---
board/apollon/mem.c new file +0
-0
...
Quoted 4 lines
+/*********************************************************************************
+ *prcm_init()- inits clocks for PRCM as defined inclocks.h(config II default).
+ * -- called from SRAM, or Flash (using temp SRAM stack).
+ *********************************************************************************/
Maximum line length exceeded.
...
board/apollon/mem.c line 177
Quoted 1 line
board/apollon/mem.c new file +1
-0+__raw_writel (APOLLON_24XX_GPMC_CONFIG7_0 ,GPMC_CONFIG7_0 );/* enable new mapping */
Maximum line length exceeded.
...
board/apollon/mem.c
Quoted 11 lines
board/apollon/mem.c new file +11
-0+#ifdef PRCM_CONFIG_I +# define APOLLON_2420_SDRC_ACTIM_CTRLA_0 APOLLON_242X_SDRC_ACTIM_CTRLA_0_166MHz +# define APOLLON_2420_SDRC_ACTIM_CTRLB_0 APOLLON_242X_SDRC_ACTIM_CTRLB_0_166MHz +# define APOLLON_2420_SDRC_RFR_CTRL APOLLON_242X_SDRC_RFR_CTRL_166MHz +# define APOLLON_2420_SDRC_DLLAB_CTRL APOLLON_242x_SDRC_DLLAB_CTRL_166MHz +#elif PRCM_CONFIG_II +# define APOLLON_2420_SDRC_ACTIM_CTRLA_0 APOLLON_242X_SDRC_ACTIM_CTRLA_0_100MHz +# define APOLLON_2420_SDRC_ACTIM_CTRLB_0 APOLLON_242X_SDRC_ACTIM_CTRLB_0_100MHz +# define APOLLON_2420_SDRC_RFR_CTRL APOLLON_242X_SDRC_RFR_CTRL_100MHz +# define APOLLON_2420_SDRC_DLLAB_CTRL APOLLON_242x_SDRC_DLLAB_CTRL_100MHz +#endif
Maximum line length exceeded.
Quoted 5 lines
include/configs/apollon.h new file +0
-0
...
include/configs/apollon.h line 148
Quoted 5 lines
include/configs/apollon.h new file +5
-0+#ifdef CONFIG_APOLLON_PLUS +#define CONFIG_BOOTARGS "root=/dev/nfs rw mem=64M console=ttyS0,115200n8 ip=192.168.116.25:192.168.116.1:192.168.116.1:255.255.255.0:apollon:eth0:off nfsroot=/tftpboot/nfsroot profile=2" +#else +#define CONFIG_BOOTARGS "root=/dev/nfs rw mem=128M console=ttyS0,115200n8 ip=192.168.116.25:192.168.116.1:192.168.116.1:255.255.255.0:apollon:eth0:off nfsroot=/tftpboot/nfsroot profile=2" +#endif
Maximum line length exceeded.
include/configs/apollon.h line 155
Quoted 7 lines
include/configs/apollon.h new file +7
-0+ +#define CONFIG_EXTRA_ENV_SETTINGS \ + "Image=tftp 0x80008000 Image\; go 0x80008000\0" \ + "zImage=tftp 0x80180000 zImage\; go 0x80180000\0" \ + "uImage=tftp 0x80180000 uImage\; bootm 0x80180000\0" \ + "uboot=tftp 0x80008000 u-boot.bin\; go 0x80008000\0" \ + "xloader=tftp 0x80180000 x-load.bin\; cp.w 0x80180000 0x00000400 0x1000\; go 0x00000400\0" \
Maximum line length exceeded.
include/configs/apollon.h line 161
Quoted 6 lines
include/configs/apollon.h new file +6
-0+"syncmode50=mw.w 0x1e442 0xc0c4\; mw 0x6800a060 0xe30d1201\0" \ +"syncmode=mw.w 0x1e442 0xe0f4\; mw 0x6800a060 0xe30d1201\0" \ +"norboot=cp32 0x18040000 0x80008000 0x200000\; go 0x80008000\0" \ +"oneboot=onenand read 0x80008000 0x40000 0x200000\; go 0x80008000\0" \ +"onesyncboot=run syncmode oneboot\0" \ +"bootcmd=run uboot\0"
Please remove the bogus backslash-escapes for the semicolons h.
Please note that booting a Linux kernel using the "go" command is not a good idea. I would not add this to a default environment.
....
Quoted 1 line
+#define
CONFIG_NR_DRAM_BANKS1 /* CS1 may or may not be populated */
Maximum line length exceeded.
Best regards,
Wolfgang Denk
Signature · 7 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de READ THIS BEFORE OPENING PACKAGE: According to Certain Suggested Ver- sions of the Grand Unified Theory, the Primary Particles Constituting this Product May Decay to Nothingness Within the Next Four Hundred Million Years.
PATCH 3/3 Apollon BSP support
Quoted 10 lines
include/configs/apollon.h line 155
Quoted 8 lines
include/configs/apollon.h new file +7
-0+ +#define CONFIG_EXTRA_ENV_SETTINGS \ + "Image=tftp 0x80008000 Image\; go 0x80008000\0" \ + "zImage=tftp 0x80180000 zImage\; go 0x80180000\0" \ + "uImage=tftp 0x80180000 uImage\; bootm 0x80180000\0" \ + "uboot=tftp 0x80008000 u-boot.bin\; go 0x80008000\0" \ + "xloader=tftp 0x80180000 x-load.bin\; cp.w 0x80180000 0x00000400 0x1000\; go 0x00000400\0" \Maximum line length exceeded.
I will rearrange it as coding style.
Quoted 8 lines
include/configs/apollon.h line 161
Quoted 7 lines
include/configs/apollon.h new file +6
-0+"syncmode50=mw.w 0x1e442 0xc0c4\; mw 0x6800a060 0xe30d1201\0" \ +"syncmode=mw.w 0x1e442 0xe0f4\; mw 0x6800a060 0xe30d1201\0" \ +"norboot=cp32 0x18040000 0x80008000 0x200000\; go 0x80008000\0" \ +"oneboot=onenand read 0x80008000 0x40000 0x200000\; go 0x80008000\0" \ +"onesyncboot=run syncmode oneboot\0" \ +"bootcmd=run uboot\0"
Quoted 5 lines
Please remove the bogus backslash-escapes for the semicolons h.
Please note that booting a Linux kernel using the "go" command is not a good idea. I would not add this to a default environment.
For fast boot, we will use the uncompressed kernel and jump to kernel directly Yes I know it not common method. I can't pass any kernel parameters But it's used for internal use only.
If you don't mind I want to leave it as it was
Thank you,
Kyungmin Park
PATCH 3/3 Apollon BSP support
Quoted 5 lines · In message <[email protected]> you…
Quoted 3 lines
Please note that booting a Linux kernel using the "go" command is not a good idea. I would not add this to a default environment.
For fast boot, we will use the uncompressed kernel and jump to kernel directly
Bootm also supports uncompressed kernel images, and you can disable the checksum test as well.That makes no speed difference then.
Quoted 1 line
Yes I know it not common method. I can't pass any kernel parameters
Right. You castrate U-Boot of half it's power...
Quoted 1 line
But it's used for internal use only.
That doesn't make it any better.
Quoted 1 line
If you don't mind I want to leave it as it was
It's you yourself who is suffering from this.
Best regards,
Wolfgang Denk
Signature · 4 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de Save energy: Drive a smaller shell.