summaryrefslogtreecommitdiffstats
path: root/drivers/staging/keucr/ms.h
blob: 80b168e9f233f39bbd6b1567d38490f79727c6b5 (plain) (blame)
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
382
383
#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