From a34c14df73404e6d52d1b35968e7da6f743cc333 Mon Sep 17 00:00:00 2001
From: Davide Mor <davide.mor@skywarder.eu>
Date: Wed, 31 Aug 2022 19:15:40 +0200
Subject: [PATCH] [cc3135] Exposed more cc3135 API functions
---
src/shared/radio/CC3135/CC3135.cpp | 114 +++++++++++++++++++----
src/shared/radio/CC3135/CC3135.h | 8 +-
src/shared/radio/CC3135/CC3135Defs.h | 29 ++++++
src/tests/drivers/CC3135/test-cc3135.cpp | 47 ++++++----
4 files changed, 157 insertions(+), 41 deletions(-)
diff --git a/src/shared/radio/CC3135/CC3135.cpp b/src/shared/radio/CC3135/CC3135.cpp
index 761607147..755dcb437 100644
--- a/src/shared/radio/CC3135/CC3135.cpp
+++ b/src/shared/radio/CC3135/CC3135.cpp
@@ -41,13 +41,13 @@
using namespace Boardcore::CC3135Defs;
using namespace miosix;
-constexpr uint8_t TEST_CHANNEL = 6;
+constexpr uint8_t TEST_CHANNEL = 64;
namespace Boardcore
{
CC3135::CC3135(std::unique_ptr<ICC3135Iface> &&iface)
- : iface(std::move(iface)), sd(-1)
+ : iface(std::move(iface)), sd(128)
{
irq_wait_thread = thread;
}
@@ -78,8 +78,7 @@ CC3135::Error CC3135::init(bool wait_for_init)
this->start();
// Setup transceiver mode
- TRY(setupTransceiver());
- TRY(startRecv());
+ // TRY(setupTransceiver());
return Error::NO_ERROR;
}
@@ -92,6 +91,20 @@ CC3135::Error CC3135::prepareForReset()
return Error::NO_ERROR;
}
+CC3135::Error CC3135::setApChannel(uint8_t ch)
+{
+ TRY(wlanSet(WLAN_CFG_AP_ID, WLAN_AP_OPT_CHANNEL, Buffer::from(&ch)));
+
+ return Error::NO_ERROR;
+}
+
+CC3135::Error CC3135::getStatus(uint16_t mask, uint8_t &status)
+{
+ TRY(deviceGet(DEVICE_STATUS, mask, Buffer::from<uint8_t>(&status)));
+
+ return Error::NO_ERROR;
+}
+
CC3135::Error CC3135::startRecv() { return socketRecv(sd, Buffer::null(), 0); }
CC3135::Error CC3135::dummyRecv() { return socketRecv(sd, Buffer::null(), 0); }
@@ -142,15 +155,16 @@ CC3135::Error CC3135::setupTransceiver()
CC3135::Error CC3135::getVersion(DeviceVersion &version)
{
version = {};
- return devigeGet(DEVICE_GENERAL, DEVICE_GENERAL_VERSION,
+ return deviceGet(DEVICE_GENERAL, DEVICE_GENERAL_VERSION,
Buffer::from<DeviceVersion>(&version));
}
-CC3135::Error CC3135::devigeGet(uint8_t set_id, uint8_t option, Buffer value)
+CC3135::Error CC3135::deviceGet(uint16_t set_id, uint16_t option, Buffer value)
{
DeviceSetGet tx_command = {};
tx_command.device_set_id = set_id;
tx_command.option = option;
+ tx_command.config_len = value.len;
DeviceSetGet rx_command = {};
@@ -161,6 +175,22 @@ CC3135::Error CC3135::devigeGet(uint8_t set_id, uint8_t option, Buffer value)
return errorFromStatus(rx_command.status);
}
+CC3135::Error CC3135::wlanSet(uint16_t config_id, uint16_t option, Buffer value)
+{
+ WlanCfgSetGet tx_command = {};
+ tx_command.config_id = config_id;
+ tx_command.option = option;
+ tx_command.config_len = value.len;
+
+ BasicResponse rx_command = {};
+
+ TRY(inoutPacketSync(OPCODE_WLAN_CFG_SET, Buffer::from(&tx_command), value,
+ OPCODE_WLAN_CFG_SET_RESPONSE, Buffer::from(&rx_command),
+ Buffer::null()));
+
+ return errorFromStatus(rx_command.status);
+}
+
CC3135::Error CC3135::wlanSetMode(CC3135Defs::Mode mode)
{
WlanSetMode tx_command = {};
@@ -356,28 +386,44 @@ void CC3135::defaultPacketHandler(CC3135Defs::ResponseHeader header)
safeRead(len, Buffer::from(&rx_command));
+ // if (rx_command.status_or_len < 0)
+ // noprintf("Status: %d\n", rx_command.status_or_len);
+
// 8 byte proprietary header, format information?
uint64_t header2;
safeRead(len, Buffer::from(&header2));
rx_command.status_or_len -= 8;
- /*
- notprintf("Header: %8x\n", header2);
+ // noprintf("Header: %8llx\n", header2);
+ //
+ // if (rx_command.status_or_len >= 0)
+ // {
+ // noprintf("%d %d\n", len, rx_command.status_or_len);
+ //
+ // uint8_t response[len];
+ // safeRead(len, Buffer{response, len});
+ //
+ // for (int i = 0; i < rx_command.status_or_len; i++)
+ // {
+ // noprintf("%2x ", response[i]);
+ // }
+ // noprintf("\n");
+ //
+ // while (1)
+ // ;
+ // }
- if (rx_command.status_or_len >= 0)
- {
- notprintf("%d %d\n", len, rx_command.status_or_len);
+ break;
+ }
+ case OPCODE_DEVICE_DEVICE_ASYNC_GENERAL_ERROR:
+ {
+ BasicResponse rx_command = {};
- uint8_t response[len];
- safeRead(len, Buffer{response, len});
+ safeRead(len, Buffer::from(&rx_command));
- for (int i = 0; i < rx_command.status_or_len; i++)
- {
- notprintf("%2x ", response[i]);
- }
- notprintf("\n");
- }
- */
+ TRACE("[cc3135] Async general error occurred!\n");
+ TRACE("- Status: %d\n", rx_command.status);
+ TRACE("- Source: %d\n", rx_command.sender);
break;
}
@@ -483,10 +529,24 @@ CC3135::Error CC3135::writePacket(OpCode opcode, CC3135::Buffer command,
TRY(writeHeader(&header));
if (command.len > 0)
+ {
iface->write(command.ptr, command.len);
+ len -= command.len;
+ }
if (payload.len > 0)
+ {
iface->write(payload.ptr, payload.len);
+ len -= payload.len;
+ }
+
+ // Write final padding
+ while (len > 0)
+ {
+ uint8_t buf[] = {0, 0, 0, 0};
+ iface->write(buf, std::min(len, (size_t)4));
+ len -= std::min(len, (size_t)4);
+ }
return Error::NO_ERROR;
}
@@ -511,6 +571,11 @@ CC3135::Error CC3135::readHeader(ResponseHeader *header)
// 2. Read initial data from the device
iface->read(&buf[0], 8);
+ // for(int i = 0; i < 8; i++)
+ // noprintf("%x ", buf[i]);
+ //
+ // noprintf("\n");
+
/*
Here the TI driver does some weird stuff.
Also the TI comment is wrong, soooo, I'll just skip that part
@@ -549,6 +614,11 @@ CC3135::Error CC3135::readHeader(ResponseHeader *header)
{
memmove(&buf[0], &buf[4], 4);
iface->read(&buf[4], 4);
+
+ // for(int i = 4; i < 8; i++)
+ // noprintf("%x ", buf[i]);
+ //
+ // noprintf("\n");
}
}
@@ -630,6 +700,8 @@ CC3135::Error CC3135::errorFromStatus(int16_t status)
{
case -2071:
return Error::WLAN_ALREADY_DISCONNECTED;
+ case -14343:
+ return Error::DEVICE_LOCKED;
default:
return Error::GENERIC_ERROR;
}
@@ -645,6 +717,8 @@ const char *CC3135::errorToStr(Error error)
return "SYNC_TIMEOUT";
case Error::GENERIC_ERROR:
return "GENERIC_ERROR";
+ case Error::DEVICE_LOCKED:
+ return "DEVICE_LOCKED";
case Error::WLAN_ALREADY_DISCONNECTED:
return "WLAN_ALREADY_DISCONNECTED";
default:
diff --git a/src/shared/radio/CC3135/CC3135.h b/src/shared/radio/CC3135/CC3135.h
index d60104533..67152eec3 100644
--- a/src/shared/radio/CC3135/CC3135.h
+++ b/src/shared/radio/CC3135/CC3135.h
@@ -51,6 +51,7 @@ public:
SYNC_TIMEOUT, //< The NWP did not respond.
GENERIC_ERROR, //< Generic error class.
WLAN_ALREADY_DISCONNECTED, //< Wlan is already disconnected.
+ DEVICE_LOCKED, //< Device is locked
};
explicit CC3135(std::unique_ptr<ICC3135Iface> &&iface);
@@ -68,6 +69,9 @@ public:
CC3135::Error dummySend();
CC3135::Error prepareForReset();
+ CC3135::Error setApChannel(uint8_t ch);
+
+ CC3135::Error getStatus(uint16_t mask, uint8_t &status);
static const char *errorToStr(Error error);
@@ -110,7 +114,9 @@ private:
// Part of the device API
- CC3135::Error devigeGet(uint8_t set_id, uint8_t option, Buffer value);
+ CC3135::Error deviceGet(uint16_t set_id, uint16_t option, Buffer value);
+
+ CC3135::Error wlanSet(uint16_t config_id, uint16_t option, Buffer value);
CC3135::Error wlanSetMode(CC3135Defs::Mode mode);
diff --git a/src/shared/radio/CC3135/CC3135Defs.h b/src/shared/radio/CC3135/CC3135Defs.h
index 0738afaa3..e8d5305ec 100644
--- a/src/shared/radio/CC3135/CC3135Defs.h
+++ b/src/shared/radio/CC3135/CC3135Defs.h
@@ -46,12 +46,14 @@ enum OpCode : uint16_t
OPCODE_DEVICE_INITCOMPLETE = 0x0008,
OPCODE_DEVICE_ABORT = 0x000C,
OPCODE_DEVICE_DEVICEASYNCDUMMY = 0x0063,
+ OPCODE_DEVICE_DEVICE_ASYNC_GENERAL_ERROR = 0x0078,
OPCODE_DEVICE_DEVICEGETRESPONSE = 0x0466,
OPCODE_DEVICE_DEVICESETRESPONSE = 0x04B7,
OPCODE_WLAN_PROVISIONING_STATUS_ASYNC_EVENT = 0x089A, //< ????
OPCODE_WLAN_WLANDISCONNECTRESPONSE = 0x0C81,
OPCODE_WLAN_POLICYSETRESPONSE = 0x0C86,
OPCODE_WLAN_SET_MODE_RESPONSE = 0x0CB4,
+ OPCODE_WLAN_CFG_SET_RESPONSE = 0x0CB5,
OPCODE_SOCKET_RECVASYNCRESPONSE = 0x100A,
OPCODE_SOCKET_SOCKETRESPONSE = 0x1401,
OPCODE_SOCKET_CLOSERESPONSE = 0x1402,
@@ -61,6 +63,7 @@ enum OpCode : uint16_t
OPCODE_WLAN_POLICYSETCOMMAND = 0x8C86,
OPCODE_WLAN_WLANDISCONNECTCOMMAND = 0x8C81,
OPCODE_WLAN_SET_MODE = 0x8CB4,
+ OPCODE_WLAN_CFG_SET = 0x8CB5,
OPCODE_SOCKET_SOCKET = 0x9401,
OPCODE_SOCKET_CLOSE = 0x9402,
OPCODE_SOCKET_RECV = 0x940A,
@@ -80,6 +83,8 @@ inline const char *opToStr(OpCode op)
return "OPCODE_DEVICE_ABORT";
case OpCode::OPCODE_DEVICE_DEVICEASYNCDUMMY:
return "OPCODE_DEVICE_DEVICEASYNCDUMMY";
+ case OpCode::OPCODE_DEVICE_DEVICE_ASYNC_GENERAL_ERROR:
+ return "OPCODE_DEVICE_DEVICE_ASYNC_GENERAL_ERROR";
case OpCode::OPCODE_DEVICE_DEVICEGETRESPONSE:
return "OPCODE_DEVICE_DEVICEGETRESPONSE";
case OpCode::OPCODE_DEVICE_DEVICESETRESPONSE:
@@ -94,6 +99,8 @@ inline const char *opToStr(OpCode op)
return "OPCODE_WLAN_POLICYSETRESPONSE";
case OpCode::OPCODE_WLAN_SET_MODE_RESPONSE:
return "OPCODE_WLAN_SET_MODE_RESPONSE";
+ case OpCode::OPCODE_WLAN_CFG_SET_RESPONSE:
+ return "OPCODE_WLAN_CFG_SET_RESPONSE";
case OpCode::OPCODE_SOCKET_RECVASYNCRESPONSE:
return "OPCODE_SOCKET_RECVASYNCRESPONSE";
case OpCode::OPCODE_SOCKET_SOCKETRESPONSE:
@@ -110,6 +117,8 @@ inline const char *opToStr(OpCode op)
return "OPCODE_WLAN_WLANDISCONNECTCOMMAND";
case OpCode::OPCODE_WLAN_SET_MODE:
return "OPCODE_WLAN_SET_MODE";
+ case OpCode::OPCODE_WLAN_CFG_SET:
+ return "OPCODE_WLAN_CFG_SET";
case OpCode::OPCODE_SOCKET_SOCKET:
return "OPCODE_SOCKET_SOCKET";
case OpCode::OPCODE_SOCKET_CLOSE:
@@ -184,6 +193,26 @@ struct DeviceSetGet
constexpr uint16_t DEVICE_GENERAL = 1;
constexpr uint16_t DEVICE_GENERAL_VERSION = 12;
+constexpr uint16_t DEVICE_STATUS = 2;
+constexpr uint16_t DEVICE_EVENT_CLASS_DEVICE = 1;
+constexpr uint16_t DEVICE_EVENT_CLASS_WLAN = 2;
+constexpr uint16_t DEVICE_EVENT_CLASS_BSD = 3;
+constexpr uint16_t DEVICE_EVENT_CLASS_NETAPP = 4;
+constexpr uint16_t DEVICE_EVENT_CLASS_NETCFG = 5;
+constexpr uint16_t DEVICE_EVENT_CLASS_FS = 6;
+constexpr uint16_t DEVICE_EVENT_CLASS_NETUTIL = 7;
+
+struct WlanCfgSetGet
+{
+ uint16_t status;
+ uint16_t config_id;
+ uint16_t option;
+ uint16_t config_len;
+};
+
+constexpr uint16_t WLAN_CFG_AP_ID = 0;
+constexpr uint16_t WLAN_AP_OPT_CHANNEL = 3;
+
struct WlanSetMode
{
Mode mode;
diff --git a/src/tests/drivers/CC3135/test-cc3135.cpp b/src/tests/drivers/CC3135/test-cc3135.cpp
index 863a78629..f348be66d 100644
--- a/src/tests/drivers/CC3135/test-cc3135.cpp
+++ b/src/tests/drivers/CC3135/test-cc3135.cpp
@@ -76,7 +76,7 @@ using irq = Gpio<GPIOA_BASE, 4>;
using hib = Gpio<GPIOA_BASE, 5>;
#define CC3135_UART USART2
-#define CC3135_HIB
+// #define CC3135_HIB
#else
using sck = Gpio<GPIOA_BASE, 5>;
using miso = Gpio<GPIOB_BASE, 4>;
@@ -211,11 +211,14 @@ int main()
{
printf("[cc3135] Failed to start cc3135 (error: %s), retrying...\n",
CC3135::errorToStr(result));
- Thread::sleep(4000);
+ Thread::sleep(1000);
miosix::reboot();
}
+ // cc3135->prepareForReset();
+ // cc3135->setApChannel(100);
+
printf("[cc3135] Initialization complete!\n");
CC3135Defs::DeviceVersion version = {};
@@ -234,28 +237,32 @@ int main()
while (true)
{
- cc3135->startRecv();
- Thread::sleep(1000);
+ // cc3135->dummySend();
+ // cc3135->startRecv();
+
+ // CHECK(cc3135->getVersion(version));
+ // printf(
+ // "[cc3135] Chip Id: %lx\n"
+ // "[cc3135] Fw version: %u.%u.%u.%u\n"
+ // "[cc3135] Phy version: %u.%u.%u.%u\n"
+ // "[cc3135] Nwp version: %u.%u.%u.%u\n"
+ // "[cc3135] Rom version: %x\n",
+ // version.chip_id, version.fw_version[0], version.fw_version[1],
+ // version.fw_version[2], version.fw_version[3],
+ // version.phy_version[0], version.phy_version[1],
+ // version.phy_version[2], version.phy_version[3],
+ // version.nwp_version[0], version.nwp_version[1],
+ // version.nwp_version[2], version.nwp_version[3],
+ // version.rom_version);
+
printf("[cc3135] Looping\n");
- cc3135->dummySend();
-
- CHECK(cc3135->getVersion(version));
- printf(
- "[cc3135] Chip Id: %lx\n"
- "[cc3135] Fw version: %u.%u.%u.%u\n"
- "[cc3135] Phy version: %u.%u.%u.%u\n"
- "[cc3135] Nwp version: %u.%u.%u.%u\n"
- "[cc3135] Rom version: %x\n",
- version.chip_id, version.fw_version[0], version.fw_version[1],
- version.fw_version[2], version.fw_version[3],
- version.phy_version[0], version.phy_version[1],
- version.phy_version[2], version.phy_version[3],
- version.nwp_version[0], version.nwp_version[1],
- version.nwp_version[2], version.nwp_version[3],
- version.rom_version);
+ Thread::sleep(1000);
}
+ while (true)
+ ;
+
// Thread::sleep(3000);
// miosix::reboot();
}
--
GitLab