[U-Boot] [PATCH v2 1/3] Add Eukrea CPUIMX27 support

CPUIMX27 is built around Freescale's i.MX27 and has up to 64MB of NOR Flash, up to 512MB of NAND Flash and up to 256MB of mDDR, it includes an ethernet PHY in MII mode, an I2C RTC and a ST16554 QuadUART on nCS3.
Signed-off-by: Eric Benard eric@eukrea.com --- arch/arm/Kconfig | 11 ++ arch/arm/Makefile | 1 + arch/arm/configs/eukrea_cpuimx27_defconfig | 222 +++++++++++++++++++++++++++ board/eukrea_cpuimx27/Makefile | 3 + board/eukrea_cpuimx27/config.h | 24 +++ board/eukrea_cpuimx27/env/bin/_update | 36 +++++ board/eukrea_cpuimx27/env/bin/boot | 47 ++++++ board/eukrea_cpuimx27/env/bin/hush_hack | 1 + board/eukrea_cpuimx27/env/bin/init | 37 +++++ board/eukrea_cpuimx27/env/bin/update_kernel | 15 ++ board/eukrea_cpuimx27/env/bin/update_root | 16 ++ board/eukrea_cpuimx27/env/config | 31 ++++ board/eukrea_cpuimx27/eukrea_cpuimx27.c | 191 +++++++++++++++++++++++ board/eukrea_cpuimx27/eukrea_cpuimx27.dox | 10 ++ board/eukrea_cpuimx27/lowlevel_init.S | 130 ++++++++++++++++ 15 files changed, 775 insertions(+), 0 deletions(-) create mode 100644 arch/arm/configs/eukrea_cpuimx27_defconfig create mode 100644 board/eukrea_cpuimx27/Makefile create mode 100644 board/eukrea_cpuimx27/config.h create mode 100644 board/eukrea_cpuimx27/env/bin/_update create mode 100644 board/eukrea_cpuimx27/env/bin/boot create mode 100644 board/eukrea_cpuimx27/env/bin/hush_hack create mode 100644 board/eukrea_cpuimx27/env/bin/init create mode 100644 board/eukrea_cpuimx27/env/bin/update_kernel create mode 100644 board/eukrea_cpuimx27/env/bin/update_root create mode 100644 board/eukrea_cpuimx27/env/config create mode 100644 board/eukrea_cpuimx27/eukrea_cpuimx27.c create mode 100644 board/eukrea_cpuimx27/eukrea_cpuimx27.dox create mode 100644 board/eukrea_cpuimx27/lowlevel_init.S
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index fa003b5..291b8f4 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -19,6 +19,7 @@ config ARCH_TEXT_BASE default 0xa7f00000 if MACH_PCA100 default 0x33fc0000 if MACH_A9M2440 default 0x23f00000 if MACH_MMCCPU + default 0xa0000000 if MACH_EUKREA_CPUIMX27
config BOARDINFO default "Synertronixx scb9328" if MACH_SCB9328 @@ -35,6 +36,7 @@ config BOARDINFO default "Digi A9M2410" if MACH_A9M2410 default "Phytec phyCard-i.MX27" if MACH_PCA100 default "Bucyrus MMC-CPU" if MACH_MMCCPU + default "Eukrea CPUIMX27" if MACH_EUKREA_CPUIMX27
config BOARD_LINKER_SCRIPT bool @@ -232,6 +234,15 @@ config MACH_MMCCPU help Say y here if you are using the Bucyrus MMC-CPU
+config MACH_EUKREA_CPUIMX27 + bool "EUKREA CPUIMX27" + select HAS_CFI + select ARCH_IMX27 + select MACH_HAS_LOWLEVEL_INIT + help + Say Y here if you are using Eukrea's CPUIMX27 equipped + with a Freescale i.MX27 Processor + endchoice
source arch/arm/mach-imx/Kconfig diff --git a/arch/arm/Makefile b/arch/arm/Makefile index aba6166..1513168 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -25,6 +25,7 @@ board-$(CONFIG_MACH_A9M2410) := a9m2410 board-$(CONFIG_MACH_PCA100) := phycard-i.MX27 board-$(CONFIG_MACH_MMCCPU) := mmccpu board-$(CONFIG_MACH_A9M2440) := a9m2440 +board-$(CONFIG_MACH_EUKREA_CPUIMX27) := eukrea_cpuimx27
# FIXME "cpu-y" never used on ARM! cpu-$(CONFIG_ARM920T) := arm920t diff --git a/arch/arm/configs/eukrea_cpuimx27_defconfig b/arch/arm/configs/eukrea_cpuimx27_defconfig new file mode 100644 index 0000000..6402278 --- /dev/null +++ b/arch/arm/configs/eukrea_cpuimx27_defconfig @@ -0,0 +1,222 @@ +# +# Automatically generated make config: don't edit +# U-Boot version: 2.0.0-rc9 +# Wed Jul 15 16:05:10 2009 +# +CONFIG_ARCH_TEXT_BASE=0xa0000000 +CONFIG_BOARDINFO="Eukrea CPUIMX27" +# CONFIG_BOARD_LINKER_SCRIPT is not set +CONFIG_GENERIC_LINKER_SCRIPT=y +CONFIG_ARM=y +CONFIG_ARM926EJS=y +# CONFIG_MACH_MX1ADS is not set +# CONFIG_MACH_SCB9328 is not set +# CONFIG_MACH_PCM038 is not set +# CONFIG_MACH_IMX21ADS is not set +# CONFIG_MACH_IMX27ADS is not set +# CONFIG_MACH_PCM043 is not set +# CONFIG_MACH_FREESCALE_MX35_3STACK is not set +# CONFIG_MACH_ECO920 is not set +# CONFIG_MACH_NXDB500 is not set +# CONFIG_MACH_PCM037 is not set +# CONFIG_MACH_OMAP is not set +# CONFIG_MACH_AT91SAM9260_EK is not set +# CONFIG_MACH_PM9263 is not set +# CONFIG_MACH_A9M2410 is not set +# CONFIG_MACH_A9M2440 is not set +# CONFIG_MACH_PCA100 is not set +# CONFIG_MACH_MMCCPU is not set +CONFIG_MACH_EUKREA_CPUIMX27=y +CONFIG_ARCH_IMX=y +CONFIG_ARCH_HAS_FEC_IMX=y +CONFIG_ARCH_IMX27=y + +# +# Board specific settings +# + +# +# i.MX specific settings +# +CONFIG_IMX_CLKO=y + +# +# Arm specific settings +# +CONFIG_CMD_ARM_CPUINFO=y +CONFIG_CMDLINE_TAG=y +CONFIG_SETUP_MEMORY_TAGS=y +# CONFIG_INITRD_TAG is not set +CONFIG_GREGORIAN_CALENDER=y +CONFIG_HAS_KALLSYMS=y +CONFIG_HAS_MODULES=y +CONFIG_CMD_MEMORY=y +CONFIG_ENV_HANDLING=y + +# +# General Settings +# +CONFIG_LOCALVERSION_AUTO=y + +# +# memory layout +# +CONFIG_HAVE_CONFIGURABLE_TEXT_BASE=y +CONFIG_TEXT_BASE=0xa7f00000 +CONFIG_HAVE_CONFIGURABLE_MEMORY_LAYOUT=y +CONFIG_MEMORY_LAYOUT_DEFAULT=y +# CONFIG_MEMORY_LAYOUT_FIXED is not set +CONFIG_STACK_SIZE=0x8000 +CONFIG_MALLOC_SIZE=0x400000 +# CONFIG_BROKEN is not set +# CONFIG_EXPERIMENTAL is not set +CONFIG_MACH_HAS_LOWLEVEL_INIT=y +CONFIG_MACH_DO_LOWLEVEL_INIT=y +CONFIG_PROMPT="uboot:" +CONFIG_BAUDRATE=115200 +CONFIG_LONGHELP=y +CONFIG_CBSIZE=1024 +CONFIG_MAXARGS=16 +CONFIG_SHELL_HUSH=y +# CONFIG_SHELL_SIMPLE is not set +CONFIG_GLOB=y +CONFIG_PROMPT_HUSH_PS2="> " +CONFIG_CMDLINE_EDITING=y +CONFIG_AUTO_COMPLETE=y +CONFIG_DYNAMIC_CRC_TABLE=y +CONFIG_ERRNO_MESSAGES=y +CONFIG_TIMESTAMP=y +CONFIG_CONSOLE_FULL=y +CONFIG_CONSOLE_ACTIVATE_FIRST=y +# CONFIG_OF_FLAT_TREE is not set +CONFIG_PARTITION=y +CONFIG_DEFAULT_ENVIRONMENT=y +CONFIG_DEFAULT_ENVIRONMENT_PATH="board/eukrea_cpuimx27/env" + +# +# Debugging +# +# CONFIG_DEBUG_INFO is not set +# CONFIG_ENABLE_FLASH_NOISE is not set +# CONFIG_ENABLE_PARTITION_NOISE is not set +# CONFIG_ENABLE_DEVICE_NOISE is not set + +# +# Commands +# + +# +# scripting +# +CONFIG_CMD_EDIT=y +CONFIG_CMD_SLEEP=y +CONFIG_CMD_SAVEENV=y +CONFIG_CMD_LOADENV=y +CONFIG_CMD_EXPORT=y +CONFIG_CMD_PRINTENV=y +CONFIG_CMD_READLINE=y +CONFIG_CMD_TRUE=y +CONFIG_CMD_FALSE=y + +# +# file commands +# +CONFIG_CMD_LS=y +CONFIG_CMD_RM=y +CONFIG_CMD_CAT=y +CONFIG_CMD_MKDIR=y +CONFIG_CMD_RMDIR=y +CONFIG_CMD_CP=y +CONFIG_CMD_PWD=y +CONFIG_CMD_CD=y +CONFIG_CMD_MOUNT=y +CONFIG_CMD_UMOUNT=y + +# +# console +# +CONFIG_CMD_CLEAR=y +CONFIG_CMD_ECHO=y + +# +# memory +# +# CONFIG_CMD_LOADB is not set +CONFIG_CMD_MEMINFO=y +CONFIG_CMD_CRC=y +CONFIG_CMD_MTEST=y +# CONFIG_CMD_MTEST_ALTERNATIVE is not set + +# +# flash +# +CONFIG_CMD_FLASH=y + +# +# booting +# +CONFIG_CMD_BOOTM=y +# CONFIG_CMD_BOOTM_ZLIB is not set +# CONFIG_CMD_BOOTM_BZLIB is not set +# CONFIG_CMD_BOOTM_SHOW_TYPE is not set +CONFIG_CMD_RESET=y +CONFIG_CMD_GO=y +CONFIG_CMD_TIMEOUT=y +CONFIG_CMD_PARTITION=y +CONFIG_CMD_TEST=y +CONFIG_CMD_VERSION=y +CONFIG_CMD_HELP=y +CONFIG_CMD_DEVINFO=y +CONFIG_NET=y +CONFIG_NET_BOOTP=y +CONFIG_NET_DHCP=y +# CONFIG_NET_RARP is not set +# CONFIG_NET_SNTP is not set +# CONFIG_NET_NFS is not set +CONFIG_NET_PING=y +CONFIG_NET_TFTP=y + +# +# Drivers +# + +# +# serial drivers +# +CONFIG_DRIVER_SERIAL_IMX=y +# CONFIG_DRIVER_SERIAL_NS16550 is not set +CONFIG_MIIPHY=y + +# +# Network drivers +# +# CONFIG_DRIVER_NET_SMC911X is not set +# CONFIG_DRIVER_NET_SMC91111 is not set +CONFIG_DRIVER_NET_FEC_IMX=y + +# +# SPI drivers +# +CONFIG_SPI=y +CONFIG_DRIVER_SPI_IMX=y +CONFIG_DRIVER_SPI_MC13783=y + +# +# flash drivers +# +CONFIG_HAS_CFI=y +CONFIG_DRIVER_CFI=y +# CONFIG_DRIVER_CFI_NEW is not set +CONFIG_DRIVER_CFI_OLD=y +CONFIG_CFI_BUFFER_WRITE=y +# CONFIG_NAND is not set +# CONFIG_USB is not set + +# +# Filesystem support +# +# CONFIG_FS_CRAMFS is not set +CONFIG_FS_RAMFS=y +CONFIG_FS_DEVFS=y +CONFIG_CRC32=y +# CONFIG_GENERIC_FIND_NEXT_BIT is not set diff --git a/board/eukrea_cpuimx27/Makefile b/board/eukrea_cpuimx27/Makefile new file mode 100644 index 0000000..5d958fa --- /dev/null +++ b/board/eukrea_cpuimx27/Makefile @@ -0,0 +1,3 @@ + +obj-y += lowlevel_init.o +obj-y += eukrea_cpuimx27.o diff --git a/board/eukrea_cpuimx27/config.h b/board/eukrea_cpuimx27/config.h new file mode 100644 index 0000000..b3eed0b --- /dev/null +++ b/board/eukrea_cpuimx27/config.h @@ -0,0 +1,24 @@ +/** + * @file + * @brief Global defintions for the ARM i.MX27 based pcm038 + * + * 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 + */ + +#ifndef __CONFIG_H +#define __CONFIG_H + +#endif /* __CONFIG_H */ diff --git a/board/eukrea_cpuimx27/env/bin/_update b/board/eukrea_cpuimx27/env/bin/_update new file mode 100644 index 0000000..fb7cbe8 --- /dev/null +++ b/board/eukrea_cpuimx27/env/bin/_update @@ -0,0 +1,36 @@ +#!/bin/sh + +if [ -z "$part" -o -z "$image" ]; then + echo "define $part and $image" + exit 1 +fi + +if [ ! -e "$part" ]; then + echo "Partition $part does not exist" + exit 1 +fi + +if [ $# = 1 ]; then + image=$1 +fi + +if [ x$ip = xdhcp ]; then + dhcp +fi + +ping $eth0.serverip +if [ $? -ne 0 ] ; then + echo "update aborted" + exit 1 +fi + +unprotect $part + +echo +echo "erasing partition $part" +erase $part + +echo +echo "flashing $image to $part" +echo +tftp $image $part diff --git a/board/eukrea_cpuimx27/env/bin/boot b/board/eukrea_cpuimx27/env/bin/boot new file mode 100644 index 0000000..dfb59aa --- /dev/null +++ b/board/eukrea_cpuimx27/env/bin/boot @@ -0,0 +1,47 @@ +#!/bin/sh + +. /env/config + +if [ x$1 = xnand ]; then + root=nand + kernel=nand +fi + +if [ x$1 = xnet ]; then + root=net + kernel=net +fi + +if [ x$1 = xnor ]; then + root=nor + kernel=nor +fi + +if [ x$ip = xdhcp ]; then + bootargs="$bootargs ip=dhcp" +else + bootargs="$bootargs ip=$eth0.ipaddr:$eth0.serverip:$eth0.gateway:$eth0.netmask:::" +fi + +if [ x$root = xnand ]; then + bootargs="$bootargs root=$rootpart_nand rootfstype=jffs2" +elif [ x$root = xnor ]; then + bootargs="$bootargs root=$rootpart_nor rootfstype=jffs2" +else + bootargs="$bootargs root=/dev/nfs nfsroot=$eth0.serverip:$nfsroot,v3,tcp" +fi + +bootargs="$bootargs mtdparts=physmap-flash.0:$nor_parts;imx_nand:$nand_parts" + +if [ $kernel = net ]; then + if [ x$ip = xdhcp ]; then + dhcp + fi + tftp $uimage uImage || exit 1 + bootm uImage +elif [ $kernel = nor ]; then + bootm /dev/nor0.kernel +else + bootm /dev/nand0.kernel.bb +fi + diff --git a/board/eukrea_cpuimx27/env/bin/hush_hack b/board/eukrea_cpuimx27/env/bin/hush_hack new file mode 100644 index 0000000..5fffa92 --- /dev/null +++ b/board/eukrea_cpuimx27/env/bin/hush_hack @@ -0,0 +1 @@ +nand -a /dev/nand0.* diff --git a/board/eukrea_cpuimx27/env/bin/init b/board/eukrea_cpuimx27/env/bin/init new file mode 100644 index 0000000..3bfd194 --- /dev/null +++ b/board/eukrea_cpuimx27/env/bin/init @@ -0,0 +1,37 @@ +#!/bin/sh + +PATH=/env/bin +export PATH + +. /env/config +if [ -e /dev/nor0 ]; then + addpart /dev/nor0 $nor_parts +fi + +if [ -e /dev/nand0 ]; then + addpart /dev/nand0 $nand_parts + + # Uh, oh, hush first expands wildcards and then starts executing + # commands. What a bug! + source /env/bin/hush_hack +fi + +if [ -z $eth0.ethaddr ]; then + while [ -z $eth0.ethaddr ]; do + readline "no MAC address set for eth0. please enter the one found on your board: " eth0.ethaddr + done + echo -a /env/config "eth0.ethaddr=$eth0.ethaddr" +fi + +echo +echo -n "Hit any key to stop autoboot: " +timeout -a $autoboot_timeout +if [ $? != 0 ]; then + echo + echo "type update_kernel nand|nor [<imagename>] to update kernel into flash" + echo "type update_root nand|nor [<imagename>] to update rootfs into flash" + echo + exit +fi + +boot diff --git a/board/eukrea_cpuimx27/env/bin/update_kernel b/board/eukrea_cpuimx27/env/bin/update_kernel new file mode 100644 index 0000000..05c822d --- /dev/null +++ b/board/eukrea_cpuimx27/env/bin/update_kernel @@ -0,0 +1,15 @@ +#!/bin/sh + +. /env/config + +image=$uimage +if [ x$1 = xnand ]; then + part=/dev/nand0.kernel.bb +elif [ x$1 = xnor ]; then + part=/dev/nor0.kernel +else + echo "usage: $0 nor|nand [imagename]" + exit 1 +fi + +. /env/bin/_update $2 diff --git a/board/eukrea_cpuimx27/env/bin/update_root b/board/eukrea_cpuimx27/env/bin/update_root new file mode 100644 index 0000000..eaf36eb --- /dev/null +++ b/board/eukrea_cpuimx27/env/bin/update_root @@ -0,0 +1,16 @@ +#!/bin/sh + +. /env/config + +image=$uimage +if [ x$1 = xnand ]; then + part=/dev/nand0.root.bb +elif [ x$1 = xnor ]; then + part=/dev/nor0.root +else + echo "usage: $0 nor|nand [imagename]" + exit 1 +fi + +. /env/bin/_update $2 + diff --git a/board/eukrea_cpuimx27/env/config b/board/eukrea_cpuimx27/env/config new file mode 100644 index 0000000..2547fb1 --- /dev/null +++ b/board/eukrea_cpuimx27/env/config @@ -0,0 +1,31 @@ +#!/bin/sh + +# can be either 'net', 'nor' or 'nand'' +kernel=nor +root=nor + +uimage=cpuimx27/uImage +jffs2=cpuimx27/rootfs.jffs2 + +autoboot_timeout=3 + +# TFP410-SVGA TFP410-VGA CMO-QVGA Optrex-WVGA Sharp-QVGA-EK +video="CMO-QVGA" +bootargs="console=ttymxc0,115200 fec_mac=$eth0.ethaddr rtc-pcf8563.probe=0,0x51 video=mxcfb:$video" + +nor_parts="256k(uboot)ro,128k(ubootenv),1792k(kernel),-(root)" +rootpart_nor="/dev/mtdblock3" + +nand_parts="-(nand)" +rootpart_nand="" + +nfsroot="" + +# use 'dhcp' to do dhcp in uboot and in kernel +ip=dhcp + +# or set your networking parameters here +#eth0.ipaddr=a.b.c.d +#eth0.netmask=a.b.c.d +#eth0.gateway=a.b.c.d +eth0.serverip=192.168.1.15 diff --git a/board/eukrea_cpuimx27/eukrea_cpuimx27.c b/board/eukrea_cpuimx27/eukrea_cpuimx27.c new file mode 100644 index 0000000..49c2f73 --- /dev/null +++ b/board/eukrea_cpuimx27/eukrea_cpuimx27.c @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2009 Eric Benard, Eukrea Electromatique + * Based on pcm038.c which is : + * Copyright (C) 2007 Sascha Hauer, Pengutronix + * + * 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 <net.h> +#include <cfi_flash.h> +#include <init.h> +#include <environment.h> +#include <asm/arch/imx-regs.h> +#include <fec.h> +#include <notifier.h> +#include <asm/arch/gpio.h> +#include <asm/armlinux.h> +#include <asm/mach-types.h> +#include <asm/arch/pmic.h> +#include <partition.h> +#include <fs.h> +#include <fcntl.h> +#include <nand.h> +#include <command.h> +#include <asm/io.h> +#include <asm/arch/imx-nand.h> +#include <asm/arch/imx-pll.h> + +static struct device_d cfi_dev = { + .name = "cfi_flash", + .id = "nor0", + + .map_base = 0xC0000000, + .size = 64 * 1024 * 1024, +}; + +static struct device_d sdram_dev = { + .name = "ram", + .id = "ram0", + + .map_base = 0xa0000000, + .size = 128 * 1024 * 1024, + + .type = DEVICE_TYPE_DRAM, +}; + +static struct fec_platform_data fec_info = { + .xcv_type = MII100, + .phy_addr = 1, +}; + +static struct device_d fec_dev = { + .name = "fec_imx", + .id = "eth0", + .map_base = 0x1002b000, + .platform_data = &fec_info, + .type = DEVICE_TYPE_ETHER, +}; + +struct imx_nand_platform_data nand_info = { + .width = 1, + .hw_ecc = 1, +}; + +static struct device_d nand_dev = { + .name = "imx_nand", + .map_base = 0xd8000000, + .platform_data = &nand_info, +}; + +static int eukrea_cpuimx27_devices_init(void) +{ + char *envdev = "no"; + int i; + + unsigned int mode[] = { + PD0_AIN_FEC_TXD0, + PD1_AIN_FEC_TXD1, + PD2_AIN_FEC_TXD2, + PD3_AIN_FEC_TXD3, + PD4_AOUT_FEC_RX_ER, + PD5_AOUT_FEC_RXD1, + PD6_AOUT_FEC_RXD2, + PD7_AOUT_FEC_RXD3, + PD8_AF_FEC_MDIO, + PD9_AIN_FEC_MDC | GPIO_PUEN, + PD10_AOUT_FEC_CRS, + PD11_AOUT_FEC_TX_CLK, + PD12_AOUT_FEC_RXD0, + PD13_AOUT_FEC_RX_DV, + PD14_AOUT_FEC_CLR, + PD15_AOUT_FEC_COL, + PD16_AIN_FEC_TX_ER, + PF23_AIN_FEC_TX_EN, + PE12_PF_UART1_TXD, + PE13_PF_UART1_RXD, + PE14_PF_UART1_CTS, + PE15_PF_UART1_RTS, + }; + + /* configure 16 bit nor flash on cs0 */ + CS0U = 0x0000CC03; + CS0L = 0xa0330D01; + CS0A = 0x00220800; + + /* configure 8 bit UART on cs3 */ + FMCR &= ~0x2; + CS3U = 0x0000DCF6; + CS3L = 0x444A4541; + CS3A = 0x44443302; + + /* initizalize gpios */ + for (i = 0; i < ARRAY_SIZE(mode); i++) + imx_gpio_mode(mode[i]); + + register_device(&cfi_dev); + register_device(&nand_dev); + register_device(&sdram_dev); + + dev_add_partition(&cfi_dev, 0x00000, 0x40000, PARTITION_FIXED, "self"); + dev_add_partition(&cfi_dev, 0x40000, 0x20000, PARTITION_FIXED, "env"); + dev_protect(&cfi_dev, 0x40000, 0, 1); + envdev = "NOR"; + + printf("Using environment in %s Flash\n", envdev); + + armlinux_set_bootparams((void *)0xa0000100); + armlinux_set_architecture(MACH_TYPE_CPUIMX27); + + return 0; +} + +device_initcall(eukrea_cpuimx27_devices_init); + +static struct device_d eukrea_cpuimx27_serial_device = { + .name = "imx_serial", + .id = "cs0", + .map_base = IMX_UART1_BASE, + .size = 4096, + .type = DEVICE_TYPE_CONSOLE, +}; + +static int eukrea_cpuimx27_console_init(void) +{ + register_device(&eukrea_cpuimx27_serial_device); + + return 0; +} + +console_initcall(eukrea_cpuimx27_console_init); + +static int eukrea_cpuimx27_late_init(void) +{ + console_flush(); + register_device(&fec_dev); + + return 0; +} + +late_initcall(eukrea_cpuimx27_late_init); + +#ifdef CONFIG_NAND_IMX_BOOT +void __bare_init nand_boot(void) +{ + int pagesize = 512; + + switch ((GPCR & GPCR_BOOT_MASK) >> GPCR_BOOT_SHIFT) { + case GPCR_BOOT_8BIT_NAND_2k: + case GPCR_BOOT_16BIT_NAND_2k: + pagesize = 2048; + } + + imx_nand_load_image((void *)TEXT_BASE, 256 * 1024, pagesize, 16384); +} +#endif + diff --git a/board/eukrea_cpuimx27/eukrea_cpuimx27.dox b/board/eukrea_cpuimx27/eukrea_cpuimx27.dox new file mode 100644 index 0000000..ad184ea --- /dev/null +++ b/board/eukrea_cpuimx27/eukrea_cpuimx27.dox @@ -0,0 +1,10 @@ +/** @page eukrea_cpuimx27 Eukrea's CPUIMX27 + +This CPU card is based on a Freescale i.MX27 CPU. The card is shipped with: + +- up to 64MiB NOR type Flash Memory +- up to 256MiB synchronous dynamic RAM +- up to 512MiB NAND type Flash Memory +- MII 10/100 ethernet PHY + +*/ diff --git a/board/eukrea_cpuimx27/lowlevel_init.S b/board/eukrea_cpuimx27/lowlevel_init.S new file mode 100644 index 0000000..8f61721 --- /dev/null +++ b/board/eukrea_cpuimx27/lowlevel_init.S @@ -0,0 +1,130 @@ +#include <config.h> +#include <asm/arch/imx-regs.h> + +#define writel(val, reg) \ + ldr r0, =reg; \ + ldr r1, =val; \ + str r1, [r0]; + + +#define ESDCTL0_VAL (ESDCTL0_SDE | ESDCTL0_ROW13 | ESDCTL0_COL10) + +.macro sdram_init + /* + * DDR on CSD0 + */ + writel(0x00000008, ESDMISC) /* Enable DDR SDRAM operation */ + + writel(0x55555555, DSCR(3)) /* Set the driving strength */ + writel(0x55555555, DSCR(5)) + writel(0x55555555, DSCR(6)) + writel(0x00005005, DSCR(7)) + writel(0x15555555, DSCR(8)) + + writel(0x00000004, ESDMISC) /* Initial reset */ + writel(0x0039572A, ESDCFG0) + + writel(ESDCTL0_VAL | ESDCTL0_SMODE_PRECHARGE, ESDCTL0) /* precharge CSD0 all banks */ + writel(0x00000000, 0xA0000F00) /* CSD0 precharge address (A10 = 1) */ + writel(ESDCTL0_VAL | ESDCTL0_SMODE_AUTO_REFRESH, ESDCTL0) + + ldr r0, =0xa0000f00 + mov r1, #0 + mov r2, #8 +1: + str r1, [r0] + subs r2, #1 + bne 1b + + writel(ESDCTL0_VAL | ESDCTL0_SMODE_LOAD_MODE, ESDCTL0) + ldr r0, =0xA0000033 + mov r1, #0xda + strb r1, [r0] + ldr r0, =0xA1000000 + mov r1, #0xff + strb r1, [r0] + writel(ESDCTL0_VAL | ESDCTL0_DSIZ_31_0 | ESDCTL0_REF4 | ESDCTL0_BL | ESDCTL0_SMODE_NORMAL, ESDCTL0) +.endm + + .section ".text_bare_init","ax" + +.globl board_init_lowlevel +board_init_lowlevel: + + mov r10, lr + + /* ahb lite ip interface */ + writel(0x20040304, AIPI1_PSR0) + writel(0xDFFBFCFB, AIPI1_PSR1) + writel(0x00000000, AIPI2_PSR0) + writel(0xFFFFFFFF, AIPI2_PSR1) + + /* disable mpll/spll */ + ldr r0, =CSCR + ldr r1, [r0] + bic r1, r1, #0x03 + str r1, [r0] + + /* + * pll clock initialization - see section 3.4.3 of the i.MX27 manual + */ + writel(0x00331C23, MPCTL0) /* MPLL = 399 MHz */ + writel(0x040C2403, SPCTL0) /* SPLL = 240 MHz */ + writel(0x33F38107 | CSCR_MPLL_RESTART | CSCR_SPLL_RESTART, CSCR) + + /* add some delay here */ + mov r1, #0x1000 +1: subs r1, r1, #0x1 + bne 1b + + /* clock gating enable */ + writel(0x00050f08, GPCR) + + /* peripheral clock divider */ + writel(0x130400c3, PCDR0) /* FIXME */ + writel(0x09030208, PCDR1) /* PERDIV1=08 @133 MHz */ + /* PERDIV1=04 @266 MHz */ + + /* skip sdram initialization if we run from ram */ + cmp pc, #0xa0000000 + bls 1f + cmp pc, #0xc0000000 + bhi 1f + + mov pc,r10 +1: + sdram_init + +#ifdef CONFIG_NAND_IMX_BOOT + ldr sp, =0xa0f00000 /* Setup a temporary stack in SDRAM */ + + ldr r0, =IMX_NFC_BASE /* start of NFC SRAM */ + ldr r2, =IMX_NFC_BASE + 0x1000 /* end of NFC SRAM */ + + /* skip NAND boot if not running from NFC space */ + cmp pc, r0 + bls ret + cmp pc, r2 + bhi ret + + /* Move ourselves out of NFC SRAM */ + ldr r1, =TEXT_BASE + +copy_loop: + ldmia r0!, {r3-r9} /* copy from source address [r0] */ + stmia r1!, {r3-r9} /* copy to target address [r1] */ + cmp r0, r2 /* until source end addreee [r2] */ + ble copy_loop + + ldr pc, =1f /* Jump to SDRAM */ +1: + bl nand_boot /* Load U-Boot from NAND Flash */ + + ldr r1, =IMX_NFC_BASE - TEXT_BASE + sub r10, r10, r1 /* adjust return address from NFC SRAM */ + /* to SDRAM */ + +#endif /* CONFIG_NAND_IMX_BOOT */ + +ret: + mov pc,r10

Signed-off-by: Eric Benard eric@eukrea.com --- drivers/nand/nand_imx.c | 20 +++++++++++++++++--- include/asm-arm/arch-imx/imx-nand.h | 3 ++- 2 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/drivers/nand/nand_imx.c b/drivers/nand/nand_imx.c index cbff7ce..ecfb649 100644 --- a/drivers/nand/nand_imx.c +++ b/drivers/nand/nand_imx.c @@ -874,7 +874,7 @@ static void imx_nand_command(struct mtd_info *mtd, unsigned command,
if (host->pagesize_2k) { send_addr(host, (page_addr >> 8) & 0xFF); - if (mtd->size >= 0x40000000) { + if (mtd->size >= 0x10000000) { send_addr(host, (page_addr >> 16) & 0xff); } } else { @@ -961,6 +961,15 @@ static void imx_low_erase(struct mtd_info *mtd) * * @return The function always returns 0. */ +static uint8_t scan_ff_pattern[] = { 0xff, 0xff }; + +static struct nand_bbt_descr smallpage_memorybased = { + .options = NAND_BBT_SCAN2NDPAGE, + .offs = 5, + .len = 1, + .pattern = scan_ff_pattern +}; + static int __init imxnd_probe(struct device_d *dev) { struct nand_chip *this; @@ -969,7 +978,7 @@ static int __init imxnd_probe(struct device_d *dev) struct imx_nand_host *host; u16 tmp; int err = 0; -#ifdef CONFIG_ARCH_MX27 +#ifdef CONFIG_ARCH_IMX27 PCCR1 |= PCCR1_NFC_BAUDEN; #endif /* Allocate memory for MTD device structure and private data */ @@ -1050,7 +1059,12 @@ static int __init imxnd_probe(struct device_d *dev) this->ecc.layout = &nand_hw_eccoob_16; }
- host->pagesize_2k = 0; + if (pdata->is2k) { + host->pagesize_2k = 1; + NFMS |= (1 << NFMS_BIT); + this->badblock_pattern = &smallpage_memorybased; + } else + host->pagesize_2k = 0;
/* Scan to find existence of the device */ if (nand_scan(mtd, 1)) { diff --git a/include/asm-arm/arch-imx/imx-nand.h b/include/asm-arm/arch-imx/imx-nand.h index 5ebe0be..500bb1a 100644 --- a/include/asm-arm/arch-imx/imx-nand.h +++ b/include/asm-arm/arch-imx/imx-nand.h @@ -8,6 +8,7 @@ void imx_nand_load_image(void *dest, int size, int pagesize, int blocksize); struct imx_nand_platform_data { int width; int hw_ecc; -}; + int is2k; + }; #endif /* __ASM_ARCH_NAND_H */

Signed-off-by: Eric Benard eric@eukrea.com --- arch/arm/configs/eukrea_cpuimx27_defconfig | 10 ++++++++-- board/eukrea_cpuimx27/eukrea_cpuimx27.c | 1 + 2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/arch/arm/configs/eukrea_cpuimx27_defconfig b/arch/arm/configs/eukrea_cpuimx27_defconfig index 6402278..465db18 100644 --- a/arch/arm/configs/eukrea_cpuimx27_defconfig +++ b/arch/arm/configs/eukrea_cpuimx27_defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # U-Boot version: 2.0.0-rc9 -# Wed Jul 15 16:05:10 2009 +# Wed Jul 15 16:06:14 2009 # CONFIG_ARCH_TEXT_BASE=0xa0000000 CONFIG_BOARDINFO="Eukrea CPUIMX27" @@ -151,6 +151,7 @@ CONFIG_CMD_MTEST=y # flash # CONFIG_CMD_FLASH=y +CONFIG_CMD_NAND=y
# # booting @@ -209,7 +210,12 @@ CONFIG_DRIVER_CFI=y # CONFIG_DRIVER_CFI_NEW is not set CONFIG_DRIVER_CFI_OLD=y CONFIG_CFI_BUFFER_WRITE=y -# CONFIG_NAND is not set +CONFIG_NAND=y +CONFIG_NAND_IMX=y +# CONFIG_NAND_IMX_BOOT is not set +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +# CONFIG_MTD_NAND_ECC_SMC is not set +CONFIG_MTD_NAND_IDS=y # CONFIG_USB is not set
# diff --git a/board/eukrea_cpuimx27/eukrea_cpuimx27.c b/board/eukrea_cpuimx27/eukrea_cpuimx27.c index 49c2f73..c87805f 100644 --- a/board/eukrea_cpuimx27/eukrea_cpuimx27.c +++ b/board/eukrea_cpuimx27/eukrea_cpuimx27.c @@ -75,6 +75,7 @@ static struct device_d fec_dev = { struct imx_nand_platform_data nand_info = { .width = 1, .hw_ecc = 1, + .is2k = 1, };
static struct device_d nand_dev = {

On Wed, Jul 15, 2009 at 05:18:40PM +0200, Eric Benard wrote:
static int __init imxnd_probe(struct device_d *dev) { struct nand_chip *this; @@ -969,7 +978,7 @@ static int __init imxnd_probe(struct device_d *dev) struct imx_nand_host *host; u16 tmp; int err = 0; -#ifdef CONFIG_ARCH_MX27 +#ifdef CONFIG_ARCH_IMX27 PCCR1 |= PCCR1_NFC_BAUDEN; #endif /* Allocate memory for MTD device structure and private data */ @@ -1050,7 +1059,12 @@ static int __init imxnd_probe(struct device_d *dev) this->ecc.layout = &nand_hw_eccoob_16; }
- host->pagesize_2k = 0;
- if (pdata->is2k) {
host->pagesize_2k = 1;
NFMS |= (1 << NFMS_BIT);
this->badblock_pattern = &smallpage_memorybased;
Why are you using the small-page badblock pattern with large pages?
- } else
host->pagesize_2k = 0;
If you use braces on one side of if/else, use them on the other.
diff --git a/include/asm-arm/arch-imx/imx-nand.h b/include/asm-arm/arch-imx/imx-nand.h index 5ebe0be..500bb1a 100644 --- a/include/asm-arm/arch-imx/imx-nand.h +++ b/include/asm-arm/arch-imx/imx-nand.h @@ -8,6 +8,7 @@ void imx_nand_load_image(void *dest, int size, int pagesize, int blocksize); struct imx_nand_platform_data { int width; int hw_ecc; -};
- int is2k;
- };
That last brace should not be indented.
-Scott

Scott Wood a écrit :
On Wed, Jul 15, 2009 at 05:18:40PM +0200, Eric Benard wrote:
- if (pdata->is2k) {
host->pagesize_2k = 1;
NFMS |= (1 << NFMS_BIT);
this->badblock_pattern = &smallpage_memorybased;
Why are you using the small-page badblock pattern with large pages?
that's what Freescale is doing in its Linux BSP and it doesn't work without, at least on my board (8 bits width NAND):
if (!this->badblock_pattern) { if (mtd->writesize == NAND_PAGESIZE_2KB) this->badblock_pattern = &smallpage_memorybased; else this->badblock_pattern = (mtd->writesize > 512) ? &largepage_memorybased : &smallpage_memorybased; }
Eric

On Wed, Jul 15, 2009 at 05:18:40PM +0200, Eric Benard wrote:
Signed-off-by: Eric Benard eric@eukrea.com
drivers/nand/nand_imx.c | 20 +++++++++++++++++--- include/asm-arm/arch-imx/imx-nand.h | 3 ++- 2 files changed, 19 insertions(+), 4 deletions(-)
What tree is this against? There is no "drivers/nand" in current u-boot, it is in drivers/mtd/nand. And there is no nand_imx.c.
-Scott

Scott Wood a écrit :
On Wed, Jul 15, 2009 at 05:18:40PM +0200, Eric Benard wrote:
Signed-off-by: Eric Benard eric@eukrea.com
drivers/nand/nand_imx.c | 20 +++++++++++++++++--- include/asm-arm/arch-imx/imx-nand.h | 3 ++- 2 files changed, 19 insertions(+), 4 deletions(-)
What tree is this against? There is no "drivers/nand" in current u-boot, it is in drivers/mtd/nand. And there is no nand_imx.c.
sorry this was for u-boot v2. Eric

On Sat, Aug 01, 2009 at 08:28:30AM +0200, Eric Bénard wrote:
Scott Wood a écrit :
On Wed, Jul 15, 2009 at 05:18:40PM +0200, Eric Benard wrote:
Signed-off-by: Eric Benard eric@eukrea.com
drivers/nand/nand_imx.c | 20 +++++++++++++++++--- include/asm-arm/arch-imx/imx-nand.h | 3 ++- 2 files changed, 19 insertions(+), 4 deletions(-)
What tree is this against? There is no "drivers/nand" in current u-boot, it is in drivers/mtd/nand. And there is no nand_imx.c.
sorry this was for u-boot v2.
Ah. I interpreted the v2 as "this is the second version of this patch".
Can we come up with a less ambiguous way to mark u-boot v2 patches?
-Scott

Hi Eric,
On Wed, Jul 15, 2009 at 05:18:39PM +0200, Eric Benard wrote:
CPUIMX27 is built around Freescale's i.MX27 and has up to 64MB of NOR Flash, up to 512MB of NAND Flash and up to 256MB of mDDR, it includes an ethernet PHY in MII mode, an I2C RTC and a ST16554 QuadUART on nCS3.
Looks good. Applied, thanks.
Sascha
participants (4)
-
Eric Benard
-
Eric Bénard
-
Sascha Hauer
-
Scott Wood