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

📄 smilmain.c

📁 ertfs文件系统里面既有完整ucos程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/*********************************************************************** 
 * $Workfile:   smilmain.c  $ 
 * $Revision: 1.1.1.1 $ 
 * $Author: meterchen $ 
 * $Date: 2003/11/10 17:00:55 $ 
 * 
 * Project:     NAND FLASH MANAGEMENT
 * 
 * Description: 
 *        
 *
 * Revision History: 
 * 
 *********************************************************************** 
 * 
 *  Copyright (c) 2003 CHENMENG
 * 
 *  All rights reserved 
 * 
 **********************************************************************/
 
#include "common.h"
#include "smil.h"
/***************************************************************************/
int Init$SmartMedia(void);
int Pwoff$SmartMedia(void);
int Check$SmartMedia(void);
int Check$Parameter(unsigned short *,unsigned char *,unsigned char *);
int Media$ReadSector(unsigned long,unsigned short,unsigned char *);
int Media$WriteSector(unsigned long,unsigned short,unsigned char *);
int Media$EraseBlock(unsigned long,unsigned short);
int Media$EraseAll(void);
/******************************************/
int Media$OneSectWriteStart(unsigned long,unsigned char *);
int Media$OneSectWriteNext(unsigned char *);
int Media$OneSectWriteFlush(void);
/******************************************/
void Led$TernOn(void);
void Led$TernOff(void);
/***************************************************************************/
static int Check$LogCHS(unsigned short *,unsigned char *,unsigned char *);
static void Initialize$Media(void);
static void PowerOff$Media(void);
static int Check$MediaPower(void);
static int Check$MediaExist(void);
static int Check$MediaWP(void);
static int Check$MediaFmt(void);
static int Check$MediaFmtForEraseAll(void);
static int Conv$MediaAddr(unsigned long);
static int Inc$MediaAddr(void);
static int Check$FirstSect(void);
static int Check$LastSect(void);
static int Media$ReadOneSect(unsigned char *);
static int Media$WriteOneSect(unsigned char *);
static int Media$CopyBlockHead(void);
static int Media$CopyBlockTail(void);
static int Media$EraseOneBlock(void);
static int Media$EraseAllBlock(void);
/******************************************/
static int Copy$BlockAll(unsigned int);
static int Copy$BlockHead(void);
static int Copy$BlockTail(void);
static int Reassign$BlockHead(void);
/******************************************/
static int Assign$WriteBlock(void);
static int Release$ReadBlock(void);
static int Release$WriteBlock(void);
/******************************************/
static int Copy$PhyOneSect(void);
static int Read$PhyOneSect(unsigned char *);
static int Write$PhyOneSect(unsigned char *);
static int Erase$PhyOneBlock(void);
/******************************************/
static int Set$PhyFmtValue(void);
static int Search$CIS(void);
static int Make$LogTable(void);
/******************************************/
static int MarkFail$PhyOneBlock(void);
/***************************************************************************/
extern int Check$DataBlank(unsigned char *);
extern int Check$FailBlock(unsigned char *);
extern int Check$DataStatus(unsigned char *);
extern int Load$LogBlockAddr(unsigned char *);
extern void Clr$RedundantData(unsigned char *);
extern void Set$LogBlockAddr(unsigned char *);
extern void Set$FailBlock(unsigned char *);
extern void Set$DataStaus(unsigned char *);
extern void Ssfdc$Reset(void);
extern int Ssfdc$ReadCisSect(unsigned char *,unsigned char *);
extern void Ssfdc$WriteRedtMode(void);
extern void Ssfdc$ReadID(unsigned char *);
extern int Ssfdc$ReadSect(unsigned char *,unsigned char *);
extern int Ssfdc$WriteSect(unsigned char *,unsigned char *);
extern int Ssfdc$WriteSectForCopy(unsigned char *,unsigned char *);
extern int Ssfdc$EraseBlock(void);
extern int Ssfdc$ReadRedtData(unsigned char *);
extern int Ssfdc$WriteRedtData(unsigned char *);
extern int Ssfdc$CheckStatus(void);
extern int Set$SsfdcModel(unsigned char);
extern void Cnt$Reset(void);
extern int Cnt$PowerOn(void);
extern void Cnt$PowerOff(void);
extern void Cnt$LedOn(void);
extern void Cnt$LedOff(void);
extern int Check$CntPower(void);
extern int Check$CardExist(void);
extern int Check$CardStsChg(void);
extern int Check$SsfdcWP(void);
/******************************************/
extern int Check$ReadError(unsigned char *);
extern int Check$Correct(unsigned char *,unsigned char *);
extern int Check$CISdata(unsigned char *,unsigned char *);
extern void Set$RightECC(unsigned char *);
/***************************************************************************/
static unsigned int ErrCode;
static unsigned char SectBuf[SECTSIZE];
static unsigned char WorkBuf[SECTSIZE];
static unsigned char Redundant[REDTSIZE];
static unsigned char WorkRedund[REDTSIZE];
static unsigned short Log2Phy[MAX_ZONENUM][MAX_LOGBLOCK];
static unsigned char Assign[MAX_ZONENUM][MAX_BLOCKNUM/8];
static unsigned short AssignStart[MAX_ZONENUM];
static unsigned short ReadBlock;
static unsigned short WriteBlock;
static unsigned int MediaChange;
static unsigned int SectCopyMode;
char CopyrightRef[] = \
"*** SmartMedia(TM) Interface Library *** Copyright (c) 1997-2000, Toshiba Corporation. All rights \
reserved.";
/***************************************************************************/
extern struct SSFDCTYPE Ssfdc;
extern struct ADDRESS Media;
extern struct CIS_AREA CisArea;
/***************************************************************************
BIT Controll Macro
***************************************************************************/
static char BitData[] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 } ;
#define Set$Bit(a,b) (a[(unsigned char)((b)/8)]|= BitData[(b)%8])
#define Clr$Bit(a,b) (a[(unsigned char)((b)/8)]&=~BitData[(b)%8])
#define Chk$Bit(a,b) (a[(unsigned char)((b)/8)] & BitData[(b)%8])
/***************************************************************************
Power Controll & Media Exist Check Function
***************************************************************************/
int Init$SmartMedia(void)
{
	Initialize$Media();
	return(NO_ERROR);
}
int Pwoff$SmartMedia(void)
{
	PowerOff$Media();
	return(NO_ERROR);
}
int Check$SmartMedia(void)
{
	if(Check$MediaExist()) return(ErrCode);
	return(NO_ERROR);
}
int Check$Parameter(unsigned short *pcyl,unsigned char *phead,unsigned char *psect)
{
	if(Check$MediaPower()) return(ErrCode);
	if(Check$MediaFmt()) return(ErrCode);
	if(Check$LogCHS(pcyl,phead,psect))
		return(ErrCode);
	return(NO_ERROR);
}
/***************************************************************************
SmartMedia Read/Write/Erase Function
***************************************************************************/
int Media$ReadSector(unsigned long start,unsigned short count,unsigned char *buf)
{
	int i;
	if(Check$MediaPower()) return(ErrCode);
	if(Check$MediaFmt()) return(ErrCode);
	if(Conv$MediaAddr(start)) return(ErrCode);
	while(1) {
		if(Media$ReadOneSect(SectBuf))
			{ ErrCode=ERR_EccReadErr; return(ErrCode); }
		for(i=0;i<SECTSIZE;i++)
			*buf++=SectBuf[i];
		if(--count<=0) break;
		if(Inc$MediaAddr()) return(ErrCode);
	}
	return(NO_ERROR);
}
int Media$WriteSector(unsigned long start,unsigned short count,unsigned char *buf)
{
	int i;
	if(Check$MediaPower()) return(ErrCode);
	if(Check$MediaFmt()) return(ErrCode);
	if(Check$MediaWP()) return(ErrCode);
	if(Conv$MediaAddr(start)) return(ErrCode);
	if(Check$FirstSect())
		if(Media$CopyBlockHead())
			{ ErrCode=ERR_WriteFault; return(ErrCode); }
	while(1) {
		if(! Check$FirstSect())
			if(Assign$WriteBlock()) return(ErrCode);
		for(i=0;i<SECTSIZE;i++)
			SectBuf[i]=*buf++;
		if(Media$WriteOneSect(SectBuf))
			{ ErrCode=ERR_WriteFault; return(ErrCode); }
		if(! Check$LastSect()) {
			if(Release$ReadBlock())
				if(ErrCode==ERR_HwError) {
					ErrCode=ERR_WriteFault;
					return(ErrCode);
				}
		}
		if(--count<=0) break;
		if(Inc$MediaAddr()) return(ErrCode);
	}
	if(! Check$LastSect()) return(NO_ERROR);
	if(Inc$MediaAddr()) return(ErrCode);
	if(Media$CopyBlockTail())
		{ ErrCode=ERR_WriteFault; return(ErrCode); }
	return(NO_ERROR);
}
int Media$EraseBlock(unsigned long start,unsigned short count)
{
	if(Check$MediaPower()) return(ErrCode);
	if(Check$MediaFmt()) return(ErrCode);
	if(Check$MediaWP()) return(ErrCode);
	if(Conv$MediaAddr(start)) return(ErrCode);
	while(Check$FirstSect()) {
		if(Inc$MediaAddr()) return(ErrCode);
		if(--count<=0) return(NO_ERROR);
	}
	while(1) {
		if(! Check$LastSect())
			if(Media$EraseOneBlock())
				if(ErrCode==ERR_HwError) {
					ErrCode=ERR_WriteFault;
					return(ErrCode);
				}
		if(Inc$MediaAddr()) return(ErrCode);
		if(--count<=0) return(NO_ERROR);
	}
}
/***************************************************************************/
int Media$EraseAll(void)
{
	if(Check$MediaPower()) return(ErrCode);
	if(Check$MediaFmtForEraseAll()) return(ErrCode);
	if(Check$MediaWP()) return(ErrCode);
	if(Media$EraseAllBlock()) return(ErrCode);
	return(NO_ERROR);
}
/***************************************************************************
SmartMedia Write Function for One Sector Write Mode
***************************************************************************/
int Media$OneSectWriteStart(unsigned long start,unsigned char *buf)
{
	int i;
	if(Check$MediaPower()) return(ErrCode);
	if(Check$MediaFmt()) return(ErrCode);
	if(Check$MediaWP()) return(ErrCode);
	if(Conv$MediaAddr(start)) return(ErrCode);
	if(Check$FirstSect())
		if(Media$CopyBlockHead())
			{ ErrCode=ERR_WriteFault; return(ErrCode); }
	if(! Check$FirstSect())
		if(Assign$WriteBlock()) return(ErrCode);
	for(i=0;i<SECTSIZE;i++)
		SectBuf[i]=*buf++;
	if(Media$WriteOneSect(SectBuf))
		{ ErrCode=ERR_WriteFault; return(ErrCode); }
	if(! Check$LastSect()) {
		if(Release$ReadBlock())
			if(ErrCode==ERR_HwError) {
				ErrCode=ERR_WriteFault;
				return(ErrCode);
			}
		}
	return(NO_ERROR);
}
int Media$OneSectWriteNext(unsigned char *buf)
{
	int i;
	if(Inc$MediaAddr()) return(ErrCode);
	if(! Check$FirstSect())
		if(Assign$WriteBlock()) return(ErrCode);
		for(i=0;i<SECTSIZE;i++)
			SectBuf[i]=*buf++;
		if(Media$WriteOneSect(SectBuf))
		{ ErrCode=ERR_WriteFault; return(ErrCode); }
		if(! Check$LastSect()) {
			if(Release$ReadBlock())
				if(ErrCode==ERR_HwError) {
					ErrCode=ERR_WriteFault;
					return(ErrCode);
				}
		}
		return(NO_ERROR);
}
int Media$OneSectWriteFlush(void)
{
	if(! Check$LastSect()) return(NO_ERROR);
	if(Inc$MediaAddr()) return(ErrCode);
	if(Media$CopyBlockTail())
	{ ErrCode=ERR_WriteFault; return(ErrCode); }
	return(NO_ERROR);
}
/***************************************************************************
LED Tern On/Off Subroutine
***************************************************************************/
void Led$TernOn(void)
{
	if(Check$CardStsChg()) MediaChange=ERROR;
	Cnt$LedOn();
}
void Led$TernOff(void)
{
	if(Check$CardStsChg()) MediaChange=ERROR;
	Cnt$LedOff();
}
/***************************************************************************
SmartMedia Logical Format Subroutine
***************************************************************************/
int Check$LogCHS(unsigned short *c,unsigned char *h,unsigned char *s)
{
	switch(Ssfdc.Model) {
	case SSFDC1MB: *c=125; *h= 4; *s= 4; break;
	case SSFDC2MB: *c=125; *h= 4; *s= 8; break;
	case SSFDC4MB: *c=250; *h= 4; *s= 8; break;
	case SSFDC8MB: *c=250; *h= 4; *s=16; break;
	case SSFDC16MB: *c=500; *h= 4; *s=16; break;
	case SSFDC32MB: *c=500; *h= 8; *s=16; break;
	case SSFDC64MB: *c=500; *h= 8; *s=32; break;
	case SSFDC128MB: *c=500; *h=16; *s=32; break;

⌨️ 快捷键说明

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