1/*----- < smil.h> ----------------------------------------------------*/
2#ifndef SMIL_INCD
3#define SMIL_INCD
4
5/***************************************************************************
6Define Definition
7***************************************************************************/
8#define K_BYTE              1024   /* Kilo Byte */
9#define SECTSIZE            512    /* Sector buffer size */
10#define REDTSIZE            16     /* Redundant buffer size */
11
12/***************************************************************************/
13#define DUMMY_DATA          0xFF   /* No Assign Sector Read Data */
14
15/***************************************************************************
16Max Zone/Block/Sectors Data Definition
17***************************************************************************/
18#define MAX_ZONENUM         128    /* Max Zone Numbers in a SmartMedia    */
19#define MAX_BLOCKNUM        0x0400 /* Max Block Numbers in a Zone         */
20#define MAX_SECTNUM         0x20   /* Max Sector Numbers in a Block       */
21#define MAX_LOGBLOCK        1000   /* Max Logical Block Numbers in a Zone */
22
23/***************************************************************************/
24#define CIS_SEARCH_SECT     0x08   /* Max CIS Search Sector Number */
25
26/***************************************************************************
27Logical to Physical Block Table Data Definition
28***************************************************************************/
29#define NO_ASSIGN           0xFFFF /* No Assign Logical Block Address */
30
31/***************************************************************************
32'SectCopyMode' Data
33***************************************************************************/
34#define COMPLETED           0      /* Sector Copy Completed */
35#define REQ_ERASE           1      /* Request Read Block Erase */
36#define REQ_FAIL            2      /* Request Read Block Failed */
37
38/***************************************************************************
39Retry Counter Definition
40***************************************************************************/
41#define RDERR_REASSIGN      1      /* Reassign with Read Error */
42#define L2P_ERR_ERASE       1      /* BlockErase for Contradicted L2P Table */
43
44/***************************************************************************
45Hardware ECC Definition
46***************************************************************************/
47#define HW_ECC_SUPPORTED    1	   /* Hardware ECC Supported */
48/* No difinition for Software ECC */
49
50/***************************************************************************
51SmartMedia Command & Status Definition
52***************************************************************************/
53/* SmartMedia Command */
54#define WRDATA        0x80
55/* #define READ          0x00 */
56#define READ_REDT     0x50
57/* #define WRITE         0x10 */
58#define RDSTATUS      0x70
59
60#define READ1         0x00 /* NO */
61#define READ2         0x01 /* NO */
62#define READ3         0x50 /* NO */
63#define RST_CHIP      0xFF
64#define ERASE1        0x60
65#define ERASE2        0xD0
66#define READ_ID_1     0x90
67#define READ_ID_2     0x91
68#define READ_ID_3     0x9A
69
70/* 712 SmartMedia Command */
71#define SM_CMD_RESET                0x00    /* 0xFF */
72#define SM_CMD_READ_ID_1            0x10    /* 0x90 */
73#define SM_CMD_READ_ID_2            0x20    /* 0x91 */
74#define SM_CMD_READ_STAT            0x30    /* 0x70 */
75#define SM_CMD_RDMULTPL_STAT        0x40    /* 0x71 */
76#define SM_CMD_READ_1               0x50    /* 0x00 */
77#define SM_CMD_READ_2               0x60    /* 0x01 */
78#define SM_CMD_READ_3               0x70    /* 0x50 */
79#define SM_CMD_PAGPRGM_TRUE         0x80    /* {0x80, 0x10} */
80#define SM_CMD_PAGPRGM_DUMY         0x90    /* {0x80, 0x11} */
81#define SM_CMD_PAGPRGM_MBLK         0xA0    /* {0x80, 0x15} */
82#define SM_CMD_BLKERASE             0xB0    /* {0x60, 0xD0} */
83#define SM_CMD_BLKERASE_MULTPL      0xC0    /* {0x60-0x60, 0xD0} */
84
85#define SM_CRADDTCT_DEBNCETIMER_EN  0x02
86#define SM_CMD_START_BIT            0x01
87
88#define SM_WaitCmdDone { while (!SM_CmdDone); }
89#define SM_WaitDmaDone { while (!SM_DmaDone); }
90
91/* SmartMedia Status */
92#define WR_FAIL       0x01      /* 0:Pass, 1:Fail */
93#define SUSPENDED     0x20      /* 0:Not Suspended, 1:Suspended */
94#define READY         0x40      /* 0:Busy, 1:Ready */
95#define WR_PRTCT      0x80      /* 0:Protect, 1:Not Protect */
96
97/* SmartMedia Busy Time (1bit:0.1ms) */
98#define BUSY_PROG 200 /* tPROG   : 20ms  ----- Program Time old : 200 */
99#define BUSY_ERASE 4000 /* tBERASE : 400ms ----- Block Erase Time old : 4000 */
100
101/*for 712 Test */
102/* #define BUSY_READ 1 *//* tR : 100us ----- Data transfer Time   old : 1 */
103/* #define BUSY_READ 10 *//* tR : 100us ----- Data transfer Time   old : 1 */
104
105#define BUSY_READ 200 /* tR : 20ms   ----- Data transfer Time   old : 1 */
106
107/* #define BUSY_RESET 60 *//* tRST : 6ms ----- Device Resetting Time old : 60 */
108
109#define BUSY_RESET 600 /* tRST : 60ms   ----- Device Resetting Time old : 60 */
110
111/* Hardware Timer (1bit:0.1ms) */
112#define TIME_PON      3000      /* 300ms ------ Power On Wait Time */
113#define TIME_CDCHK    200       /* 20ms  ------ Card Check Interval Timer */
114#define TIME_WPCHK    50        /* 5ms   ------ WP Check Interval Timer */
115#define TIME_5VCHK    10        /* 1ms   ------ 5V Check Interval Timer */
116
117/***************************************************************************
118Redundant Data
119***************************************************************************/
120#define REDT_DATA     0x04
121#define REDT_BLOCK    0x05
122#define REDT_ADDR1H   0x06
123#define REDT_ADDR1L   0x07
124#define REDT_ADDR2H   0x0B
125#define REDT_ADDR2L   0x0C
126#define REDT_ECC10    0x0D
127#define REDT_ECC11    0x0E
128#define REDT_ECC12    0x0F
129#define REDT_ECC20    0x08
130#define REDT_ECC21    0x09
131#define REDT_ECC22    0x0A
132
133/***************************************************************************
134SmartMedia Model & Attribute
135***************************************************************************/
136/* SmartMedia Attribute */
137#define NOWP          0x00 /* 0... .... No Write Protect */
138#define WP            0x80 /* 1... .... Write Protected */
139#define MASK          0x00 /* .00. .... NAND MASK ROM Model */
140#define FLASH         0x20 /* .01. .... NAND Flash ROM Model */
141#define AD3CYC        0x00 /* ...0 .... Address 3-cycle */
142#define AD4CYC        0x10 /* ...1 .... Address 4-cycle */
143#define BS16          0x00 /* .... 00.. 16page/block */
144#define BS32          0x04 /* .... 01.. 32page/block */
145#define PS256         0x00 /* .... ..00 256byte/page */
146#define PS512         0x01 /* .... ..01 512byte/page */
147#define MWP           0x80 /* WriteProtect mask */
148#define MFLASH        0x60 /* Flash Rom mask */
149#define MADC          0x10 /* Address Cycle */
150#define MBS           0x0C /* BlockSize mask */
151#define MPS           0x03 /* PageSize mask */
152
153/* SmartMedia Model */
154#define NOSSFDC       0x00 /* NO   SmartMedia */
155#define SSFDC1MB      0x01 /* 1MB  SmartMedia */
156#define SSFDC2MB      0x02 /* 2MB  SmartMedia */
157#define SSFDC4MB      0x03 /* 4MB  SmartMedia */
158#define SSFDC8MB      0x04 /* 8MB  SmartMedia */
159#define SSFDC16MB     0x05 /* 16MB SmartMedia */
160#define SSFDC32MB     0x06 /* 32MB SmartMedia */
161#define SSFDC64MB     0x07 /* 64MB SmartMedia */
162#define SSFDC128MB    0x08 /*128MB SmartMedia */
163#define SSFDC256MB    0x09
164#define SSFDC512MB    0x0A
165#define SSFDC1GB      0x0B
166#define SSFDC2GB      0x0C
167
168/***************************************************************************
169Struct Definition
170***************************************************************************/
171struct SSFDCTYPE {
172	BYTE Model;
173	BYTE Attribute;
174	BYTE MaxZones;
175	BYTE MaxSectors;
176	WORD MaxBlocks;
177	WORD MaxLogBlocks;
178};
179
180typedef struct SSFDCTYPE_T {
181	BYTE Model;
182	BYTE Attribute;
183	BYTE MaxZones;
184	BYTE MaxSectors;
185	WORD MaxBlocks;
186	WORD MaxLogBlocks;
187} *SSFDCTYPE_T;
188
189struct ADDRESS {
190	BYTE Zone;	/* Zone Number */
191	BYTE Sector;	/* Sector(512byte) Number on Block */
192	WORD PhyBlock;	/* Physical Block Number on Zone */
193	WORD LogBlock;	/* Logical Block Number of Zone */
194};
195
196typedef struct ADDRESS_T {
197	BYTE Zone;	/* Zone Number */
198	BYTE Sector;	/* Sector(512byte) Number on Block */
199	WORD PhyBlock;	/* Physical Block Number on Zone */
200	WORD LogBlock;	/* Logical Block Number of Zone */
201} *ADDRESS_T;
202
203struct CIS_AREA {
204	BYTE Sector;	/* Sector(512byte) Number on Block */
205	WORD PhyBlock;	/* Physical Block Number on Zone 0 */
206};
207
208
209extern BYTE IsSSFDCCompliance;
210extern BYTE IsXDCompliance;
211
212extern DWORD	ErrXDCode;
213extern DWORD	ErrCode;
214extern WORD	ReadBlock;
215extern WORD	WriteBlock;
216extern DWORD	MediaChange;
217
218extern struct SSFDCTYPE  Ssfdc;
219extern struct ADDRESS    Media;
220extern struct CIS_AREA   CisArea;
221
222/*
223 * SMILMain.c
224 */
225/******************************************/
226int         Init_D_SmartMedia(void);
227int         Pwoff_D_SmartMedia(void);
228int         Check_D_SmartMedia(void);
229int         Check_D_Parameter(struct us_data *, WORD *, BYTE *, BYTE *);
230int         Media_D_ReadSector(struct us_data *, DWORD, WORD, BYTE *);
231int         Media_D_WriteSector(struct us_data *, DWORD, WORD, BYTE *);
232int         Media_D_CopySector(struct us_data *, DWORD, WORD, BYTE *);
233int         Media_D_EraseBlock(struct us_data *, DWORD, WORD);
234int         Media_D_EraseAll(struct us_data *);
235/******************************************/
236int         Media_D_OneSectWriteStart(struct us_data *, DWORD, BYTE *);
237int         Media_D_OneSectWriteNext(struct us_data *, BYTE *);
238int         Media_D_OneSectWriteFlush(struct us_data *);
239
240/******************************************/
241extern int	SM_FreeMem(void);	/* ENE SM function */
242void        SM_EnableLED(struct us_data *, BOOLEAN);
243void        Led_D_TernOn(void);
244void        Led_D_TernOff(void);
245
246int         Media_D_EraseAllRedtData(DWORD Index, BOOLEAN CheckBlock);
247/*DWORD Media_D_GetMediaInfo(struct us_data * fdoExt,
248	PIOCTL_MEDIA_INFO_IN pParamIn, PIOCTL_MEDIA_INFO_OUT pParamOut); */
249
250/*
251 * SMILSub.c
252 */
253/******************************************/
254int  Check_D_DataBlank(BYTE *);
255int  Check_D_FailBlock(BYTE *);
256int  Check_D_DataStatus(BYTE *);
257int  Load_D_LogBlockAddr(BYTE *);
258void Clr_D_RedundantData(BYTE *);
259void Set_D_LogBlockAddr(BYTE *);
260void Set_D_FailBlock(BYTE *);
261void Set_D_DataStaus(BYTE *);
262
263/******************************************/
264void Ssfdc_D_Reset(struct us_data *);
265int  Ssfdc_D_ReadCisSect(struct us_data *, BYTE *, BYTE *);
266void Ssfdc_D_WriteRedtMode(void);
267void Ssfdc_D_ReadID(BYTE *, BYTE);
268int  Ssfdc_D_ReadSect(struct us_data *, BYTE *, BYTE *);
269int  Ssfdc_D_ReadBlock(struct us_data *, WORD, BYTE *, BYTE *);
270int  Ssfdc_D_WriteSect(struct us_data *, BYTE *, BYTE *);
271int  Ssfdc_D_WriteBlock(struct us_data *, WORD, BYTE *, BYTE *);
272int  Ssfdc_D_CopyBlock(struct us_data *, WORD, BYTE *, BYTE *);
273int  Ssfdc_D_WriteSectForCopy(struct us_data *, BYTE *, BYTE *);
274int  Ssfdc_D_EraseBlock(struct us_data *);
275int  Ssfdc_D_ReadRedtData(struct us_data *, BYTE *);
276int  Ssfdc_D_WriteRedtData(struct us_data *, BYTE *);
277int  Ssfdc_D_CheckStatus(void);
278int  Set_D_SsfdcModel(BYTE);
279void Cnt_D_Reset(void);
280int  Cnt_D_PowerOn(void);
281void Cnt_D_PowerOff(void);
282void Cnt_D_LedOn(void);
283void Cnt_D_LedOff(void);
284int  Check_D_CntPower(void);
285int  Check_D_CardExist(void);
286int  Check_D_CardStsChg(void);
287int  Check_D_SsfdcWP(void);
288int  SM_ReadBlock(struct us_data *, BYTE *, BYTE *);
289
290int  Ssfdc_D_ReadSect_DMA(struct us_data *, BYTE *, BYTE *);
291int  Ssfdc_D_ReadSect_PIO(struct us_data *, BYTE *, BYTE *);
292int  Ssfdc_D_WriteSect_DMA(struct us_data *, BYTE *, BYTE *);
293int  Ssfdc_D_WriteSect_PIO(struct us_data *, BYTE *, BYTE *);
294
295/******************************************/
296int  Check_D_ReadError(BYTE *);
297int  Check_D_Correct(BYTE *, BYTE *);
298int  Check_D_CISdata(BYTE *, BYTE *);
299void Set_D_RightECC(BYTE *);
300
301/*
302 * SMILECC.c
303 */
304void calculate_ecc(BYTE *, BYTE *, BYTE *, BYTE *, BYTE *);
305BYTE correct_data(BYTE *, BYTE *, BYTE,   BYTE,   BYTE);
306int  _Correct_D_SwECC(BYTE *, BYTE *, BYTE *);
307void _Calculate_D_SwECC(BYTE *, BYTE *);
308
309void SM_Init(void);
310
311#endif /* already included */
312