| 116 | #define SEC_BA(x) ((u8)(((x) >> 12) & 0x7f)) |
| 117 | |
| 118 | static s32 ReadArrayUnlock(s32 chan, u32 data, void* rbuf, s32 rlen, s32 mode) |
| 119 | { |
| 120 | CARDControl* card; |
| 121 | BOOL err; |
| 122 | u8 cmd[5]; |
| 123 | |
| 124 | card = &__CARDBlock[chan]; |
| 125 | if (!EXISelect(chan, 0, 4)) |
| 126 | { |
| 127 | return CARD_RESULT_NOCARD; |
| 128 | } |
| 129 | |
| 130 | data &= 0xfffff000; |
| 131 | memset(cmd, 0, 5); |
| 132 | cmd[0] = 0x52; |
| 133 | if (mode == 0) |
| 134 | { |
| 135 | cmd[1] = SEC_AD1(data); |
| 136 | cmd[2] = SEC_AD2(data); |
| 137 | cmd[3] = SEC_AD3(data); |
| 138 | cmd[4] = SEC_BA(data); |
| 139 | } |
| 140 | else |
| 141 | { |
| 142 | cmd[1] = (u8)((data & 0xff000000) >> 24); |
| 143 | cmd[2] = (u8)((data & 0x00ff0000) >> 16); |
| 144 | } |
| 145 | |
| 146 | err = FALSE; |
| 147 | err |= !EXIImmEx(chan, cmd, 5, 1); |
| 148 | err |= !EXIImmEx(chan, (u8*)card->workArea + (u32)sizeof(CARDID), card->latency, 1); |
| 149 | err |= !EXIImmEx(chan, rbuf, rlen, 0); |
| 150 | err |= !EXIDeselect(chan); |
| 151 | |
| 152 | return err ? CARD_RESULT_NOCARD : CARD_RESULT_READY; |
| 153 | } |
| 154 | |
| 155 | // Calculate Dummy Read Length, 4-32Bytes |
| 156 | static s32 DummyLen(void) |
no test coverage detected