LED board improvements and cleanup
This commit is contained in:
222
board/led15093-cmd.h
Normal file
222
board/led15093-cmd.h
Normal file
@ -0,0 +1,222 @@
|
||||
#pragma once
|
||||
|
||||
#include "board/led15093-frame.h"
|
||||
|
||||
/* Command IDs */
|
||||
|
||||
enum {
|
||||
LED_15093_CMD_RESET = 0x10,
|
||||
LED_15093_CMD_SET_TIMEOUT = 0x11,
|
||||
LED_15093_CMD_UNK1 = 0x12,
|
||||
LED_15093_CMD_SET_DISABLE_RESPONSE = 0x14,
|
||||
LED_15093_CMD_SET_ID = 0x18,
|
||||
LED_15093_CMD_CLEAR_ID = 0x19,
|
||||
LED_15093_CMD_SET_MAX_BRIGHT = 0x3F, // TODO
|
||||
LED_15093_CMD_UPDATE_LED = 0x80,
|
||||
LED_15093_CMD_SET_LED = 0x81,
|
||||
LED_15093_CMD_SET_IMM_LED = 0x82,
|
||||
LED_15093_CMD_SET_FADE_LED = 0x83,
|
||||
LED_15093_CMD_SET_FADE_LEVEL = 0x84,
|
||||
LED_15093_CMD_SET_FADE_SHIFT = 0x85,
|
||||
LED_15093_CMD_SET_AUTO_SHIFT = 0x86,
|
||||
LED_15093_CMD_GET_BOARD_INFO = 0xF0,
|
||||
LED_15093_CMD_GET_BOARD_STATUS = 0xF1,
|
||||
LED_15093_CMD_GET_FW_SUM = 0xF2,
|
||||
LED_15093_CMD_GET_PROTOCOL_VER = 0xF3,
|
||||
LED_15093_CMD_SET_BOOTMODE = 0xFD,
|
||||
LED_15093_CMD_FW_UPDATE = 0xFE,
|
||||
};
|
||||
|
||||
/* Response codes */
|
||||
|
||||
enum {
|
||||
LED_15093_STATUS_OK = 0x01,
|
||||
LED_15093_STATUS_ERR_SUM = 0x02,
|
||||
LED_15093_STATUS_ERR_PARITY = 0x03,
|
||||
LED_15093_STATUS_ERR_FRAMING = 0x04,
|
||||
LED_15093_STATUS_ERR_OVERRUN = 0x05,
|
||||
LED_15093_STATUS_ERR_BUFFER_OVERFLOW = 0x06,
|
||||
};
|
||||
|
||||
enum {
|
||||
LED_15093_REPORT_OK = 0x01,
|
||||
LED_15093_REPORT_WAIT = 0x02,
|
||||
LED_15093_REPORT_ERR1 = 0x03,
|
||||
LED_15093_REPORT_ERR2 = 0x04,
|
||||
};
|
||||
|
||||
/* Status bitmasks */
|
||||
|
||||
enum {
|
||||
LED_15093_STATUS_UART_ERR_SUM = 0x01,
|
||||
LED_15093_STATUS_UART_ERR_PARITY = 0x02,
|
||||
LED_15093_STATUS_UART_ERR_FRAMING = 0x04,
|
||||
LED_15093_STATUS_UART_ERR_OVERRUN = 0x08,
|
||||
LED_15093_STATUS_UART_ERR_BUFFER_OVERFLOW = 0x10,
|
||||
};
|
||||
|
||||
enum {
|
||||
LED_15093_STATUS_BOARD_ERR_WDT = 0x01,
|
||||
LED_15093_STATUS_BOARD_ERR_TIMEOUT = 0x02,
|
||||
LED_15093_STATUS_BOARD_ERR_RESET = 0x04,
|
||||
LED_15093_STATUS_BOARD_ERR_BOR = 0x08,
|
||||
};
|
||||
|
||||
enum {
|
||||
LED_15093_STATUS_CMD_ERR_BUSY = 0x01,
|
||||
LED_15093_STATUS_CMD_ERR_UNKNOWN = 0x02,
|
||||
LED_15093_STATUS_CMD_ERR_PARAM = 0x04,
|
||||
LED_15093_STATUS_CMD_ERR_EXE = 0x08,
|
||||
};
|
||||
|
||||
/* Status types for internal use */
|
||||
|
||||
enum {
|
||||
LED_15093_STATUS_TYPE_BOARD = 1,
|
||||
LED_15093_STATUS_TYPE_UART = 2,
|
||||
LED_15093_STATUS_TYPE_CMD = 3,
|
||||
};
|
||||
|
||||
/* Request data structures */
|
||||
|
||||
struct led15093_req_reset {
|
||||
struct led15093_req_hdr hdr;
|
||||
uint8_t cmd;
|
||||
uint8_t r_type;
|
||||
};
|
||||
|
||||
struct led15093_req_set_timeout {
|
||||
struct led15093_req_hdr hdr;
|
||||
uint8_t cmd;
|
||||
uint8_t count;
|
||||
};
|
||||
|
||||
struct led15093_req_set_disable_response {
|
||||
struct led15093_req_hdr hdr;
|
||||
uint8_t cmd;
|
||||
bool sw;
|
||||
};
|
||||
|
||||
struct led15093_req_set_id {
|
||||
struct led15093_req_hdr hdr;
|
||||
uint8_t cmd;
|
||||
uint8_t id;
|
||||
};
|
||||
|
||||
struct led15093_req_set_led {
|
||||
struct led15093_req_hdr hdr;
|
||||
uint8_t cmd;
|
||||
uint8_t data[198];
|
||||
};
|
||||
|
||||
struct led15093_req_set_fade_level {
|
||||
struct led15093_req_hdr hdr;
|
||||
uint8_t cmd;
|
||||
uint8_t depth;
|
||||
uint8_t cycle;
|
||||
};
|
||||
|
||||
struct led15093_req_set_fade_shift {
|
||||
struct led15093_req_hdr hdr;
|
||||
uint8_t cmd;
|
||||
uint8_t target;
|
||||
};
|
||||
|
||||
struct led15093_req_set_auto_shift {
|
||||
struct led15093_req_hdr hdr;
|
||||
uint8_t cmd;
|
||||
uint8_t count;
|
||||
uint8_t target;
|
||||
};
|
||||
|
||||
struct led15093_req_get_board_status {
|
||||
struct led15093_req_hdr hdr;
|
||||
uint8_t cmd;
|
||||
bool clear;
|
||||
};
|
||||
|
||||
union led15093_req_any {
|
||||
struct led15093_req_hdr hdr;
|
||||
struct led15093_req_reset reset;
|
||||
struct led15093_req_set_timeout set_timeout;
|
||||
struct led15093_req_set_disable_response set_disable_response;
|
||||
struct led15093_req_set_id set_id;
|
||||
struct led15093_req_set_led set_led;
|
||||
struct led15093_req_set_fade_level set_fade_level;
|
||||
struct led15093_req_set_fade_shift set_fade_shift;
|
||||
struct led15093_req_set_auto_shift set_auto_shift;
|
||||
struct led15093_req_get_board_status get_board_status;
|
||||
uint8_t payload[256];
|
||||
};
|
||||
|
||||
/* Response data structures */
|
||||
|
||||
struct led15093_resp_any {
|
||||
struct led15093_resp_hdr hdr;
|
||||
uint8_t status;
|
||||
uint8_t cmd;
|
||||
uint8_t report;
|
||||
uint8_t data[32];
|
||||
};
|
||||
|
||||
struct led15093_resp_timeout {
|
||||
struct led15093_resp_hdr hdr;
|
||||
uint8_t status;
|
||||
uint8_t cmd;
|
||||
uint8_t report;
|
||||
uint8_t count_upper;
|
||||
uint8_t count_lower;
|
||||
};
|
||||
|
||||
struct led15093_resp_fw_sum {
|
||||
struct led15093_resp_hdr hdr;
|
||||
uint8_t status;
|
||||
uint8_t cmd;
|
||||
uint8_t report;
|
||||
uint8_t sum_upper;
|
||||
uint8_t sum_lower;
|
||||
};
|
||||
|
||||
struct led15093_resp_board_info_legacy {
|
||||
struct led15093_resp_hdr hdr;
|
||||
uint8_t status;
|
||||
uint8_t cmd;
|
||||
uint8_t report;
|
||||
char board_num[8];
|
||||
uint8_t lf; // 0x0A (ASCII LF)
|
||||
char chip_num[5];
|
||||
uint8_t endcode; // Always 0xFF
|
||||
uint8_t fw_ver;
|
||||
};
|
||||
|
||||
struct led15093_resp_board_info {
|
||||
struct led15093_resp_hdr hdr;
|
||||
uint8_t status;
|
||||
uint8_t cmd;
|
||||
uint8_t report;
|
||||
char board_num[8];
|
||||
uint8_t lf; // 0x0A (ASCII LF)
|
||||
char chip_num[5];
|
||||
uint8_t endcode; // Always 0xFF
|
||||
uint8_t fw_ver;
|
||||
uint8_t rx_buf;
|
||||
};
|
||||
|
||||
struct led15093_resp_protocol_ver {
|
||||
struct led15093_resp_hdr hdr;
|
||||
uint8_t status;
|
||||
uint8_t cmd;
|
||||
uint8_t report;
|
||||
uint8_t mode;
|
||||
uint8_t major_ver;
|
||||
uint8_t minor_ver;
|
||||
};
|
||||
|
||||
struct led15093_resp_set_auto_shift {
|
||||
struct led15093_resp_hdr hdr;
|
||||
uint8_t status;
|
||||
uint8_t cmd;
|
||||
uint8_t report;
|
||||
uint8_t count;
|
||||
uint8_t target;
|
||||
};
|
@ -5,13 +5,13 @@
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "board/led1509306-frame.h"
|
||||
#include "board/led15093-frame.h"
|
||||
|
||||
#include "hook/iobuf.h"
|
||||
|
||||
static void led1509306_frame_sync(struct iobuf *src);
|
||||
static HRESULT led1509306_frame_accept(const struct iobuf *dest);
|
||||
static HRESULT led1509306_frame_encode_byte(struct iobuf *dest, uint8_t byte);
|
||||
static void led15093_frame_sync(struct iobuf *src);
|
||||
static HRESULT led15093_frame_accept(const struct iobuf *dest);
|
||||
static HRESULT led15093_frame_encode_byte(struct iobuf *dest, uint8_t byte);
|
||||
|
||||
/* Frame structure:
|
||||
|
||||
@ -34,17 +34,17 @@ static HRESULT led1509306_frame_encode_byte(struct iobuf *dest, uint8_t byte);
|
||||
|
||||
0xD0 is an escape byte. Un-escape the subsequent byte by adding 1. */
|
||||
|
||||
static void led1509306_frame_sync(struct iobuf *src)
|
||||
static void led15093_frame_sync(struct iobuf *src)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0 ; i < src->pos && src->bytes[i] != 0xE0 ; i++);
|
||||
for (i = 0 ; i < src->pos && src->bytes[i] != LED_15093_FRAME_SYNC ; i++);
|
||||
|
||||
src->pos -= i;
|
||||
memmove(&src->bytes[0], &src->bytes[i], i);
|
||||
}
|
||||
|
||||
static HRESULT led1509306_frame_accept(const struct iobuf *dest)
|
||||
static HRESULT led15093_frame_accept(const struct iobuf *dest)
|
||||
{
|
||||
uint8_t checksum;
|
||||
size_t i;
|
||||
@ -58,9 +58,9 @@ static HRESULT led1509306_frame_accept(const struct iobuf *dest)
|
||||
for (i = 1 ; i < dest->pos - 1 ; i++) {
|
||||
checksum += dest->bytes[i];
|
||||
}
|
||||
|
||||
//dprintf("LED checksum %02x, expected %02x\n", checksum, dest->bytes[dest->pos - 1]);
|
||||
|
||||
|
||||
// dprintf("LED checksum %02x, expected %02x\n", checksum, dest->bytes[dest->pos - 1]);
|
||||
|
||||
if (checksum != dest->bytes[dest->pos - 1]) {
|
||||
return HRESULT_FROM_WIN32(ERROR_CRC);
|
||||
}
|
||||
@ -68,7 +68,7 @@ static HRESULT led1509306_frame_accept(const struct iobuf *dest)
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT led1509306_frame_decode(struct iobuf *dest, struct iobuf *src)
|
||||
HRESULT led15093_frame_decode(struct iobuf *dest, struct iobuf *src)
|
||||
{
|
||||
uint8_t byte;
|
||||
bool escape;
|
||||
@ -82,7 +82,7 @@ HRESULT led1509306_frame_decode(struct iobuf *dest, struct iobuf *src)
|
||||
assert(src->bytes != NULL || src->nbytes == 0);
|
||||
assert(src->pos <= src->nbytes);
|
||||
|
||||
led1509306_frame_sync(src);
|
||||
led15093_frame_sync(src);
|
||||
|
||||
dest->pos = 0;
|
||||
escape = false;
|
||||
@ -96,9 +96,9 @@ HRESULT led1509306_frame_decode(struct iobuf *dest, struct iobuf *src)
|
||||
hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
|
||||
} else if (i == 0) {
|
||||
dest->bytes[dest->pos++] = byte;
|
||||
} else if (byte == 0xE0) {
|
||||
} else if (byte == LED_15093_FRAME_SYNC) {
|
||||
hr = E_FAIL;
|
||||
} else if (byte == 0xD0) {
|
||||
} else if (byte == LED_15093_FRAME_ESC) {
|
||||
if (escape) {
|
||||
hr = E_FAIL;
|
||||
}
|
||||
@ -114,7 +114,7 @@ HRESULT led1509306_frame_decode(struct iobuf *dest, struct iobuf *src)
|
||||
/* Try to accept the packet we've built up so far */
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
hr = led1509306_frame_accept(dest);
|
||||
hr = led15093_frame_accept(dest);
|
||||
}
|
||||
}
|
||||
|
||||
@ -129,7 +129,7 @@ HRESULT led1509306_frame_decode(struct iobuf *dest, struct iobuf *src)
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT led1509306_frame_encode(
|
||||
HRESULT led15093_frame_encode(
|
||||
struct iobuf *dest,
|
||||
const void *ptr,
|
||||
size_t nbytes)
|
||||
@ -147,22 +147,24 @@ HRESULT led1509306_frame_encode(
|
||||
|
||||
src = ptr;
|
||||
|
||||
assert(nbytes >= 3 && src[0] == 0xE0 && src[3] + 4 == nbytes);
|
||||
assert(nbytes >= 3 &&
|
||||
src[0] == LED_15093_FRAME_SYNC &&
|
||||
src[3] + 4 == nbytes);
|
||||
|
||||
if (dest->pos >= dest->nbytes) {
|
||||
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
|
||||
}
|
||||
|
||||
dest->bytes[dest->pos++] = 0xE0;
|
||||
dest->bytes[dest->pos++] = LED_15093_FRAME_SYNC;
|
||||
checksum = 0;
|
||||
// dprintf("%02x ", 0xe0);
|
||||
// dprintf("%02x ", LED_15093_FRAME_SYNC);
|
||||
|
||||
for (i = 1 ; i < nbytes ; i++) {
|
||||
byte = src[i];
|
||||
checksum += byte;
|
||||
// dprintf("%02x ", byte);
|
||||
|
||||
hr = led1509306_frame_encode_byte(dest, byte);
|
||||
hr = led15093_frame_encode_byte(dest, byte);
|
||||
|
||||
if (FAILED(hr)) {
|
||||
return hr;
|
||||
@ -170,17 +172,17 @@ HRESULT led1509306_frame_encode(
|
||||
}
|
||||
// dprintf("%02x \n", checksum);
|
||||
|
||||
return led1509306_frame_encode_byte(dest, checksum);
|
||||
return led15093_frame_encode_byte(dest, checksum);
|
||||
}
|
||||
|
||||
static HRESULT led1509306_frame_encode_byte(struct iobuf *dest, uint8_t byte)
|
||||
static HRESULT led15093_frame_encode_byte(struct iobuf *dest, uint8_t byte)
|
||||
{
|
||||
if (byte == 0xE0 || byte == 0xD0) {
|
||||
if (byte == LED_15093_FRAME_SYNC || byte == LED_15093_FRAME_ESC) {
|
||||
if (dest->pos + 2 > dest->nbytes) {
|
||||
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
|
||||
}
|
||||
|
||||
dest->bytes[dest->pos++] = 0xD0;
|
||||
dest->bytes[dest->pos++] = LED_15093_FRAME_ESC;
|
||||
dest->bytes[dest->pos++] = byte - 1;
|
||||
} else {
|
||||
if (dest->pos + 1 > dest->nbytes) {
|
34
board/led15093-frame.h
Normal file
34
board/led15093-frame.h
Normal file
@ -0,0 +1,34 @@
|
||||
#pragma once
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "hook/iobuf.h"
|
||||
|
||||
enum {
|
||||
LED_15093_FRAME_SYNC = 0xE0,
|
||||
LED_15093_FRAME_ESC = 0xD0,
|
||||
};
|
||||
|
||||
struct led15093_req_hdr {
|
||||
uint8_t sync;
|
||||
uint8_t dest_adr;
|
||||
uint8_t src_adr;
|
||||
uint8_t nbytes;
|
||||
};
|
||||
|
||||
struct led15093_resp_hdr {
|
||||
uint8_t sync;
|
||||
uint8_t dest_adr;
|
||||
uint8_t src_adr;
|
||||
uint8_t nbytes;
|
||||
};
|
||||
|
||||
HRESULT led15093_frame_decode(struct iobuf *dest, struct iobuf *src);
|
||||
|
||||
HRESULT led15093_frame_encode(
|
||||
struct iobuf *dest,
|
||||
const void *ptr,
|
||||
size_t nbytes);
|
1112
board/led15093.c
Normal file
1112
board/led15093.c
Normal file
File diff suppressed because it is too large
Load Diff
22
board/led15093.h
Normal file
22
board/led15093.h
Normal file
@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
struct led15093_config {
|
||||
bool enable;
|
||||
bool high_baudrate;
|
||||
unsigned int port_no[2];
|
||||
char board_number[8];
|
||||
char chip_number[5];
|
||||
char boot_chip_number[5];
|
||||
uint8_t fw_ver;
|
||||
uint16_t fw_sum;
|
||||
};
|
||||
|
||||
HRESULT led15093_hook_init(
|
||||
const struct led15093_config *cfg,
|
||||
unsigned int port_no_0,
|
||||
unsigned int port_no_1);
|
@ -1,45 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "board/led1509306-frame.h"
|
||||
|
||||
enum {
|
||||
LED_15093_06_CMD_RESET = 0x10,
|
||||
LED_15093_06_CMD_SET_TIMEOUT = 0x11,
|
||||
LED_15093_06_CMD_SET_DISABLE_RESPONSE = 0x14,
|
||||
LED_15093_06_CMD_SET_LED = 0x82,
|
||||
LED_15093_06_CMD_SET_LED_COUNT = 0x86,
|
||||
LED_15093_06_CMD_BOARD_INFO = 0xF0,
|
||||
LED_15093_06_CMD_BOARD_STATUS = 0xF1,
|
||||
LED_15093_06_CMD_FW_SUM = 0xF2,
|
||||
LED_15093_06_CMD_PROTOCOL_VER = 0xF3,
|
||||
LED_15093_06_CMD_BOOTLOADER = 0xFD,
|
||||
};
|
||||
|
||||
struct led1509306_req_any {
|
||||
struct led1509306_hdr hdr;
|
||||
uint8_t cmd;
|
||||
uint8_t payload[256];
|
||||
};
|
||||
|
||||
struct led1509306_resp_any {
|
||||
struct led1509306_hdr hdr;
|
||||
uint8_t status;
|
||||
uint8_t cmd;
|
||||
uint8_t report;
|
||||
uint8_t data[32];
|
||||
};
|
||||
|
||||
struct led1509306_resp_board_info {
|
||||
struct led1509306_hdr hdr;
|
||||
uint8_t status;
|
||||
uint8_t cmd;
|
||||
uint8_t report;
|
||||
struct {
|
||||
char board_num[8];
|
||||
uint8_t _0a;
|
||||
char chip_num[5];
|
||||
uint8_t _ff;
|
||||
uint8_t fw_ver;
|
||||
// may be some more data after this that isn't checked
|
||||
} data;
|
||||
};
|
@ -1,26 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "hook/iobuf.h"
|
||||
|
||||
enum {
|
||||
LED_15093_06_FRAME_SYNC = 0xE0,
|
||||
};
|
||||
|
||||
struct led1509306_hdr {
|
||||
uint8_t sync;
|
||||
uint8_t dest_adr;
|
||||
uint8_t src_adr;
|
||||
uint8_t nbytes;
|
||||
};
|
||||
|
||||
HRESULT led1509306_frame_decode(struct iobuf *dest, struct iobuf *src);
|
||||
|
||||
HRESULT led1509306_frame_encode(
|
||||
struct iobuf *dest,
|
||||
const void *ptr,
|
||||
size_t nbytes);
|
@ -20,9 +20,11 @@ board_lib = static_library(
|
||||
'io3.h',
|
||||
'io4.c',
|
||||
'io4.h',
|
||||
'led1509306-cmd.h',
|
||||
'led1509306-frame.c',
|
||||
'led1509306-frame.h',
|
||||
'led15093-cmd.h',
|
||||
'led15093-frame.c',
|
||||
'led15093-frame.h',
|
||||
'led15093.c',
|
||||
'led15093.h',
|
||||
'sg-cmd.c',
|
||||
'sg-cmd.h',
|
||||
'sg-frame.c',
|
||||
|
Reference in New Issue
Block a user