X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb/blobdiff_plain/3e34d2cea8844557376669f4782f07f5085253c9..853cbce9b9a23201a048934b004ac04643f9c895:/hmuartlgw.c diff --git a/hmuartlgw.c b/hmuartlgw.c index ccb5dbc..2fa755c 100644 --- a/hmuartlgw.c +++ b/hmuartlgw.c @@ -39,7 +39,7 @@ #define HMUARTLGW_INIT_TIMEOUT 10000 -#define HMUARTLGW_SETTLE_TIME 2 +#define HMUARTLGW_SETTLE_TIME 1 static int debug = 0; @@ -106,7 +106,7 @@ static int hmuartlgw_init_parse(enum hmuartlgw_dst dst, uint8_t *buf, int buf_le switch(rdata->state) { case HMUARTLGW_QUERY_APPSTATE: - if ((buf[0] == 0x04) && (buf[1] == 0x02)) { + if ((buf[0] == HMUARTLGW_OS_ACK) && (buf[1] == 0x02)) { if (!strncmp(((char*)buf)+2, "Co_CPU_BL", 9)) { rdata->state = HMUARTLGW_BOOTLOADER; } else if (!strncmp(((char*)buf)+2, "Co_CPU_App", 10)) { @@ -116,7 +116,7 @@ static int hmuartlgw_init_parse(enum hmuartlgw_dst dst, uint8_t *buf, int buf_le break; case HMUARTLGW_ENTER_BOOTLOADER: if ((buf_len == 2) && - (buf[0] == 0x04) && + (buf[0] == HMUARTLGW_OS_ACK) && (buf[1] == 0x01)) { rdata->state = HMUARTLGW_ENTER_BOOTLOADER_ACK; } @@ -126,7 +126,7 @@ static int hmuartlgw_init_parse(enum hmuartlgw_dst dst, uint8_t *buf, int buf_le break; case HMUARTLGW_ENTER_APPLICATION: if ((buf_len == 2) && - (buf[0] == 0x04) && + (buf[0] == HMUARTLGW_OS_ACK) && (buf[1] == 0x01)) { rdata->state = HMUARTLGW_ENTER_APPLICATION_ACK; } @@ -142,7 +142,7 @@ static int hmuartlgw_init_parse(enum hmuartlgw_dst dst, uint8_t *buf, int buf_le return 1; } -struct hmuartlgw_dev *hmuart_init(char *device, hmuartlgw_cb_fn cb, void *data) +struct hmuartlgw_dev *hmuart_init(char *device, hmuartlgw_cb_fn cb, void *data, int app) { struct hmuartlgw_dev *dev = NULL; struct termios oldtio, tio; @@ -191,7 +191,11 @@ struct hmuartlgw_dev *hmuart_init(char *device, hmuartlgw_cb_fn cb, void *data) hmuartlgw_flush(dev); - hmuartlgw_enter_app(dev); + if (app) { + hmuartlgw_enter_app(dev); + } else { + hmuartlgw_enter_bootloader(dev); + } dev->cb = cb; dev->cb_data = data; @@ -329,7 +333,7 @@ int hmuartlgw_send_raw(struct hmuartlgw_dev *dev, uint8_t *frame, int framelen) int hmuartlgw_send(struct hmuartlgw_dev *dev, uint8_t *cmd, int cmdlen, enum hmuartlgw_dst dst) { static uint8_t cnt = 0; - uint8_t frame[1024] = { 0 }; + uint8_t frame[4096] = { 0 }; uint16_t crc; frame[0] = 0xfd; @@ -413,10 +417,8 @@ int hmuartlgw_poll(struct hmuartlgw_dev *dev, int timeout) return -1; } - crc = crc16(dev->buf, dev->pos - 2); - if ((((crc >> 8) & 0xff) == dev->buf[dev->pos - 2]) && - ((crc & 0xff) == dev->buf[dev->pos - 1])) { - + crc = crc16(dev->buf, dev->pos); + if (crc == 0x0000) { if (debug) hexdump(dev->buf, dev->pos, "UARTLGW > ");