| 286 | } |
| 287 | |
| 288 | Result SPIReadSaveData(CardType type, u32 offset, void* data, u32 size) |
| 289 | { |
| 290 | u8 cmd[4] = {SPI_CMD_READ}; |
| 291 | u32 cmdSize = 4; |
| 292 | if (size == 0) |
| 293 | return 0; |
| 294 | if (type == NO_CHIP) |
| 295 | return 0xC8E13404; |
| 296 | |
| 297 | Result res = SPIWaitWriteEnd(type); |
| 298 | if (res) |
| 299 | return res; |
| 300 | |
| 301 | size = (size <= SPIGetCapacity(type) - offset) ? size : SPIGetCapacity(type) - offset; |
| 302 | u32 pos = offset; |
| 303 | switch (type) { |
| 304 | case EEPROM_512B: |
| 305 | return _SPIReadSaveData_512B_impl(offset, data, size); |
| 306 | break; |
| 307 | case EEPROM_8KB: |
| 308 | case EEPROM_64KB: |
| 309 | cmdSize = 3; |
| 310 | cmd[1] = (u8)(pos >> 8); |
| 311 | cmd[2] = (u8)pos; |
| 312 | break; |
| 313 | case EEPROM_128KB: |
| 314 | cmdSize = 4; |
| 315 | cmd[1] = (u8)(pos >> 16); |
| 316 | cmd[2] = (u8)(pos >> 8); |
| 317 | cmd[3] = (u8)pos; |
| 318 | break; |
| 319 | case FLASH_256KB_1: |
| 320 | case FLASH_256KB_2: |
| 321 | case FLASH_512KB_1: |
| 322 | case FLASH_512KB_2: |
| 323 | case FLASH_1MB: |
| 324 | case FLASH_8MB: |
| 325 | case FLASH_512KB_INFRARED: |
| 326 | case FLASH_256KB_INFRARED: |
| 327 | cmdSize = 4; |
| 328 | cmd[1] = (u8)(pos >> 16); |
| 329 | cmd[2] = (u8)(pos >> 8); |
| 330 | cmd[3] = (u8)pos; |
| 331 | break; |
| 332 | default: |
| 333 | return 0; // never happens |
| 334 | } |
| 335 | |
| 336 | return SPIWriteRead(type, cmd, cmdSize, data, size, NULL, 0); |
| 337 | } |
| 338 | |
| 339 | Result SPIEraseSector(CardType type, u32 offset) |
| 340 | { |
no test coverage detected