diff --git a/include/spi.h b/include/spi.h index 8cfd934..6483e9b 100644 --- a/include/spi.h +++ b/include/spi.h @@ -4,8 +4,8 @@ struct spi_dev; struct spi_ops { int (* set_cs_level)(struct spi_dev *dev, int level); - int (* tx_rx)(struct spi_dev *dev, void *rx_buf, const void *tx_buf, - size_t len); + int (* tx_rx)(struct spi_dev *dev, void *rx_buf, size_t rx_len, + const void *tx_buf, size_t tx_len); }; struct spi_dev { @@ -16,5 +16,5 @@ struct spi_dev { struct spi_dev *spi_probe(void); void spi_release(struct spi_dev *dev); int spi_set_cs_level(struct spi_dev *dev, int level); -int spi_tx_rx(struct spi_dev *dev, void *rx_buf, const void *tx_buf, - size_t len); +int spi_tx_rx(struct spi_dev *dev, void *rx_buf, size_t rx_len, + const void *tx_buf, size_t tx_len); diff --git a/source/core/spi.c b/source/core/spi.c index b9e5816..a949630 100644 --- a/source/core/spi.c +++ b/source/core/spi.c @@ -11,11 +11,11 @@ int spi_set_cs_level(struct spi_dev *dev, int level) return dev->ops->set_cs_level(dev, level); } -int spi_tx_rx(struct spi_dev *dev, void *rx_buf, const void *tx_buf, - size_t len) +int spi_tx_rx(struct spi_dev *dev, void *rx_buf, size_t rx_len, + const void *tx_buf, size_t tx_len) { if (!dev) return -1; - return dev->ops->tx_rx(dev, rx_buf, tx_buf, len); + return dev->ops->tx_rx(dev, rx_buf, rx_len, tx_buf, tx_len); } diff --git a/source/drivers/spi_flash.c b/source/drivers/spi_flash.c index 2e100ab..78471c6 100644 --- a/source/drivers/spi_flash.c +++ b/source/drivers/spi_flash.c @@ -36,9 +36,7 @@ static void spi_flash_write_enable(struct flash_dev *dev) char cmd[1] = { SPI_FLASH_WRITE_ENABLE }; struct spi_dev *spi_dev = dev->priv; - spi_set_cs_level(spi_dev, 0); - spi_tx_rx(spi_dev, NULL, cmd, sizeof cmd); - spi_set_cs_level(spi_dev, 1); + spi_tx_rx(spi_dev, NULL, 0, cmd, sizeof cmd); } static void spi_flash_write_disable(struct flash_dev *dev) @@ -46,23 +44,19 @@ static void spi_flash_write_disable(struct flash_dev *dev) char cmd[1] = { SPI_FLASH_WRITE_DISABLE }; struct spi_dev *spi_dev = dev->priv; - spi_set_cs_level(spi_dev, 0); - spi_tx_rx(spi_dev, NULL, cmd, sizeof cmd); - spi_set_cs_level(spi_dev, 1); + spi_tx_rx(spi_dev, NULL, 0, cmd, sizeof cmd); } static size_t spi_flash_get_jedec_id(struct flash_dev *dev, uint8_t *jedec_id, size_t len) { - uint8_t cmd[5] = { SPI_FLASH_JEDEC_ID, 0, 0, 0, 0 }; - uint8_t buf[5]; + uint8_t cmd[1] = { SPI_FLASH_JEDEC_ID }; + uint8_t buf[6]; struct spi_dev *spi_dev = dev->priv; - spi_set_cs_level(spi_dev, 0); - spi_tx_rx(spi_dev, buf, cmd, sizeof cmd); - spi_set_cs_level(spi_dev, 1); + spi_tx_rx(spi_dev, buf, sizeof buf, cmd, sizeof cmd); - memcpy(jedec_id, buf + 1, min(4, len)); + memcpy(jedec_id, buf + 1, min(sizeof buf, len)); return len; } @@ -87,8 +81,7 @@ static size_t spi_flash_read(struct flash_dev *dev, uint32_t addr, void *data, spi_flash_addr(cmd, addr); spi_set_cs_level(spi_dev, 0); - spi_tx_rx(spi_dev, NULL, cmd, sizeof cmd); - spi_tx_rx(spi_dev, data, NULL, len); + spi_tx_rx(spi_dev, data, len, cmd, sizeof cmd); spi_set_cs_level(spi_dev, 1); return len; @@ -97,15 +90,17 @@ static size_t spi_flash_read(struct flash_dev *dev, uint32_t addr, void *data, static size_t spi_flash_write(struct flash_dev *dev, uint32_t addr, const void *data, size_t len) { - char cmd[4] = { SPI_FLASH_PAGE_PROGRAM }; + char cmd[4 + len]; struct spi_dev *spi_dev = dev->priv; spi_flash_write_enable(dev); + + cmd[0] = SPI_FLASH_PAGE_PROGRAM; spi_flash_addr(cmd, addr); + memcpy(cmd + 4, data, len); spi_set_cs_level(spi_dev, 0); - spi_tx_rx(spi_dev, NULL, cmd, sizeof cmd); - spi_tx_rx(spi_dev, NULL, data, len); + spi_tx_rx(spi_dev, NULL, 0, cmd, sizeof cmd); spi_set_cs_level(spi_dev, 1); spi_flash_write_disable(dev); @@ -124,7 +119,7 @@ static int spi_flash_erase(struct flash_dev *dev, uint32_t addr) spi_flash_addr(cmd, addr << dev->log2_block_size); spi_set_cs_level(spi_dev, 0); - spi_tx_rx(spi_dev, NULL, cmd, sizeof cmd); + spi_tx_rx(spi_dev, NULL, 0, cmd, sizeof cmd); spi_set_cs_level(spi_dev, 1); spi_flash_write_disable(dev); diff --git a/source/drivers/stm32f0_spi.c b/source/drivers/stm32f0_spi.c index cd987d4..4ee2806 100644 --- a/source/drivers/stm32f0_spi.c +++ b/source/drivers/stm32f0_spi.c @@ -10,8 +10,8 @@ #include static int stm32f0_spi_set_cs_level(struct spi_dev *dev, int level); -static int stm32f0_spi_tx_rx(struct spi_dev *dev, void *rx_buf, - const void *tx_buf, size_t len); +static int stm32f0_spi_tx_rx(struct spi_dev *dev, void *rx_buf, size_t rx_len, + const void *tx_buf, size_t tx_len); static struct spi_ops stm32f0_spi_ops = { .set_cs_level = stm32f0_spi_set_cs_level, @@ -80,20 +80,26 @@ static int stm32f0_spi_set_cs_level(struct spi_dev *dev, int level) return 0; } -static int stm32f0_spi_tx_rx(struct spi_dev *dev, void *rx_buf, - const void *tx_buf, size_t len) +static int stm32f0_spi_tx_rx(struct spi_dev *dev, void *rx_buf, size_t rx_len, + const void *tx_buf, size_t tx_len) { char *rx = rx_buf; const char *tx = tx_buf; size_t i; - for (i = 0; i < len; ++i) { + gpio_clear(GPIOA, GPIO4); + + for (i = 0; i < tx_len; ++i) { spi_send8(dev->dev_id, tx ? *tx++ : 0); + } - if (rx) { + if (rx_buf) { + for (i = 0; i < rx_len; ++i) { *rx++ = spi_read8(dev->dev_id); } } + gpio_set(GPIOA, GPIO4); + return 0; }