#ifndef _TFFS_DIRECT_NAND_ #define _TFFS_DIRECT_NAND_ /*------------------------------------------------------------------------------------------*\ * aus urlader => include/nand.h \*------------------------------------------------------------------------------------------*/ enum ecc_calculation { SOFTWARE_ECC, HARDWARE_ECC }; enum ecc_errors { no, onebit, multibit }; /*------------------------------------------------------------------------------------------*\ * Manufacture Codes \*------------------------------------------------------------------------------------------*/ #define MANUFACTURE_SAMSUNG 0xec /*--- Samsung ---*/ #define MANUFACTURE_MICRON 0x2c /*--- Micron ---*/ #define MANUFACTURE_NUMONYX 0x20 /*--- Numonyx ---*/ /*------------------------------------------------------------------------------------------*\ * NAND Devices \*------------------------------------------------------------------------------------------*/ #define SAMSUNG_K9F1G08R0A_ID 0xa1 /* part # */ #define SAMSUNG_K9F64G08R0A_ID 0xd7 /* part # */ #define SAMSUNG_K9F_ID 0x79 /* part # */ #define MICRON_29F1G_ID_3_3 0xf1 /* x8, 1GiB, 3.3V */ #define MICRON_29F1G_ID 0xa1 /* x8, 1GiB, 1.8V */ #define MICRON_29F2G_ID 0xba /* x16, 2GiB */ #define MICRON_29F4G_ID 0xbc /* x16, 4GiB */ #define MICRON_29F16G_ID 0xd5 /*--- x8, 16GiB ---*/ #define MICRON_29F64G_ID 0xd7 /*--- x8, 64GiB ---*/ #define NUMONYX_08GW3x_ID 0xD3 /*--- x8, 8GiB ---*/ #define NUMONYX_04GW3B_ID 0xDC /*--- x8, 2GiB ---*/ #define NUMONYX_01GW3B_ID 0xF1 /*--- x8, 1GiB ---*/ #define NAND_CMD_READ 0x00 #define NAND_CMD_READOOB 0x01 #define NAND_CMD_PROGRAM 0x80 #define NAND_CMD_PROGRAMOOB 0x02 #define NAND_CMD_ERASE 0x60 #define NAND_CMD_STATUS 0x70 #define NAND_CMD_READID 0x90 #define NAND_CMD_RESET 0xff #define NAND_CMD_READ_START 0x30 /* Extended Commands for Large page devices */ #define NAND_CMD_ERASE_START 0xD0 #define NAND_CMD_PROGRAM_START 0x10 #define NAND_STATUS_WRITE_PROT (1<<7) #define NAND_STATUS_PER_READY ((1<<6)|(1<<5)) #define NAND_STATUS_ERROR (1<<0) #define NAND_STATUS_MASK_ERROR (NAND_STATUS_WRITE_PROT|NAND_STATUS_ERROR) #define NAND_STATUS_MASK_BUSY NAND_STATUS_PER_READY struct tffs_nand_Geometry { unsigned int blocksize; unsigned short pagesize; unsigned short oobsize; unsigned short eccsize; unsigned short eccblocksize; unsigned short blk_num; unsigned char interface_size; unsigned char chipcnt; unsigned char pageshift; unsigned char *ecc_layout; }; #define NAND_BUFFER_SIZE (128*1024) /*--- Blocksize ---*/ /*------------------------------------------------------------------------------------------*\ * aus urlader => include/flash16.h \*------------------------------------------------------------------------------------------*/ #define FLASH_SUCCESS 0 /*--- #define FLASH_IGNORE 0x8000 ---*/ /*--- #define FLASH_NO_BUFFER 0x8001 ---*/ #define FLASH_INVAL_ADDR 0x8002 #define FLASH_ID_FAILED 0x8003 #define FLASH_QUERY_FAILED 0x8004 #define FLASH_ERASE_REGIONS 0x8005 #define FLASH_MX_BOTTOM_FAILED 0x8006 /*------------------------------------------------------------------------------------------*\ * neue Fehler für Flashfunktionen - werden negativ ausgegeben * z.B. -FLASH_ERASE_ERROR \*------------------------------------------------------------------------------------------*/ #define FLASH_NO_ERROR 0 #define FLASH_ERASE_ERROR 1 #define FLASH_WRITE_ERROR 2 #define FLASH_BAD_BLOCK 3 #define FLASH_VERIFY_ERROR 4 #define FLASH_SINGLEBIT_ERROR 5 #define FLASH_MULTIBIT_ERROR 6 #define FLASH_PARAMETER_ERROR 7 struct tffs_nand_CFI_System_Data_ { unsigned char min_VCC; unsigned char max_VCC; unsigned char min_VPP; unsigned char max_VPP; unsigned char write_timeout; unsigned char buffer_write_timeout; unsigned char erase_sector_timeout; unsigned char erase_chip_timeout; unsigned char max_write_timeout; unsigned char max_buffer_write_timeout; unsigned char max_erase_sector_timeout; unsigned char max_erase_chip_timeout; }; struct tffs_nand_CFI_Erase_Regions_ { unsigned short blk_num; unsigned int blk_size; unsigned int size; }; struct tffs_nand_CFI_Device_Geometry_ { unsigned short flash_interface_size; unsigned short interface_code; unsigned short writeBuffer_size; unsigned char num_erase_regions; struct tffs_nand_CFI_Erase_Regions_ erase_regions[4]; }; struct tffs_nand_CFI_ { char Query[3]; unsigned int PriVendorCmdSet_ID; unsigned int Addr_ext_Query_Table; unsigned int AltVendorIDCode; unsigned int Addr_Second_ext_Query_Table; }; struct tffs_nand_flash_device_ { unsigned char Manufacturer; unsigned char ID; unsigned char Organisation; unsigned char Blockmode; unsigned int Size; struct tffs_nand_Geometry nand_Geometry; void (*ecc_enable)(uint32_t chipselect); void (*ecc_calculate)(const uint8_t *dat, uint8_t *ecc_code); enum ecc_errors (*ecc_correct)(uint8_t *dat, uint8_t *read_ecc, uint8_t *calc_ecc); struct tffs_nand_CFI_ Ident; struct tffs_nand_CFI_System_Data_ System; struct tffs_nand_CFI_Device_Geometry_ Geometry; int (*Program_Cmd)(volatile unsigned int Addr, unsigned short Wert); int (*Erase_Cmd)(volatile unsigned int Addr); }; /*------------------------------------------------------------------------------------------*\ * Funktionen \*------------------------------------------------------------------------------------------*/ unsigned int tffs_nand_init(void); int tffs_nand_read(unsigned int page, unsigned char *buffer, unsigned int len); int tffs_nand_write(unsigned int page, unsigned char *pdata, unsigned int len); int tffs_nand_erase(unsigned int page); /*------------------------------------------------------------------------------------------*\ * ECC-Funktionen \*------------------------------------------------------------------------------------------*/ extern void tffs_nand_calculate_ecc(const uint8_t *dat, uint8_t *ecc_code); extern enum ecc_errors tffs_nand_correct_data(uint8_t *dat, uint8_t *read_ecc, uint8_t *calc_ecc); extern void tffs_nand_ecc_enable(uint32_t chipselect); extern void tffs_nand_calculate_hwecc(const uint8_t *dat, uint8_t *ecc_code); extern enum ecc_errors tffs_nand_hwecc_correct_data(uint8_t *dat, uint8_t *read_ecc, uint8_t *calc_ecc); extern void tffs_nand_hwecc_enable(uint32_t chipselect); #endif /*--- #ifndef _TFFS_DIRECT_NAND_ ---*/