int GetBLVersion(struct wacom_i2c *wac_i2c, int *pBLVer) { int rv; wacom_i2c_flash_cmd(wac_i2c); if (!flash_query(wac_i2c)) { if (!wacom_i2c_flash_cmd(wac_i2c)) return EXIT_FAIL_ENTER_FLASH_MODE; else { msleep(100); if (!flash_query(wac_i2c)) return EXIT_FAIL_FLASH_QUERY; } } rv = flash_blver(wac_i2c, pBLVer); if (rv) return EXIT_OK; else return EXIT_FAIL_GET_BOOT_LOADER_VERSION; }
static int GetBLVersion(struct wacom_i2c *wac_i2c, int *pBLVer) { int rv; int retry = 0; rv = wacom_flash_cmd(wac_i2c); if (rv < 0) msleep(500); do { msleep(100); rv = flash_query(wac_i2c); retry++; } while (rv < 0 && retry < 10); if (rv < 0) return EXIT_FAIL_GET_BOOT_LOADER_VERSION; rv = flash_blver(wac_i2c, pBLVer); if (rv) return EXIT_OK; else return EXIT_FAIL_GET_BOOT_LOADER_VERSION; }
int wacom_i2c_flash_w9012(struct wacom_i2c *wac_i2c, unsigned char *fw_data) { bool bRet = false; int result, i; int eraseBlock[200], eraseBlockNum; int iBLVer, iMpuType; unsigned long max_address = 0; /* Max.address of Load data */ unsigned long start_address = 0x2000; /* Start.address of Load data */ /*Obtain boot loader version */ if (!flash_blver(wac_i2c, &iBLVer)) { printk(KERN_DEBUG"epen:%s failed to get Boot Loader version \n", __func__); return -EXIT_FAIL_GET_BOOT_LOADER_VERSION; } printk(KERN_DEBUG"epen:BL version: %x \n", iBLVer); /*Obtain MPU type: this can be manually done in user space */ if (!flash_mputype(wac_i2c, &iMpuType)) { printk(KERN_DEBUG"epen:%s failed to get MPU type \n", __func__); return -EXIT_FAIL_GET_MPU_TYPE; } if (iMpuType != MPU_W9012) { printk(KERN_DEBUG"epen:MPU is not for W9012 : %x \n", iMpuType); return -EXIT_FAIL_GET_MPU_TYPE; } printk(KERN_DEBUG"epen:MPU type: %x \n", iMpuType); /*-----------------------------------*/ /*Flashing operation starts from here */ /*Set start and end address and block numbers */ eraseBlockNum = 0; start_address = W9012_START_ADDR; max_address = W9012_END_ADDR; for (i = BLOCK_NUM; i >= 8; i--) { eraseBlock[eraseBlockNum] = i; eraseBlockNum++; } msleep(300); /*Erase the old program */ printk(KERN_DEBUG"epen:%s erasing the current firmware \n", __func__); bRet = flash_erase(wac_i2c, eraseBlock, eraseBlockNum); if (!bRet) { printk(KERN_DEBUG"epen:%s failed to erase the user program \n", __func__); result = -EXIT_FAIL_ERASE; goto fail; } /*Write the new program */ printk(KERN_DEBUG"epen:%s writing new firmware \n", __func__); bRet = flash_write(wac_i2c, fw_data, start_address, &max_address); if (!bRet) { printk(KERN_DEBUG"epen:%s failed to write firmware \n", __func__); result = -EXIT_FAIL_WRITE_FIRMWARE; goto fail; } /*Return to the user mode */ printk(KERN_DEBUG"epen:%s closing the boot mode \n", __func__); bRet = flash_end(wac_i2c); if (!bRet) { printk(KERN_DEBUG"epen:%s closing boot mode failed \n", __func__); result = -EXIT_FAIL_WRITING_MARK_NOT_SET; goto fail; } printk(KERN_DEBUG"epen:%s write and verify completed \n", __func__); result = EXIT_OK; fail: return result; }