Browse Source

[SPI]Update and fixup the SPI

* Make a priv data read API for probed SPI device
* Fixup the SPI device pre-alloc
GUI 2 weeks ago
parent
commit
8a7ef41c3c

+ 8 - 3
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
 }

+ 5 - 1
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

+ 15 - 17
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;
     }

+ 13 - 1
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)
             {

+ 13 - 5
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,