📄 flashdisk.h
字号:
/*
******************************************************************************
*
* Copyright (C) 2002, HITACHI LTD. All Rights Reserved
*
* FILE NAME :
* DATE CREATED : March 2002, HMSA-HKDC
* DATE MODIFIED :
*
* DESCRIPTION:
* include file
*
******************************************************************************
*/
#include "h8s2215.h"
//*********** flash memory definiation
#define fMANU_CODE 0xEC75 // manufacturer code (EC75H)
//#define fDEVICE_CODE 0x75 // device code (75h)
// Define for Samsung Flash Memory
#define TOT_BLK 1024 // for 32MB
#define MAX_BAD_BLK (1024-1005) // max. blk - min blk in data sheet
#define BAD_BLK_TBL 0x0000 // Block management table start address
#define DA_START_BLK 0x0001 // Start of Data area (blk number) for 32MB
#define SPARE_PAGE 0x0005 // spare blk area (32MB)
#define MAX_BLK_ADDR 0x03FF // total no. of pages for 32MB
#define NUM_OF_SPARE 50 // presentage of spare from usable blk, e.g 2%=100/2=50, 1.5%=100/1.5=31, etc.
#define BLK_TBL_OFFSET 1 // page 0 is bad blk table, page 1 is physical blk alocation tbl
//--- buffer parameters
#define RD_BUFF_SIZE 512
//#define WR_BUFF_SIZE 8192 // 8K
//#define WR_AREA 0x1F00 // 8K
#define WR_BUFF_SIZE 2048 // 2K
#define WR_AREA 0x0700 // 2K
#define WR_PAGES (WR_BUFF_SIZE/512)
// error code
#define FLASH_NOT_FORMAT 0x01 // flash memory not yet formated
#define NO_BACKUP_BLK 0x02 // not enough backup block found
#define NO_SPARE_BLK 0x03 // no more spare block available
// HN29W25611
#define fTOT_BLK 0x3FFF // number of sector in flash memory
#define fSECTOR_SIZE 528 // 512 + 16 bytes
#define fBLK_SIZE 2112 // sector_size x 4 bytes
#define fSPARE_SIZE 290 // 16384 x 98% x 1.8%
#define fGOOD_CODE 0x1C71C7 // good block/sector code
#define fSECTOR_INFO_ADDR 0x0000 // 1 bad block info address
#define fBLOCK_TBL_ADDR 0x0001 // (16+4) Block management table start address
#define fDA_START_ADDR 0x0015 // (16072) Data area start address
#define fSPARE_ADDR 0x3EDD // (290) spare block for bad block
#define fORG_GOOD_ADDR 0x0820 // factory good code address
#define fGOOD_CODE_OFFSET 509 // good code offset address after format
#define fSTATUS_OK 0x80 // flash memory status OK
#define fBLK0 0 // as column addr (CA)
#define fBLK1 512
#define fBLK2 1024
#define fBLK3 1536
#define fECC1 2048
#define fECC2 2048+11
#define fECC3 2048+38
#define fECC4 2048+49
#define fBLK_NO_OFFSET 2048+22 // flash memory sector no.
#define fBID_OFFSET 2048+24 // sector type
#define fGD_CODE_OFFSET 2048+32 // good sector code location
#define fSIZE_4BLK 2048 // no. of byte to read/write
#define fSIZE_3BLK 1536 // 512 + 16 per block
#define fSIZE_2BLK 1024
#define fSIZE_1BLK 512
#define SUCCESS 0x00
#define FAIL 0x01
#define ERROR 0xff
#define BUS_CE 1
#if BUS_CE==0
#define ChipSelect_F1 PORT.PEDR.BIT.PE0DR = 0;
#define De_ChipSelect_F1 PORT.PEDR.BIT.PE0DR = 1;
#else
//#define ChipSelect_F1 PORT.PGDDR.BYTE = 0x00; // CS1 input (i.e. external pull low)
//#define De_ChipSelect_F1 PORT.PGDDR.BYTE = 0x02; // all CS output (i.e. CS1 high, normal operation)
#define ChipSelect_F1 PORT.PGDDR.BYTE = 0x00; // CS1 input (i.e. external pull low)
#define De_ChipSelect_F1 PORT.PGDDR.BYTE = 0x08; // all CS output (i.e. CS1 high, normal operation)
#endif
#define ChipSelect_F2 PORT.PEDR.BIT.PE1DR = 0;
#define De_ChipSelect_F2 PORT.PEDR.BIT.PE1DR = 1;
// write protect pin
//#define WP_pin PORT.PORTE.BIT.PE4 // Write Protect pin
/*
* Defines return type BOOLEAN (TRUE/FALSE)
*/
#define TRUE 1
#define FALSE 0
#define BSET(var,bit) (var |= (bit))
#define BCLR(var,bit) (var &= ~(bit))
#define BTST(var,bit) ((var&(bit)) ? 1 : 0)
#define BIT15 0x8000
#define BIT14 0x4000
#define BIT13 0x2000
#define BIT12 0x1000
#define BIT11 0x0800
#define BIT10 0x0400
#define BIT9 0x0200
#define BIT8 0x0100
#define BIT7 0x80
#define BIT6 0x40
#define BIT5 0x20
#define BIT4 0x10
#define BIT3 0x08
#define BIT2 0x04
#define BIT1 0x02
#define BIT0 0x01
//**** low level flash memory access functions
//void f_clr_status(void);
void freset(void);
void fread_sector(void);
void fread_data(unsigned int loc); // together with "flash_rw"
unsigned int fread_id(void);
//unsigned char fread_status(void);
unsigned char fwrite_sector (void);
void ferase_blk_nowait (unsigned int addr);
unsigned char ferase_blk (unsigned int addr);
unsigned char fwrite_data(unsigned int loc); // together with "flash_rw"
unsigned char fcopy_back(unsigned long src_addr, unsigned long dest_addr);
//////////////////////////////////////////////////////////////////////////////////
//Public functions declarations (API interface)
void SCSI_READ(void);
long SCSI_WRITE(void);
void BULK_READ(void);
void BULK_WRITE(void);
unsigned char ReadFlash(unsigned long Addr, void *buf); // read 512
unsigned char ReadFlash4s(unsigned long Addr, void *buf); // read 2k
unsigned char WriteFlash(unsigned long Addr, void *buf);
unsigned char BackupFlash(unsigned long Addr, unsigned long length);
unsigned char EraseFlash(unsigned long Addr, unsigned char wait);
// =======================================================================
/* <<LED>> */
// =======================================================================
#define TurnOnLed() (PORT.P3DR.BYTE &= (unsigned char)~0x30)
#define TurnOffLed() (PORT.P3DR.BYTE |= 0x30)
#define ToggleLed() (PORT.P3DR.BYTE ^= 0x30)
//#define TurnOnLed() (PORT.P1DR.BYTE &= (unsigned char)~0x03)
//#define TurnOffLed() (PORT.P1DR.BYTE |= 0x03)
//#define ToggleLed() (PORT.P1DR.BYTE ^= 0x03)
// flash read/write parameters
typedef struct {
unsigned long addr; // page address
unsigned int length;
unsigned char *buff_ptr;
unsigned char *ecc_ptr;
} FLASH_RW;
typedef struct data_d {
unsigned char Buf[512+2];
unsigned long Addr;
unsigned char Modified;
unsigned int Sectors;
}MSC;
/*
typedef struct rdata_d {
unsigned char Buf[512+2];
unsigned char BufOdd[512+2];
unsigned long Addr;
unsigned char Modified;
unsigned int Sectors;
}RD_MSC;
typedef struct wdata_d {
unsigned char Buf[2048+2];
unsigned long Addr;
unsigned long Modified_BLK;
unsigned char Modified;
unsigned int Sectors;
}WR_MSC;
*/
typedef union DATA_BUFF {
unsigned char data_buff[2048+11];
struct ReadCache {
unsigned char Buf[1024];
unsigned char BufOdd[1024];
unsigned long Addr;
unsigned long Dummy;
unsigned char Modified;
unsigned int Sectors;
}ReadCache;
struct WriteCache {
unsigned char Buf[2048];
unsigned long Addr;
unsigned long Modified_BLK;
unsigned char Modified;
unsigned int Sectors;
}WriteCache;
} DATA_BUFF;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -