diff --git a/fpga/zsbl/sd.c b/fpga/zsbl/sd.c new file mode 100644 index 000000000..4ffb53d67 --- /dev/null +++ b/fpga/zsbl/sd.c @@ -0,0 +1,31 @@ +#include "sd.h" +#include "spi.h" + +uint8_t crc7(uint8_t prev, uint8_t in) { + // CRC polynomial 0x89 + uint8_t remainder = prev & in; + remainder ^= (remainder >> 4) ^ (remainder >> 7); + remainder ^= remainder << 4; + return remainder & 0x7f; +} + +uint16_t crc16(uint16_t crc, uint8_t data) { + // CRC polynomial 0x11021 + crc = (uint8_t)(crc >> 8) | (crc << 8); + crc ^= data; + crc ^= (uint8_t)(crc >> 4) & 0xf; + crc ^= crc << 12; + crc ^= (crc & 0xff) << 5; + return crc; +} + +uint8_t sd_cmd(uint8_t cmd, uint32_t arg, uint8_t crc) { + spi_send_byte +} + +void init_sd(){ + init_spi(); + + +} + diff --git a/fpga/zsbl/sd.h b/fpga/zsbl/sd.h new file mode 100644 index 000000000..b1b27db14 --- /dev/null +++ b/fpga/zsbl/sd.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +uint8_t crc7(uint8_t prev, uint8_t in); +uint16_t crc16(uint16_t crc, uint8_t data); +uint8_t sd_cmd(uint8_t cmd, uint32_t arg, uint8_t crc); +void init_sd(); + diff --git a/fpga/zsbl/spi.c b/fpga/zsbl/spi.c index 1400b8881..bf6d629b4 100644 --- a/fpga/zsbl/spi.c +++ b/fpga/zsbl/spi.c @@ -48,4 +48,3 @@ uint8_t spi_send_byte(uint8_t byte) { return result; } - diff --git a/fpga/zsbl/spi.h b/fpga/zsbl/spi.h index 2bd2003c5..6bae450ae 100644 --- a/fpga/zsbl/spi.h +++ b/fpga/zsbl/spi.h @@ -40,6 +40,7 @@ void write_reg(uintptr_t addr, uint32_t value); uint32_t read_reg(uintptr_t addr); uint8_t spi_send_byte(uint8_t byte); + void spi_init(); #endif