spi: add function to read various id codes

Signed-off-by: Sean Cross <sean@xobs.io>
This commit is contained in:
Sean Cross 2018-11-29 04:27:19 -05:00
parent cddbe4c90c
commit a9af9820be
2 changed files with 70 additions and 7 deletions

66
spi.c
View File

@ -203,13 +203,6 @@ static void spiQuadTx(struct ff_spi *spi, uint8_t out) {
}
}
void spiCommand(struct ff_spi *spi, uint8_t cmd) {
if (spi->type == ST_QPI)
spiQuadTx(spi, cmd);
else
spiSingleTx(spi, cmd);
}
static uint8_t spiDualRx(struct ff_spi *spi) {
int bit;
uint8_t in = 0;
@ -276,6 +269,20 @@ uint8_t spiRx(struct ff_spi *spi) {
}
}
void spiCommand(struct ff_spi *spi, uint8_t cmd) {
if (spi->type == ST_QPI)
spiQuadTx(spi, cmd);
else
spiSingleTx(spi, cmd);
}
uint8_t spiCommandRx(struct ff_spi *spi) {
if (spi->type == ST_QPI)
return spiQuadRx(spi);
else
return spiSingleRx(spi);
}
uint8_t spiReadSr(struct ff_spi *spi, int sr) {
uint8_t val = 0xff;
@ -350,6 +357,51 @@ void spiWriteSr(struct ff_spi *spi, int sr, uint8_t val) {
}
}
struct spi_id spiId(struct ff_spi *spi) {
struct spi_id id;
memset(&id, 0xff, sizeof(id));
spiBegin(spi);
spiCommand(spi, 0x90); // Read manufacturer ID
spiCommand(spi, 0x00); // Dummy byte 1
spiCommand(spi, 0x00); // Dummy byte 2
spiCommand(spi, 0x00); // Dummy byte 3
id.manufacturer_id = spiCommandRx(spi);
id.device_id = spiCommandRx(spi);
spiEnd(spi);
spiBegin(spi);
spiCommand(spi, 0x9f); // Read device id
id._manufacturer_id = spiCommandRx(spi);
id.memory_type = spiCommandRx(spi);
id.memory_size = spiCommandRx(spi);
spiEnd(spi);
spiBegin(spi);
spiCommand(spi, 0xab); // Read electronic signature
spiCommand(spi, 0x00); // Dummy byte 1
spiCommand(spi, 0x00); // Dummy byte 2
spiCommand(spi, 0x00); // Dummy byte 3
id.signature = spiCommandRx(spi);
spiEnd(spi);
spiBegin(spi);
spiCommand(spi, 0x4b); // Read unique ID
spiCommand(spi, 0x00); // Dummy byte 1
spiCommand(spi, 0x00); // Dummy byte 2
spiCommand(spi, 0x00); // Dummy byte 3
spiCommand(spi, 0x00); // Dummy byte 4
id.serial[0] = spiCommandRx(spi);
id.serial[1] = spiCommandRx(spi);
id.serial[2] = spiCommandRx(spi);
id.serial[3] = spiCommandRx(spi);
spiEnd(spi);
return id;
}
uint32_t spiJedecId(struct ff_spi *spi);
int spiSetType(struct ff_spi *spi, enum spi_type type) {
if (spi->type == type)

11
spi.h
View File

@ -34,6 +34,16 @@ enum spi_pin {
SP_D3,
};
struct spi_id {
uint8_t manufacturer_id; // Result from 0x90
uint8_t device_id; // Result from 0x90
uint8_t _manufacturer_id; // Result from 0x9f
uint8_t memory_type; // Result from 0x9f
uint8_t memory_size; // Result from 0x9f
uint8_t signature; // Result from 0xab
uint8_t serial[4]; // Result from 0x4b
};
struct ff_spi;
void spiPause(struct ff_spi *spi);
@ -53,6 +63,7 @@ uint8_t spiReadSr(struct ff_spi *spi, int sr);
void spiWriteSr(struct ff_spi *spi, int sr, uint8_t val);
int spiSetType(struct ff_spi *spi, enum spi_type type);
int spiRead(struct ff_spi *spi, uint32_t addr, uint8_t *data, unsigned int count);
struct spi_id spiId(struct ff_spi *spi);
//int spi_wait_for_not_busy(struct ff_spi *spi);
int spiWrite(struct ff_spi *spi, uint32_t addr, const uint8_t *data, unsigned int count);
uint8_t spiReset(struct ff_spi *spi);