[U-Boot] [PATCHv2 3/3] 83xx, kmeter1: added NAND support
Heiko Schocher
hs at denx.de
Mon Jul 13 11:55:15 CEST 2009
Hello Stefan,
Stefan Roese wrote:
> 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.
Hmm.. keymile has per default deactivated NAND support on this board,
so I think it is necessary (or I make this dependence in the board
makefile ...)
>> +#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).
Yep, you are right. I fix it.
thanks
bye
Heiko
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
More information about the U-Boot
mailing list