From 95a31bf718dcf7db2057ed000468c54e9f1d524f Mon Sep 17 00:00:00 2001
From: Davide Mor <davide.mor@skywarder.eu>
Date: Fri, 12 Aug 2022 19:30:24 +0200
Subject: [PATCH] [cc3135] Added dummy read just before initialization

---
 src/shared/radio/CC3135/CC3135.cpp       | 13 +++++++++++++
 src/shared/radio/CC3135/CC3135.h         |  3 +++
 src/tests/drivers/CC3135/test-cc3135.cpp | 12 +++++-------
 3 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/src/shared/radio/CC3135/CC3135.cpp b/src/shared/radio/CC3135/CC3135.cpp
index 15680adf1..536807b17 100644
--- a/src/shared/radio/CC3135/CC3135.cpp
+++ b/src/shared/radio/CC3135/CC3135.cpp
@@ -49,6 +49,9 @@ CC3135::CC3135(std::unique_ptr<ICC3135Iface> &&iface) : iface(std::move(iface))
 
 CC3135::Error CC3135::init(bool wait_for_init)
 {
+    if (iface->is_spi())
+        dummyDeviceRead();
+
     if (wait_for_init)
     {
         DeviceInitInfo init_info = {};
@@ -88,6 +91,16 @@ CC3135::Error CC3135::devigeGet(uint8_t set_id, uint8_t option, Buffer result)
                            Buffer::from(&rx_command), result);
 }
 
+CC3135::Error CC3135::dummyDeviceRead()
+{
+    ResponseHeader header;
+    TRY(readHeader(&header));
+
+    defaultPacketHandler(header);
+
+    return Error::NO_ERROR;
+}
+
 CC3135::Error CC3135::setMode(CC3135Defs::Mode mode)
 {
     WlanSetMode tx_command = {};
diff --git a/src/shared/radio/CC3135/CC3135.h b/src/shared/radio/CC3135/CC3135.h
index 8a569d72e..e3082b78e 100644
--- a/src/shared/radio/CC3135/CC3135.h
+++ b/src/shared/radio/CC3135/CC3135.h
@@ -83,6 +83,9 @@ private:
 
     CC3135::Error devigeGet(uint8_t set_id, uint8_t option, Buffer result);
 
+    //! Read something from the device, to wake it up?
+    CC3135::Error dummyDeviceRead();
+
     // Functions dedicated to interrupt servicing
 
     //! Wait for an incoming interrupt (only callable in service thread).
diff --git a/src/tests/drivers/CC3135/test-cc3135.cpp b/src/tests/drivers/CC3135/test-cc3135.cpp
index f3e2e034b..f1c137c30 100644
--- a/src/tests/drivers/CC3135/test-cc3135.cpp
+++ b/src/tests/drivers/CC3135/test-cc3135.cpp
@@ -86,7 +86,7 @@ using irq  = Gpio<GPIOA_BASE, 4>;
 using hib  = Gpio<GPIOA_BASE, 6>;
 
 #define CC3135_SPI SPI1
-#define CC3135_HIB
+// #define CC3135_HIB
 #endif
 
 #endif
@@ -190,7 +190,7 @@ int main()
     GpioPin cs_pin = cs::getPin();
 
     SPIBusConfig config = {};
-    config.clockDivider = SPI::ClockDivider::DIV_64;
+    config.clockDivider = SPI::ClockDivider::DIV_32;
     config.mode         = SPI::Mode::MODE_0;
     config.bitOrder     = SPI::BitOrder::MSB_FIRST;
 
@@ -201,18 +201,16 @@ int main()
     std::unique_ptr<ICC3135Iface> iface(new CC3135Uart(CC3135_UART));
 #endif
 
-    Thread::sleep(5000);
-
     printf("[cc3135] Initializing...\n");
     cc3135 = new CC3135(std::move(iface));
 
-    cc3135->handleIrq();
+    // cc3135->handleIrq();
 
-    if (cc3135->init(true) != CC3135::Error::NO_ERROR)
+    if (cc3135->init(false) != CC3135::Error::NO_ERROR)
     {
         printf("[cc3135] Failed to start cc3135, retrying...\n");
         Thread::sleep(2000);
-        return;
+        return 0;
 
         // miosix::reboot();
     }
-- 
GitLab