diff --git a/components/drivers/include/drivers/dev_spi.h b/components/drivers/include/drivers/dev_spi.h index c5de588d7c4..8aeab22b86f 100644 --- a/components/drivers/include/drivers/dev_spi.h +++ b/components/drivers/include/drivers/dev_spi.h @@ -313,6 +313,11 @@ rt_err_t rt_spi_driver_register(struct rt_spi_driver *driver); rt_err_t rt_spi_device_register(struct rt_spi_device *device); #define RT_SPI_DRIVER_EXPORT(driver) RT_DRIVER_EXPORT(driver, spi, BUILIN) + +rt_inline const void *rt_spi_device_id_data(struct rt_spi_device *device) +{ + return device->id ? device->id->data : (device->ofw_id ? device->ofw_id->data : RT_NULL); +} #endif /* RT_USING_DM */ /** @@ -598,7 +603,7 @@ rt_err_t rt_qspi_bus_register(struct rt_spi_bus *bus, const char *name, const st * * @return the actual length of transmitted. */ -rt_size_t rt_qspi_transfer_message(struct rt_qspi_device *device, struct rt_qspi_message *message); +rt_ssize_t rt_qspi_transfer_message(struct rt_qspi_device *device, struct rt_qspi_message *message); /** * @brief This function can send data then receive data from QSPI device @@ -611,7 +616,7 @@ rt_size_t rt_qspi_transfer_message(struct rt_qspi_device *device, struct rt_qsp * * @return the status of transmit. */ -rt_err_t rt_qspi_send_then_recv(struct rt_qspi_device *device, const void *send_buf, rt_size_t send_length,void *recv_buf, rt_size_t recv_length); +rt_ssize_t rt_qspi_send_then_recv(struct rt_qspi_device *device, const void *send_buf, rt_size_t send_length,void *recv_buf, rt_size_t recv_length); /** * @brief This function can send data to QSPI device @@ -622,7 +627,7 @@ rt_err_t rt_qspi_send_then_recv(struct rt_qspi_device *device, const void *send_ * * @return the status of transmit. */ -rt_err_t rt_qspi_send(struct rt_qspi_device *device, const void *send_buf, rt_size_t length); +rt_ssize_t rt_qspi_send(struct rt_qspi_device *device, const void *send_buf, rt_size_t length); #ifdef __cplusplus } diff --git a/components/drivers/spi/Kconfig b/components/drivers/spi/Kconfig index 4b95a18bfed..4a61ee8a8fc 100644 --- a/components/drivers/spi/Kconfig +++ b/components/drivers/spi/Kconfig @@ -1,4 +1,4 @@ -config RT_USING_SPI +menuconfig RT_USING_SPI bool "Using SPI Bus/Device device drivers" default n @@ -235,3 +235,7 @@ config RT_USING_SPI select RT_USING_LWIP default n endif + +if RT_USING_DM && RT_USING_SPI + osource "$(SOC_DM_SPI_DIR)/Kconfig" +endif diff --git a/components/drivers/spi/dev_qspi_core.c b/components/drivers/spi/dev_qspi_core.c index f076945b643..aa536af4dfd 100644 --- a/components/drivers/spi/dev_qspi_core.c +++ b/components/drivers/spi/dev_qspi_core.c @@ -10,6 +10,10 @@ #include "drivers/dev_spi.h" +extern rt_err_t spi_bus_register(struct rt_spi_bus *bus, + const char *name, + const struct rt_spi_ops *ops); + rt_err_t rt_qspi_configure(struct rt_qspi_device *device, struct rt_qspi_configuration *cfg) { RT_ASSERT(device != RT_NULL); @@ -67,21 +71,15 @@ rt_err_t rt_qspi_configure(struct rt_qspi_device *device, struct rt_qspi_configu rt_err_t rt_qspi_bus_register(struct rt_spi_bus *bus, const char *name, const struct rt_spi_ops *ops) { - rt_err_t result = RT_EOK; - - result = rt_spi_bus_register(bus, name, ops); - if(result == RT_EOK) - { - /* set SPI bus to qspi modes */ - bus->mode = RT_SPI_BUS_MODE_QSPI; - } + /* set SPI bus to qspi modes */ + bus->mode = RT_SPI_BUS_MODE_QSPI; - return result; + return spi_bus_register(bus, name, ops); } -rt_size_t rt_qspi_transfer_message(struct rt_qspi_device *device, struct rt_qspi_message *message) +rt_ssize_t rt_qspi_transfer_message(struct rt_qspi_device *device, struct rt_qspi_message *message) { - rt_err_t result; + rt_ssize_t result; RT_ASSERT(device != RT_NULL); RT_ASSERT(message != RT_NULL); @@ -130,7 +128,7 @@ rt_size_t rt_qspi_transfer_message(struct rt_qspi_device *device, struct rt_qsp return result; } -rt_err_t rt_qspi_send_then_recv(struct rt_qspi_device *device, const void *send_buf, rt_size_t send_length, void *recv_buf, rt_size_t recv_length) +rt_ssize_t rt_qspi_send_then_recv(struct rt_qspi_device *device, const void *send_buf, rt_size_t send_length, void *recv_buf, rt_size_t recv_length) { RT_ASSERT(send_buf); RT_ASSERT(recv_buf); @@ -139,7 +137,7 @@ rt_err_t rt_qspi_send_then_recv(struct rt_qspi_device *device, const void *send_ struct rt_qspi_message message; unsigned char *ptr = (unsigned char *)send_buf; rt_size_t count = 0; - rt_err_t result = 0; + rt_ssize_t result = 0; message.instruction.content = ptr[0]; message.instruction.qspi_lines = 1; @@ -208,7 +206,7 @@ rt_err_t rt_qspi_send_then_recv(struct rt_qspi_device *device, const void *send_ { result = -RT_EIO; } - else + else if (result > 0) { result = recv_length; } @@ -216,7 +214,7 @@ rt_err_t rt_qspi_send_then_recv(struct rt_qspi_device *device, const void *send_ return result; } -rt_err_t rt_qspi_send(struct rt_qspi_device *device, const void *send_buf, rt_size_t length) +rt_ssize_t rt_qspi_send(struct rt_qspi_device *device, const void *send_buf, rt_size_t length) { RT_ASSERT(send_buf); RT_ASSERT(length != 0); @@ -224,7 +222,7 @@ rt_err_t rt_qspi_send(struct rt_qspi_device *device, const void *send_buf, rt_si struct rt_qspi_message message; unsigned char *ptr = (unsigned char *)send_buf; rt_size_t count = 0; - rt_err_t result = 0; + rt_ssize_t result = 0; message.instruction.content = ptr[0]; message.instruction.qspi_lines = 1; @@ -294,7 +292,7 @@ rt_err_t rt_qspi_send(struct rt_qspi_device *device, const void *send_buf, rt_si { result = -RT_EIO; } - else + else if (result > 0) { result = length; } diff --git a/components/drivers/spi/dev_spi_bus.c b/components/drivers/spi/dev_spi_bus.c index cb40de9b8dc..ed1f29eac8a 100644 --- a/components/drivers/spi/dev_spi_bus.c +++ b/components/drivers/spi/dev_spi_bus.c @@ -34,7 +34,19 @@ void spi_bus_scan_devices(struct rt_spi_bus *bus) continue; } - spi_dev = rt_calloc(1, sizeof(*spi_dev)); + if ((bus->mode & RT_SPI_BUS_MODE_SPI) == RT_SPI_BUS_MODE_SPI) + { + spi_dev = rt_calloc(1, sizeof(struct rt_spi_device)); + } + else if ((bus->mode & RT_SPI_BUS_MODE_QSPI) == RT_SPI_BUS_MODE_QSPI) + { + spi_dev = rt_calloc(1, sizeof(struct rt_qspi_device)); + } + else + { + LOG_E("Unknown bus mode = %x", bus->mode); + RT_ASSERT(0); + } if (!spi_dev) { diff --git a/components/drivers/spi/dev_spi_core.c b/components/drivers/spi/dev_spi_core.c index d830989947b..53bb7284faa 100644 --- a/components/drivers/spi/dev_spi_core.c +++ b/components/drivers/spi/dev_spi_core.c @@ -26,9 +26,9 @@ extern rt_err_t rt_spi_bus_device_init(struct rt_spi_bus *bus, const char *name); extern rt_err_t rt_spidev_device_init(struct rt_spi_device *dev, const char *name); -rt_err_t rt_spi_bus_register(struct rt_spi_bus *bus, - const char *name, - const struct rt_spi_ops *ops) +rt_err_t spi_bus_register(struct rt_spi_bus *bus, + const char *name, + const struct rt_spi_ops *ops) { rt_err_t result; @@ -42,8 +42,6 @@ rt_err_t rt_spi_bus_register(struct rt_spi_bus *bus, bus->ops = ops; /* initialize owner */ bus->owner = RT_NULL; - /* set bus mode */ - bus->mode = RT_SPI_BUS_MODE_SPI; #ifdef RT_USING_DM if (!bus->slave) @@ -77,6 +75,16 @@ rt_err_t rt_spi_bus_register(struct rt_spi_bus *bus, return RT_EOK; } +rt_err_t rt_spi_bus_register(struct rt_spi_bus *bus, + const char *name, + const struct rt_spi_ops *ops) +{ + /* set bus mode */ + bus->mode = RT_SPI_BUS_MODE_SPI; + + return spi_bus_register(bus, name, ops); +} + rt_err_t rt_spi_bus_attach_device_cspin(struct rt_spi_device *device, const char *name, const char *bus_name,