]> git.zerfleddert.de Git - hmcfgusb/blobdiff - hmuartlgw.c
flash-hmmoduart: add utility to upgrade firmware on HM-MOD-UART
[hmcfgusb] / hmuartlgw.c
index ccb5dbc5eed1e78922448174d6fb9b2b207650d3..2fa755c03eb9c880c4c7ca5db00080a0b16bfa39 100644 (file)
@@ -39,7 +39,7 @@
 
 #define HMUARTLGW_INIT_TIMEOUT 10000
 
 
 #define HMUARTLGW_INIT_TIMEOUT 10000
 
-#define HMUARTLGW_SETTLE_TIME  2
+#define HMUARTLGW_SETTLE_TIME  1
 
 static int debug = 0;
 
 
 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:
 
        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)) {
                                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) &&
                        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;
                        }
                            (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) &&
                        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;
                        }
                            (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;
 }
 
         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;
 {
        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_flush(dev);
 
-       hmuartlgw_enter_app(dev);
+       if (app) {
+               hmuartlgw_enter_app(dev);
+       } else {
+               hmuartlgw_enter_bootloader(dev);
+       }
 
        dev->cb = cb;
        dev->cb_data = data;
 
        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;
 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;
        uint16_t crc;
 
        frame[0] = 0xfd;
@@ -413,10 +417,8 @@ int hmuartlgw_poll(struct hmuartlgw_dev *dev, int timeout)
                return -1;
        }
 
                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 > ");
 
                if (debug)
                        hexdump(dev->buf, dev->pos, "UARTLGW > ");
 
Impressum, Datenschutz