[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