You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by je...@apache.org on 2018/12/12 13:22:53 UTC
[mynewt-core] branch kasjer/flashspi-bus-support created (now
f7597d4)
This is an automated email from the ASF dual-hosted git repository.
jerzy pushed a change to branch kasjer/flashspi-bus-support
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git.
at f7597d4 hw/drivers: Add bus driver support ot spiflash
This branch includes the following new commits:
new f7597d4 hw/drivers: Add bus driver support ot spiflash
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
[mynewt-core] 01/01: hw/drivers: Add bus driver support ot spiflash
Posted by je...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jerzy pushed a commit to branch kasjer/flashspi-bus-support
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git
commit f7597d4a0611579f86cc0f3d979dcbfec64647f7
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Wed Dec 5 14:39:19 2018 +0100
hw/drivers: Add bus driver support ot spiflash
---
.../flash/spiflash/include/spiflash/spiflash.h | 7 +++
hw/drivers/flash/spiflash/src/spiflash.c | 73 +++++++++++++++++++---
2 files changed, 73 insertions(+), 7 deletions(-)
diff --git a/hw/drivers/flash/spiflash/include/spiflash/spiflash.h b/hw/drivers/flash/spiflash/include/spiflash/spiflash.h
index 216b1c2..f3cf919 100644
--- a/hw/drivers/flash/spiflash/include/spiflash/spiflash.h
+++ b/hw/drivers/flash/spiflash/include/spiflash/spiflash.h
@@ -25,6 +25,9 @@
#endif
#include <hal/hal_flash_int.h>
#include <hal/hal_spi.h>
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+#include <bus/spi.h>
+#endif
#ifdef __cplusplus
extern "C" {
@@ -32,10 +35,14 @@ extern "C" {
struct spiflash_dev {
struct hal_flash hal;
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ struct bus_spi_node dev;
+#else
struct hal_spi_settings spi_settings;
int spi_num;
void *spi_cfg; /** Low-level MCU SPI config */
int ss_pin;
+#endif
uint16_t sector_size;
uint16_t page_size;
/* Array of supported flash chips */
diff --git a/hw/drivers/flash/spiflash/src/spiflash.c b/hw/drivers/flash/spiflash/src/spiflash.c
index 7fbf191..691c61e 100644
--- a/hw/drivers/flash/spiflash/src/spiflash.c
+++ b/hw/drivers/flash/spiflash/src/spiflash.c
@@ -25,6 +25,10 @@
#include <hal/hal_flash.h>
#include <hal/hal_flash_int.h>
#include <spiflash/spiflash.h>
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+#include <bus/bus.h>
+#include <bus/spi.h>
+#endif
#if MYNEWT_VAL(SPIFLASH)
@@ -581,6 +585,9 @@ static const struct hal_flash_funcs spiflash_flash_funcs = {
.hff_init = spiflash_init,
};
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+#endif
+
struct spiflash_dev spiflash_dev = {
/* struct hal_flash for compatibility */
.hal = {
@@ -593,6 +600,7 @@ struct spiflash_dev spiflash_dev = {
.hf_erased_val = 0xff,
},
+#if !MYNEWT_VAL(BUS_DRIVER_PRESENT)
/* SPI settings */
.spi_settings = {
.data_order = HAL_SPI_MSB_FIRST,
@@ -600,12 +608,12 @@ struct spiflash_dev spiflash_dev = {
.baudrate = MYNEWT_VAL(SPIFLASH_BAUDRATE),
.word_size = HAL_SPI_WORD_SIZE_8BIT,
},
-
- .sector_size = MYNEWT_VAL(SPIFLASH_SECTOR_SIZE),
- .page_size = MYNEWT_VAL(SPIFLASH_PAGE_SIZE),
.spi_num = MYNEWT_VAL(SPIFLASH_SPI_NUM),
.spi_cfg = NULL,
.ss_pin = MYNEWT_VAL(SPIFLASH_SPI_CS_PIN),
+#endif
+ .sector_size = MYNEWT_VAL(SPIFLASH_SECTOR_SIZE),
+ .page_size = MYNEWT_VAL(SPIFLASH_PAGE_SIZE),
.supported_chips = supported_chips,
.flash_chip = NULL,
@@ -628,13 +636,23 @@ static inline void spiflash_unlock(struct spiflash_dev *dev)
static inline void
spiflash_cs_activate(struct spiflash_dev *dev)
{
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ struct bus_spi_node *node = (struct bus_spi_node *)&dev->dev;
+ hal_gpio_write(node->pin_cs, 0);
+#else
hal_gpio_write(dev->ss_pin, 0);
+#endif
}
static inline void
spiflash_cs_deactivate(struct spiflash_dev *dev)
{
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ struct bus_spi_node *node = &dev->dev;
+ hal_gpio_write(node->pin_cs, 1);
+#else
hal_gpio_write(dev->ss_pin, 1);
+#endif
}
void
@@ -644,11 +662,15 @@ spiflash_power_down(struct spiflash_dev *dev)
spiflash_lock(dev);
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ bus_node_simple_write(&dev->dev.bnode.odev, cmd, sizeof(cmd));
+#else
spiflash_cs_activate(dev);
hal_spi_txrx(dev->spi_num, cmd, cmd, sizeof cmd);
spiflash_cs_deactivate(dev);
+#endif
spiflash_unlock(dev);
}
@@ -678,11 +700,15 @@ spiflash_release_power_down(struct spiflash_dev *dev)
spiflash_lock(dev);
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ bus_node_simple_write(&dev->dev.bnode.odev, cmd, sizeof(cmd));
+#else
spiflash_cs_activate(dev);
hal_spi_txrx(dev->spi_num, cmd, cmd, sizeof cmd);
spiflash_cs_deactivate(dev);
+#endif
spiflash_unlock(dev);
}
@@ -695,11 +721,16 @@ spiflash_read_jedec_id(struct spiflash_dev *dev,
spiflash_lock(dev);
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ bus_node_simple_write_read_transact(&dev->dev.bnode.odev,
+ cmd, 1, cmd + 1, 3);
+#else
spiflash_cs_activate(dev);
hal_spi_txrx(dev->spi_num, cmd, cmd, sizeof cmd);
spiflash_cs_deactivate(dev);
+#endif
if (manufacturer) {
*manufacturer = cmd[1];
@@ -722,15 +753,21 @@ uint8_t
spiflash_read_status(struct spiflash_dev *dev)
{
uint8_t val;
+ const uint8_t cmd = SPIFLASH_READ_STATUS_REGISTER;
spiflash_lock(dev);
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ bus_node_simple_write_read_transact(&dev->dev.bnode.odev,
+ &cmd, 1, &val, 1);
+#else
spiflash_cs_activate(dev);
- hal_spi_tx_val(dev->spi_num, SPIFLASH_READ_STATUS_REGISTER);
+ hal_spi_tx_val(dev->spi_num, cmd);
val = hal_spi_tx_val(dev->spi_num, 0xFF);
spiflash_cs_deactivate(dev);
+#endif
spiflash_unlock(dev);
@@ -770,13 +807,18 @@ err:
int
spiflash_write_enable(struct spiflash_dev *dev)
{
+ uint8_t cmd = SPIFLASH_WRITE_ENABLE;
spiflash_lock(dev);
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ bus_node_simple_write(&dev->dev.bnode.odev, &cmd, 1);
+#else
spiflash_cs_activate(dev);
- hal_spi_tx_val(dev->spi_num, SPIFLASH_WRITE_ENABLE);
+ hal_spi_tx_val(dev->spi_num, cmd);
spiflash_cs_deactivate(dev);
+#endif
spiflash_unlock(dev);
@@ -800,6 +842,10 @@ spiflash_read(const struct hal_flash *hal_flash_dev, uint32_t addr, void *buf,
if (!err) {
spiflash_cs_activate(dev);
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ bus_node_simple_write_read_transact(&dev->dev.bnode.odev,
+ &cmd, 4, buf, len);
+#else
/* Send command + address */
hal_spi_txrx(dev->spi_num, cmd, NULL, sizeof cmd);
/* For security mostly, do not output random data, fill it with FF */
@@ -808,6 +854,7 @@ spiflash_read(const struct hal_flash *hal_flash_dev, uint32_t addr, void *buf,
hal_spi_txrx(dev->spi_num, buf, buf, len);
spiflash_cs_deactivate(dev);
+#endif
}
spiflash_unlock(dev);
@@ -845,11 +892,18 @@ spiflash_write(const struct hal_flash *hal_flash_dev, uint32_t addr,
page_limit = (addr & ~(dev->page_size - 1)) + dev->page_size;
to_write = page_limit - addr > len ? len : page_limit - addr;
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ bus_node_lock(&dev->dev.bnode.odev, BUS_NODE_LOCK_DEFAULT_TIMEOUT);
+ bus_node_write(&dev->dev.bnode.odev,
+ cmd, 4, BUS_NODE_LOCK_DEFAULT_TIMEOUT, BUS_F_NOSTOP);
+ bus_node_simple_write(&dev->dev.bnode.odev, u8buf, to_write);
+ bus_node_unlock(&dev->dev.bnode.odev);
+#else
spiflash_cs_activate(dev);
hal_spi_txrx(dev->spi_num, cmd, NULL, sizeof cmd);
hal_spi_txrx(dev->spi_num, (void *)u8buf, NULL, to_write);
spiflash_cs_deactivate(dev);
-
+#endif
addr += to_write;
u8buf += to_write;
len -= to_write;
@@ -884,11 +938,15 @@ spiflash_erase_sector(const struct hal_flash *hal_flash_dev,
spiflash_read_status(dev);
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ bus_node_simple_write(&dev->dev.bnode.odev, cmd, sizeof(cmd));
+#else
spiflash_cs_activate(dev);
hal_spi_txrx(dev->spi_num, cmd, NULL, sizeof cmd);
spiflash_cs_deactivate(dev);
+#endif
spiflash_wait_ready(dev, 100);
err:
@@ -1009,6 +1067,7 @@ spiflash_init(const struct hal_flash *hal_flash_dev)
os_mutex_init(&dev->lock);
#endif
+#if !MYNEWT_VAL(BUS_DRIVER_PRESENT)
hal_gpio_init_out(dev->ss_pin, 1);
(void)hal_spi_disable(dev->spi_num);
@@ -1020,7 +1079,7 @@ spiflash_init(const struct hal_flash *hal_flash_dev)
hal_spi_set_txrx_cb(dev->spi_num, NULL, NULL);
hal_spi_enable(dev->spi_num);
-
+#endif
rc = spiflash_identify(dev);
return rc;