diff --git a/src/shared/radio/CC3135/CC3135.cpp b/src/shared/radio/CC3135/CC3135.cpp index 761607147cd4f89f9782431447816f62d769379b..755dcb437ec231e1e46878bc2f213ad80833ef3a 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 d60104533039edb337d3a8ca5ca3bc4b0a09d52a..67152eec3c1d5ef2c783ee543530c6e4ee155db7 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 0738afaa3a96e46ad38cd7c9b3b428a736ff1646..e8d5305ec229114307cf609ec67229b16bfbef63 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 863a7862933d2f36fb4d2837d2c38e5d8e1790a7..f348be66d1711777d2a43b8cc19672c8b9b243a8 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(); }