summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorGUI <[email protected]>2025-07-10 13:28:16 +0800
committerGitHub <[email protected]>2025-07-10 13:28:16 +0800
commit8a7ef41c3c95da1d1c13627709e0658d0b1e3180 (patch)
tree71160f3bbc856b671561da2ae6190d8b28f6b42c /components
parent29033ab50032007dc372907a463270cfbd54fa4f (diff)
[SPI]Update and fixup the SPI
* Make a priv data read API for probed SPI device * Fixup the SPI device pre-alloc
Diffstat (limited to 'components')
-rw-r--r--components/drivers/include/drivers/dev_spi.h11
-rw-r--r--components/drivers/spi/Kconfig6
-rw-r--r--components/drivers/spi/dev_qspi_core.c32
-rw-r--r--components/drivers/spi/dev_spi_bus.c14
-rw-r--r--components/drivers/spi/dev_spi_core.c18
5 files changed, 54 insertions, 27 deletions
diff --git a/components/drivers/include/drivers/dev_spi.h b/components/drivers/include/drivers/dev_spi.h
index c5de588d7c..8aeab22b86 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 4b95a18bfe..4a61ee8a8f 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 f076945b64..aa536af4df 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 @@ __exit:
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 cb40de9b8d..ed1f29eac8 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 d830989947..53bb7284fa 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,