[U-Boot] [PATCHv2 3/3] 83xx, kmeter1: added NAND support
Stefan Roese
sr at denx.de
Mon Jul 13 11:20:31 CEST 2009
On Saturday 11 July 2009 10:19:08 Heiko Schocher wrote:
> +++ b/drivers/mtd/nand/kmeter1_nand.c
> @@ -0,0 +1,153 @@
> +/*
> + * (C) Copyright 2009
> + * Heiko Schocher, DENX Software Engineering, hs at denx.de
> + *
> + * 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>
> +
> +#if defined(CONFIG_CMD_NAND)
This #if shouldn't be necessary.
> +#include <nand.h>
> +#include <asm/io.h>
> +
> +#define CONFIG_NAND_MODE_REG (CONFIG_SYS_NAND_BASE + 0x20000)
> +#define CONFIG_NAND_DATA_REG (CONFIG_SYS_NAND_BASE + 0x30000)
> +
> +#define read_mode() in_8((volatile unsigned char __iomem *) \
> + CONFIG_NAND_MODE_REG)
> +#define write_mode(val) out_8((volatile unsigned char __iomem *) \
> + CONFIG_NAND_MODE_REG, val)
> +#define read_data() in_8((volatile unsigned char __iomem *) \
> + CONFIG_NAND_DATA_REG)
> +#define write_data(val) out_8((volatile unsigned char __iomem *) \
> + CONFIG_NAND_DATA_REG, val)
> +
> +#define KPN_RDY2 (1 << 7)
> +#define KPN_RDY1 (1 << 6)
> +#define KPN_WPN (1 << 4)
> +#define KPN_CE2N (1 << 3)
> +#define KPN_CE1N (1 << 2)
> +#define KPN_ALE (1 << 1)
> +#define KPN_CLE (1 << 0)
> +
> +#define KPN_DEFAULT_CHIP_DELAY 50
> +
> +static int kpn_chip_ready(void)
> +{
> + if (read_mode() & KPN_RDY1)
> + return 1;
> +
> + return 0;
> +}
> +
> +static void kpn_wait_rdy(void)
> +{
> + int cnt = 1000000;
> +
> + while (--cnt && !kpn_chip_ready())
> + udelay(1);
> +
> + if (!cnt)
> + printf ("timeout while waiting for RDY\n");
> +}
> +
> +static void kpn_nand_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int
> ctrl) +{
> + u8 reg_val = read_mode();
> +
> + if (ctrl & NAND_CTRL_CHANGE) {
> + if ( ctrl & NAND_NCE)
> + reg_val = reg_val & ~KPN_CE1N;
> + else
> + reg_val = reg_val | KPN_CE1N;
> + write_mode(reg_val);
> + }
> + if (cmd == NAND_CMD_NONE)
> + return;
> +
> + reg_val = reg_val & ~(KPN_ALE + KPN_CLE);
> + if (ctrl & NAND_CLE)
> + reg_val = reg_val | KPN_CLE;
> + if (ctrl & NAND_ALE)
> + reg_val = reg_val | KPN_ALE;
> +
> + /* select register */
> + write_mode(reg_val);
> +
> + /* write cmd */
> + write_data(cmd);
> +
> + /* deselect register */
> + reg_val = reg_val & ~(KPN_ALE + KPN_CLE);
> + write_mode(reg_val);
> +
> + /* wait until flash is ready */
> + kpn_wait_rdy();
> +}
> +
> +static u_char kpn_nand_read_byte(struct mtd_info *mtd)
> +{
> + return read_data();
> +}
> +
> +static void kpn_nand_write_buf(struct mtd_info *mtd, const u_char *buf,
> int len) +{
> + int i;
> +
> + for (i = 0; i < len; i++) {
> + write_data(buf[i]);
> + kpn_wait_rdy();
> + }
> +}
> +
> +static void kpn_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
> +{
> + int i;
> +
> + for (i = 0; i < len; i++) {
> + buf[i] = read_data();
> + }
Nitpicking: The braces are not necessary (single line statement).
Best regards,
Stefan
=====================================================================
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office at denx.de
=====================================================================
More information about the U-Boot
mailing list