12 #include "semaphore.h"
14 //#include "card_fat.h"
17 //#define _CARDIO_DEBUG
23 #define SECTOR_ADDRESSING 0
24 #define BYTE_ADDRESSING 1
28 #define MMC_ERROR_PARAM 0x0040
29 #define MMC_ERROR_ADDRESS 0x0020
30 #define MMC_ERROR_ERASE_SEQ 0x0010
31 #define MMC_ERROR_CRC 0x0008
32 #define MMC_ERROR_ILL 0x0004
33 #define MMC_ERROR_ERASE_RES 0x0002
34 #define MMC_ERROR_IDLE 0x0001
36 #define CARDIO_OP_INITFAILED 0x8000
37 #define CARDIO_OP_TIMEDOUT 0x4000
38 #define CARDIO_OP_IOERR_IDLE 0x2000
39 #define CARDIO_OP_IOERR_PARAM 0x1000
40 #define CARDIO_OP_IOERR_WRITE 0x0200
41 #define CARDIO_OP_IOERR_ADDR 0x0100
42 #define CARDIO_OP_IOERR_CRC 0x0002
43 #define CARDIO_OP_IOERR_ILL 0x0001
44 #define CARDIO_OP_IOERR_FATAL (CARDIO_OP_IOERR_PARAM|CARDIO_OP_IOERR_WRITE|CARDIO_OP_IOERR_ADDR|CARDIO_OP_IOERR_CRC|CARDIO_OP_IOERR_ILL)
46 #define _SHIFTL(v, s, w) \
47 ((u32) (((u32)(v) & ((0x01 << (w)) - 1)) << (s)))
48 #define _SHIFTR(v, s, w) \
49 ((u32)(((u32)(v) >> (s)) & ((0x01 << (w)) - 1)))
51 typedef s32 (*cardiocallback
)(s32 drv_no
);
53 u8 g_CID
[MAX_DRIVE
][16];
54 u8 g_CSD
[MAX_DRIVE
][16];
55 u8 g_CardStatus
[MAX_DRIVE
][64];
57 u8 g_mCode
[MAX_MI_NUM
] = { 0x03 };
59 u16 g_dCode
[MAX_MI_NUM
][MAX_DI_NUM
] =
72 static u32 _ioCardFreq
;
73 static u32 _ioRetryCnt
;
74 static cardiocallback _ioRetryCB
= NULL
;
76 static lwpq_t _ioEXILock
[MAX_DRIVE
];
78 static u32 _ioPageSize
[MAX_DRIVE
];
79 static u32 _ioFlag
[MAX_DRIVE
];
80 static u32 _ioError
[MAX_DRIVE
];
81 static bool _ioCardInserted
[MAX_DRIVE
];
83 static u8 _ioResponse
[MAX_DRIVE
][128];
84 static u8 _ioCrc7Table
[256];
85 static u16 _ioCrc16Table
[256];
88 static u32 _initType
[MAX_DRIVE
];
89 static u32 _ioAddressingType
[MAX_DRIVE
];
91 extern unsigned long gettick();
93 static __inline__ u32
__check_response(s32 drv_no
,u8 res
)
95 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
98 if(_ioFlag
[drv_no
]==INITIALIZING
&& res
&MMC_ERROR_IDLE
) {
99 _ioError
[drv_no
] |= CARDIO_OP_IOERR_IDLE
;
100 return CARDIO_ERROR_READY
;
102 if(res
&MMC_ERROR_PARAM
) _ioError
[drv_no
] |= CARDIO_OP_IOERR_PARAM
;
103 if(res
&MMC_ERROR_ADDRESS
) _ioError
[drv_no
] |= CARDIO_OP_IOERR_ADDR
;
104 if(res
&MMC_ERROR_CRC
) _ioError
[drv_no
] |= CARDIO_OP_IOERR_CRC
;
105 if(res
&MMC_ERROR_ILL
) _ioError
[drv_no
] |= CARDIO_OP_IOERR_ILL
;
107 return ((_ioError
[drv_no
]&CARDIO_OP_IOERR_FATAL
)?CARDIO_ERROR_INTERNAL
:CARDIO_ERROR_READY
);
110 static void __init_crc7()
121 if((crc7
^c
)&0x80) crc7
^= 0x09;
125 _ioCrc7Table
[i
] = crc7
;
129 static u8
__make_crc7(void *buffer
,u32 len
)
138 crc7
= _ioCrc7Table
[(u8
)((crc7
<<1)^ptr
[i
])];
140 return ((crc7
<<1)|1);
144 static u8 __make_crc7(void *buffer,u32 len)
148 u8 *ptr = (u8*)buffer;
157 val = *ptr^((res>>bcnt)&0xff);
160 if(!(res&0x0008)) res |= 0x0008;
163 } else if(res&0x0008) res |= 0x0008;
172 return (res<<1)&0xff;
175 static void __init_crc16()
184 if((crc16
^c
)&0x8000) crc16
= (crc16
<<1)^0x1021;
190 _ioCrc16Table
[i
] = crc16
;
194 static u16
__make_crc16(void *buffer
,u32 len
)
203 crc16
= (crc16
<<8)^_ioCrc16Table
[((crc16
>>8)^(u16
)(ptr
[i
]))];
209 static u16 __make_crc16(void *buffer,u32 len)
213 u8 *ptr = (u8*)buffer;
222 tmp = val^((res>>(bcnt+8))&0xff);
224 res = (res<<1)|0x0001;
225 if(!(res&0x0020)) res |= 0x0020;
227 if(!(res&0x1000)) res |= 0x1000;
230 res = (res<<1)&~0x0001;
231 if(res&0x0020) res |= 0x0020;
233 if(res&0x1000) res |= 0x1000;
247 static u32
__card_checktimeout(s32 drv_no
,u32 startT
,u32 timeout
)
254 diff
= (endT
+(-1-startT
))+1;
256 diff
= (endT
-startT
);
258 msec
= (diff
/TB_TIMER_CLOCK
);
259 if(msec
<=timeout
) return 0;
261 _ioError
[drv_no
] |= CARDIO_OP_TIMEDOUT
;
265 static s32
__exi_unlock(s32 chn
,s32 dev
)
267 LWP_ThreadBroadcast(_ioEXILock
[chn
]);
271 static void __exi_wait(s32 drv_no
)
276 if((ret
=EXI_Lock(drv_no
,EXI_DEVICE_0
,__exi_unlock
))==1) break;
277 LWP_ThreadSleep(_ioEXILock
[drv_no
]);
281 static s32
__card_exthandler(s32 chn
,s32 dev
)
283 _ioCardInserted
[chn
] = FALSE
;
284 sdgecko_doUnmount(chn
);
285 sdgecko_ejectedCB(chn
);
290 static s32
__card_writecmd0(s32 drv_no
)
295 u8 cmd
[5] = {0,0,0,0,0};
297 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
301 crc
= __make_crc7(cmd
,5);
305 for(cnt
=0;cnt
<5;cnt
++) cmd
[cnt
] ^= -1;
308 for(cnt
=0;cnt
<128;cnt
++) dummy
[cnt
] = _ioClrFlag
;
312 if(EXI_SelectSD(drv_no
,EXI_DEVICE_0
,_ioCardFreq
)==0) {
314 return CARDIO_ERROR_NOCARD
;
320 if(EXI_ImmEx(drv_no
,dummy
,128,EXI_WRITE
)==0) {
321 EXI_Deselect(drv_no
);
323 return CARDIO_ERROR_IOERROR
;
327 EXI_Deselect(drv_no
);
329 if(EXI_Select(drv_no
,EXI_DEVICE_0
,_ioCardFreq
)==0) {
331 return CARDIO_ERROR_NOCARD
;
335 if(_ioWPFlag
) crc
^= -1;
337 printf("sd command0: %02x %02x %02x %02x %02x %02x\n",cmd
[0],cmd
[1],cmd
[2],cmd
[3],cmd
[4],crc
);
339 if(EXI_ImmEx(drv_no
,cmd
,5,EXI_WRITE
)==0) {
340 EXI_Deselect(drv_no
);
342 return CARDIO_ERROR_IOERROR
;
345 if(EXI_ImmEx(drv_no
,&crc
,1,EXI_WRITE
)==0) {
346 EXI_Deselect(drv_no
);
348 return CARDIO_ERROR_IOERROR
;
351 EXI_Deselect(drv_no
);
353 return CARDIO_ERROR_READY
;
356 static s32
__card_writecmd(s32 drv_no
,void *buf
,s32 len
)
362 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
366 crc
= __make_crc7(buf
,len
);
369 for(cnt
=0;cnt
<len
;cnt
++) ptr
[cnt
] ^= -1;
374 if(EXI_Select(drv_no
,EXI_DEVICE_0
,_ioCardFreq
)==0) {
376 return CARDIO_ERROR_NOCARD
;
379 for(cnt
=0;cnt
<32;cnt
++) dummy
[cnt
] = _ioClrFlag
;
381 if(EXI_ImmEx(drv_no
,dummy
,10,EXI_WRITE
)==0) {
382 EXI_Deselect(drv_no
);
384 return CARDIO_ERROR_IOERROR
;
388 if(_ioWPFlag
) crc
^= -1;
390 printf("sd command: %02x %02x %02x %02x %02x %02x\n",((u8
*)buf
)[0],((u8
*)buf
)[1],((u8
*)buf
)[2],((u8
*)buf
)[3],((u8
*)buf
)[4],crc
);
392 if(EXI_ImmEx(drv_no
,buf
,len
,EXI_WRITE
)==0) {
393 EXI_Deselect(drv_no
);
395 return CARDIO_ERROR_IOERROR
;
397 if(EXI_ImmEx(drv_no
,&crc
,1,EXI_WRITE
)==0) {
398 EXI_Deselect(drv_no
);
400 return CARDIO_ERROR_IOERROR
;
403 EXI_Deselect(drv_no
);
405 return CARDIO_ERROR_READY
;
408 static s32
__card_readresponse(s32 drv_no
,void *buf
,s32 len
)
413 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
415 ret
= CARDIO_ERROR_READY
;
421 if(EXI_Select(drv_no
,EXI_DEVICE_0
,_ioCardFreq
)==0) {
423 return CARDIO_ERROR_NOCARD
;
426 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
427 EXI_Deselect(drv_no
);
429 return CARDIO_ERROR_IOERROR
;
432 printf("sd response: %02x\n",((u8
*)buf
)[0]);
438 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
439 EXI_Deselect(drv_no
);
441 return CARDIO_ERROR_IOERROR
;
444 printf("sd response: %02x\n",((u8
*)buf
)[0]);
446 if(!(*ptr
&0x80)) break;
447 if(__card_checktimeout(drv_no
,startT
,500)!=0) {
449 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
450 EXI_Deselect(drv_no
);
452 return CARDIO_ERROR_IOERROR
;
455 printf("sd response: %02x\n",((u8
*)buf
)[0]);
457 if(*ptr
&0x80) ret
= CARDIO_ERROR_IOTIMEOUT
;
461 if(len
>1 && ret
==CARDIO_ERROR_READY
) {
462 *(++ptr
) = _ioClrFlag
;
463 if(EXI_ImmEx(drv_no
,ptr
,len
-1,EXI_READWRITE
)==0) ret
= CARDIO_ERROR_IOERROR
;
466 EXI_Deselect(drv_no
);
471 static s32
__card_stopreadresponse(s32 drv_no
,void *buf
,s32 len
)
476 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
482 if(EXI_Select(drv_no
,EXI_DEVICE_0
,_ioCardFreq
)==0) {
484 return CARDIO_ERROR_NOCARD
;
487 ret
= CARDIO_ERROR_READY
;
489 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
490 EXI_Deselect(drv_no
);
492 return CARDIO_ERROR_IOERROR
;
495 kprintf("sd response(%d): %02x\n",__LINE__
,((u8
*)buf
)[0]);
499 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
500 EXI_Deselect(drv_no
);
502 return CARDIO_ERROR_IOERROR
;
505 kprintf("sd response1: %02x\n",((u8
*)buf
)[0]);
511 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
512 EXI_Deselect(drv_no
);
514 return CARDIO_ERROR_IOERROR
;
517 kprintf("sd response2: %02x\n",((u8
*)buf
)[0]);
519 if(!(*ptr
&0x80)) break;
520 if(__card_checktimeout(drv_no
,startT
,1500)!=0) {
522 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
523 EXI_Deselect(drv_no
);
525 return CARDIO_ERROR_IOERROR
;
528 kprintf("sd response3: %02x\n",((u8
*)buf
)[0]);
530 if(*ptr
&0x80) ret
= CARDIO_ERROR_IOTIMEOUT
;
538 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
539 EXI_Deselect(drv_no
);
541 return CARDIO_ERROR_IOERROR
;
544 kprintf("sd response4: %02x\n",((u8
*)buf
)[0]);
546 if(*ptr
==0xff) break;
547 if(__card_checktimeout(drv_no
,startT
,1500)!=0) {
549 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
550 EXI_Deselect(drv_no
);
552 return CARDIO_ERROR_IOERROR
;
555 kprintf("sd response5: %02x\n",((u8
*)buf
)[0]);
557 if(*ptr
!=0xff) ret
= CARDIO_ERROR_IOTIMEOUT
;
563 if(len
>1 && ret
==CARDIO_ERROR_READY
) {
564 *(++ptr
) = _ioClrFlag
;
565 if(EXI_ImmEx(drv_no
,ptr
,len
-1,EXI_READWRITE
)==0) ret
= CARDIO_ERROR_IOERROR
;
568 EXI_Deselect(drv_no
);
573 static s32
__card_datares(s32 drv_no
,void *buf
)
578 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
584 if(EXI_Select(drv_no
,EXI_DEVICE_0
,_ioCardFreq
)==0) {
586 return CARDIO_ERROR_NOCARD
;
589 ret
= CARDIO_ERROR_READY
;
591 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
592 EXI_Deselect(drv_no
);
594 return CARDIO_ERROR_IOERROR
;
597 printf("sd response: %02x\n",((u8
*)buf
)[0]);
602 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
603 EXI_Deselect(drv_no
);
605 return CARDIO_ERROR_IOERROR
;
608 printf("sd response: %02x\n",((u8
*)buf
)[0]);
610 if(!(*ptr
&0x10)) break;
611 if(__card_checktimeout(drv_no
,startT
,1500)!=0) {
613 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
614 EXI_Deselect(drv_no
);
616 return CARDIO_ERROR_IOERROR
;
619 printf("sd response: %02x\n",((u8
*)buf
)[0]);
621 if(*ptr
&0x10) ret
= CARDIO_ERROR_IOTIMEOUT
;
626 *(++ptr
) = _ioClrFlag
;
627 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
628 EXI_Deselect(drv_no
);
630 return CARDIO_ERROR_IOERROR
;
636 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
637 EXI_Deselect(drv_no
);
639 return CARDIO_ERROR_IOERROR
;
642 printf("sd response: %02x\n",((u8
*)buf
)[0]);
645 if(__card_checktimeout(drv_no
,startT
,1500)!=0) {
647 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
648 EXI_Deselect(drv_no
);
650 return CARDIO_ERROR_IOERROR
;
653 printf("sd response: %02x\n",((u8
*)buf
)[0]);
655 if(!*ptr
) ret
= CARDIO_ERROR_IOTIMEOUT
;
659 EXI_Deselect(drv_no
);
665 static s32
__card_stopresponse(s32 drv_no
)
669 if((ret
=__card_stopreadresponse(drv_no
,_ioResponse
[drv_no
],1))!=0) return ret
;
670 ret
= __check_response(drv_no
,_ioResponse
[drv_no
][0]);
675 static s32
__card_dataresponse(s32 drv_no
)
680 if((ret
=__card_datares(drv_no
,_ioResponse
[drv_no
]))!=0) return ret
;
681 res
= _SHIFTR(_ioResponse
[drv_no
][0],1,3);
682 if(res
==0x0005) ret
= CARDIO_OP_IOERR_CRC
;
683 else if(res
==0x0006) ret
= CARDIO_OP_IOERR_WRITE
;
688 static s32
__card_dataread(s32 drv_no
,void *buf
,u32 len
)
696 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
700 if(EXI_Select(drv_no
,EXI_DEVICE_0
,_ioCardFreq
)==0) {
702 return CARDIO_ERROR_NOCARD
;
705 ret
= CARDIO_ERROR_READY
;
707 for(cnt
=0;cnt
<len
;cnt
++) ptr
[cnt
] = _ioClrFlag
;
708 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
709 EXI_Deselect(drv_no
);
711 return CARDIO_ERROR_IOERROR
;
714 printf("sd response: %02x\n",((u8
*)buf
)[0]);
720 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
721 EXI_Deselect(drv_no
);
723 return CARDIO_ERROR_IOERROR
;
726 printf("sd response: %02x\n",((u8
*)buf
)[0]);
728 if(*ptr
==0xfe) break;
729 if(__card_checktimeout(drv_no
,startT
,1500)!=0) {
731 if(EXI_ImmEx(drv_no
,ptr
,1,EXI_READWRITE
)==0) {
732 EXI_Deselect(drv_no
);
734 return CARDIO_ERROR_IOERROR
;
737 printf("sd response: %02x\n",((u8
*)buf
)[0]);
739 if(*ptr
!=0xfe) ret
= CARDIO_ERROR_IOTIMEOUT
;
745 if(EXI_ImmEx(drv_no
,ptr
,len
,EXI_READWRITE
)==0) {
746 EXI_Deselect(drv_no
);
748 return CARDIO_ERROR_IOERROR
;
754 res
[0] = res
[1] = _ioClrFlag
;
755 if(EXI_ImmEx(drv_no
,res
,2,EXI_READWRITE
)==0) {
756 EXI_Deselect(drv_no
);
758 return CARDIO_ERROR_IOERROR
;
761 printf("sd response: %04x\n",*(u16
*)res
);
763 crc_org
= ((res
[0]<<8)&0xff00)|(res
[1]&0xff);
765 EXI_Deselect(drv_no
);
768 crc
= __make_crc16(buf
,len
);
769 if(crc
!=crc_org
) ret
= CARDIO_OP_IOERR_CRC
;
771 printf("crc ok: %04x : %04x\n",crc_org
,crc
);
776 static s32
__card_multidatawrite(s32 drv_no
,void *buf
,u32 len
)
783 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
785 for(cnt
=0;cnt
<32;cnt
++) dummy
[cnt
] = _ioClrFlag
;
786 crc
= __make_crc16(buf
,len
);
790 if(EXI_Select(drv_no
,EXI_DEVICE_0
,_ioCardFreq
)==0) {
792 return CARDIO_ERROR_NOCARD
;
796 if(EXI_ImmEx(drv_no
,dummy
,1,EXI_WRITE
)==0) {
797 EXI_Deselect(drv_no
);
799 return CARDIO_ERROR_IOERROR
;
802 if(EXI_ImmEx(drv_no
,buf
,len
,EXI_WRITE
)==0) {
803 EXI_Deselect(drv_no
);
805 return CARDIO_ERROR_IOERROR
;
811 ret
= CARDIO_ERROR_READY
;
812 if(EXI_ImmEx(drv_no
,&crc
,2,EXI_WRITE
)==0) ret
= CARDIO_ERROR_IOERROR
;
814 EXI_Deselect(drv_no
);
820 static s32
__card_multiwritestop(s32 drv_no
)
825 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
827 for(cnt
=0;cnt
<32;cnt
++) dummy
[cnt
] = _ioClrFlag
;
831 if(EXI_Select(drv_no
,EXI_DEVICE_0
,_ioCardFreq
)==0) {
833 return CARDIO_ERROR_NOCARD
;
836 ret
= CARDIO_ERROR_READY
;
838 if(_ioWPFlag
) dummy
[0] = 0x02; //!0xfd
839 if(EXI_ImmEx(drv_no
,dummy
,1,EXI_WRITE
)==0) {
840 EXI_Deselect(drv_no
);
842 return CARDIO_ERROR_IOERROR
;
845 dummy
[0] = _ioClrFlag
;
846 if(EXI_ImmEx(drv_no
,dummy
,1,EXI_READWRITE
)==0) {
847 EXI_Deselect(drv_no
);
849 return CARDIO_ERROR_IOERROR
;
852 dummy
[0] = _ioClrFlag
;
853 if(EXI_ImmEx(drv_no
,dummy
,1,EXI_READWRITE
)==0) {
854 EXI_Deselect(drv_no
);
856 return CARDIO_ERROR_IOERROR
;
859 dummy
[0] = _ioClrFlag
;
860 if(EXI_ImmEx(drv_no
,dummy
,1,EXI_READWRITE
)==0) {
861 EXI_Deselect(drv_no
);
863 return CARDIO_ERROR_IOERROR
;
866 dummy
[0] = _ioClrFlag
;
867 if(EXI_ImmEx(drv_no
,dummy
,1,EXI_READWRITE
)==0) {
868 EXI_Deselect(drv_no
);
870 return CARDIO_ERROR_IOERROR
;
874 ret
= CARDIO_ERROR_READY
;
876 dummy
[0] = _ioClrFlag
;
877 if(EXI_ImmEx(drv_no
,dummy
,1,EXI_READWRITE
)==0) {
878 EXI_Deselect(drv_no
);
880 return CARDIO_ERROR_IOERROR
;
883 if(__card_checktimeout(drv_no
,startT
,1500)!=0) {
884 dummy
[0] = _ioClrFlag
;
885 if(EXI_ImmEx(drv_no
,dummy
,1,EXI_READWRITE
)==0) {
886 EXI_Deselect(drv_no
);
888 return CARDIO_ERROR_IOERROR
;
890 if(!dummy
[0]) ret
= CARDIO_ERROR_IOTIMEOUT
;
895 EXI_Deselect(drv_no
);
900 static s32
__card_response1(s32 drv_no
)
904 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
906 if((ret
=__card_readresponse(drv_no
,_ioResponse
[drv_no
],1))!=0) return ret
;
907 return __check_response(drv_no
,_ioResponse
[drv_no
][0]);
910 static s32
__card_response2(s32 drv_no
)
914 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
916 if((ret
=__card_readresponse(drv_no
,_ioResponse
[drv_no
],2))!=0) return ret
;
917 if(!(_ioResponse
[drv_no
][0]&0x7c) && !(_ioResponse
[drv_no
][1]&0x9e)) return CARDIO_ERROR_READY
;
918 return CARDIO_ERROR_FATALERROR
;
921 static s32
__card_sendappcmd(s32 drv_no
)
924 u8 ccmd
[5] = {0,0,0,0,0};
926 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
929 if((ret
=__card_writecmd(drv_no
,ccmd
,5))!=0) {
931 printf("__card_sendappcmd(%d): sd write cmd failed.\n",ret
);
935 if((ret
=__card_readresponse(drv_no
,_ioResponse
[drv_no
],1))!=0) return ret
;
936 ret
= __check_response(drv_no
,_ioResponse
[drv_no
][0]);
941 static s32
__card_sendopcond(s32 drv_no
)
943 u8 ccmd
[5] = {0,0,0,0,0};
947 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
949 printf("__card_sendopcond(%d)\n",drv_no
);
954 if(_initType
[drv_no
]==TYPE_SDHC
) {
955 __card_sendappcmd(drv_no
);
961 if((ret
=__card_writecmd(drv_no
,ccmd
,5))!=0) {
963 printf("__card_sendopcond(%d): sd write cmd failed.\n",ret
);
967 if((ret
=__card_readresponse(drv_no
,_ioResponse
[drv_no
],1))!=0) return ret
;
968 if((ret
=__check_response(drv_no
,_ioResponse
[drv_no
][0]))!=0) return ret
;
969 if(!(_ioError
[drv_no
]&CARDIO_OP_IOERR_IDLE
)) return CARDIO_ERROR_READY
;
971 ret
= __card_checktimeout(drv_no
,startT
,1500);
974 if(_initType
[drv_no
]==TYPE_SDHC
) {
975 __card_sendappcmd(drv_no
);
981 if((ret
=__card_writecmd(drv_no
,ccmd
,5))!=0) {
983 printf("__card_sendopcond(%d): sd write cmd failed.\n",ret
);
987 if((ret
=__card_readresponse(drv_no
,_ioResponse
[drv_no
],1))!=0) return ret
;
988 if((ret
=__check_response(drv_no
,_ioResponse
[drv_no
][0]))!=0) return ret
;
989 if(_ioError
[drv_no
]&CARDIO_OP_IOERR_IDLE
) return CARDIO_ERROR_IOERROR
;
991 return CARDIO_ERROR_READY
;
994 static s32
__card_sendCMD8(s32 drv_no
)
997 u8 ccmd
[5] = {0,0,0,0,0};
999 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
1004 if((ret
=__card_writecmd(drv_no
,ccmd
,5))!=0){
1005 #ifdef _CARDIO_DEBUG
1006 printf("__card_sendCMD8(%d): sd write cmd failed.\n",ret
);
1010 if((ret
=__card_readresponse(drv_no
,_ioResponse
[drv_no
],5))!=0) return ret
;
1011 ret
= __check_response(drv_no
,_ioResponse
[drv_no
][0]);
1016 static s32
__card_sendCMD58(s32 drv_no
)
1019 u8 ccmd
[5] = {0,0,0,0,0};
1021 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
1024 if((ret
=__card_writecmd(drv_no
,ccmd
,5))!=0) {
1025 #ifdef _CARDIO_DEBUG
1026 printf("__card_sendCMD58(%d): sd write cmd failed.\n",ret
);
1030 if((ret
=__card_readresponse(drv_no
,_ioResponse
[drv_no
],5))!=0) return ret
;
1031 ret
= __check_response(drv_no
,_ioResponse
[drv_no
][0]);
1036 static s32
__card_sendcmd(s32 drv_no
,u8 cmd
,u8
*arg
)
1038 u8 ccmd
[5] = {0,0,0,0,0};
1040 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
1049 return __card_writecmd(drv_no
,ccmd
,5);
1052 static s32
__card_setblocklen(s32 drv_no
,u32 block_len
)
1057 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
1058 #ifdef _CARDIO_DEBUG
1059 printf("__card_setblocklen(%d,%d)\n",drv_no
,block_len
);
1061 if(block_len
>PAGE_SIZE512
) block_len
= PAGE_SIZE512
;
1064 cmd
[1] = (block_len
>>24)&0xff;
1065 cmd
[2] = (block_len
>>16)&0xff;
1066 cmd
[3] = (block_len
>>8)&0xff;
1067 cmd
[4] = block_len
&0xff;
1068 if((ret
=__card_writecmd(drv_no
,cmd
,5))!=0) {
1069 #ifdef _CARDIO_DEBUG
1070 printf("__card_setblocklen(%d): sd write cmd failed.\n",ret
);
1074 if((ret
=__card_readresponse(drv_no
,_ioResponse
[drv_no
],1))<0) return ret
;
1075 ret
= __check_response(drv_no
,_ioResponse
[drv_no
][0]);
1080 static s32
__card_readcsd(s32 drv_no
)
1082 u8 ccmd
[5] = {0,0,0,0,0};
1085 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
1086 #ifdef _CARDIO_DEBUG
1087 printf("__card_readcsd(%d)\n",drv_no
);
1091 if((ret
=__card_writecmd(drv_no
,ccmd
,5))!=0) {
1092 #ifdef _CARDIO_DEBUG
1093 printf("__card_readcsd(%d): sd write cmd failed.\n",ret
);
1097 if((ret
=__card_readresponse(drv_no
,_ioResponse
[drv_no
],1))!=0) return ret
;
1098 ret
= __check_response(drv_no
,_ioResponse
[drv_no
][0]);
1100 if((ret
=__card_dataread(drv_no
,g_CSD
[drv_no
],16))!=0) return ret
;
1105 static s32
__card_readcid(s32 drv_no
)
1107 u8 ccmd
[5] = {0,0,0,0,0};
1110 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
1111 #ifdef _CARDIO_DEBUG
1112 printf("__card_readcid(%d)\n",drv_no
);
1116 if((ret
=__card_writecmd(drv_no
,ccmd
,5))!=0) {
1117 #ifdef _CARDIO_DEBUG
1118 printf("__card_readcid(%d): sd write cmd failed.\n",ret
);
1122 if((ret
=__card_readresponse(drv_no
,_ioResponse
[drv_no
],1))!=0) return ret
;
1123 ret
= __check_response(drv_no
,_ioResponse
[drv_no
][0]);
1125 if((ret
=__card_dataread(drv_no
,g_CID
[drv_no
],16))!=0) return ret
;
1130 static s32
__card_sd_status(s32 drv_no
)
1134 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
1135 #ifdef _CARDIO_DEBUG
1136 printf("__card_sd_status(%d)\n",drv_no
);
1138 if(_ioPageSize
[drv_no
]!=64) {
1139 _ioPageSize
[drv_no
] = 64;
1140 if((ret
=__card_setblocklen(drv_no
,_ioPageSize
[drv_no
]))!=0) return ret
;
1142 if((ret
=__card_sendappcmd(drv_no
))!=0) return ret
;
1143 if((ret
=__card_sendcmd(drv_no
,0x0d,NULL
))!=0) return ret
;
1144 if((ret
=__card_response2(drv_no
))!=0) return ret
;
1145 ret
= __card_dataread(drv_no
,g_CardStatus
[drv_no
],64);
1150 static s32
__card_softreset(s32 drv_no
)
1154 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
1155 #ifdef _CARDIO_DEBUG
1156 printf("__card_softreset(%d)\n",drv_no
);
1159 if((ret
=__card_writecmd0(drv_no
))!=0) {
1160 #ifdef _CARDIO_DEBUG
1161 printf("__card_softreset(%d): sd write cmd0 failed.\n",ret
);
1166 if((ret
=__card_readresponse(drv_no
,_ioResponse
[drv_no
],1))!=0) return ret
;
1167 return __check_response(drv_no
,_ioResponse
[drv_no
][0]);
1170 static bool __card_check(s32 drv_no
)
1174 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return FALSE
;
1175 #ifdef _CARDIO_DEBUG
1176 printf("__card_check(%d)\n",drv_no
);
1178 while((ret
=EXI_ProbeEx(drv_no
))==0);
1179 if(ret
!=1) return FALSE
;
1181 if(!(EXI_GetState(drv_no
)&EXI_FLAG_ATTACH
)) {
1182 if(EXI_Attach(drv_no
,__card_exthandler
)==0) return FALSE
;
1183 #ifdef _CARDIO_DEBUG
1184 printf("__card_check(%d, attached)\n",drv_no
);
1186 sdgecko_insertedCB(drv_no
);
1191 static s32
__card_retrycb(s32 drv_no
)
1193 #ifdef _CARDIO_DEBUG
1194 printf("__card_retrycb(%d)\n",drv_no
);
1198 return sdgecko_initIO(drv_no
);
1201 static void __convert_sector(s32 drv_no
,u32 sector_no
,u8
*arg
)
1203 if(_ioAddressingType
[drv_no
]==BYTE_ADDRESSING
) {
1204 arg
[0] = (sector_no
>>15)&0xff;
1205 arg
[1] = (sector_no
>>7)&0xff;
1206 arg
[2] = (sector_no
<<1)&0xff;
1207 arg
[3] = (sector_no
<<9)&0xff;
1208 } else if(_ioAddressingType
[drv_no
]==SECTOR_ADDRESSING
) {
1209 arg
[0] = (sector_no
>>24)&0xff;
1210 arg
[1] = (sector_no
>>16)&0xff;
1211 arg
[2] = (sector_no
>>8)&0xff;
1212 arg
[3] = sector_no
&0xff;
1216 void sdgecko_initIODefault()
1219 #ifdef _CARDIO_DEBUG
1220 printf("card_initIODefault()\n");
1224 for(i
=0;i
<MAX_DRIVE
;++i
) {
1227 _ioCardInserted
[i
] = FALSE
;
1228 _ioFlag
[i
] = NOT_INITIALIZED
;
1229 _ioAddressingType
[i
] = BYTE_ADDRESSING
;
1230 _initType
[i
] = TYPE_SD
;
1231 LWP_InitQueue(&_ioEXILock
[i
]);
1235 s32
sdgecko_initIO(s32 drv_no
)
1237 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
1240 EXI_GetID(drv_no
,EXI_DEVICE_0
,&id
);
1241 if ( id
!= -1 ) return CARDIO_ERROR_NOCARD
;
1245 return CARDIO_ERROR_IOERROR
;
1248 _ioCardInserted
[drv_no
] = __card_check(drv_no
);
1250 if(_ioCardInserted
[drv_no
]==TRUE
) {
1252 _ioCardFreq
= EXI_SPEED16MHZ
;
1253 _initType
[drv_no
] = TYPE_SD
;
1254 _ioFlag
[drv_no
] = INITIALIZING
;
1255 _ioAddressingType
[drv_no
] = BYTE_ADDRESSING
;
1256 if(__card_softreset(drv_no
)!=0) {
1258 if(__card_softreset(drv_no
)!=0) goto exit
;
1261 if(__card_sendCMD8(drv_no
)!=0) goto exit
;
1262 #ifdef _CARDIO_DEBUG
1263 printf("Response %02X,%02X,%02X,%02X,%02X\n",_ioResponse
[drv_no
][0],_ioResponse
[drv_no
][1],_ioResponse
[drv_no
][2],_ioResponse
[drv_no
][3],_ioResponse
[drv_no
][4]);
1265 if((_ioResponse
[drv_no
][3]==1) && (_ioResponse
[drv_no
][4]==0xAA)) _initType
[drv_no
] = TYPE_SDHC
;
1267 if(__card_sendopcond(drv_no
)!=0) goto exit
;
1268 if(__card_readcsd(drv_no
)!=0) goto exit
;
1269 if(__card_readcid(drv_no
)!=0) goto exit
;
1271 if(_initType
[drv_no
]==TYPE_SDHC
) {
1272 if(__card_sendCMD58(drv_no
)!=0) goto exit
;
1273 #ifdef _CARDIO_DEBUG
1274 printf("Response %02X,%02X,%02X,%02X,%02X\n",_ioResponse
[drv_no
][0],_ioResponse
[drv_no
][1],_ioResponse
[drv_no
][2],_ioResponse
[drv_no
][3],_ioResponse
[drv_no
][4]);
1276 if(_ioResponse
[drv_no
][1]&0x40) _ioAddressingType
[drv_no
] = SECTOR_ADDRESSING
;
1279 _ioPageSize
[drv_no
] = 1<<WRITE_BL_LEN(drv_no
);
1280 if(__card_setblocklen(drv_no
,_ioPageSize
[drv_no
])!=0) goto exit
;
1282 if(__card_sd_status(drv_no
)!=0) goto exit
;
1285 _ioFlag
[drv_no
] = INITIALIZED
;
1286 return CARDIO_ERROR_READY
;
1288 _ioRetryCB
= __card_retrycb
;
1289 return sdgecko_doUnmount(drv_no
);
1291 return CARDIO_ERROR_NOCARD
;
1294 s32
sdgecko_preIO(s32 drv_no
)
1298 if(_ioFlag
[drv_no
]!=INITIALIZED
) {
1299 ret
= sdgecko_initIO(drv_no
);
1300 if(ret
!=CARDIO_ERROR_READY
) {
1301 #ifdef _CARDIO_DEBUG
1302 printf("sdgecko_preIO(%d,ret = %d)\n",drv_no
,ret
);
1307 return CARDIO_ERROR_READY
;
1310 s32
sdgecko_readCID(s32 drv_no
)
1314 if(drv_no
<EXI_CHANNEL_0
|| drv_no
>=EXI_CHANNEL_2
) return CARDIO_ERROR_NOCARD
;
1315 #ifdef _CARDIO_DEBUG
1316 printf("sdgecko_readCID(%d)\n",drv_no
);
1318 ret
= sdgecko_preIO(drv_no
);
1319 if(ret
!=0) return ret
;
1321 return __card_readcid(drv_no
);
1324 s32
sdgecko_readCSD(s32 drv_no
)
1328 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
1329 #ifdef _CARDIO_DEBUG
1330 printf("sdgecko_readCSD(%d)\n",drv_no
);
1332 ret
= sdgecko_preIO(drv_no
);
1333 if(ret
!=0) return ret
;
1335 return __card_readcsd(drv_no
);
1338 s32
sdgecko_readStatus(s32 drv_no
)
1342 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
1343 #ifdef _CARDIO_DEBUG
1344 printf("sdgecko_readCSD(%d)\n",drv_no
);
1346 ret
= sdgecko_preIO(drv_no
);
1347 if(ret
!=0) return ret
;
1349 return __card_sd_status(drv_no
);
1352 // Multiple sector read by emu_kidid
1353 s32
sdgecko_readSectors(s32 drv_no
,u32 sector_no
,u32 num_sectors
,void *buf
)
1358 char *ptr
= (char*)buf
;
1360 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
1362 ret
= sdgecko_preIO(drv_no
);
1363 if(ret
!=0) return ret
;
1365 if(num_sectors
<1) return CARDIO_ERROR_INTERNAL
;
1367 #ifdef _CARDIO_DEBUG
1368 kprintf("sdgecko_readSectors(%d,%d,%d,%d)\n",drv_no
,sector_no
,num_sectors
,_ioPageSize
[drv_no
]);
1371 // Must be 512b, otherwise fail!
1372 if(PAGE_SIZE512
!=_ioPageSize
[drv_no
]) {
1373 _ioPageSize
[drv_no
] = PAGE_SIZE512
;
1374 if((ret
=__card_setblocklen(drv_no
,PAGE_SIZE512
))!=0) return ret
;
1378 __convert_sector(drv_no
,sector_no
,arg
);
1380 if((ret
=__card_sendcmd(drv_no
,0x12,arg
))!=0) return ret
;
1381 if((ret
=__card_response1(drv_no
))!=0) return ret
;
1383 for(i
=0;i
<num_sectors
;i
++) {
1384 if((ret
=__card_dataread(drv_no
,ptr
,_ioPageSize
[drv_no
]))!=0) return ret
;
1385 ptr
+= _ioPageSize
[drv_no
];
1388 if((ret
=__card_sendcmd(drv_no
,0x0C,NULL
))!=0) return ret
;
1389 return __card_stopresponse(drv_no
);
1392 s32
sdgecko_writeSectors(s32 drv_no
,u32 sector_no
,u32 num_sectors
,const void *buf
)
1397 char *ptr
= (char*)buf
;
1399 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
1401 ret
= sdgecko_preIO(drv_no
);
1402 if(ret
!=0) return ret
;
1404 if(num_sectors
<1) return CARDIO_ERROR_INTERNAL
;
1406 #ifdef _CARDIO_DEBUG
1407 printf("sdgecko_writeSectors(%d,%d,%d,%d)\n",drv_no
,sector_no
,num_sectors
,_ioPageSize
[drv_no
]);
1410 if(PAGE_SIZE512
!=_ioPageSize
[drv_no
]) {
1411 _ioPageSize
[drv_no
] = PAGE_SIZE512
;
1412 if((ret
=__card_setblocklen(drv_no
,_ioPageSize
[drv_no
]))!=0) return ret
;
1415 // send SET_WRITE_BLK_ERASE_CNT cmd
1416 arg
[0] = (num_sectors
>>24)&0xff;
1417 arg
[1] = (num_sectors
>>16)&0xff;
1418 arg
[2] = (num_sectors
>>8)&0xff;
1419 arg
[3] = num_sectors
&0xff;
1420 if((ret
=__card_sendappcmd(drv_no
))!=0) return ret
;
1421 if((ret
=__card_sendcmd(drv_no
,0x17,arg
))!=0) return ret
;
1422 if((ret
=__card_response1(drv_no
))!=0) return ret
;
1425 __convert_sector(drv_no
,sector_no
,arg
);
1427 if((ret
=__card_sendcmd(drv_no
,0x19,arg
))!=0) return ret
;
1428 if((ret
=__card_response1(drv_no
))!=0) return ret
;
1430 for(i
=0;i
<num_sectors
;i
++) {
1431 if((ret
=__card_multidatawrite(drv_no
,ptr
,_ioPageSize
[drv_no
]))!=0) return ret
;
1432 if((ret
=__card_dataresponse(drv_no
))!=0) {
1433 if((ret
=__card_sendcmd(drv_no
,0x0C,arg
))!=0) return ret
;
1434 return __card_stopresponse(drv_no
);
1436 ptr
+= _ioPageSize
[drv_no
];
1439 if((ret
=__card_multiwritestop(drv_no
))!=0) return ret
;
1440 if((ret
=__card_sendcmd(drv_no
,0x0D,NULL
))!=0) return ret
;
1441 return __card_response2(drv_no
);
1444 s32
sdgecko_doUnmount(s32 drv_no
)
1448 if(drv_no
<0 || drv_no
>=MAX_DRIVE
) return CARDIO_ERROR_NOCARD
;
1450 if(__card_check(drv_no
)==TRUE
&& _ioFlag
[drv_no
]!=NOT_INITIALIZED
) {
1451 if((ret
=__card_sendappcmd(drv_no
))!=0) goto exit
;
1452 if((ret
=__card_sendcmd(drv_no
,0x2a,NULL
))!=0) goto exit
;
1453 ret
= __card_response1(drv_no
);
1454 #ifdef _CARDIO_DEBUG
1455 printf("sdgecko_doUnmount(%d) disconnected 50KOhm pull-up(%d)\n",drv_no
,ret
);
1458 _ioFlag
[drv_no
] = NOT_INITIALIZED
;
1461 if(_ioCardInserted
[drv_no
]==TRUE
) {
1462 _ioCardInserted
[drv_no
] = FALSE
;
1466 return _ioRetryCB(drv_no
);
1468 return CARDIO_ERROR_READY
;
1471 static void (*pfCallbackIN
[MAX_DRIVE
])(s32
) = {NULL
, NULL
};
1472 static void (*pfCallbackOUT
[MAX_DRIVE
])(s32
) = {NULL
, NULL
};
1474 void sdgecko_insertedCB(s32 drv_no
)
1476 if(pfCallbackIN
[drv_no
])
1477 pfCallbackIN
[drv_no
](drv_no
);
1480 void sdgecko_ejectedCB(s32 drv_no
)
1482 if(pfCallbackOUT
[drv_no
])
1483 pfCallbackOUT
[drv_no
](drv_no
);
1486 void sdgecko_setSpeed(u32 freq
)
1491 u32
sdgecko_getPageSize(s32 drv_no
)
1493 return _ioPageSize
[drv_no
];
1496 u32
sdgecko_setPageSize(s32 drv_no
, int size
)
1498 if(_ioPageSize
[drv_no
]!=size
)
1499 _ioPageSize
[drv_no
] = size
;
1501 return __card_setblocklen(drv_no
, _ioPageSize
[drv_no
]);
1504 u32
sdgecko_getAddressingType(s32 drv_no
)
1506 return _ioAddressingType
[drv_no
];