static int as102_firmware_upload(struct as10x_bus_adapter_t *bus_adap, unsigned char *cmd, const struct firmware *firmware) { struct as10x_fw_pkt_t fw_pkt; int total_read_bytes = 0, errno = 0; unsigned char addr_has_changed = 0; ENTER(); for (total_read_bytes = 0; total_read_bytes < firmware->size; ) { int read_bytes = 0, data_len = 0; read_bytes = parse_hex_line( (u8 *) (firmware->data + total_read_bytes), fw_pkt.raw.address, fw_pkt.raw.data, &data_len, &addr_has_changed); if (read_bytes <= 0) goto error; total_read_bytes += read_bytes; if (total_read_bytes == firmware->size) { fw_pkt.u.request[0] = 0x00; fw_pkt.u.request[1] = 0x03; errno = bus_adap->ops->upload_fw_pkt(bus_adap, (uint8_t *) &fw_pkt, 2, 0); if (errno < 0) goto error; } else { if (!addr_has_changed) { fw_pkt.u.request[0] = 0x00; fw_pkt.u.request[1] = 0x01; data_len += sizeof(fw_pkt.u.request); data_len += sizeof(fw_pkt.raw.address); errno = bus_adap->ops->upload_fw_pkt(bus_adap, (uint8_t *) &fw_pkt, data_len, 0); if (errno < 0) goto error; } } } error: LEAVE(); return (errno == 0) ? total_read_bytes : errno; }
static int as102_firmware_upload(struct as10x_bus_adapter_t *bus_adap, unsigned char *cmd, const struct firmware *firmware) { struct as10x_fw_pkt_t fw_pkt; int total_read_bytes = 0, errno = 0; unsigned char addr_has_changed = 0; for (total_read_bytes = 0; total_read_bytes < firmware->size; ) { int read_bytes = 0, data_len = 0; /* parse intel hex line */ read_bytes = parse_hex_line( (u8 *) (firmware->data + total_read_bytes), fw_pkt.raw.address, fw_pkt.raw.data, &data_len, &addr_has_changed); if (read_bytes <= 0) goto error; /* detect the end of file */ total_read_bytes += read_bytes; if (total_read_bytes == firmware->size) { fw_pkt.u.request[0] = 0x00; fw_pkt.u.request[1] = 0x03; /* send EOF command */ errno = bus_adap->ops->upload_fw_pkt(bus_adap, (uint8_t *) &fw_pkt, 2, 0); if (errno < 0) goto error; } else { if (!addr_has_changed) { /* prepare command to send */ fw_pkt.u.request[0] = 0x00; fw_pkt.u.request[1] = 0x01; data_len += sizeof(fw_pkt.u.request); data_len += sizeof(fw_pkt.raw.address); /* send cmd to device */ errno = bus_adap->ops->upload_fw_pkt(bus_adap, (uint8_t *) &fw_pkt, data_len, 0); if (errno < 0) goto error; } } } error: return (errno == 0) ? total_read_bytes : errno; }