⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flashdisk.h

📁 瑞萨单片机开发软代码.非常实用小巧的平台,很多应用都可以在上面实现.
💻 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 + -