diff --git a/src/shared/radio/CC3135/CC3135.cpp b/src/shared/radio/CC3135/CC3135.cpp index 755dcb437ec231e1e46878bc2f213ad80833ef3a..9ffe8f3ed8a3ef9b0f10addb2a62d3420c158668 100644 --- a/src/shared/radio/CC3135/CC3135.cpp +++ b/src/shared/radio/CC3135/CC3135.cpp @@ -98,13 +98,6 @@ CC3135::Error CC3135::setApChannel(uint8_t 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); } @@ -152,11 +145,99 @@ CC3135::Error CC3135::setupTransceiver() return Error::NO_ERROR; } +CC3135::Error CC3135::deviceStop() +{ + DeviceStop tx_command = {}; + // Deafault timeout + tx_command.timeout = 10; + + BasicResponse rx_command = {}; + + TRY(inoutPacketSync(OPCODE_DEVICE_STOP_COMMAND, Buffer::from(&tx_command), + Buffer::null(), OPCODE_DEVICE_STOP_RESPONSE, + Buffer::from(&rx_command), Buffer::null())); + + return Error::NO_ERROR; +} + +CC3135::Error CC3135::factoryRestore(CC3135Defs::FsRetToFactoryOp op) +{ + FsFileSysControlCommand tx_command = {}; + tx_command.token = 0; + tx_command.operation = FS_CTL_RESTORE; + tx_command.buffer_length = sizeof(FsRetToFactoryCommand); + + FsRetToFactoryCommand command = {}; + command.operation = op; + + FsFileSysControlResponse rx_command = {}; + + TRY(inoutPacketSync(OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLCOMMAND, + Buffer::from(&tx_command), Buffer::from(&command), + OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLRESPONSE, + Buffer::from(&tx_command), Buffer::null())); + + return errorFromStatus(rx_command.status); +} + +CC3135::Error CC3135::getStatus(uint16_t mask, uint32_t &status) +{ + status = {}; + TRY(deviceGet(DEVICE_STATUS, mask, Buffer::from<uint32_t>(&status))); + + return Error::NO_ERROR; +} + CC3135::Error CC3135::getVersion(DeviceVersion &version) { version = {}; - return deviceGet(DEVICE_GENERAL, DEVICE_GENERAL_VERSION, - Buffer::from<DeviceVersion>(&version)); + TRY(deviceGet(DEVICE_GENERAL, DEVICE_GENERAL_VERSION, + Buffer::from<DeviceVersion>(&version))); + + return Error::NO_ERROR; +} + +CC3135::Error CC3135::deviceStatStart() +{ + BasicResponse rx_command = {}; + + TRY(inoutPacketSync(OPCODE_WLAN_STARTRXSTATCOMMAND, Buffer::null(), + Buffer::null(), OPCODE_WLAN_STARTRXSTATRESPONSE, + Buffer::from(&rx_command), Buffer::null())); + + return errorFromStatus(rx_command.status); +} + +CC3135::Error CC3135::deviceStatStop() +{ + BasicResponse rx_command = {}; + + TRY(inoutPacketSync(OPCODE_WLAN_STOPRXSTATCOMMAND, Buffer::null(), + Buffer::null(), OPCODE_WLAN_STOPRXSTATRESPONSE, + Buffer::from(&rx_command), Buffer::null())); + + return errorFromStatus(rx_command.status); +} + +CC3135::Error CC3135::deviceStatGet(CC3135Defs::DeviceGetStat &stats) +{ + stats = {}; + + TRY(inoutPacketSync(OPCODE_WLAN_GETRXSTATCOMMAND, Buffer::null(), + Buffer::null(), OPCODE_WLAN_GETRXSTATRESPONE, + Buffer::from<DeviceGetStat>(&stats), Buffer::null())); + + return Error::NO_ERROR; +} + +CC3135::Error CC3135::deviceStatGetPm(CC3135Defs::DeviceGetPmStat &stats) +{ + stats = {}; + + TRY(deviceGet(DEVICE_GENERAL, DEVICE_STAT_PM, + Buffer::from<DeviceGetPmStat>(&stats))); + + return Error::NO_ERROR; } CC3135::Error CC3135::deviceGet(uint16_t set_id, uint16_t option, Buffer value) @@ -164,7 +245,6 @@ 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 = {}; @@ -511,7 +591,10 @@ CC3135::Error CC3135::readPacket(OpCode opcode, CC3135::Buffer command, // Read tail of remaining data if (len > 0) + { + TRACE("[cc3135] %d bytes still in receive buffer!\n", len); dummyRead(len); + } break; } diff --git a/src/shared/radio/CC3135/CC3135.h b/src/shared/radio/CC3135/CC3135.h index 67152eec3c1d5ef2c783ee543530c6e4ee155db7..dcfd0c85162b4d1242c6ac1a9dc25d1dbd66fb65 100644 --- a/src/shared/radio/CC3135/CC3135.h +++ b/src/shared/radio/CC3135/CC3135.h @@ -59,6 +59,10 @@ public: CC3135::Error init(bool wait_for_init); + CC3135::Error deviceStop(); + + CC3135::Error factoryRestore(CC3135Defs::FsRetToFactoryOp op); + void handleIrq(); CC3135::Error getVersion(CC3135Defs::DeviceVersion &version); @@ -71,7 +75,16 @@ public: CC3135::Error prepareForReset(); CC3135::Error setApChannel(uint8_t ch); - CC3135::Error getStatus(uint16_t mask, uint8_t &status); + CC3135::Error deviceStatStart(); + CC3135::Error deviceStatStop(); + CC3135::Error deviceStatGet(CC3135Defs::DeviceGetStat &stats); + + // Not working :( + // The device WON'T respond to this ones, not even an error, why? + // The comunication is not broken, it will respond to other commands, just + // not this one + CC3135::Error getStatus(uint16_t mask, uint32_t &status); + CC3135::Error deviceStatGetPm(CC3135Defs::DeviceGetPmStat &stats); static const char *errorToStr(Error error); diff --git a/src/shared/radio/CC3135/CC3135Defs.h b/src/shared/radio/CC3135/CC3135Defs.h index e8d5305ec229114307cf609ec67229b16bfbef63..1259c40cd6a79dfeb6737e76539216103cc8ff0a 100644 --- a/src/shared/radio/CC3135/CC3135Defs.h +++ b/src/shared/radio/CC3135/CC3135Defs.h @@ -46,28 +46,39 @@ enum OpCode : uint16_t OPCODE_DEVICE_INITCOMPLETE = 0x0008, OPCODE_DEVICE_ABORT = 0x000C, OPCODE_DEVICE_DEVICEASYNCDUMMY = 0x0063, + OPCODE_DEVICE_STOP_ASYNC_RESPONSE = 0x0073, OPCODE_DEVICE_DEVICE_ASYNC_GENERAL_ERROR = 0x0078, OPCODE_DEVICE_DEVICEGETRESPONSE = 0x0466, + OPCODE_DEVICE_STOP_RESPONSE = 0x0473, OPCODE_DEVICE_DEVICESETRESPONSE = 0x04B7, OPCODE_WLAN_PROVISIONING_STATUS_ASYNC_EVENT = 0x089A, //< ???? OPCODE_WLAN_WLANDISCONNECTRESPONSE = 0x0C81, OPCODE_WLAN_POLICYSETRESPONSE = 0x0C86, + OPCODE_WLAN_STARTRXSTATRESPONSE = 0x0CAC, + OPCODE_WLAN_STOPRXSTATRESPONSE = 0x0CAB, + OPCODE_WLAN_GETRXSTATRESPONE = 0x0CAF, OPCODE_WLAN_SET_MODE_RESPONSE = 0x0CB4, OPCODE_WLAN_CFG_SET_RESPONSE = 0x0CB5, OPCODE_SOCKET_RECVASYNCRESPONSE = 0x100A, OPCODE_SOCKET_SOCKETRESPONSE = 0x1401, OPCODE_SOCKET_CLOSERESPONSE = 0x1402, + OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLRESPONSE = 0x244B, OPCODE_NETAPP_IPACQUIRED = 0x1825, //< ???? OPCODE_DEVICE_DEVICEGET = 0x8466, + OPCODE_DEVICE_STOP_COMMAND = 0x8473, OPCODE_DEVICE_DEVICESET = 0x84B7, OPCODE_WLAN_POLICYSETCOMMAND = 0x8C86, OPCODE_WLAN_WLANDISCONNECTCOMMAND = 0x8C81, + OPCODE_WLAN_STARTRXSTATCOMMAND = 0x8CAC, + OPCODE_WLAN_STOPRXSTATCOMMAND = 0x8CAB, + OPCODE_WLAN_GETRXSTATCOMMAND = 0x8CAF, OPCODE_WLAN_SET_MODE = 0x8CB4, OPCODE_WLAN_CFG_SET = 0x8CB5, OPCODE_SOCKET_SOCKET = 0x9401, OPCODE_SOCKET_CLOSE = 0x9402, OPCODE_SOCKET_RECV = 0x940A, OPCODE_SOCKET_SEND = 0x940C, + OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLCOMMAND = 0xA44B, }; //! Is this message synchronous? @@ -83,10 +94,14 @@ inline const char *opToStr(OpCode op) return "OPCODE_DEVICE_ABORT"; case OpCode::OPCODE_DEVICE_DEVICEASYNCDUMMY: return "OPCODE_DEVICE_DEVICEASYNCDUMMY"; + case OpCode::OPCODE_DEVICE_STOP_ASYNC_RESPONSE: + return "OPCODE_DEVICE_STOP_ASYNC_RESPONSE"; 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_STOP_RESPONSE: + return "OPCODE_DEVICE_STOP_RESPONSE"; case OpCode::OPCODE_DEVICE_DEVICESETRESPONSE: return "OPCODE_DEVICE_DEVICESETRESPONSE"; case OpCode::OPCODE_NETAPP_IPACQUIRED: @@ -97,6 +112,10 @@ inline const char *opToStr(OpCode op) return "OPCODE_WLAN_WLANDISCONNECTRESPONSE"; case OpCode::OPCODE_WLAN_POLICYSETRESPONSE: return "OPCODE_WLAN_POLICYSETRESPONSE"; + case OpCode::OPCODE_WLAN_STARTRXSTATRESPONSE: + return "OPCODE_WLAN_STARTRXSTATRESPONSE"; + case OpCode::OPCODE_WLAN_GETRXSTATRESPONE: + return "OPCODE_WLAN_GETRXSTATRESPONE"; case OpCode::OPCODE_WLAN_SET_MODE_RESPONSE: return "OPCODE_WLAN_SET_MODE_RESPONSE"; case OpCode::OPCODE_WLAN_CFG_SET_RESPONSE: @@ -107,14 +126,22 @@ inline const char *opToStr(OpCode op) return "OPCODE_SOCKET_SOCKETRESPONSE"; case OpCode::OPCODE_SOCKET_CLOSERESPONSE: return "OPCODE_SOCKET_CLOSERESPONSE"; + case OpCode::OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLRESPONSE: + return "OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLRESPONSE"; case OpCode::OPCODE_DEVICE_DEVICEGET: return "OPCODE_DEVICE_DEVICEGET"; + case OpCode::OPCODE_DEVICE_STOP_COMMAND: + return "OPCODE_DEVICE_STOP_COMMAND"; case OpCode::OPCODE_DEVICE_DEVICESET: return "OPCODE_DEVICE_DEVICESET"; case OpCode::OPCODE_WLAN_POLICYSETCOMMAND: return "OPCODE_WLAN_POLICYSETCOMMAND"; case OpCode::OPCODE_WLAN_WLANDISCONNECTCOMMAND: return "OPCODE_WLAN_WLANDISCONNECTCOMMAND"; + case OpCode::OPCODE_WLAN_STARTRXSTATCOMMAND: + return "OPCODE_WLAN_STARTRXSTATCOMMAND"; + case OpCode::OPCODE_WLAN_GETRXSTATCOMMAND: + return "OPCODE_WLAN_GETRXSTATCOMMAND"; case OpCode::OPCODE_WLAN_SET_MODE: return "OPCODE_WLAN_SET_MODE"; case OpCode::OPCODE_WLAN_CFG_SET: @@ -127,6 +154,8 @@ inline const char *opToStr(OpCode op) return "OPCODE_SOCKET_RECV"; case OpCode::OPCODE_SOCKET_SEND: return "OPCODE_SOCKET_SEND"; + case OpCode::OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLCOMMAND: + return "OPCODE_NVMEM_NVMEMFILESYSTEMCONTROLCOMMAND"; default: return "<unknown>"; } @@ -141,6 +170,23 @@ enum Mode : uint8_t ROLE_TAG = 4 }; +enum FsCtl : uint8_t +{ + FS_CTL_RESTORE = 0, + FS_CTL_ROLLBACK = 1, + FS_CTL_COMMIT = 2, + FS_CTL_RENAME = 3, + FS_CTL_GET_STORAGE_INFO = 5, + FS_CTL_BUNDLE_ROLLBACK = 6, + FS_CTL_BUNDLE_COMMIT = 7 +}; + +enum FsRetToFactoryOp : uint32_t +{ + FS_FACTORY_RET_TO_IMAGE = 0, + FS_FACTORY_RET_TO_DEFAULT = 2, +}; + struct DeviceVersion { uint32_t chip_id; @@ -151,6 +197,46 @@ struct DeviceVersion uint8_t _pad[2]; }; +struct DeviceGetPmStatClrOnRdTypes +{ + uint32_t disconnects; + uint32_t tx_frames_count; + uint32_t received_bytes_count; + uint8_t _pad[16]; +}; + +struct DeviceGetPmStatAcc +{ + uint32_t time_mac_awake[2]; + uint32_t time_mac_sleep[2]; + uint32_t time_mac_listen_11b[2]; + uint32_t time_nwp_deep_sleep[2]; + uint32_t time_nwp_stand_by[2]; + uint32_t time_nwp_awake[2]; +}; + +struct DeviceGetPmStat +{ + DeviceGetPmStatClrOnRdTypes pm_clr_on_rd; + DeviceGetPmStatAcc pm_acc; + uint8_t _pad[16]; + uint32_t start_timestamp; + uint32_t get_timestamp; +}; + +struct DeviceGetStat +{ + uint32_t received_valid_packets_number; + uint32_t received_fcs_error_packets_number; + uint32_t received_address_mismatch_packets_number; + int16_t average_data_ctrl_rssi; + int16_t average_mg_mnt_rssi; + uint16_t rate_histogram[20]; + uint16_t rssi_histogram[6]; + uint32_t start_timestamp; + uint32_t get_timestamp; +}; + struct GenericHeader { OpCode opcode; @@ -192,6 +278,8 @@ struct DeviceSetGet constexpr uint16_t DEVICE_GENERAL = 1; constexpr uint16_t DEVICE_GENERAL_VERSION = 12; +constexpr uint16_t DEVICE_STAT_WLAN_RX = 16; +constexpr uint16_t DEVICE_STAT_PM = 14; constexpr uint16_t DEVICE_STATUS = 2; constexpr uint16_t DEVICE_EVENT_CLASS_DEVICE = 1; @@ -299,6 +387,33 @@ struct SocketResponse uint8_t _pad; }; +struct DeviceStop +{ + uint16_t timeout; + uint8_t _pad[2]; +}; + +struct FsFileSysControlCommand +{ + uint32_t token; + FsCtl operation; + uint8_t _pad[3]; + uint32_t file_name_length; + uint32_t buffer_length; +}; + +struct FsFileSysControlResponse +{ + int32_t status; + uint32_t token; + uint32_t len; +}; + +struct FsRetToFactoryCommand +{ + FsRetToFactoryOp operation; +}; + enum Rate : uint16_t { RATE_1M = 1, @@ -346,7 +461,7 @@ inline uint16_t makeWlanRawRfTxParams(uint8_t channel, Rate rate, uint8_t power, if (channel <= MAX_2_4G_CHANNEL) { - return ((channel << CHANNEL_SHIFT) | (BAND_2_4G << BAND_SHIFT) | + return ((channel << CHANNEL_SHIFT) | /*(BAND_2_4G << BAND_SHIFT) |*/ (rate << RATE_SHIFT) | (power << POWER_SHIFT) | (preamble << PREAMBLE_SHIFT)); } diff --git a/src/tests/drivers/CC3135/test-cc3135.cpp b/src/tests/drivers/CC3135/test-cc3135.cpp index f348be66d1711777d2a43b8cc19672c8b9b243a8..2870909681dd7c6e9bcdf7c001e49bd4f06ee8a9 100644 --- a/src/tests/drivers/CC3135/test-cc3135.cpp +++ b/src/tests/drivers/CC3135/test-cc3135.cpp @@ -156,6 +156,43 @@ void initBoard() InterruptTrigger::RISING_EDGE); } +void printStats() +{ + CC3135Defs::DeviceGetStat stats = {}; + CHECK(cc3135->deviceStatGet(stats)); + + printf( + "[cc3135] Received valid packets: %lu\n" + "[cc3135] Received fcs error packets: %lu\n" + "[cc3135] Received address mismatch packets: %lu\n" + "[cc3135] Average data control rssi: %d\n" + "[cc3135] Average mg mnt rssi: %d\n" + "[cc3135] Start timestamp: %lu\n" + "[cc3135] Get timestamp: %lu\n", + stats.received_valid_packets_number, + stats.received_fcs_error_packets_number, + stats.received_address_mismatch_packets_number, + stats.average_data_ctrl_rssi, stats.average_mg_mnt_rssi, + stats.start_timestamp, stats.get_timestamp); +} + +void printChipid() +{ + CC3135Defs::DeviceVersion version = {}; + 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); +} + int main() { // IRQ watcher thread @@ -216,24 +253,24 @@ int main() miosix::reboot(); } + cc3135->deviceStatStart(); + // cc3135->prepareForReset(); // cc3135->setApChannel(100); printf("[cc3135] Initialization complete!\n"); - CC3135Defs::DeviceVersion version = {}; - 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); + printChipid(); + + // uint32_t status; + // CHECK(cc3135->getStatus(0, status)); + // printf("[cc3135] Device status: %lu\n", status); + + // cc3135->factoryRestore(CC3135Defs::FS_FACTORY_RET_TO_IMAGE); + // printf("[cc3135] Requested factory reset\n"); + + cc3135->deviceStop(); + printf("[cc3135] Device stopped!\n"); while (true) { @@ -255,7 +292,7 @@ int main() // version.nwp_version[2], version.nwp_version[3], // version.rom_version); - printf("[cc3135] Looping\n"); + // printStats(); Thread::sleep(1000); }