1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
|
#ifndef MS_INCD
#define MS_INCD
#include <linux/blkdev.h>
#include "common.h"
// MemoryStick Register
// Status Register 0
#define MS_REG_ST0_MB 0x80 // media busy
#define MS_REG_ST0_FB0 0x40 // flush busy 0
#define MS_REG_ST0_BE 0x20 // buffer empty
#define MS_REG_ST0_BF 0x10 // buffer full
#define MS_REG_ST0_SL 0x02 // sleep
#define MS_REG_ST0_WP 0x01 // write protected
#define MS_REG_ST0_WP_ON MS_REG_ST0_WP
#define MS_REG_ST0_WP_OFF 0x00
// Status Register 1
#define MS_REG_ST1_MB 0x80 // media busy
#define MS_REG_ST1_FB1 0x40 // flush busy 1
#define MS_REG_ST1_DTER 0x20 // error on data(corrected)
#define MS_REG_ST1_UCDT 0x10 // unable to correct data
#define MS_REG_ST1_EXER 0x08 // error on extra(corrected)
#define MS_REG_ST1_UCEX 0x04 // unable to correct extra
#define MS_REG_ST1_FGER 0x02 // error on overwrite flag(corrected)
#define MS_REG_ST1_UCFG 0x01 // unable to correct overwrite flag
#define MS_REG_ST1_DEFAULT (MS_REG_ST1_MB | MS_REG_ST1_FB1 | \
MS_REG_ST1_DTER | MS_REG_ST1_UCDT | \
MS_REG_ST1_EXER | MS_REG_ST1_UCEX | \
MS_REG_ST1_FGER | MS_REG_ST1_UCFG)
// System Parameter
#define MS_REG_SYSPAR_BAMD 0x80 // block address mode
#define MS_REG_SYSPAR_BAND_LINEAR MS_REG_SYSPAR_BAMD // linear mode
#define MS_REG_SYSPAR_BAND_CHIP 0x00 // chip mode
#define MS_REG_SYSPAR_ATEN 0x40 // attribute ROM enable
#define MS_REG_SYSPAR_ATEN_ENABLE MS_REG_SYSPAR_ATEN // enable
#define MS_REG_SYSPAR_ATEN_DISABLE 0x00 // disable
#define MS_REG_SYSPAR_RESERVED 0x2f
// Command Parameter
#define MS_REG_CMDPAR_CP2 0x80
#define MS_REG_CMDPAR_CP1 0x40
#define MS_REG_CMDPAR_CP0 0x20
#define MS_REG_CMDPAR_BLOCK_ACCESS 0
#define MS_REG_CMDPAR_PAGE_ACCESS MS_REG_CMDPAR_CP0
#define MS_REG_CMDPAR_EXTRA_DATA MS_REG_CMDPAR_CP1
#define MS_REG_CMDPAR_OVERWRITE MS_REG_CMDPAR_CP2
#define MS_REG_CMDPAR_RESERVED 0x1f
// Overwrite Area
#define MS_REG_OVR_BKST 0x80 // block status
#define MS_REG_OVR_BKST_OK MS_REG_OVR_BKST // OK
#define MS_REG_OVR_BKST_NG 0x00 // NG
#define MS_REG_OVR_PGST0 0x40 // page status
#define MS_REG_OVR_PGST1 0x20
#define MS_REG_OVR_PGST_MASK (MS_REG_OVR_PGST0 | MS_REG_OVR_PGST1)
#define MS_REG_OVR_PGST_OK (MS_REG_OVR_PGST0 | MS_REG_OVR_PGST1) // OK
#define MS_REG_OVR_PGST_NG MS_REG_OVR_PGST1 // NG
#define MS_REG_OVR_PGST_DATA_ERROR 0x00 // data error
#define MS_REG_OVR_UDST 0x10 // update status
#define MS_REG_OVR_UDST_UPDATING 0x00 // updating
#define MS_REG_OVR_UDST_NO_UPDATE MS_REG_OVR_UDST
#define MS_REG_OVR_RESERVED 0x08
#define MS_REG_OVR_DEFAULT (MS_REG_OVR_BKST_OK | \
MS_REG_OVR_PGST_OK | \
MS_REG_OVR_UDST_NO_UPDATE | \
MS_REG_OVR_RESERVED)
// Management Flag
#define MS_REG_MNG_SCMS0 0x20 // serial copy management system
#define MS_REG_MNG_SCMS1 0x10
#define MS_REG_MNG_SCMS_MASK (MS_REG_MNG_SCMS0 | MS_REG_MNG_SCMS1)
#define MS_REG_MNG_SCMS_COPY_OK (MS_REG_MNG_SCMS0 | MS_REG_MNG_SCMS1)
#define MS_REG_MNG_SCMS_ONE_COPY MS_REG_MNG_SCMS1
#define MS_REG_MNG_SCMS_NO_COPY 0x00
#define MS_REG_MNG_ATFLG 0x08 // address transfer table flag
#define MS_REG_MNG_ATFLG_OTHER MS_REG_MNG_ATFLG // other
#define MS_REG_MNG_ATFLG_ATTBL 0x00 // address transfer table
#define MS_REG_MNG_SYSFLG 0x04 // system flag
#define MS_REG_MNG_SYSFLG_USER MS_REG_MNG_SYSFLG // user block
#define MS_REG_MNG_SYSFLG_BOOT 0x00 // system block
#define MS_REG_MNG_RESERVED 0xc3
#define MS_REG_MNG_DEFAULT (MS_REG_MNG_SCMS_COPY_OK | \
MS_REG_MNG_ATFLG_OTHER | \
MS_REG_MNG_SYSFLG_USER | \
MS_REG_MNG_RESERVED)
// Error codes
#define MS_STATUS_SUCCESS 0x0000
#define MS_ERROR_OUT_OF_SPACE 0x0103
#define MS_STATUS_WRITE_PROTECT 0x0106
#define MS_ERROR_READ_DATA 0x8002
#define MS_ERROR_FLASH_READ 0x8003
#define MS_ERROR_FLASH_WRITE 0x8004
#define MS_ERROR_FLASH_ERASE 0x8005
#define MS_ERROR_FLASH_COPY 0x8006
#define MS_STATUS_ERROR 0xfffe
#define MS_FIFO_ERROR 0xfffd
#define MS_UNDEFINED_ERROR 0xfffc
#define MS_KETIMEOUT_ERROR 0xfffb
#define MS_STATUS_INT_ERROR 0xfffa
#define MS_NO_MEMORY_ERROR 0xfff9
#define MS_NOCARD_ERROR 0xfff8
#define MS_LB_NOT_USED 0xffff
#define MS_LB_ERROR 0xfff0
#define MS_LB_BOOT_BLOCK 0xfff1
#define MS_LB_INITIAL_ERROR 0xfff2
#define MS_STATUS_SUCCESS_WITH_ECC 0xfff3
#define MS_LB_ACQUIRED_ERROR 0xfff4
#define MS_LB_NOT_USED_ERASED 0xfff5
#define MS_LibConv2Physical(pdx, LogBlock) (((LogBlock) >= (pdx)->MS_Lib.NumberOfLogBlock) ? MS_STATUS_ERROR : (pdx)->MS_Lib.Log2PhyMap[LogBlock])
#define MS_LibConv2Logical(pdx, PhyBlock) (((PhyBlock) >= (pdx)->MS_Lib.NumberOfPhyBlock) ? MS_STATUS_ERROR : (pdx)->MS_Lib.Phy2LogMap[PhyBlock]) //¬dphy->log table
#define MS_LIB_CTRL_RDONLY 0
#define MS_LIB_CTRL_WRPROTECT 1
#define MS_LibCtrlCheck(pdx, Flag) ((pdx)->MS_Lib.flags & (1 << (Flag)))
#define MS_LibCtrlSet(pdx, Flag) (pdx)->MS_Lib.flags |= (1 << (Flag))
#define MS_LibCtrlReset(pdx, Flag) (pdx)->MS_Lib.flags &= ~(1 << (Flag))
#define MS_LibIsWritable(pdx) ((MS_LibCtrlCheck((pdx), MS_LIB_CTRL_RDONLY) == 0) && (MS_LibCtrlCheck(pdx, MS_LIB_CTRL_WRPROTECT) == 0))
#define MS_MAX_PAGES_PER_BLOCK 32
#define MS_LIB_BITS_PER_BYTE 8
#define MS_LibPageMapIdx(n) ((n) / MS_LIB_BITS_PER_BYTE)
#define MS_LibPageMapBit(n) (1 << ((n) % MS_LIB_BITS_PER_BYTE))
#define MS_LibCheckPageMapBit(pdx, n) ((pdx)->MS_Lib.pagemap[MS_LibPageMapIdx(n)] & MS_LibPageMapBit(n))
#define MS_LibSetPageMapBit(pdx, n) ((pdx)->MS_Lib.pagemap[MS_LibPageMapIdx(n)] |= MS_LibPageMapBit(n))
#define MS_LibResetPageMapBit(pdx, n) ((pdx)->MS_Lib.pagemap[MS_LibPageMapIdx(n)] &= ~MS_LibPageMapBit(n))
#define MS_LibClearPageMap(pdx) memset((pdx)->MS_Lib.pagemap, 0, sizeof((pdx)->MS_Lib.pagemap))
#define MemStickLogAddr(logadr1, logadr0) ((((WORD)(logadr1)) << 8) | (logadr0))
#define MS_BYTES_PER_PAGE 512
#define MS_MAX_INITIAL_ERROR_BLOCKS 10
#define MS_NUMBER_OF_PAGES_FOR_BOOT_BLOCK 3
#define MS_NUMBER_OF_PAGES_FOR_LPCTBL 2
#define MS_NUMBER_OF_BOOT_BLOCK 2
#define MS_NUMBER_OF_SYSTEM_BLOCK 4
#define MS_LOGICAL_BLOCKS_PER_SEGMENT 496
#define MS_LOGICAL_BLOCKS_IN_1ST_SEGMENT 494
#define MS_PHYSICAL_BLOCKS_PER_SEGMENT 0x200 // 512
#define MS_PHYSICAL_BLOCKS_PER_SEGMENT_MASK 0x1ff
#define MS_SECTOR_SIZE 512
#define MBR_SIGNATURE 0xAA55
#define PBR_SIGNATURE 0xAA55
#define PARTITION_FAT_12 1
#define PARTITION_FAT_16 2
#define MS_BOOT_BLOCK_ID 0x0001
#define MS_BOOT_BLOCK_FORMAT_VERSION 0x0100
#define MS_BOOT_BLOCK_DATA_ENTRIES 2
#define MS_SYSINF_MSCLASS_TYPE_1 1
#define MS_SYSINF_CARDTYPE_RDONLY 1
#define MS_SYSINF_CARDTYPE_RDWR 2
#define MS_SYSINF_CARDTYPE_HYBRID 3
#define MS_SYSINF_SECURITY 0x01
#define MS_SYSINF_SECURITY_NO_SUPPORT MS_SYSINF_SECURITY
#define MS_SYSINF_SECURITY_SUPPORT 0
#define MS_SYSINF_FORMAT_MAT 0 // ?
#define MS_SYSINF_FORMAT_FAT 1
#define MS_SYSINF_USAGE_GENERAL 0
#define MS_SYSINF_PAGE_SIZE MS_BYTES_PER_PAGE // fixed
#define MS_SYSINF_RESERVED1 1
#define MS_SYSINF_RESERVED2 1
#define MS_SYSENT_TYPE_INVALID_BLOCK 0x01
#define MS_SYSENT_TYPE_CIS_IDI 0x0a // CIS/IDI
#define SIZE_OF_KIRO 1024
// BOOT BLOCK
#define MS_NUMBER_OF_SYSTEM_ENTRY 4
//----- MemStickRegisters --------------------------------------------
// Status registers (16 bytes)
typedef struct {
BYTE Reserved0; // 00
BYTE INTRegister; // 01
BYTE StatusRegister0; // 02
BYTE StatusRegister1; // 03
BYTE Reserved1[12]; // 04-0F
} MemStickStatusRegisters;
// Parameter registers (6 bytes)
typedef struct {
BYTE SystemParameter; // 10
BYTE BlockAddress2; // 11
BYTE BlockAddress1; // 12
BYTE BlockAddress0; // 13
BYTE CMDParameter; // 14
BYTE PageAddress; // 15
} MemStickParameterRegisters;
// Extra registers (9 bytes)
typedef struct {
BYTE OverwriteFlag; // 16
BYTE ManagementFlag; // 17
BYTE LogicalAddress1; // 18
BYTE LogicalAddress0; // 19
BYTE ReservedArea[5]; // 1A-1E
} MemStickExtraDataRegisters;
// All registers in Memory Stick (32 bytes, includes 1 byte padding)
typedef struct {
MemStickStatusRegisters status;
MemStickParameterRegisters param;
MemStickExtraDataRegisters extra;
BYTE padding;
} MemStickRegisters, *PMemStickRegisters;
//----- MemStickBootBlockPage0 ---------------------------------------
typedef struct {
WORD wBlockID;
WORD wFormatVersion;
BYTE bReserved1[184];
BYTE bNumberOfDataEntry;
BYTE bReserved2[179];
} MemStickBootBlockHeader;
typedef struct {
DWORD dwStart;
DWORD dwSize;
BYTE bType;
BYTE bReserved[3];
} MemStickBootBlockSysEntRec;
typedef struct {
MemStickBootBlockSysEntRec entry[MS_NUMBER_OF_SYSTEM_ENTRY];
} MemStickBootBlockSysEnt;
typedef struct {
BYTE bMsClass; // must be 1
BYTE bCardType; // see below
WORD wBlockSize; // n KB
WORD wBlockNumber; // number of physical block
WORD wTotalBlockNumber; // number of logical block
WORD wPageSize; // must be 0x200
BYTE bExtraSize; // 0x10
BYTE bSecuritySupport;
BYTE bAssemblyDate[8];
BYTE bFactoryArea[4];
BYTE bAssemblyMakerCode;
BYTE bAssemblyMachineCode[3];
WORD wMemoryMakerCode;
WORD wMemoryDeviceCode;
WORD wMemorySize;
BYTE bReserved1;
BYTE bReserved2;
BYTE bVCC;
BYTE bVPP;
WORD wControllerChipNumber;
WORD wControllerFunction; // New MS
BYTE bReserved3[9]; // New MS
BYTE bParallelSupport; // New MS
WORD wFormatValue; // New MS
BYTE bFormatType;
BYTE bUsage;
BYTE bDeviceType;
BYTE bReserved4[22];
BYTE bFUValue3;
BYTE bFUValue4;
BYTE bReserved5[15];
} MemStickBootBlockSysInf;
typedef struct {
MemStickBootBlockHeader header;
MemStickBootBlockSysEnt sysent;
MemStickBootBlockSysInf sysinf;
} MemStickBootBlockPage0;
//----- MemStickBootBlockCIS_IDI -------------------------------------
typedef struct {
BYTE bCistplDEVICE[6]; // 0
BYTE bCistplDEVICE0C[6]; // 6
BYTE bCistplJEDECC[4]; // 12
BYTE bCistplMANFID[6]; // 16
BYTE bCistplVER1[32]; // 22
BYTE bCistplFUNCID[4]; // 54
BYTE bCistplFUNCE0[4]; // 58
BYTE bCistplFUNCE1[5]; // 62
BYTE bCistplCONF[7]; // 67
BYTE bCistplCFTBLENT0[10]; // 74
BYTE bCistplCFTBLENT1[8]; // 84
BYTE bCistplCFTBLENT2[12]; // 92
BYTE bCistplCFTBLENT3[8]; // 104
BYTE bCistplCFTBLENT4[17]; // 112
BYTE bCistplCFTBLENT5[8]; // 129
BYTE bCistplCFTBLENT6[17]; // 137
BYTE bCistplCFTBLENT7[8]; // 154
BYTE bCistplNOLINK[3]; // 162
} MemStickBootBlockCIS;
typedef struct {
#define MS_IDI_GENERAL_CONF 0x848A
WORD wIDIgeneralConfiguration; // 0
WORD wIDInumberOfCylinder; // 1
WORD wIDIreserved0; // 2
WORD wIDInumberOfHead; // 3
WORD wIDIbytesPerTrack; // 4
WORD wIDIbytesPerSector; // 5
WORD wIDIsectorsPerTrack; // 6
WORD wIDItotalSectors[2]; // 7-8 high,low
WORD wIDIreserved1[11]; // 9-19
WORD wIDIbufferType; // 20
WORD wIDIbufferSize; // 21
WORD wIDIlongCmdECC; // 22
WORD wIDIfirmVersion[4]; // 23-26
WORD wIDImodelName[20]; // 27-46
WORD wIDIreserved2; // 47
WORD wIDIlongWordSupported; // 48
WORD wIDIdmaSupported; // 49
WORD wIDIreserved3; // 50
WORD wIDIpioTiming; // 51
WORD wIDIdmaTiming; // 52
WORD wIDItransferParameter; // 53
WORD wIDIformattedCylinder; // 54
WORD wIDIformattedHead; // 55
WORD wIDIformattedSectorsPerTrack; // 56
WORD wIDIformattedTotalSectors[2]; // 57-58
WORD wIDImultiSector; // 59
WORD wIDIlbaSectors[2]; // 60-61
WORD wIDIsingleWordDMA; // 62
WORD wIDImultiWordDMA; // 63
WORD wIDIreserved4[192]; // 64-255
} MemStickBootBlockIDI;
typedef struct {
union {
MemStickBootBlockCIS cis;
BYTE dmy[256];
} cis;
union {
MemStickBootBlockIDI idi;
BYTE dmy[256];
} idi;
} MemStickBootBlockCIS_IDI;
//----- MS_LibControl ------------------------------------------------
typedef struct {
BYTE reserved;
BYTE intr;
BYTE status0;
BYTE status1;
BYTE ovrflg;
BYTE mngflg;
WORD logadr;
} MS_LibTypeExtdat;
typedef struct {
DWORD flags;
DWORD BytesPerSector;
DWORD NumberOfCylinder;
DWORD SectorsPerCylinder;
WORD cardType; // R/W, RO, Hybrid
WORD blockSize;
WORD PagesPerBlock;
WORD NumberOfPhyBlock;
WORD NumberOfLogBlock;
WORD NumberOfSegment;
WORD *Phy2LogMap; // phy2log table
WORD *Log2PhyMap; // log2phy table
WORD wrtblk;
BYTE pagemap[(MS_MAX_PAGES_PER_BLOCK + (MS_LIB_BITS_PER_BYTE-1)) /
MS_LIB_BITS_PER_BYTE];
BYTE *blkpag;
MS_LibTypeExtdat *blkext;
BYTE copybuf[512];
} MS_LibControl;
#endif
|