1 #include <linux/wacom_i2c.h>
3 #include "wacom_i2c_flash.h"
5 int wacom_i2c_flash_chksum(struct wacom_i2c *wac_i2c, unsigned char *flash_data,
6 unsigned long *max_address)
9 unsigned long chksum = 0;
11 for (i = 0x0000; i <= *max_address; i++)
12 chksum += flash_data[i];
19 int wacom_i2c_flash_cmd(struct wacom_i2c *wac_i2c)
26 buf[1] = FLASH_START0;
27 buf[2] = FLASH_START1;
28 buf[3] = FLASH_START2;
29 buf[4] = FLASH_START3;
30 buf[5] = FLASH_START4;
31 buf[6] = FLASH_START5;
36 ret = wacom_i2c_master_send(wac_i2c->client, &flashq, len,
43 ret = wacom_i2c_master_recv(wac_i2c->client, &flashq,
49 } while (flashq == 0xff);
53 ret = i2c_master_send(wac_i2c->client, buf, len);
55 printk(KERN_ERR "Sending flash command failed\n");
58 printk(KERN_DEBUG "flash send?:%d\n", ret);
65 int wacom_i2c_flash_query(struct wacom_i2c *wac_i2c, u8 query, u8 recvdQuery)
73 ret = wacom_i2c_master_send(wac_i2c->client, &flashq, len,
76 printk(KERN_ERR "query unsent:%d\n", ret);
86 ret = wacom_i2c_master_recv(wac_i2c->client, &flashq, len,
92 printk(KERN_DEBUG "ret:%d flashq:%x\n", ret, flashq);
93 } while (recvdQuery == 0xff && flashq != recvdQuery);
94 printk(KERN_DEBUG "query:%x\n", flashq);
99 int wacom_i2c_flash_end(struct wacom_i2c *wac_i2c)
101 if (wacom_i2c_flash_query(wac_i2c, FLASH_END, FLASH_END) == -1)
102 return ERR_FAILED_EXIT;
103 printk(KERN_DEBUG "Digitizer activated\n");
107 int wacom_i2c_flash_enter(struct wacom_i2c *wac_i2c)
109 if (wacom_i2c_flash_query(wac_i2c, FLASH_QUERY, FLASH_ACK) == -1)
110 return ERR_NOT_FLASH;
114 int wacom_i2c_flash_BLVer(struct wacom_i2c *wac_i2c)
117 ret = wacom_i2c_flash_query(wac_i2c, FLASH_BLVER, 0x40);
124 int wacom_i2c_flash_mucId(struct wacom_i2c *wac_i2c)
128 ret = wacom_i2c_flash_query(wac_i2c, FLASH_MPU, 0x26);
135 int wacom_i2c_flash_erase(struct wacom_i2c *wac_i2c, u8 cmd_erase,
136 u8 cmd_block, u8 endBlock)
139 u8 buf[3], sum, block, flashq;
143 for (i = cmd_block; i >= endBlock; i--) {
156 ret = wacom_i2c_master_send(wac_i2c->client, buf, len,
159 printk(KERN_ERR "Erase failed\n");
170 ret = wacom_i2c_master_recv(wac_i2c->client, &flashq,
171 len, WACOM_I2C_BOOT);
174 if (j > RETRY || flashq == 0x84 || flashq == 0x88
175 || flashq == 0x8A || flashq == 0x90) {
179 0x88:Erase time parameter error
180 0x8A:Write time parameter error
183 printk(KERN_ERR "Error:%x\n", flashq);
186 } while (flashq == 0xff);
187 printk(KERN_DEBUG "Erasing at %d, ", i);
191 printk(KERN_DEBUG "Erasing done\n");
195 int wacom_i2c_flash_write(struct wacom_i2c *wac_i2c, unsigned long startAddr,
196 u8 size, unsigned long maxAddr)
198 unsigned long ulAddr;
203 u8 buf[WRITE_BUFF], bank;
208 for (ulAddr = startAddr; ulAddr <= maxAddr; ulAddr += BLOCK_SIZE_W) {
211 buf[0] = FLASH_WRITE;
212 buf[1] = (u8)(ulAddr & 0xff);
213 buf[2] = (u8)((ulAddr & 0xff00)>>8);
217 for (i = 0; i < 5; i++)
225 ret = wacom_i2c_master_send(wac_i2c->client, buf, len,
228 printk(KERN_ERR "Write process aborted\n");
229 return ERR_FAILED_ENTER;
237 ret = wacom_i2c_master_recv(wac_i2c->client, buf, len,
241 if (j > RETRY || buf[0] == 0x90) {
242 /*0xff:No data 0x90:Checksum error*/
243 printk(KERN_ERR "Error:%x\n", buf[0]);
246 } while (buf[0] == 0xff);
250 for (i = 0; i < BLOCK_SIZE_W; i++) {
251 buf[i] = Binary[ulAddr+i];
252 sum += Binary[ulAddr+i];
255 buf[BLOCK_SIZE_W] = sum;
256 len = BLOCK_SIZE_W+1;
258 ret = wacom_i2c_master_send(wac_i2c->client, buf, len,
261 printk(KERN_ERR "Firmware flash aborted while writing\n");
262 return ERR_NOT_FLASH;
271 ret = wacom_i2c_master_recv(wac_i2c->client, buf, len,
275 if (j > RETRY || buf[0] == 0x82 || buf[0] == 0x90) {
281 printk(KERN_ERR "Error:%x\n", buf[0]);
284 } while (buf[0] == 0xff);
285 printk(KERN_DEBUG "Written on:0x%lx", ulAddr);
288 printk(KERN_DEBUG "\nWriting done\n");
293 int wacom_i2c_flash_verify(struct wacom_i2c *wac_i2c, unsigned long startAddr,
294 u8 size, unsigned long maxAddr)
296 unsigned long ulAddr;
299 u8 buf[WRITE_BUFF], bank;
304 for (ulAddr = startAddr; ulAddr <= maxAddr; ulAddr += BLOCK_SIZE_W) {
307 buf[0] = FLASH_VERIFY;
308 buf[1] = (u8)(ulAddr & 0xff);
309 buf[2] = (u8)((ulAddr & 0xff00)>>8);
313 for (i = 0; i < 5; i++)
322 ret = wacom_i2c_master_send(wac_i2c->client, buf, len,
325 printk(KERN_ERR "Write process aborted\n");
326 return ERR_FAILED_ENTER;
333 ret = wacom_i2c_master_recv(wac_i2c->client, buf, len,
336 if (j > RETRY || buf[0] == 0x90) {
337 /*0xff:No data 0x90:Checksum error*/
338 printk(KERN_ERR "Error:%x\n", buf[0]);
341 } while (buf[0] == 0xff);
345 for (i = 0; i < BLOCK_SIZE_W; i++) {
346 buf[i] = Binary[ulAddr+i];
347 sum += Binary[ulAddr+i];
350 buf[BLOCK_SIZE_W] = sum;
351 len = BLOCK_SIZE_W+1;
353 ret = wacom_i2c_master_send(wac_i2c->client, buf, len,
356 printk(KERN_ERR "Firmware flash aborted while writing\n");
357 return ERR_NOT_FLASH;
365 ret = wacom_i2c_master_recv(wac_i2c->client, buf, len,
369 if (j > RETRY || buf[0] == 0x81 || buf[0] == 0x90) {
375 printk(KERN_ERR "Error:%x", buf[0]);
378 } while (buf[0] == 0xff);
379 printk(KERN_DEBUG "Verified:0x%lx", ulAddr);
382 printk("\nVerifying done\n");
388 int wacom_i2c_flash(struct wacom_i2c *wac_i2c)
391 unsigned long i, maxAddr;
392 ret = blver = mcu = 0;
395 ret = wacom_i2c_flash_cmd(wac_i2c);
397 ret = wacom_i2c_flash_enter(wac_i2c);
398 printk(KERN_DEBUG "flashEnter:%d\n", ret);
403 blver = wacom_i2c_flash_BLVer(wac_i2c);
404 printk(KERN_DEBUG "blver:%d\n", blver);
409 mcu = wacom_i2c_flash_mucId(wac_i2c);
410 printk(KERN_DEBUG "mcu:%d\n", mcu);
411 if (Mpu_type != mcu) {
412 wacom_i2c_flash_end(wac_i2c);
422 printk(KERN_DEBUG "flashing for w8501 started\n");
423 maxAddr = MAX_ADDR_W8501;
424 ret = wacom_i2c_flash_erase(wac_i2c, FLASH_ERASE,
425 MAX_BLOCK_W8501, END_BLOCK);
428 printk(KERN_DEBUG "erased:%d\n", ret);
432 ret = wacom_i2c_flash_write(wac_i2c, START_ADDR,
433 NUM_BLOCK_2WRITE, maxAddr);
439 ret = wacom_i2c_flash_verify(wac_i2c, START_ADDR,
440 NUM_BLOCK_2WRITE, maxAddr);
447 printk(KERN_DEBUG "Flashing for 514 started\n");
448 maxAddr = MAX_ADDR_514;
449 ret = wacom_i2c_flash_erase(wac_i2c, FLASH_ERASE,
450 MAX_BLOCK_514, END_BLOCK);
453 printk(KERN_DEBUG "erased:%d\n", ret);
457 ret = wacom_i2c_flash_write(wac_i2c, START_ADDR,
458 NUM_BLOCK_2WRITE, maxAddr);
464 ret = wacom_i2c_flash_verify(wac_i2c, START_ADDR,
465 NUM_BLOCK_2WRITE, maxAddr);
472 printk(KERN_DEBUG "default called\n");
477 ret = wacom_i2c_flash_end(wac_i2c);
478 printk(KERN_DEBUG "Firmware successfully updated:%x\n", ret);