Skip to content
Snippets Groups Projects
Commit a34c14df authored by Davide Mor's avatar Davide Mor
Browse files

[cc3135] Exposed more cc3135 API functions

parent 331da086
Branches
No related tags found
No related merge requests found
...@@ -41,13 +41,13 @@ ...@@ -41,13 +41,13 @@
using namespace Boardcore::CC3135Defs; using namespace Boardcore::CC3135Defs;
using namespace miosix; using namespace miosix;
constexpr uint8_t TEST_CHANNEL = 6; constexpr uint8_t TEST_CHANNEL = 64;
namespace Boardcore namespace Boardcore
{ {
CC3135::CC3135(std::unique_ptr<ICC3135Iface> &&iface) CC3135::CC3135(std::unique_ptr<ICC3135Iface> &&iface)
: iface(std::move(iface)), sd(-1) : iface(std::move(iface)), sd(128)
{ {
irq_wait_thread = thread; irq_wait_thread = thread;
} }
...@@ -78,8 +78,7 @@ CC3135::Error CC3135::init(bool wait_for_init) ...@@ -78,8 +78,7 @@ CC3135::Error CC3135::init(bool wait_for_init)
this->start(); this->start();
// Setup transceiver mode // Setup transceiver mode
TRY(setupTransceiver()); // TRY(setupTransceiver());
TRY(startRecv());
return Error::NO_ERROR; return Error::NO_ERROR;
} }
...@@ -92,6 +91,20 @@ CC3135::Error CC3135::prepareForReset() ...@@ -92,6 +91,20 @@ CC3135::Error CC3135::prepareForReset()
return Error::NO_ERROR; 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::startRecv() { return socketRecv(sd, Buffer::null(), 0); }
CC3135::Error CC3135::dummyRecv() { return socketRecv(sd, Buffer::null(), 0); } CC3135::Error CC3135::dummyRecv() { return socketRecv(sd, Buffer::null(), 0); }
...@@ -142,15 +155,16 @@ CC3135::Error CC3135::setupTransceiver() ...@@ -142,15 +155,16 @@ CC3135::Error CC3135::setupTransceiver()
CC3135::Error CC3135::getVersion(DeviceVersion &version) CC3135::Error CC3135::getVersion(DeviceVersion &version)
{ {
version = {}; version = {};
return devigeGet(DEVICE_GENERAL, DEVICE_GENERAL_VERSION, return deviceGet(DEVICE_GENERAL, DEVICE_GENERAL_VERSION,
Buffer::from<DeviceVersion>(&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 = {}; DeviceSetGet tx_command = {};
tx_command.device_set_id = set_id; tx_command.device_set_id = set_id;
tx_command.option = option; tx_command.option = option;
tx_command.config_len = value.len;
DeviceSetGet rx_command = {}; DeviceSetGet rx_command = {};
...@@ -161,6 +175,22 @@ CC3135::Error CC3135::devigeGet(uint8_t set_id, uint8_t option, Buffer value) ...@@ -161,6 +175,22 @@ CC3135::Error CC3135::devigeGet(uint8_t set_id, uint8_t option, Buffer value)
return errorFromStatus(rx_command.status); 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) CC3135::Error CC3135::wlanSetMode(CC3135Defs::Mode mode)
{ {
WlanSetMode tx_command = {}; WlanSetMode tx_command = {};
...@@ -356,28 +386,44 @@ void CC3135::defaultPacketHandler(CC3135Defs::ResponseHeader header) ...@@ -356,28 +386,44 @@ void CC3135::defaultPacketHandler(CC3135Defs::ResponseHeader header)
safeRead(len, Buffer::from(&rx_command)); 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? // 8 byte proprietary header, format information?
uint64_t header2; uint64_t header2;
safeRead(len, Buffer::from(&header2)); safeRead(len, Buffer::from(&header2));
rx_command.status_or_len -= 8; rx_command.status_or_len -= 8;
/* // noprintf("Header: %8llx\n", header2);
notprintf("Header: %8x\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) break;
}
case OPCODE_DEVICE_DEVICE_ASYNC_GENERAL_ERROR:
{ {
notprintf("%d %d\n", len, rx_command.status_or_len); BasicResponse rx_command = {};
uint8_t response[len]; safeRead(len, Buffer::from(&rx_command));
safeRead(len, Buffer{response, len});
for (int i = 0; i < rx_command.status_or_len; i++) TRACE("[cc3135] Async general error occurred!\n");
{ TRACE("- Status: %d\n", rx_command.status);
notprintf("%2x ", response[i]); TRACE("- Source: %d\n", rx_command.sender);
}
notprintf("\n");
}
*/
break; break;
} }
...@@ -483,10 +529,24 @@ CC3135::Error CC3135::writePacket(OpCode opcode, CC3135::Buffer command, ...@@ -483,10 +529,24 @@ CC3135::Error CC3135::writePacket(OpCode opcode, CC3135::Buffer command,
TRY(writeHeader(&header)); TRY(writeHeader(&header));
if (command.len > 0) if (command.len > 0)
{
iface->write(command.ptr, command.len); iface->write(command.ptr, command.len);
len -= command.len;
}
if (payload.len > 0) if (payload.len > 0)
{
iface->write(payload.ptr, payload.len); 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; return Error::NO_ERROR;
} }
...@@ -511,6 +571,11 @@ CC3135::Error CC3135::readHeader(ResponseHeader *header) ...@@ -511,6 +571,11 @@ CC3135::Error CC3135::readHeader(ResponseHeader *header)
// 2. Read initial data from the device // 2. Read initial data from the device
iface->read(&buf[0], 8); 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. Here the TI driver does some weird stuff.
Also the TI comment is wrong, soooo, I'll just skip that part Also the TI comment is wrong, soooo, I'll just skip that part
...@@ -549,6 +614,11 @@ CC3135::Error CC3135::readHeader(ResponseHeader *header) ...@@ -549,6 +614,11 @@ CC3135::Error CC3135::readHeader(ResponseHeader *header)
{ {
memmove(&buf[0], &buf[4], 4); memmove(&buf[0], &buf[4], 4);
iface->read(&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) ...@@ -630,6 +700,8 @@ CC3135::Error CC3135::errorFromStatus(int16_t status)
{ {
case -2071: case -2071:
return Error::WLAN_ALREADY_DISCONNECTED; return Error::WLAN_ALREADY_DISCONNECTED;
case -14343:
return Error::DEVICE_LOCKED;
default: default:
return Error::GENERIC_ERROR; return Error::GENERIC_ERROR;
} }
...@@ -645,6 +717,8 @@ const char *CC3135::errorToStr(Error error) ...@@ -645,6 +717,8 @@ const char *CC3135::errorToStr(Error error)
return "SYNC_TIMEOUT"; return "SYNC_TIMEOUT";
case Error::GENERIC_ERROR: case Error::GENERIC_ERROR:
return "GENERIC_ERROR"; return "GENERIC_ERROR";
case Error::DEVICE_LOCKED:
return "DEVICE_LOCKED";
case Error::WLAN_ALREADY_DISCONNECTED: case Error::WLAN_ALREADY_DISCONNECTED:
return "WLAN_ALREADY_DISCONNECTED"; return "WLAN_ALREADY_DISCONNECTED";
default: default:
......
...@@ -51,6 +51,7 @@ public: ...@@ -51,6 +51,7 @@ public:
SYNC_TIMEOUT, //< The NWP did not respond. SYNC_TIMEOUT, //< The NWP did not respond.
GENERIC_ERROR, //< Generic error class. GENERIC_ERROR, //< Generic error class.
WLAN_ALREADY_DISCONNECTED, //< Wlan is already disconnected. WLAN_ALREADY_DISCONNECTED, //< Wlan is already disconnected.
DEVICE_LOCKED, //< Device is locked
}; };
explicit CC3135(std::unique_ptr<ICC3135Iface> &&iface); explicit CC3135(std::unique_ptr<ICC3135Iface> &&iface);
...@@ -68,6 +69,9 @@ public: ...@@ -68,6 +69,9 @@ public:
CC3135::Error dummySend(); CC3135::Error dummySend();
CC3135::Error prepareForReset(); CC3135::Error prepareForReset();
CC3135::Error setApChannel(uint8_t ch);
CC3135::Error getStatus(uint16_t mask, uint8_t &status);
static const char *errorToStr(Error error); static const char *errorToStr(Error error);
...@@ -110,7 +114,9 @@ private: ...@@ -110,7 +114,9 @@ private:
// Part of the device API // 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); CC3135::Error wlanSetMode(CC3135Defs::Mode mode);
......
...@@ -46,12 +46,14 @@ enum OpCode : uint16_t ...@@ -46,12 +46,14 @@ enum OpCode : uint16_t
OPCODE_DEVICE_INITCOMPLETE = 0x0008, OPCODE_DEVICE_INITCOMPLETE = 0x0008,
OPCODE_DEVICE_ABORT = 0x000C, OPCODE_DEVICE_ABORT = 0x000C,
OPCODE_DEVICE_DEVICEASYNCDUMMY = 0x0063, OPCODE_DEVICE_DEVICEASYNCDUMMY = 0x0063,
OPCODE_DEVICE_DEVICE_ASYNC_GENERAL_ERROR = 0x0078,
OPCODE_DEVICE_DEVICEGETRESPONSE = 0x0466, OPCODE_DEVICE_DEVICEGETRESPONSE = 0x0466,
OPCODE_DEVICE_DEVICESETRESPONSE = 0x04B7, OPCODE_DEVICE_DEVICESETRESPONSE = 0x04B7,
OPCODE_WLAN_PROVISIONING_STATUS_ASYNC_EVENT = 0x089A, //< ???? OPCODE_WLAN_PROVISIONING_STATUS_ASYNC_EVENT = 0x089A, //< ????
OPCODE_WLAN_WLANDISCONNECTRESPONSE = 0x0C81, OPCODE_WLAN_WLANDISCONNECTRESPONSE = 0x0C81,
OPCODE_WLAN_POLICYSETRESPONSE = 0x0C86, OPCODE_WLAN_POLICYSETRESPONSE = 0x0C86,
OPCODE_WLAN_SET_MODE_RESPONSE = 0x0CB4, OPCODE_WLAN_SET_MODE_RESPONSE = 0x0CB4,
OPCODE_WLAN_CFG_SET_RESPONSE = 0x0CB5,
OPCODE_SOCKET_RECVASYNCRESPONSE = 0x100A, OPCODE_SOCKET_RECVASYNCRESPONSE = 0x100A,
OPCODE_SOCKET_SOCKETRESPONSE = 0x1401, OPCODE_SOCKET_SOCKETRESPONSE = 0x1401,
OPCODE_SOCKET_CLOSERESPONSE = 0x1402, OPCODE_SOCKET_CLOSERESPONSE = 0x1402,
...@@ -61,6 +63,7 @@ enum OpCode : uint16_t ...@@ -61,6 +63,7 @@ enum OpCode : uint16_t
OPCODE_WLAN_POLICYSETCOMMAND = 0x8C86, OPCODE_WLAN_POLICYSETCOMMAND = 0x8C86,
OPCODE_WLAN_WLANDISCONNECTCOMMAND = 0x8C81, OPCODE_WLAN_WLANDISCONNECTCOMMAND = 0x8C81,
OPCODE_WLAN_SET_MODE = 0x8CB4, OPCODE_WLAN_SET_MODE = 0x8CB4,
OPCODE_WLAN_CFG_SET = 0x8CB5,
OPCODE_SOCKET_SOCKET = 0x9401, OPCODE_SOCKET_SOCKET = 0x9401,
OPCODE_SOCKET_CLOSE = 0x9402, OPCODE_SOCKET_CLOSE = 0x9402,
OPCODE_SOCKET_RECV = 0x940A, OPCODE_SOCKET_RECV = 0x940A,
...@@ -80,6 +83,8 @@ inline const char *opToStr(OpCode op) ...@@ -80,6 +83,8 @@ inline const char *opToStr(OpCode op)
return "OPCODE_DEVICE_ABORT"; return "OPCODE_DEVICE_ABORT";
case OpCode::OPCODE_DEVICE_DEVICEASYNCDUMMY: case OpCode::OPCODE_DEVICE_DEVICEASYNCDUMMY:
return "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: case OpCode::OPCODE_DEVICE_DEVICEGETRESPONSE:
return "OPCODE_DEVICE_DEVICEGETRESPONSE"; return "OPCODE_DEVICE_DEVICEGETRESPONSE";
case OpCode::OPCODE_DEVICE_DEVICESETRESPONSE: case OpCode::OPCODE_DEVICE_DEVICESETRESPONSE:
...@@ -94,6 +99,8 @@ inline const char *opToStr(OpCode op) ...@@ -94,6 +99,8 @@ inline const char *opToStr(OpCode op)
return "OPCODE_WLAN_POLICYSETRESPONSE"; return "OPCODE_WLAN_POLICYSETRESPONSE";
case OpCode::OPCODE_WLAN_SET_MODE_RESPONSE: case OpCode::OPCODE_WLAN_SET_MODE_RESPONSE:
return "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: case OpCode::OPCODE_SOCKET_RECVASYNCRESPONSE:
return "OPCODE_SOCKET_RECVASYNCRESPONSE"; return "OPCODE_SOCKET_RECVASYNCRESPONSE";
case OpCode::OPCODE_SOCKET_SOCKETRESPONSE: case OpCode::OPCODE_SOCKET_SOCKETRESPONSE:
...@@ -110,6 +117,8 @@ inline const char *opToStr(OpCode op) ...@@ -110,6 +117,8 @@ inline const char *opToStr(OpCode op)
return "OPCODE_WLAN_WLANDISCONNECTCOMMAND"; return "OPCODE_WLAN_WLANDISCONNECTCOMMAND";
case OpCode::OPCODE_WLAN_SET_MODE: case OpCode::OPCODE_WLAN_SET_MODE:
return "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: case OpCode::OPCODE_SOCKET_SOCKET:
return "OPCODE_SOCKET_SOCKET"; return "OPCODE_SOCKET_SOCKET";
case OpCode::OPCODE_SOCKET_CLOSE: case OpCode::OPCODE_SOCKET_CLOSE:
...@@ -184,6 +193,26 @@ struct DeviceSetGet ...@@ -184,6 +193,26 @@ struct DeviceSetGet
constexpr uint16_t DEVICE_GENERAL = 1; constexpr uint16_t DEVICE_GENERAL = 1;
constexpr uint16_t DEVICE_GENERAL_VERSION = 12; 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 struct WlanSetMode
{ {
Mode mode; Mode mode;
......
...@@ -76,7 +76,7 @@ using irq = Gpio<GPIOA_BASE, 4>; ...@@ -76,7 +76,7 @@ using irq = Gpio<GPIOA_BASE, 4>;
using hib = Gpio<GPIOA_BASE, 5>; using hib = Gpio<GPIOA_BASE, 5>;
#define CC3135_UART USART2 #define CC3135_UART USART2
#define CC3135_HIB // #define CC3135_HIB
#else #else
using sck = Gpio<GPIOA_BASE, 5>; using sck = Gpio<GPIOA_BASE, 5>;
using miso = Gpio<GPIOB_BASE, 4>; using miso = Gpio<GPIOB_BASE, 4>;
...@@ -211,11 +211,14 @@ int main() ...@@ -211,11 +211,14 @@ int main()
{ {
printf("[cc3135] Failed to start cc3135 (error: %s), retrying...\n", printf("[cc3135] Failed to start cc3135 (error: %s), retrying...\n",
CC3135::errorToStr(result)); CC3135::errorToStr(result));
Thread::sleep(4000); Thread::sleep(1000);
miosix::reboot(); miosix::reboot();
} }
// cc3135->prepareForReset();
// cc3135->setApChannel(100);
printf("[cc3135] Initialization complete!\n"); printf("[cc3135] Initialization complete!\n");
CC3135Defs::DeviceVersion version = {}; CC3135Defs::DeviceVersion version = {};
...@@ -234,28 +237,32 @@ int main() ...@@ -234,28 +237,32 @@ int main()
while (true) while (true)
{ {
cc3135->startRecv(); // cc3135->dummySend();
Thread::sleep(1000); // cc3135->startRecv();
printf("[cc3135] Looping\n");
// 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);
cc3135->dummySend(); printf("[cc3135] Looping\n");
CHECK(cc3135->getVersion(version)); Thread::sleep(1000);
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);
} }
while (true)
;
// Thread::sleep(3000); // Thread::sleep(3000);
// miosix::reboot(); // miosix::reboot();
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment