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

📄 ddfrom.h

📁 Atmal Flash驱动以及基于驱动之上的Flash页读写实现
💻 H
字号:
/********************************************************************/
/* Copyright (c) 2005,夏新电子通信事业部							*/
/* All rights reserved.												*/
/*                   												*/
/* 文件名称:Ddfrom.h	             								*/
/* 摘    要:该文件包含Atmel Flash驱动中间层的函数声明和宏定义		*/
/*                    												*/
/* 当前版本:1.0               										*/
/* 作    者:王劲涛              									*/
/* 完成日期:2005年6月14日 创建           							*/
/*                   												*/
/********************************************************************/

#ifndef _DDFROM_H_
#define _DDFROM_H_

#define ATMEL_1601
/**-----------------------------------------------------------------*/
/**                         Compiler Flag                           */
/**-----------------------------------------------------------------*/
#ifdef __cplusplus
    extern   "C"
    {
#endif
#include "Tdef.h"

/**-----------------------------------------------------------------*/
/**                         枚举型定义                              */
/**-----------------------------------------------------------------*/
typedef enum 
{
	FML_SUCCESS = 0,				//FML层操作成功
	FML_FAILURE						//FML层操作失败
}FML_RESULT;						//FML层函数操作结果


typedef enum 
{
	FML_FLASH_FREE = 0,				//未使用
	FML_FLASH_INUSE,				//使用中
	FML_FLASH_INVALID				//已废弃
}FML_FLASH_STATUS;					//FLASH的使用状态


/**-----------------------------------------------------------------*/
/**                         结构体定义                              */
/**-----------------------------------------------------------------*/
typedef struct
{
	byte page_lid;			//块内逻辑页号
	byte page_sts;			//页状态
}PAT_UNIT_INFO;				//PAT管理单元

/**-----------------------------------------------------------------*/
/**                         常量定义									*/
/**-----------------------------------------------------------------*/
#define ROM_BASE 0xE00000				//Flash基地址,待定
#define BLOCK_SIZE 0x8000 				//可根据Flash型号修改
#define PAGE_SIZE 128					//可根据Flash型号及应用情况修改
#define MAX_USE_BLOCK 3 				//可擦除块个数,根据可变更数据情况定义
#define MAX_FREE_BLOCK 1				//备用块个数,根据Flash剩余空间大小定义
#define MAX_PHY_PAGE_NUM 254			//每个可擦除块中最大有效物理页个数
//chg start by wjt 2005.09.06
//#define MAX_LOGIC_PAGE_NUM 200		//每个可擦除块中最大有效逻辑页个数
#define MAX_LOGIC_PAGE_NUM 160			//每个可擦除块中最大有效逻辑页个数
//chg end by wjt 2005.09.06
#define BLOCK_INFO_SIZE 2				//块信息占用空间
#define PAT_SIZE 254					//可擦除块中分配表PAT大小
#define MAX_TIMEOUT 0x7FFF			//判断Prog是否结束的最大检测次数
#define Erase_MAX_TIMEOUT 0x7FFFFFFF		//判断Erase是否结束的最大检测次数
#define BLOCK_ADDR_INVALID	0xFFFFFFFF	//块物理地址非法
#define IO7_BIT 0x0080					// IO/7标志位
#define ERASE_PROG_CODE_SIZE	64		//擦除/字写入的代码长度

//块状态定义
#define BLOCK_INVALID 0x0000			//该Block已废弃
#define	BLOCK_IN_USE 0xFF00				//该Block已使用
#define	BLOCK_FREE 0xFFFF				//该Block未使用
	
//页状态定义
#define	PAGE_USED 0x00					//该页已使用
#define	PAGE_FREE 0xFF					//该页未使用
#define	PAGE_INVALID 0x0000			//该页已废弃	

//Flash地址偏移量转换
#define sysAddress(offset) ((volatile word *)( ROM_BASE + (offset)*2))

#define CMN_FSY_OK				0x00	
#define CMN_FSY_DRIVER_ERROR	0x01

#ifdef ATMEL_1601
#define FONT_BLOCK_NUM 4
#define MAIN_BLOCK_NUM 31
#define PARA_BLOCK_NUM 8
#define MAIN_BLOCK_SIZE 32*1024
#define PARA_BLOCK_SIZE 4*1024
#define PRRA_BLOCK_START_ADDR MAIN_BLOCK_SIZE*MAIN_BLOCK_NUM
#endif

/**--------------------------------------------------------------------------*
 **                         Atmel Flash 驱动中间层函数声明                 	 *
 **--------------------------------------------------------------------------*/
//提供给A09文件系统的API
word dDFRomFormat(void);		//格式化Flash中存放可变数据的块
word dDFRomInit(void);			//初始化驱动中间层的管理
word dDFRomRead(word aUnit, word nID, byte *pcBuffer);	//根据起始逻辑页号从Flash上读入一页或几页的信息
word dDFRomWrite(word nID, byte *aSrcAddr);		//根据起始逻辑页号向Flash上写入一页或几页的信息
word dDFRomStatusChk(void);	//判断输入的逻辑页号是否在规定范围内
word dDFRomReWriteSet(word aMode);			//Flash碎片的整理回收,为兼容原有文件系统而保留,不做具体操作

//Atmel Flash 驱动中间层内部函数
void FML_init(void);										//解除开机后所有FML管理下的Flash块的soft-lock	
word FML_SectorUnLockF(void);						//Atmel Flash Block软解锁
FML_RESULT FML_BlockEraseF(ulong pwAddr);
FML_RESULT FML_ProgOneWordF(ulong dst, word data);
FML_RESULT FML_ProgOnePage(ulong dst, word *src);		//往Flash的指定地址上写入1页的数据
static FML_RESULT FML_ReadOnePage(ulong addr, word *data_ptr);		//从Flash的指定地址上读入1页数据

static FML_FLASH_STATUS FML_GetRealAddr(ulong nID, byte *block_id, 
							byte *page_id, ulong page_addr);		//得到逻辑页对应的真实物理地址
static FML_RESULT FML_AllocNewBlock(byte block_id, ulong *block_addr);	//分配新的物理块
static FML_RESULT FML_BlockCopy(byte block_id);	//将可用空间不足的物理块上的数据整理复制到新块中
static FML_RESULT FML_AllocNewPage(byte block_id, ulong *page_addr);	//分配新的物理页并置为待写入状态
word FML_SectorUnLock(void);
word FML_BlockErase(ulong block_addr);					//擦除已废弃的物理块									
word FML_ProgOneWord(ulong dst, word data);		//往Flash的指定地址上写入1个word
word FML_SectorLockF(ulong sector);


#ifdef   __cplusplus
    }
#endif

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -