summaryrefslogtreecommitdiff
path: root/libtwn3.c
diff options
context:
space:
mode:
Diffstat (limited to 'libtwn3.c')
-rw-r--r--libtwn3.c74
1 files changed, 69 insertions, 5 deletions
diff --git a/libtwn3.c b/libtwn3.c
index 4d862cd..e9a70bc 100644
--- a/libtwn3.c
+++ b/libtwn3.c
@@ -163,6 +163,7 @@ ssize_t twn3_sync_command(int fd, uint8_t flags, uint8_t* cmd, size_t cmd_len, u
}
int twn3_sync_restart(int fd, uint8_t flags){
+ //TODO stop auto-started continuous mode
ssize_t bytes = twn3_sync_command(fd, flags, (uint8_t*) "x", 1, NULL, 0);
return (bytes >= 2) ? 0 : -1;
}
@@ -184,11 +185,11 @@ int twn3_sync_read_version(int fd, uint8_t flags, char* version, size_t max_leng
int twn3_sync_read_eeprom(int fd, uint8_t flags, uint8_t reg, uint8_t* value){
char data[6];
- ssize_t bytes;
+ ssize_t bytes = 0;
snprintf(data, sizeof(data) - 1, "re%02X", reg);
bytes = twn3_sync_command(fd, flags, (uint8_t*) data, 4, (uint8_t*) data, 4);
- if(bytes){
+ if(bytes > 0){
data[2] = 0;
if(value){
*value = strtoul(data, NULL, 16);
@@ -200,7 +201,7 @@ int twn3_sync_read_eeprom(int fd, uint8_t flags, uint8_t reg, uint8_t* value){
int twn3_sync_write_eeprom(int fd, uint8_t flags, uint8_t reg, uint8_t value){
char data[8];
- ssize_t bytes;
+ ssize_t bytes = 0;
snprintf(data, sizeof(data) - 1, "we%02X%02X", reg, value);
if(reg > 0x14){
@@ -209,7 +210,7 @@ int twn3_sync_write_eeprom(int fd, uint8_t flags, uint8_t reg, uint8_t value){
bytes = twn3_sync_command(fd, flags, (uint8_t*) data, 6, (uint8_t*) data, 4);
//failure may return `F\r\n`, which is also valid hex - genius!
- if(bytes && data[1] != '\r'){
+ if(bytes > 0 && data[1] != '\r'){
data[2] = 0;
bytes = strtoul(data, NULL, 16);
return (bytes == value) ? 0 : -1;
@@ -234,7 +235,7 @@ int twn3_sync_storekey(int fd, uint8_t flags, uint8_t keyid, uint8_t key[6]){
int twn3_sync_antenna(int fd, uint8_t flags, uint8_t enable){
uint8_t data[5];
- ssize_t bytes;
+ ssize_t bytes = 0;
if(enable){
bytes = twn3_sync_command(fd, flags, (uint8_t*) "pon", 3, data, sizeof(data));
@@ -245,3 +246,66 @@ int twn3_sync_antenna(int fd, uint8_t flags, uint8_t enable){
return (bytes > 2 && data[0] == 'P') ? 0 : -1;
}
+
+int twn3_sync_select_first(int fd, uint8_t flags, uint8_t* type, uint8_t* serial, size_t* length);
+int twn3_sync_list(int fd, uint8_t flags, uint8_t* type, uint8_t* serial, size_t* length);
+int twn3_sync_select(int fd, uint8_t flags, uint8_t* type, uint8_t* serial, size_t* length);
+int twn3_sync_auth(int fd, uint8_t flags, uint8_t key_a, uint8_t block, uint8_t key[6]);
+int twn3_sync_auth_stored(int fd, uint8_t flags, uint8_t key_a, uint8_t block, uint8_t key_id);
+
+static inline uint8_t hex_nibble(char in){
+ if(in <= 39){
+ return in & 0x0F;
+ }
+ if(in <= 46){
+ return in - 55;
+ }
+ return in - 87;
+}
+
+int twn3_sync_read(int fd, uint8_t flags, uint8_t block, uint8_t* values, size_t max_len){
+ char data[40];
+ ssize_t bytes;
+ unsigned u;
+ snprintf(data, sizeof(data) - 1, "r%02X", block);
+
+ bytes = twn3_sync_command(fd, flags, (uint8_t*) data, 3, (uint8_t*) data, sizeof(data));
+ if(bytes > 0){
+ if(bytes > 10){
+ //convert ascii hex representation
+ for(u = 0; u < max_len && bytes > 2 * u; u++){
+ if(!isxdigit(data[u * 2]) || !isxdigit(data[(u * 2) + 1])){
+ return -1;
+ }
+
+ values[u] = (hex_nibble(data[u * 2]) << 4) | hex_nibble(data[(u * 2) + 1]);
+ }
+ return u;
+ }
+ else{
+ return 0;
+ }
+ }
+ return -1;
+}
+
+int twn3_sync_write(int fd, uint8_t flags, uint8_t block, uint8_t value[16]){
+ char data[40];
+ ssize_t bytes;
+ snprintf(data, sizeof(data) - 1, "w%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
+ block,
+ value[0], value[1], value[2], value[3],
+ value[4], value[5], value[6], value[7],
+ value[8], value[9], value[10], value[11],
+ value[12], value[13], value[14], value[15]);
+
+ bytes = twn3_sync_command(fd, flags, (uint8_t*) data, 19, (uint8_t*) data, sizeof(data));
+ if(bytes > 0){
+ if(data[1] != '\r'){
+ return 0;
+ }
+ return 1;
+ }
+ return -1;
+}
+