📄 smilmain.c
字号:
/***********************************************************************
* $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 + -