[Skyeye-developer] SF.net SVN: skyeye: [311] skyeye-v1/trunk
Michael.Kang
blackfin.kang at gmail.com
Mon Sep 17 17:50:45 CST 2007
Revision: 311
http://skyeye.svn.sourceforge.net/skyeye/?rev=311&view=rev
Author: kangsh
Date: 2007-09-17 02:49:15 -0700 (Mon, 17 Sep 2007)
Log Message:
-----------
Add patch for nandflash device provided by gbf0871
Modified Paths:
--------------
skyeye-v1/trunk/Makefile
skyeye-v1/trunk/device/skyeye_device.c
skyeye-v1/trunk/utils/config/skyeye_config.h
skyeye-v1/trunk/utils/config/skyeye_options.c
Added Paths:
-----------
skyeye-v1/trunk/device/nandflash/dev_nandflash_s3c2410.c
skyeye-v1/trunk/device/nandflash/dev_nandflash_s3c2410.h
skyeye-v1/trunk/device/nandflash/nandflash_smallblock.c
skyeye-v1/trunk/device/nandflash/nandflash_smallblock.h
skyeye-v1/trunk/device/nandflash/skyeye_nandflash.c
skyeye-v1/trunk/device/nandflash/skyeye_nandflash.h
skyeye-v1/trunk/device/nandflash/tools/
skyeye-v1/trunk/device/nandflash/tools/mknandflashdump.c
Modified: skyeye-v1/trunk/Makefile
===================================================================
--- skyeye-v1/trunk/Makefile 2007-09-17 09:46:18 UTC (rev 310)
+++ skyeye-v1/trunk/Makefile 2007-09-17 09:49:15 UTC (rev 311)
@@ -107,12 +107,12 @@
ARCH_ARM_CFLAGS = -I arch/arm -I arch/arm/common -I
arch/arm/common/mmu -I arch/arm/mach
ARCH_BLACKFIN_CFLAGS = -I arch/bfin/common -I arch/bfin/mach
ARCH_COLDFIRE_CFLAGS = -I arch/coldfire/common
-#Shi yang 2006-08-23
ARCH_MIPS_CFLAGS = -I arch/mips/common
-DEVICE_CFLAGS = -I device -I device/net -I device/lcd -I device/flash
-I device/uart
+ARCH_PPC_CFLAGS = -I arch/ppc/common
+DEVICE_CFLAGS = -I device -I device/net -I device/lcd -I device/flash
-I device/uart -I device/nandflash
UTILS_CFLAGS = -I utils -I utils/share -I utils/main -I utils/config
-I utils/debugger
-SIM_EXTRA_CFLAGS = -DMODET $(ARCH_ARM_CFLAGS) $(ARCH_BLACKFIN_CFLAGS)
$(ARCH_COLDFIRE_CFLAGS) $(DEVICE_CFLAGS) $(UTILS_CFLAGS)
+SIM_EXTRA_CFLAGS = -DMODET $(ARCH_ARM_CFLAGS) $(ARCH_BLACKFIN_CFLAGS)
$(ARCH_COLDFIRE_CFLAGS) $(ARCH_PPC_CFLAGS) $(DEVICE_CFLAGS)
$(UTILS_CFLAGS)
SIM_EXTRA_LIBS = $(EXTRA_LIBS)
# Determine extra flags/libs on system
@@ -191,7 +191,7 @@
$(DEVICE_CFLAGS) $(UTILS_CFLAGS) -g -O
endif
-SIM_ARM_OBJS = binary/armcopro.o binary/armemu26.o binary/armemu32.o
binary/arminit.o binary/armsupp.o binary/armos.o binary/thumbemu.o
binary/armvirt.o binary/armmmu.o binary/armmem.o binary/armio.o
binary/arm_arch_interface.o
+SIM_ARM_OBJS = binary/armcopro.o binary/armemu26.o binary/armemu32.o
binary/arminit.o binary/armsupp.o binary/armos.o binary/thumbemu.o
binary/armvirt.o binary/armmmu.o binary/armmem.o binary/armio.o
binary/arm_arch_interface.o binary/armengr.o binary/armsym.o
BFIN_DBCT_OBJS = binary/bfin_tb.o binary/dbct_step.o
binary/bfin2x86_load_store.o binary/bfin2x86_move.o
binary/bfin2x86_arith.o
BFIN_COMMON_OBJS = binary/bfin_arch_interface.o binary/iomem.o
binary/bfin-dis.o
BFIN_MACH_OBJS = binary/bf533_io.o binary/bf537_io.o
@@ -294,11 +294,15 @@
binary/dev_flash_intel.o \
binary/dev_flash_sst39lvf160.o \
binary/dev_flash_am29.o
+
+SIM_NANDFLASH_OBJS= binary/skyeye_nandflash.o \
+ binary/dev_nandflash_s3c2410.o\
+ binary/nandflash_smallblock.o
SIM_TOUCHSCREEN_OBJS = binary/skyeye_touchscreen.o
binary/dev_touchscreen_skyeye.o
SIM_SOUND_OBJS = binary/skyeye_sound.o binary/skyeye_sound_pcm.o
binary/dev_sound_s3c44b0x.o
-SIM_DEVICE_OBJS = binary/skyeye_device.o $(SIM_NET_OBJS)
$(SIM_LCD_OBJS) $(SIM_FLASH_OBJS) $(SIM_UART_OBJS)
$(SIM_TOUCHSCREEN_OBJS) $(SIM_SOUND_OBJS)
+SIM_DEVICE_OBJS = binary/skyeye_device.o $(SIM_NET_OBJS)
$(SIM_LCD_OBJS) $(SIM_FLASH_OBJS) $(SIM_UART_OBJS)
$(SIM_TOUCHSCREEN_OBJS) $(SIM_SOUND_OBJS) $(SIM_NANDFLASH_OBJS)
SIM_UTILS_OBJS = binary/skyeye2gdb.o \
binary/gdbserver.o \
@@ -554,6 +558,10 @@
$(CC) -c $< -o $@ $(ALL_CFLAGS)
binary/arm_arch_interface.o: $(ARM_COMMON_PATH)/arm_arch_interface.c
$(CC) -c $< -o $@ $(ALL_CFLAGS)
+binary/armengr.o: $(ARM_COMMON_PATH)/armengr.c
+ $(CC) -c $< -o $@ $(ALL_CFLAGS)
+binary/armsym.o: $(ARM_COMMON_PATH)/armsym.c $(ARM_COMMON_PATH)/armsym.h
+ $(CC) -c $< -o $@ $(ALL_CFLAGS)
#SIM_MMU_OBJS
binary/arm7100_mmu.o: $(ARM_COMMON_PATH)/mmu/arm7100_mmu.c
$(ARM_COMMON_PATH)/mmu/arm7100_mmu.h
$(CC) $(ALL_CFLAGS) -c $< -o $@
@@ -575,9 +583,6 @@
$(CC) -c $< -o $@ $(ALL_CFLAGS)
binary/wb.o: $(ARM_COMMON_PATH)/mmu/wb.c $(ARM_COMMON_PATH)/mmu/wb.h
$(CC) -c $< -o $@ $(ALL_CFLAGS)
-binary/skyeye_mach_ps7500.o: $(ARM_MACH_PATH)/skyeye_mach_ps7500.c
$(UTILS_PATH)/config/skyeye_config.h \
- $(ARM_COMMON_PATH)/armdefs.h
$(ARM_COMMON_PATH)/armio.h $(ARM_MACH_PATH)/ps7500.h
- $(CC) $(ALL_CFLAGS) -c $< -o $@
@@ -635,6 +640,9 @@
$(CC) $(ALL_CFLAGS) -c $< -o $@
binary/skyeye_mach_9238imx.o:$(ARM_MACH_PATH)/skyeye_mach_9238imx.c
$(ARM_MACH_PATH)/imx-regs.h
$(CC) $(ALL_CFLAGS) -c $< -o $@
+binary/skyeye_mach_ps7500.o: $(ARM_MACH_PATH)/skyeye_mach_ps7500.c
$(UTILS_PATH)/config/skyeye_config.h \
+ $(ARM_COMMON_PATH)/armdefs.h
$(ARM_COMMON_PATH)/armio.h $(ARM_MACH_PATH)/ps7500.h
+ $(CC) $(ALL_CFLAGS) -c $< -o $@
#SIM_DEVICE_OBJS
binary/skyeye_device.o: $(DEVICE_PATH)/skyeye_device.c
$(DEVICE_PATH)/skyeye_device.h
@@ -648,6 +656,14 @@
binary/dev_flash_%.o:$(DEVICE_PATH)/flash/dev_flash_%.c
$(DEVICE_PATH)/flash/dev_flash_%.h $(DEVICE_PATH)/flash/skyeye_flash.h
$(CC) -c $< -o $@ $(ALL_CFLAGS)
+#SIM_NANDFLASH_OBJS
+binary/skyeye_nandflash.o:
$(DEVICE_PATH)/nandflash/skyeye_nandflash.c
$(DEVICE_PATH)/nandflash/skyeye_nandflash.h
$(ARM_COMMON_PATH)/armdefs.h
+ $(CC) -c $< -o $@ $(ALL_CFLAGS)
+binary/nandflash_smallblock.o:
$(DEVICE_PATH)/nandflash/nandflash_smallblock.c
$(DEVICE_PATH)/nandflash/nandflash_smallblock.h
$(ARM_COMMON_PATH)/armdefs.h
+ $(CC) -c $< -o $@ $(ALL_CFLAGS)
+binary/dev_nandflash_%.o:$(DEVICE_PATH)/nandflash/dev_nandflash_%.c
$(DEVICE_PATH)/nandflash/dev_nandflash_%.h
$(DEVICE_PATH)/nandflash/skyeye_nandflash.h
+ $(CC) -c $< -o $@ $(ALL_CFLAGS)
+
#SIM_NET_OBJS
binary/dev_net_%.o: $(DEVICE_PATH)/net/dev_net_%.c
$(DEVICE_PATH)/net/dev_net_%.h
$(CC) $(ALL_CFLAGS) -c $< -o $@
@@ -742,7 +758,7 @@
$(CC) -c $< -o $@ $(ALL_CFLAGS)
binary/ppc_fpu.o:$(PPC_COMMON_PATH)/ppc_fpu.c $(PPC_COMMON_PATH)/ppc_cpu.h
$(CC) -c $< -o $@ $(ALL_CFLAGS)
-binary/ppc_mmu.o:$(PPC_COMMON_PATH)/ppc_mmu.c
$(PPC_COMMON_PATH)/ppc_cpu.h $(PPC_COMMON_PATH)/ppc_mmu.h
+binary/ppc_mmu.o:$(PPC_COMMON_PATH)/ppc_mmu.c
$(PPC_COMMON_PATH)/ppc_cpu.h $(PPC_COMMON_PATH)/ppc_mmu.h
$(PPC_COMMON_PATH)/ppc_memory.h
$(CC) -c $< -o $@ $(ALL_CFLAGS)
binary/ppc_vec.o:$(PPC_COMMON_PATH)/ppc_vec.c $(PPC_COMMON_PATH)/ppc_cpu.h
$(CC) -c $< -o $@ $(ALL_CFLAGS)
Added: skyeye-v1/trunk/device/nandflash/dev_nandflash_s3c2410.c
===================================================================
--- skyeye-v1/trunk/device/nandflash/dev_nandflash_s3c2410.c
(rev 0)
+++ skyeye-v1/trunk/device/nandflash/dev_nandflash_s3c2410.c
2007-09-17 09:49:15 UTC (rev 311)
@@ -0,0 +1,227 @@
+/*
+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, 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. */
+
+/*
+ * author gbf0871 <gbf0871 at 126.com>
+ */
+#include "armdefs.h"
+#include "skyeye_device.h"
+#include "skyeye_nandflash.h"
+#include "dev_nandflash_s3c2410.h"
+#include "nandflash_smallblock.h"
+
+static void
+nandflash_s3c2410_fini (struct device_desc *dev)
+{
+ struct nandflash_device *nandflashdev=(struct
nandflash_device*)dev->dev;
+ struct nandflash_s3c2410_io *io = (struct nandflash_s3c2410_io
*) dev->data;
+ //nandflash_sb_uninstall(nandflashdev);
+ nandflashdev->uinstall(nandflashdev);
+ if (!dev->dev)
+ free (dev->dev);
+ if (!io)
+ free (io);
+}
+
+static void
+nandflash_s3c2410_reset (struct device_desc *dev)
+{
+ struct nandflash_device *nandflash_dev = (struct
nandflash_device *) dev->dev;
+ struct nandflash_s3c2410_io *io = (struct nandflash_s3c2410_io
*) dev->data;
+ //struct nandflash_sb_status *nf = (struct
nandflash_sb_status*)nandflash_dev->priv;
+ io->nfaddr=0;
+ io->nfcmd=0;
+ io->nfconf=0;
+ io->nfdata=0;
+ io->nfecc=0;
+ io->nfstat=0;
+ nandflash_dev->setCE(nandflash_dev,NF_HIGH);
+ //nandflash_sb_setCE(NF_HIGH,nf);
+}
+
+static void
+nandflash_s3c2410_update (struct device_desc *dev)
+{
+ struct nandflash_device *nandflash_dev = (struct
nandflash_device *) dev->dev;
+ struct nandflash_s3c2410_io *io = (struct nandflash_s3c2410_io
*) dev->data;
+ struct machine_config *mc = (struct machine_config *) dev->mach;
+
+}
+
+int iomach(u32 addr)
+{
+ if((addr>=NFCONF)&&(addr<=NFECC3))
+ return 1;
+ else
+ return 0;
+}
+int
+nandflash_s3c2410_read_word (struct device_desc *dev, u32 addr, u32 * data)
+{
+ struct nandflash_device *nandflash_dev = (struct
nandflash_device *) dev->dev;
+ struct nandflash_s3c2410_io *io = (struct nandflash_s3c2410_io
*) dev->data;
+ //struct nandflash_sb_status *nf = (struct
nandflash_sb_status*)nandflash_dev->priv;
+ int ret = ADDR_HIT;
+ int ctrenable=io->nfconf&S3C2410_NFCONF_EN;
+ //if (iomach(addr))
+ // NANDFLASH_DBG("%s:addr %x\n", __FUNCTION__, addr);
+ *data = 0;
+ switch (addr) {
+ case NFCONF:
+ *data = io->nfconf;
+ break;
+ case NFCMD:
+ *data = io->nfcmd;
+ break;
+ case NFADDR:
+ *data = io->nfaddr;
+ break;
+ case NFDATA:
+ if(ctrenable)
+ //*data=(u32)nandflash_sb_readdata(nf);
+ *data=(u32)nandflash_dev->readdata(nandflash_dev);
+ break;
+ case NFSTAT:
+ if(ctrenable)
+ *data=nandflash_dev->readRB(nandflash_dev);
+ //*data = nandflash_sb_readRB(nf);
+ break;
+ case NFECC1:
+ *data = 0xFF;
+ break;
+ case NFECC2:
+ *data = 0xFF;
+ break;
+ case NFECC3:
+ *data = 0xFF;
+ break;
+ default:
+ ret= ADDR_NOHIT;
+ break;
+ }
+ //if (iomach(addr))
+ // NANDFLASH_DBG("%s:readdata: %x\n", __FUNCTION__, *data);
+ return ret;
+
+}
+int
+nandflash_s3c2410_read_byte(struct device_desc *dev, u32 addr, u8 * data)
+{
+ nandflash_s3c2410_read_word(dev,addr,(u32*)data);
+}
+
+
+int
+nandflash_s3c2410_write_word (struct device_desc *dev, u32 addr, u32 data)
+{
+ struct nandflash_device *nandflash_dev = (struct
nandflash_device *) dev->dev;
+ struct nandflash_s3c2410_io *io = (struct nandflash_s3c2410_io
*) dev->data;
+ //struct nandflash_sb_status *nf = (struct
nandflash_sb_status*)nandflash_dev->priv;
+ int ret = ADDR_HIT;
+ int ctrenable=io->nfconf&S3C2410_NFCONF_EN;
+ //if (iomach(addr))
+
+ switch (addr) {
+ case NFCONF:
+ //NANDFLASH_DBG("%s:mach:%x,data:%x\n", __FUNCTION__,
addr,data);
+ io->nfconf=data;
+ ctrenable=io->nfconf&S3C2410_NFCONF_EN;
+ if ((data&S3C2410_NFCONF_nFCE)&&(ctrenable))
+ {
+ //NANDFLASH_DBG("%d\n",data&S3C2410_NFCONF_nFCE);
+ //nandflash_sb_setCE(NF_HIGH,nf);
+ nandflash_dev->setCE(nandflash_dev,NF_HIGH);
+ }
+ else
+ {
+ //nandflash_sb_setCE(NF_LOW,nf);
+ nandflash_dev->setCE(nandflash_dev,NF_LOW);
+ }
+ break;
+ case NFCMD:
+
+ if(ctrenable)
+ {
+ //NANDFLASH_DBG("%s:mach:%x,data:%x\n",
__FUNCTION__, addr,data);
+ //nandflash_sb_sendcmd((u8)data,nf);
+ nandflash_dev->sendcmd(nandflash_dev,(u8)data);
+ }
+ break;
+ case NFADDR:
+ if(ctrenable)
+ nandflash_dev->sendaddr(nandflash_dev,(u8)data);
+ //nandflash_sb_sendaddr((u8)data,nf);
+ break;
+ case NFDATA:
+ if(ctrenable)
+ nandflash_dev->senddata(nandflash_dev,(u8)data);
+ //nandflash_sb_senddata((u8)data,nf);
+ break;
+ case NFSTAT:
+ break;
+ case NFECC1:
+ break;
+ case NFECC2:
+ break;
+ case NFECC3:
+ break;
+ default:
+ ret = ADDR_NOHIT;
+ break;
+ }
+
+ return ret;
+}
+int
+nandflash_s3c2410_write_byte (struct device_desc *dev, u32 addr, u8 data)
+{
+ nandflash_s3c2410_write_word(dev,addr,(u32)data);
+}
+static int
+nandflash_s3c2410_setup (struct device_desc *dev)
+{
+ int i;
+ struct nandflash_s3c2410_io *io;
+ struct device_interrupt *intr = &dev->intr;
+ struct nandflash_device *nandflashdev=(struct
nandflash_device*)dev->dev;
+ dev->fini = nandflash_s3c2410_fini;
+ dev->reset = nandflash_s3c2410_reset;
+ dev->update = nandflash_s3c2410_update;
+ dev->read_word = nandflash_s3c2410_read_word;
+ dev->write_word = nandflash_s3c2410_write_word;
+ dev->read_byte= nandflash_s3c2410_read_byte;
+ dev->write_byte= nandflash_s3c2410_write_byte;
+ //nandflash_sb_setup(nandflashdev);
+ if (nandflash_module_setup(nandflashdev,dev->name)==-1)
+ return 1;
+ nandflashdev->install(nandflashdev);
+ io = (struct nandflash_s3c2410_io *)
+ malloc (sizeof (struct nandflash_s3c2410_io));
+ if (io == NULL)
+ return 1;
+ memset (io, 0, sizeof (struct nandflash_s3c2410_io));
+ dev->data = (void *) io;
+ nandflash_s3c2410_reset (dev);
+ return 0;
+}
+
+void
+nandflash_s3c2410_init (struct device_module_set *mod_set)
+{
+ int i;
+ register_device_module ("s3c2410x", mod_set, &nandflash_s3c2410_setup);
+
+}
+
Added: skyeye-v1/trunk/device/nandflash/dev_nandflash_s3c2410.h
===================================================================
--- skyeye-v1/trunk/device/nandflash/dev_nandflash_s3c2410.h
(rev 0)
+++ skyeye-v1/trunk/device/nandflash/dev_nandflash_s3c2410.h
2007-09-17 09:49:15 UTC (rev 311)
@@ -0,0 +1,51 @@
+/*
+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, 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. */
+
+/*
+ * author gbf0871 <gbf0871 at 126.com>
+ */
+#ifndef __DEV_NANDFLASH_S3C2410_H_
+#define __DEV_NANDFLASH_S3C2410_H_
+
+#define S3C2410_NFCONF_EN (1<<15)
+#define S3C2410_NFCONF_512BYTE (1<<14)
+#define S3C2410_NFCONF_4STEP (1<<13)
+#define S3C2410_NFCONF_INITECC (1<<12)
+#define S3C2410_NFCONF_nFCE (1<<11)
+#define S3C2410_NFCONF_TACLS(x) ((x)<<8)
+#define S3C2410_NFCONF_TWRPH0(x) ((x)<<4)
+#define S3C2410_NFCONF_TWRPH1(x) ((x)<<0)
+#define NFCONF 0x4E000000 /* NAND flash configuration */
+#define NFCMD 0x4E000004 /* NAND flash command set register */
+#define NFADDR 0x4E000008 /*NAND flash address set register*/
+#define NFDATA 0x4E00000C /* NAND flash data register */
+#define NFSTAT 0x4E000010 /*NAND flash operation status*/
+#define NFECC1 0x4E000014 /* NAND flash ECC (Error Correction
Code) register */
+#define NFECC2 0x4E000015
+#define NFECC3 0x4E000016
+
+typedef struct nandflash_s3c2410_io
+{
+ u32 nfconf;
+ u32 nfcmd;
+ u32 nfaddr;
+ u32 nfdata;
+ u32 nfstat;
+ u32 nfecc;
+} nandflash_s3c2410_io_t;
+
+
+#endif //_DEV_NANDFLASH_S3C2410_H_
+
Added: skyeye-v1/trunk/device/nandflash/nandflash_smallblock.c
===================================================================
--- skyeye-v1/trunk/device/nandflash/nandflash_smallblock.c
(rev 0)
+++ skyeye-v1/trunk/device/nandflash/nandflash_smallblock.c
2007-09-17 09:49:15 UTC (rev 311)
@@ -0,0 +1,611 @@
+/*
+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, 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. */
+
+/*
+ * author gbf0871 <gbf0871 at 126.com>
+ */
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <unistd.h>
+//#include <sys/mman.h>
+#include "portable/mman.h"
+#include "skyeye_nandflash.h"
+#include "nandflash_smallblock.h"
+void nandflash_sb_reset(struct nandflash_device *dev);
+static void nandflash_sb_doerase(struct nandflash_device *dev,struct
nandflash_sb_status *nf)
+{
+ u32 blocks,len,base,i;
+ if(nf->WP==NF_HIGH)
+ {
+ len=dev->erasesize;
+ base=nf->address-nf->address%len;
+#if !(defined(__MINGW32__))
+ for (i=0;i<len;i++)
+ *(nf->addrspace+base+i)=0xFF;
+#else
+ lseek(nf->fdump,base,SEEK_SET);
+ memset(nf->readbuffer,0xff,dev->pagedumpsize);
+ nf->curblock=-1;
+ for(i=0;i<dev->pagenum;i++)
+ write(nf->fdump,nf->readbuffer,dev->pagedumpsize);
+#endif
+ //msync(nf->addrspace+base,len,MS_ASYNC);
+ }
+}
+static void nandflash_sb_dodatawrite(struct nandflash_device
*dev,struct nandflash_sb_status *nf)
+{
+ u32 offset;
+ if(nf->WP==NF_HIGH)
+ {
+ //offset=nf->address%528;
+ if (nf->pageoffset>dev->pagedumpsize-1)
+ NANDFLASH_DBG("nandflash write cycle out bound\n");
+ nf->writebuffer[nf->pageoffset]=nf->IOPIN;
+ nf->pageoffset++;
+ }
+
+}
+static void nandflash_sb_finishwrite(struct nandflash_device
*dev,struct nandflash_sb_status *nf)
+{
+ u32 i,base;
+ if(nf->WP==NF_HIGH)
+ {
+ base=nf->address-nf->address%dev->pagedumpsize;
+#if !(defined(__MINGW32__))
+ for (i=0;i<dev->pagedumpsize;i++)
+ {
+ *(nf->addrspace+base+i)&=nf->writebuffer[i];
+ }
+#else
+ //printf("DEBUG:nand flash write\n");
+ lseek(nf->fdump,base,SEEK_SET);
+
if(write(nf->fdump,nf->writebuffer,dev->pagedumpsize)!=dev->pagedumpsize)
+ printf("nand flash write error\n");
+ //fsync(nf->fdump);
+#endif
+ //msync(nf->addrspace+base,528,MS_ASYNC);
+ }
+}
+static void nandflash_sb_doread(struct nandflash_device *dev,struct
nandflash_sb_status *nf)
+{
+ if(nf->address<dev->devicesize)
+ {
+#if !(defined(__MINGW32__))
+ nf->IOPIN=*(nf->addrspace+nf->address);
+#else
+ int blockoff=nf->address%dev->pagedumpsize;
+ nf->IOPIN=nf->readbuffer[blockoff];
+#endif
+ nf->address++;
+#if (defined(__MINGW32__))
+ if((nf->address%dev->pagedumpsize)==0)
+ {
+ nf->curblock=-1;
+ }
+#endif
+
if((nf->address%dev->pagedumpsize==0)&&(nf->cmd==NAND_CMD_READOOB))
+ {
+ nf->address+=dev->pagesize;
+ }
+ //NANDFLASH_DBG("%s:mach:%x,data:%x\n", __FUNCTION__,
nf->address,nf->IOPIN);
+ }
+ else
+ {
+ NANDFLASH_DBG("nandflash read outof bound!\n");
+ }
+}
+static void nandflash_sb_doreadid(struct nandflash_device *dev,struct
nandflash_sb_status *nf)
+{
+ switch(nf->cmdstatus){
+ case NF_readID_1st:
+ nf->IOPIN=dev->ID[0];
+ nf->cmdstatus=NF_readID_2nd;
+ break;
+ case NF_readID_2nd:
+ nf->IOPIN=dev->ID[1];
+ nf->cmdstatus=NF_readID_3rd;
+ break;
+ case NF_readID_3rd:
+ nf->IOPIN=dev->ID[2];
+ nf->cmdstatus=NF_readID_4th;
+ break;
+ case NF_readID_4th:
+ nf->IOPIN=dev->ID[3];
+ nf->cmdstatus=NF_NOSTATUS;
+ nf->iostatus=NF_NONE;
+ break;
+ default:
+ NANDFLASH_DBG("Nandflash readID Error!");
+ break;
+ }
+}
+static void nandflash_sb_docmd(struct nandflash_device *dev,struct
nandflash_sb_status *nf)
+{
+ //printf("commd:%x\n",nf->IOPIN);
+ switch(nf->IOPIN) {
+ case NAND_CMD_READ0:
+ nf->cmd=NAND_CMD_READ0;
+ nf->cmdstatus=NF_addr_1st;
+ nf->address=0;
+ nf->iostatus=NF_ADDR;
+ nf->pageoffset=0;
+ break;
+ case NAND_CMD_READ1:
+ nf->cmd=NAND_CMD_READ1;
+ nf->cmdstatus=NF_addr_1st;
+ nf->pageoffset=256;
+ nf->address=0;
+ nf->iostatus=NF_ADDR;;
+ break;
+ case NAND_CMD_READOOB:
+ nf->cmd=NAND_CMD_READOOB;
+ nf->cmdstatus=NF_addr_1st;
+ nf->address=0;
+ nf->pageoffset=512;
+ nf->iostatus=NF_ADDR;
+ break;
+ case NAND_CMD_RESET:
+ nf->cmd=NAND_CMD_RESET;
+ nandflash_sb_reset(dev);
+ break;
+ case NAND_CMD_SEQIN:
+ nf->cmd=NAND_CMD_SEQIN;
+ nf->cmdstatus=NF_addr_1st;
+ memset(nf->writebuffer,0xFF,dev->pagedumpsize);
+ nf->address=0;
+ nf->iostatus=NF_ADDR;
+ break;
+ case NAND_CMD_ERASE1:
+ nf->cmd=NAND_CMD_ERASE1;
+ nf->cmdstatus=NF_addr_2nd;
+ nf->iostatus=NF_ADDR;
+ nf->pageoffset=0;
+ nf->address=0;
+ break;
+ case NAND_CMD_ERASE2:
+ if ((nf->cmd==NAND_CMD_ERASE1)&&(nf->cmdstatus==NF_addr_finish))
+ {
+
+ nandflash_sb_doerase(dev,nf);
+ }
+ else
+ {
+ NANDFLASH_DBG("invalid ERASE2
commond,command:%x,status:%x\n",nf->cmd,nf->cmdstatus);
+ }
+ nf->cmd=NAND_CMD_NONE;
+ break;
+ case NAND_CMD_STATUS:
+ nf->cmd=NAND_CMD_STATUS;
+ nf->cmdstatus=NF_status;
+ nf->iostatus=NF_STATUSREAD;
+ break;
+ case NAND_CMD_READID:
+ nf->cmd=NAND_CMD_READID;
+ nf->cmdstatus=NF_addr_4th;
+ nf->pageoffset=0;
+ nf->address=0;
+ nf->iostatus=NF_ADDR;
+ break;
+ case NAND_CMD_PAGEPROG:
+ if ((nf->cmd==NAND_CMD_SEQIN)&&(nf->cmdstatus==NF_addr_finish))
+ {
+ nf->cmd=NAND_CMD_PAGEPROG;
+ nandflash_sb_finishwrite(dev,nf);
+ }
+ else
+ {
+ NANDFLASH_DBG("invalid PAGEPROG
commond,command:%x,status:%x\n",nf->cmd,nf->cmdstatus);
+ }
+ break;
+ default:
+ NANDFLASH_DBG("Unknow nandflash command:%x\n",nf->IOPIN);
+ break;
+ }
+}
+static void nandflash_sb_doaddr(struct nandflash_device *dev,struct
nandflash_sb_status *nf)
+{
+ u32 offset,rows,tmp;
+ tmp=nf->IOPIN;
+ //printf("tmp:%02x\n",tmp);
+ switch (nf->cmdstatus) {
+ case NF_addr_1st:
+ nf->address=0;
+ nf->pageoffset=nf->IOPIN+nf->pageoffset;
+ nf->cmdstatus=NF_addr_2nd;
+ break;
+ case NF_addr_2nd:
+ nf->address=(nf->address |(tmp<<9));
+ nf->cmdstatus=NF_addr_3rd;
+ break;
+ case NF_addr_3rd:
+ nf->address=(nf->address |(tmp<<17));
+ nf->cmdstatus=NF_addr_4th;
+ break;
+ case NF_addr_4th:
+ nf->address=(nf->address |(tmp<<25));
+ rows=nf->address>>9;
+ nf->address=rows*528+nf->pageoffset;
+ //NANDFLASH_DBG("set addr:%08x\n",nf->address);
+ if
((nf->cmd==NAND_CMD_READ0)||(nf->cmd==NAND_CMD_READ1)||(nf->cmd==NAND_CMD_READOOB))
+ {
+ nf->iostatus=NF_DATAREAD;
+ #if (defined(__MINGW32__))
+ int block=nf->address/dev->pagedumpsize;
+ int tmp;
+ //if(block!=nf->curblock)
+ //{
+ //printf("nand read
address:%08x\n",nf->address);
+ if (nf->address<dev->devicesize)
+ {
+
memset(nf->readbuffer,0xff,dev->pagedumpsize);
+
if(lseek(nf->fdump,block*dev->pagedumpsize,SEEK_SET)==-1)
+ printf("lseek error\n");
+ //printf("offset:%d\n",block);
+
tmp=read(nf->fdump,nf->readbuffer,dev->pagedumpsize);
+ if (tmp!=dev->pagedumpsize)
+ printf("read
error address:%08x,readsize:%d,block:%d\n",nf->address,tmp,block);
+ }
+ else
+ {
+ printf("read outof bound\n");
+ }
+ //}
+ #endif
+ }
+ else if (nf->cmd==NAND_CMD_SEQIN)
+ {
+ nf->iostatus=NF_DATAWRITE;
+ nf->cmdstatus=NF_addr_finish;
+ //if (nf->pageoffset!=0) NANDFLASH_DBG("when
page program offset is not 0 maybe this is error!\n");
+ }
+ else if (nf->cmd==NAND_CMD_READID)
+ {
+ nf->iostatus=NF_IDREAD;
+ nf->cmdstatus=NF_readID_1st;
+ }
+ else if (nf->cmd==NAND_CMD_ERASE1)
+ {
+ nf->iostatus=NF_CMD;
+ nf->cmdstatus=NF_addr_finish;
+ }
+ else
+ {
+ NANDFLASH_DBG("Error address input\n");
+ }
+ break;
+ case NF_readID_addr:
+ nf->cmdstatus=NF_readID_1st;
+ nf->iostatus=NF_addr_finish;
+ break;
+ case NF_addr_finish:
+ NANDFLASH_DBG("nandflash write address 4 cycle has
already finish,but addr write however!\n");
+ break;
+ default:
+ NANDFLASH_DBG("nandflash write address error!\n");
+ break;
+ }
+}
+u8 nandflash_sb_readio(struct nandflash_device *dev)
+{
+ struct nandflash_sb_status *nf=(struct nandflash_sb_status*)dev->priv;
+ if (nf->CE==NF_LOW)
+ {
+ return nf->IOPIN;
+ }
+}
+void nandflash_sb_writeio(struct nandflash_device *dev,u8 iodata)
+{
+ struct nandflash_sb_status *nf=(struct nandflash_sb_status*)dev->priv;
+ if (nf->CE==NF_LOW)
+ {
+ nf->IOPIN=iodata;
+ }
+}
+void nandflash_sb_setCE(struct nandflash_device *dev,NFCE_STATE state)
+{
+ struct nandflash_sb_status *nf=(struct nandflash_sb_status*)dev->priv;
+ nf->CE=state;
+ if ((state==NF_HIGH) &(nf->iostatus==NF_DATAREAD))
+ {
+ nf->iostatus=NF_NONE;
+ }
+}
+void nandflash_sb_setCLE(struct nandflash_device *dev,NFCE_STATE state)
+{
+ struct nandflash_sb_status *nf=(struct nandflash_sb_status*)dev->priv;
+ if (nf->ALE==NF_HIGH)
+ {
+ NANDFLASH_DBG("warning the ALE is high,but CLE also
set high\n");//maybe this warning is wrong,i don't know
+ }
+ nf->CLE=state;
+ if ((state==NF_HIGH)&&(nf->CE==NF_LOW))
+ {
+ nf->iostatus=NF_CMD;
+ }
+}
+void nandflash_sb_setALE(struct nandflash_device *dev,NFCE_STATE state)
+{
+ struct nandflash_sb_status *nf=(struct nandflash_sb_status*)dev->priv;
+ if (nf->CLE==NF_HIGH)
+ {
+ NANDFLASH_DBG("warning the CLE is high,but ALE also
set high\n"); //maybe this warning is wrong,i don't know
+ }
+ nf->ALE=state;
+ if ((state==NF_HIGH)&&(nf->CE==NF_LOW))
+ {
+ nf->iostatus=NF_ADDR;
+ }
+}
+void nandflash_sb_setWE(struct nandflash_device *dev,NFCE_STATE state)
+{
+ struct nandflash_sb_status *nf=(struct nandflash_sb_status*)dev->priv;
+ if ((nf->WE==NF_LOW)&&(state==NF_HIGH)&&(nf->CE==NF_LOW))
//latched on the rising edge
+ {
+ switch(nf->iostatus) {
+ case NF_CMD:
+ nandflash_sb_docmd(dev,nf);
+ break;
+ case NF_ADDR:
+ nandflash_sb_doaddr(dev,nf);
+ break;
+ case NF_DATAWRITE:
+ nandflash_sb_dodatawrite(dev,nf);
+ //nf->iostatus=NF_NONE;
+ break;
+ default:
+ NANDFLASH_DBG("warning when WE raising,do nothing\n ");
+ break;
+ }
+ }
+ nf->WE=state;
+}
+void nandflash_sb_setRE(struct nandflash_device *dev,NFCE_STATE state)
+{
+ struct nandflash_sb_status *nf=(struct nandflash_sb_status*)dev->priv;
+ if ((nf->RE==NF_HIGH)&&(state==NF_LOW)&&(nf->CE==NF_LOW))
+ {
+ switch(nf->iostatus) {
+ case NF_DATAREAD:
+ nandflash_sb_doread(dev,nf);
+ break;
+ case NF_IDREAD:
+ nandflash_sb_doreadid(dev,nf);
+ break;
+ case NF_STATUSREAD:
+ //printf("read status:0x%x\n",nf->status);
+ nf->IOPIN=nf->status;
+ nf->iostatus=NF_NONE;
+ break;
+ default:
+ NANDFLASH_DBG("warning when RE falling,do nothing\n ");
+ break;
+ }
+ }
+ nf->RE=state;
+}
+void nandflash_sb_setWP(struct nandflash_device *dev,NFCE_STATE state)
+{
+ struct nandflash_sb_status *nf=(struct nandflash_sb_status*)dev->priv;
+ nf->WP=state;
+ if (state==NF_LOW){
+ nf->status=nf->status & 127;
+ printf("WP set LOW\n");
+ }
+ else {
+ nf->status=nf->status | 128;
+ printf("WP set HIGH\n");
+ }
+}
+u32 nandflash_sb_readRB(struct nandflash_device *dev) //the rb
+{
+ return 1;
+}
+void nandflash_sb_sendcmd(struct nandflash_device *dev,u8 cmd)
//send a commond
+{
+ nandflash_sb_setCLE(dev,NF_HIGH);
+ nandflash_sb_setWE(dev,NF_LOW);
+ nandflash_sb_writeio(dev,cmd);
+ nandflash_sb_setWE(dev,NF_HIGH);
+ nandflash_sb_setCLE(dev,NF_LOW);
+}
+
+void nandflash_sb_senddata(struct nandflash_device *dev,u8 data)
+{
+ nandflash_sb_setWE(dev,NF_LOW);
+ nandflash_sb_writeio(dev,data);
+ nandflash_sb_setWE(dev,NF_HIGH);
+}
+void nandflash_sb_sendaddr(struct nandflash_device *dev,u8 data)
+{
+ nandflash_sb_setALE(dev,NF_HIGH);
+ nandflash_sb_setWE(dev,NF_LOW);
+ nandflash_sb_writeio(dev,data);
+ nandflash_sb_setWE(dev,NF_HIGH);
+ nandflash_sb_setALE(dev,NF_LOW);
+}
+u8 nandflash_sb_readdata(struct nandflash_device *dev)
+{
+ u8 data;
+ nandflash_sb_setRE(dev,NF_LOW);
+ data=nandflash_sb_readio(dev);
+ nandflash_sb_setRE(dev,NF_HIGH);
+ return data;
+}
+void nandflash_sb_poweron(struct nandflash_device *dev)
+{
+ struct nandflash_sb_status *nf=(struct nandflash_sb_status*)dev->priv;
+ nf->ALE=NF_LOW;
+ nf->CLE=NF_LOW;
+ nf->CE=NF_HIGH;
+ nf->iostatus=NF_NONE;
+ nf->IOPIN=0;
+ nf->RB=1;
+ nf->RE=NF_HIGH;
+ nf->WE=NF_HIGH;
+ nf->WP=NF_HIGH;
+ nf->status=192;
+ nf->pageoffset=0;
+ nf->cmd=NAND_CMD_READ0;
+ nf->cmdstatus=NF_NOSTATUS;
+ nf->iostatus=NF_NONE;
+ memset(nf->writebuffer,0xFF,dev->pagedumpsize);
+}
+void nandflash_sb_reset(struct nandflash_device *dev)
+{
+ struct nandflash_sb_status *nf=(struct nandflash_sb_status*)dev->priv;
+ nf->ALE=NF_LOW;
+ nf->CLE=NF_LOW;
+ //nf->CE=NF_HIGH;
+ nf->iostatus=NF_NONE;
+ nf->IOPIN=0;
+ nf->RB=1;
+ nf->RE=NF_HIGH;
+ nf->WE=NF_HIGH;
+ nf->WP=NF_HIGH;
+ nf->status=192;
+ nf->pageoffset=0;
+ nf->cmd=NF_NOSTATUS;
+ nf->cmdstatus=NF_NOSTATUS;
+ nf->iostatus=NF_NONE;
+ memset(nf->writebuffer,0xFF,dev->pagedumpsize);
+}
+
+
+void nandflash_sb_setup(struct nandflash_device* dev)
+{
+ u8 flag=0xFF;
+ int len,start,needinit=0;
+ struct stat statbuf;
+ struct nandflash_sb_status *nf;
+ int i;
+ nf=(struct nandflash_sb_status *)malloc(sizeof(struct
nandflash_sb_status));
+ if (nf==NULL)
+ {
+ printf("error malloc nandflash_sb_status!\n");
+ skyeye_exit(-1);
+ }
+ dev->poweron=nandflash_sb_poweron;
+ dev->readdata=nandflash_sb_readdata;
+ dev->readio=nandflash_sb_readio;
+ dev->readRB=nandflash_sb_readRB;
+ dev->reset=nandflash_sb_reset;
+ dev->sendaddr=nandflash_sb_sendaddr;
+ dev->sendcmd=nandflash_sb_sendcmd;
+ dev->senddata=nandflash_sb_senddata;
+ dev->setALE=nandflash_sb_setALE;
+ dev->setCE=nandflash_sb_setCE;
+ dev->setCLE=nandflash_sb_setCLE;
+ dev->setRE=nandflash_sb_setRE;
+ dev->setWE=nandflash_sb_setWE;
+ dev->setWP=nandflash_sb_setWP;
+ memset(nf,0,sizeof(struct nandflash_sb_status));
+#if (defined(__MINGW32__))
+ nf->readbuffer=(u8*)malloc(dev->pagedumpsize);
+#endif
+ nf->writebuffer=(u8*)malloc(dev->pagedumpsize);
+ //nf->memsize=528*32*4096;
+ if ((nf->fdump= open(dev->dump, FILE_FLAG)) < 0)
+ {
+ free(nf);
+ printf("error open nandflash dump!\n");
+ skyeye_exit(-1);
+ }
+
+ if (fstat(nf->fdump, &statbuf) < 0) /* need size of input file */
+ {
+ free(nf);
+ printf("error fstat function\n");
+ skyeye_exit(-1);
+ }
+ if (statbuf.st_size<dev->devicesize)
+ {
+ printf("\nInit nandflash dump file.\n");
+ needinit=1;
+ start=statbuf.st_size;
+ len=dev->devicesize-start;
+ lseek(nf->fdump,dev->devicesize-1,SEEK_SET);
+ write(nf->fdump,&flag,1);
+ fsync(nf->fdump);
+ }
+ #if !(defined(__MINGW32__))
+
+ if (fstat(nf->fdump, &statbuf) < 0) /* need size of input file */
+ {
+ free(nf);
+ printf("error fstat function\n");
+ skyeye_exit(-1);
+ }
+
+ printf("file size:%d\n",statbuf.st_size);
+ if ((nf->addrspace= mmap(0, statbuf.st_size, PROT_READ | PROT_WRITE,
+ MAP_SHARED, nf->fdump, 0)) == MAP_FAILED)
+ {
+ free(nf);
+ printf("error mmap nandflash file\n");
+ skyeye_exit(-1);
+ }
+ if (needinit)
+ {
+ for(i=start;i<dev->devicesize;i++)
+ {
+ *(nf->addrspace+i)=flag;
+ }
+ if (!msync(nf->addrspace,dev->devicesize,MS_SYNC))
+ printf("finish init nandflash dump\n");
+
+ }
+
+ #else
+ nf->curblock=-1;
+ if (needinit)
+ {
+ memset(nf->readbuffer,0xff,dev->pagedumpsize);
+ lseek(nf->fdump,start,SEEK_SET);
+ while((dev->devicesize-start)>=dev->pagesize)
+ {
+ write(nf->fdump,nf->readbuffer,dev->pagesize);
+ start=start+dev->pagesize;
+ }
+ for (i=start;i<dev->devicesize;i++)
+ write(nf->fdump,&flag,1);
+ }
+ #endif
+ dev->priv=nf;
+ nandflash_sb_poweron(dev);
+}
+void nandflash_sb_uninstall(struct nandflash_device* dev)
+{
+ struct nandflash_sb_status *nf;
+ if(!dev->priv)
+ {
+ nf=(struct nandflash_sb_status*)dev->priv;
+ if (!nf->fdump)
+ {
+ //msync(nf->addrspace,nf->memsize,MS_SYNC);
+#if !(defined(__MINGW32__))
+ munmap(nf->addrspace,dev->devicesize);
+#endif
+ close(nf->fdump);
+ NANDFLASH_DBG("Unistall nandflash\n");
+ }
+#if (defined(__MINGW32__))
+ if(!nf->readbuffer)
+ free(nf->readbuffer);
+#endif
+ if(!nf->writebuffer)
+ free(nf->writebuffer);
+ free(nf);
+ }
+}
Added: skyeye-v1/trunk/device/nandflash/nandflash_smallblock.h
===================================================================
--- skyeye-v1/trunk/device/nandflash/nandflash_smallblock.h
(rev 0)
+++ skyeye-v1/trunk/device/nandflash/nandflash_smallblock.h
2007-09-17 09:49:15 UTC (rev 311)
@@ -0,0 +1,82 @@
+/*
+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, 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. */
+
+/*
+ * author gbf0871 <gbf0871 at 126.com>
+ */
+#ifndef _NANDFLASH_SMALLBLOCK_H_
+#define _NANDFLASH_SMALLBLOCK_H_
+#include <stdio.h>
+#include "skyeye_nandflash.h"
+ #if (defined(__MINGW32__))
+#define FILE_FLAG (O_RDWR | O_CREAT|O_BINARY)
+#else
+#define FILE_FLAG (O_RDWR | O_CREAT)
+#endif
+//nandflash cmd status
+
+typedef enum {
+ NF_NOSTATUS,
+ NF_addr_1st,
+ NF_addr_2nd,
+ NF_addr_3rd,
+ NF_addr_4th,
+ NF_addr_finish,
+ NF_status,
+ NF_readID_1st,
+ NF_readID_2nd,
+ NF_readID_3rd,
+ NF_readID_4th,
+ NF_readID_addr
+} cmdstatustype;
+
+typedef enum {
+ NF_CMD,
+ NF_ADDR,
+ NF_DATAREAD,
+ NF_DATAWRITE,
+ NF_STATUSREAD,
+ NF_IDREAD,
+ NF_NONE
+} iostatustype;
+struct nandflash_sb_status
+{
+ u8 IOPIN;
+ u8 status;
+ NFCE_STATE CLE;
+ NFCE_STATE ALE;
+ NFCE_STATE CE;
+ NFCE_STATE WE;
+ NFCE_STATE RE;
+ NFCE_STATE WP;
+ NFCE_STATE RB;
+ u8 cmd;
+ cmdstatustype cmdstatus;
+ iostatustype iostatus;
+ u32 address;
+ //u32 memsize;
+ int fdump;
+ u8 *writebuffer;
+ u16 pageoffset;
+ #if (defined(__MINGW32__))
+ u8 *readbuffer;
+ u32 curblock;
+ FILE *fd;
+ #else
+ u8* addrspace;
+ #endif
+};
+
+#endif //_NANDFLASH_SMALLBLOCK_H_
Added: skyeye-v1/trunk/device/nandflash/skyeye_nandflash.c
===================================================================
--- skyeye-v1/trunk/device/nandflash/skyeye_nandflash.c
(rev 0)
+++ skyeye-v1/trunk/device/nandflash/skyeye_nandflash.c 2007-09-17
09:49:15 UTC (rev 311)
@@ -0,0 +1,118 @@
+/*
+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, 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. */
+
+/*
+ * author gbf0871 <gbf0871 at 126.com>
+ */
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "armdefs.h"
+#include "skyeye_device.h"
+
+#include "skyeye_options.h"
+#include "skyeye.h"
+#include "skyeye_nandflash.h"
+
+extern void nandflash_s3c2410_init(struct device_module_set *mod_set);
+
+/* initialize the nandflash module set.
+ * If you want to add a new nandflash simulation, just add a
"flash_*_init" function to it.
+ * */
+static void
+nandflash_init (struct device_module_set *mod_set)
+{
+ nandflash_s3c2410_init (mod_set);
+}
+
+nandflash_module_option * get_nandflashmd(char *name)
+{
+ nandflash_module_option * md=nandflash_module_data;
+ int i;
+ for(i=0;i<sizeof(nandflash_module_data);i++,md++)
+ {
+ if (!strcmp(name,md->name))
+ return md;
+ }
+ return NULL;
+}
+
+int nandflash_module_setup(struct nandflash_device *dev,char *name)
+{
+ nandflash_module_option * md;
+ int ret=-1;
+ int i;
+ md=get_nandflashmd(name);
+ if(md!=NULL){
+ dev->install=md->install_dev;
+ dev->uinstall=md->uinstall_dev;
+ dev->pagesize=md->pagesize;
+ dev->obbsize=md->obbsize;
+ dev->pagenum=md->pagenum;
+ dev->blocknum=md->blocknum;
+ dev->pagedumpsize=dev->pagesize+dev->obbsize;
+ dev->erasesize=dev->pagedumpsize*dev->pagenum;
+ dev->devicesize=dev->erasesize*dev->blocknum;
+ for(i=0;i<5;i++)
+ dev->ID[i]=md->ID[i];
+ //md->install_dev(dev);
+ ret=0;
+ }
+ else
+ {
+ printf("nandflash not support this:%s\n",name);
+ exit(1);
+ }
+}
+
+static int
+nandflash_setup (struct device_desc *dev, void *option)
+{
+ struct nandflash_device *nandflash_dev;
+ struct flash_option *nandflash_opt = (struct flash_option *) option;
+ int ret = 0;
+
+ nandflash_dev =
+ (struct nandflash_device *) malloc (sizeof (struct
nandflash_device));
+ if (nandflash_dev == NULL)
+ return 1;
+
+ memset (nandflash_dev, 0, sizeof (struct nandflash_device));
+ memcpy (&nandflash_dev->dump[0], &nandflash_opt->dump[0], MAX_STR_NAME);
+
+ dev->dev = (void *) nandflash_dev;
+ return ret;
+
+}
+static struct device_module_set nandflash_mod_set = {
+ .name = "nandflash",
+ .count = 0,
+ .count_max = 0,
+ .init = nandflash_init,
+ .initialized = 0,
+ .setup_module = nandflash_setup,
+};
+
+/* used by global device initialize function.
+ * */
+void
+nandflash_register ()
+{
+ if (register_device_module_set (&nandflash_mod_set))
+ SKYEYE_ERR ("\"%s\" module set register error!\n",
+ nandflash_mod_set.name);
+}
+
Added: skyeye-v1/trunk/device/nandflash/skyeye_nandflash.h
===================================================================
--- skyeye-v1/trunk/device/nandflash/skyeye_nandflash.h
(rev 0)
+++ skyeye-v1/trunk/device/nandflash/skyeye_nandflash.h 2007-09-17
09:49:15 UTC (rev 311)
@@ -0,0 +1,101 @@
+/*
+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, 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. */
+
+/*
+ * author gbf0871 <gbf0871 at 126.com>
+ */
+#ifndef __SKYEYE_NANDFLASH_H_
+#define __SKYEYE_NANDFLASH_H_
+
+#include "skyeye_device.h"
+#define NANDFLASH_DEBUG 1
+#if NANDFLASH_DEBUG
+#define NANDFLASH_DBG(msg...) fprintf(stderr, ##msg)
+#else
+#define NANDFLASH_DBG(msg...)
+#endif
+/*
+ * Standard NAND flash commands
+ */
+ #define NAND_CMD_NONE -1
+#define NAND_CMD_READ0 0
+#define NAND_CMD_READ1 1
+#define NAND_CMD_PAGEPROG 0x10
+#define NAND_CMD_READOOB 0x50
+#define NAND_CMD_ERASE1 0x60
+#define NAND_CMD_STATUS 0x70
+#define NAND_CMD_STATUS_MULTI 0x71
+#define NAND_CMD_SEQIN 0x80
+#define NAND_CMD_READID 0x90
+#define NAND_CMD_ERASE2 0xd0
+#define NAND_CMD_RESET 0xff
+
+typedef enum {
+ NF_LOW,
+ NF_HIGH
+} NFCE_STATE;
+
+struct nandflash_device
+{
+ int mod;
+ void *state;
+ /* private data. */
+ void *priv;
+ char dump[MAX_STR_NAME];
+ u32 pagesize,obbsize;
+ u32 pagenum; /* page numbers per block*/
+ u32 blocknum; /* block numbers per device*/
+ u32 pagedumpsize,erasesize;
+ u32 devicesize;
+ u8 ID[5];
+ u8 (*readio)(struct nandflash_device * flash_dev);
+ void (*writeio) (struct nandflash_device * flash_dev,u8 iodata);
+ void (*setCE) (struct nandflash_device * flash_dev,NFCE_STATE state);
+ void (*setCLE) (struct nandflash_device * flash_dev,NFCE_STATE state);
+ void (*setALE) (struct nandflash_device * flash_dev,NFCE_STATE state);
+ void (*setRE) (struct nandflash_device * flash_dev,NFCE_STATE state);
+ void (*setWE) (struct nandflash_device * flash_dev,NFCE_STATE state);
+ void (*setWP) (struct nandflash_device * flash_dev,NFCE_STATE state);
+ u32 (*readRB)(struct nandflash_device * flash_dev);
+ void (*sendcmd)(struct nandflash_device * flash_dev,u8 cmd);
+ void (*sendaddr)(struct nandflash_device * flash_dev,u8 addr);
+ void (*senddata)(struct nandflash_device * flash_dev,u8 data);
+ u8 (*readdata)(struct nandflash_device * flash_dev);
+ void (*poweron)(struct nandflash_device * flash_dev);
+ void (*reset)(struct nandflash_device * flash_dev);
+ void (*install)(struct nandflash_device *flash_dev);
+ void (*uinstall)(struct nandflash_device *flash_dev);
+
+};
+
+typedef struct nandflash_module_option
+{
+ char *name;
+ u32 pagesize,obbsize;
+ u32 pagenum; /* page numbers per block*/
+ u32 blocknum; /* block numbers per device*/
+ u8 ID[5];
+ void (*install_dev) (struct nandflash_device *dev);
+ void (*uinstall_dev)(struct nandflash_device *dev);
+} nandflash_module_option;
+
+int nandflash_module_setup(struct nandflash_device *dev,char *name);
+void nandflash_sb_uninstall(struct nandflash_device* dev);
+void nandflash_sb_setup(struct nandflash_device* dev);
+static nandflash_module_option nandflash_module_data[]={
+ {"K9F1208U0B",512,16,32,4096,{0xEC,0x76,0xA5,0xC0,0x0},nandflash_sb_setup,nandflash_sb_uninstall},
+};
+#endif /*__SKYEYE_NANDFLASH_H_*/
+
Added: skyeye-v1/trunk/device/nandflash/tools/mknandflashdump.c
===================================================================
--- skyeye-v1/trunk/device/nandflash/tools/mknandflashdump.c
(rev 0)
+++ skyeye-v1/trunk/device/nandflash/tools/mknandflashdump.c
2007-09-17 09:49:15 UTC (rev 311)
@@ -0,0 +1,86 @@
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
+int main(int argc, char *argv[])
+{
+ int fdin, fdout;
+ unsigned char *src, *dst;
+ struct stat statbuf;
+ int i,j,size,offset,pos;
+ if (argc != 4)
+ {
+ printf("usage: %s <fromfile> <tofile> <offset>\n", argv[0]);
+ exit(1);
+ }
+
+ if ((fdin = open(argv[1], O_RDONLY)) < 0)
+ {
+ printf("can't open %s for reading", argv[1]);
+ exit(1);
+ }
+
+ if ((fdout = open(argv[2], O_RDWR | O_CREAT,
+ FILE_MODE)) < 0)
+ {
+ printf("can't creat %s for writing", argv[2]);
+ exit(1);
+ }
+
+ if (fstat(fdin, &statbuf) < 0) /* need size of input file */
+ {
+ printf("fstat error");
+ exit(1);
+ }
+ offset=strtoul(argv[3],NULL,0);
+ if(offset %512)
+ {
+ printf("offset not a multiple of 512 bytes\n");
+ exit(1);
+ }
+ size=((statbuf.st_size+offset+511)/512)*528;
+ /* set size of output file */
+ if (lseek(fdout, size - 1, SEEK_SET) == -1)
+ {
+ printf("lseek error");
+ exit(1);
+ }
+ if (write(fdout, "", 1) != 1)
+ {
+ printf("write error");
+ exit(1);
+ }
+ if ((src = mmap(0, statbuf.st_size, PROT_READ, MAP_SHARED,
+ fdin, 0)) == MAP_FAILED)
+ {
+ printf("mmap error for input");
+ exit(1);
+ }
+
+ if ((dst = mmap(0, size, PROT_READ | PROT_WRITE,
+ MAP_SHARED, fdout, 0)) == MAP_FAILED)
+ {
+ printf("mmap error for output");
+ exit(1);
+ }
+ //memset(dst+offset,0xFF,size-offset);
+ //printf("%x\n",offset);
+ for(i=0,pos=(offset*528/512);i<statbuf.st_size;i++,pos++)
+ {
+ if((i%512)==0&&i)
+ for(j=0;j<16;j++)
+ {
+ *(dst+pos)=0xFF;
+ pos++;
+ }
+ *(dst+pos)=*(src+i);
+ }
+ msync(dst,size,MS_SYNC);
+ printf("finish\n");
+ exit(0);
+}
Modified: skyeye-v1/trunk/device/skyeye_device.c
===================================================================
--- skyeye-v1/trunk/device/skyeye_device.c 2007-09-17 09:46:18
UTC (rev 310)
+++ skyeye-v1/trunk/device/skyeye_device.c 2007-09-17 09:49:15
UTC (rev 311)
@@ -44,6 +44,7 @@
flash_register ();
touchscreen_register ();
sound_register ();
+ nandflash_register();
}
void
Modified: skyeye-v1/trunk/utils/config/skyeye_config.h
===================================================================
--- skyeye-v1/trunk/utils/config/skyeye_config.h 2007-09-17
09:46:18 UTC (rev 310)
+++ skyeye-v1/trunk/utils/config/skyeye_config.h 2007-09-17
09:49:15 UTC (rev 311)
@@ -182,6 +182,7 @@
int do_flash_option ();
int do_touchscreen_option ();
int do_sound_option ();
+int do_nandflash_option();
/*ywc 2005-04-01*/
int do_dbct_option ();
@@ -271,6 +272,7 @@
{"uart", do_uart_option, 0, MAX_UART_DEVICE_NUM},
{"lcd", do_lcd_option, 0, 1},
{"flash", do_flash_option, 0, 1},
+ {"nandflash",do_nandflash_option,0,1},
{"touchscreen", do_touchscreen_option, 0, 1},
{"sound", do_sound_option, 0, 1},
Modified: skyeye-v1/trunk/utils/config/skyeye_options.c
===================================================================
--- skyeye-v1/trunk/utils/config/skyeye_options.c 2007-09-17
09:46:18 UTC (rev 310)
+++ skyeye-v1/trunk/utils/config/skyeye_options.c 2007-09-17
09:49:15 UTC (rev 311)
@@ -18,6 +18,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA
*/
+
/* 08/20/2003 add log option function
chenyu
4/02/2003 add net option function
@@ -118,9 +119,11 @@
return 0;
}
-/* setup device option.
+/**
+ * setup device option.
* all device options may have common parameters. Here we handle
these common parameters.
- * */
+ *
+ */
int
setup_device_option (char *option_name, void *dev_option,
int num_params, const char *params[])
@@ -163,7 +166,7 @@
}
-/*defined in skyeye_arch.c*/
+/* defined in skyeye_arch.c */
extern arch_config_t *skyeye_archs[];
int
@@ -305,7 +308,10 @@
return 0;
}
-/*added by ksh in 2004-11-26 ,energy option*/
+/**
+ *
+ * energy option
+ */
int
do_energy_option (skyeye_option_t * this_option, int num_params,
const char *params[])
@@ -672,6 +678,37 @@
}
int
+do_nandflash_option (skyeye_option_t * this_option, int num_params,
+ const char *params[])
+{
+ char name[MAX_PARAM_NAME], value[MAX_PARAM_NAME];
+ struct flash_option flash_opt;
+ int i, fd;
+
+ memset(&flash_opt, 0, sizeof(struct flash_option));
+
+ for (i = 0; i < num_params; i++) {
+ if (split_param (params[i], name, value) < 0)
+ SKYEYE_ERR
+ ("Error: flash has wrong parameter \"%s\".\n",
+ name);
+
+ if (!strncmp("dump", name, strlen(name))) {
+ memcpy(&flash_opt.dump[0], value, strlen(value) + 1);
+ }
+ }
+
+ SKYEYE_INFO ("nandflash: dump %s\n",
+ flash_opt.dump[0] == 0 ? "none" : flash_opt.dump);
+
+ setup_device_option (this_option->name, (void *) &flash_opt,
+ num_params, params);
+
+ return 0;
+}
+
+
+int
do_touchscreen_option (skyeye_option_t * this_option, int num_params,
const char *params[])
{
@@ -757,3 +794,5 @@
}
#endif //DBCT_TEST_SPEED
//AJ2D--------------------------------------------------------------------------
+
+int do_regfile_option(){}
This was sent by the SourceForge.net collaborative development
platform, the world's largest Open Source development site.
--
www.skyeye.org
More information about the Skyeye-developer
mailing list