| 1495 | } |
| 1496 | |
| 1497 | uint8_t modSPIRead(uint32_t offset, uint32_t size, uint8_t *dst) |
| 1498 | { |
| 1499 | uint8_t temp[512] __attribute__ ((aligned (4))); |
| 1500 | uint32_t toAlign; |
| 1501 | |
| 1502 | if (offset & 3) { // long align offset |
| 1503 | if (SPI_FLASH_RESULT_OK != spi_flash_read(offset & ~3, (uint32_t *)temp, 4)) |
| 1504 | return 0; |
| 1505 | |
| 1506 | toAlign = 4 - (offset & 3); |
| 1507 | c_memcpy(dst, temp + 4 - toAlign, (size < toAlign) ? size : toAlign); |
| 1508 | |
| 1509 | if (size <= toAlign) |
| 1510 | return 1; |
| 1511 | |
| 1512 | dst += toAlign; |
| 1513 | offset += toAlign; |
| 1514 | size -= toAlign; |
| 1515 | } |
| 1516 | |
| 1517 | toAlign = size & ~3; |
| 1518 | if (toAlign) { |
| 1519 | size -= toAlign; |
| 1520 | if (((uintptr_t)dst) & ~3) { // dst is not long aligned, copy through stack |
| 1521 | while (toAlign) { |
| 1522 | uint32_t use = (toAlign > sizeof(temp)) ? sizeof(temp) : toAlign; |
| 1523 | |
| 1524 | if (SPI_FLASH_RESULT_OK != spi_flash_read(offset, (uint32_t *)temp, use)) |
| 1525 | return 0; |
| 1526 | c_memmove(dst, temp, use); |
| 1527 | |
| 1528 | toAlign -= use; |
| 1529 | dst += use; |
| 1530 | offset += use; |
| 1531 | } |
| 1532 | } |
| 1533 | else { |
| 1534 | if (SPI_FLASH_RESULT_OK != spi_flash_read(offset, (uint32_t *)dst, toAlign)) |
| 1535 | return 0; |
| 1536 | dst += toAlign; |
| 1537 | offset += toAlign; |
| 1538 | } |
| 1539 | } |
| 1540 | |
| 1541 | if (size) { // long align tail |
| 1542 | if (SPI_FLASH_RESULT_OK != spi_flash_read(offset, (uint32_t *)temp, 4)) |
| 1543 | return 0; |
| 1544 | c_memcpy(dst, temp, size); |
| 1545 | } |
| 1546 | |
| 1547 | return 1; |
| 1548 | } |
| 1549 | |
| 1550 | uint8_t modSPIWrite(uint32_t offset, uint32_t size, const uint8_t *src) |
| 1551 | { |
no outgoing calls
no test coverage detected