Thread (2 messages) 2 messages, 2 authors, 2021-07-23

Re: [PATCH] Input: ilitek_ts_i2c - support firmware update

From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date: 2021-07-23 19:50:10
Also in: linux-devicetree

Hi Joe,

On Tue, May 11, 2021 at 10:05:06PM +0800, Joe Hung wrote:
+static int ilitek_parse_hex(struct ilitek_ts_data *ts, u32 *fw_size, u8 *fw_buf)
+{
+	int error;
+	char *fw_file;
+	const struct firmware *fw;
+	struct device *dev = &ts->client->dev;
+	u32 i, len, addr, type, exaddr = 0;
+	u8 info[4], data[16];
+
+	fw_file = kasprintf(GFP_KERNEL, "ilitek_%04x.hex", ts->mcu_ver);
+	if (!fw_file)
+		return -ENOMEM;
+
+	error = request_firmware(&fw, fw_file, dev);
+	kfree(fw_file);
+	if (error) {
+		dev_err(dev, "request firmware:%s failed, ret:%d\n",
+			fw_file, error);
+		return error;
+	}
+
+	for (i = 0; i < fw->size; i++) {
+		if (fw->data[i] == ':' ||
+		    fw->data[i] == 0x0D ||
+		    fw->data[i] == 0x0A)
+			continue;
+
+		error = hex2bin(info, fw->data + i, sizeof(info));
+		if (error)
+			goto release_fw;
+
+		len = info[0];
+		addr = get_unaligned_be16(info + 1);
+		type = info[3];
+
+		error = hex2bin(data, fw->data + i + 8, len);
+		if (error)
+			goto release_fw;
+
+		switch (type) {
+		case 0x01:
+			goto release_fw;
+		case 0x02:
+			exaddr = get_unaligned_be16(data);
+			exaddr <<= 4;
+			break;
+		case 0x04:
+			exaddr = get_unaligned_be16(data);
+			exaddr <<= 16;
+			break;
+		case 0xAC:
+		case 0xAD:
+			break;
+		case 0x00:
+			addr += exaddr;
+			memcpy(fw_buf + addr, data, len);
+			*fw_size = addr + len;
+			break;
+		default:
+			dev_err(dev, "unexpected type:%x in hex\n", type);
+			goto err_invalid;
+		}
This looks like ihex. Is it? If so we have request_ihex_firmware() and
ihex2fw tool to convertihex firmware to compact binary format. Please
use it.

Thanks.

-- 
Dmitry
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help