static int fwu_read_f34_queries(void)
{
    int retval;
    unsigned char count;
    unsigned char buf[10];

    retval = fwu->fn_ptr->read(fwu->rmi4_data,
                               fwu->f34_fd.query_base_addr + BOOTLOADER_ID_OFFSET,
                               fwu->bootloader_id,
                               sizeof(fwu->bootloader_id));
    if (retval < 0) {
        TS_LOG_ERR("Failed to read bootloader ID\n");
        return retval;
    }

    TS_LOG_INFO("bootloader_id[1] = %c", fwu->bootloader_id[1]);

    if (fwu->bootloader_id[1] == '5') {
        fwu->bl_version = V5;
    } else if (fwu->bootloader_id[1] == '6') {
        fwu->bl_version = V6;
    } else {
        TS_LOG_ERR("Unrecognized bootloader version\n");
        return -EINVAL;
    }

    if (fwu->bl_version == V5) {
        fwu->properties_off = V5_PROPERTIES_OFFSET;
        fwu->blk_size_off = V5_BLOCK_SIZE_OFFSET;
        fwu->blk_count_off = V5_BLOCK_COUNT_OFFSET;
        fwu->blk_data_off = V5_BLOCK_DATA_OFFSET;
    } else if (fwu->bl_version == V6) {
        fwu->properties_off = V6_PROPERTIES_OFFSET;
        fwu->blk_size_off = V6_BLOCK_SIZE_OFFSET;
        fwu->blk_count_off = V6_BLOCK_COUNT_OFFSET;
        fwu->blk_data_off = V6_BLOCK_DATA_OFFSET;
    }

    retval = fwu->fn_ptr->read(fwu->rmi4_data,
                               fwu->f34_fd.query_base_addr + fwu->properties_off,
                               &fwu->flash_properties,
                               sizeof(fwu->flash_properties));
    if (retval < 0) {
        TS_LOG_ERR("Failed to read flash properties\n");
        return retval;
    }

    count = 4;

    if (fwu->flash_properties & HAS_PERM_CONFIG) {
        fwu->has_perm_config = 1;
        count += 2;
    }

    if (fwu->flash_properties & HAS_BL_CONFIG) {
        fwu->has_bl_config = 1;
        count += 2;
    }

    if (fwu->flash_properties & HAS_DISP_CONFIG) {
        fwu->has_disp_config = 1;
        count += 2;
    }

    retval = fwu->fn_ptr->read(fwu->rmi4_data,
                               fwu->f34_fd.query_base_addr + fwu->blk_size_off,
                               buf,
                               2);
    if (retval < 0) {
        TS_LOG_ERR("Failed to read block size info\n");
        return retval;
    }

    batohs(&fwu->block_size, &(buf[0]));

    if (fwu->bl_version == V5) {
        fwu->flash_cmd_off = fwu->blk_data_off + fwu->block_size;
        fwu->flash_status_off = fwu->flash_cmd_off;
    } else if (fwu->bl_version == V6) {
        fwu->flash_cmd_off = V6_FLASH_COMMAND_OFFSET;
        fwu->flash_status_off = V6_FLASH_STATUS_OFFSET;
    }

    retval = fwu->fn_ptr->read(fwu->rmi4_data,
                               fwu->f34_fd.query_base_addr + fwu->blk_count_off,
                               buf,
                               count);
    if (retval < 0) {
        TS_LOG_ERR("Failed to read block count info\n");
        return retval;
    }

    batohs(&fwu->fw_block_count, &(buf[0]));
    batohs(&fwu->config_block_count, &(buf[2]));

    count = 4;

    if (fwu->has_perm_config) {
        batohs(&fwu->perm_config_block_count, &(buf[count]));
        count += 2;
    }

    if (fwu->has_bl_config) {
        batohs(&fwu->bl_config_block_count, &(buf[count]));
        count += 2;
    }

    if (fwu->has_disp_config)
        batohs(&fwu->disp_config_block_count, &(buf[count]));

    return 0;
}
示例#2
0
static int rmi_f34_initialize(struct rmi_function_dev *fn_dev)
{
	struct rmi_device *rmi_dev = fn_dev->rmi_dev;
	struct rmi_device_platform_data *pdata;
	int retval = 0;
	struct rmi_fn_34_data *f34 = fn_dev->data;
	u16 query_base_addr;
	u16 control_base_addr;
	u8 buf[2];

	pdata = to_rmi_platform_data(rmi_dev);

	mutex_init(&f34->attn_mutex);

	/* get the Bootloader ID and Block Size. */
	query_base_addr = fn_dev->fd.query_base_addr;
	control_base_addr = fn_dev->fd.control_base_addr;

	retval = rmi_read_block(fn_dev->rmi_dev, query_base_addr, buf,
			ARRAY_SIZE(buf));

	if (retval < 0) {
		dev_err(&fn_dev->dev, "Could not read bootloaderid from 0x%04x.\n",
			query_base_addr);
		return retval;
	}

	f34->bootloaderid = batohs(buf);

	retval = rmi_read_block(fn_dev->rmi_dev, query_base_addr + BLK_SZ_OFF,
				buf, ARRAY_SIZE(buf));

	if (retval < 0) {
		dev_err(&fn_dev->dev, "Could not read block size from 0x%04x, error=%d.\n",
			query_base_addr + BLK_SZ_OFF, retval);
		return retval;
	}
	f34->blocksize = batohs(buf);

	/* Get firmware image block count and store it in the instance data */
	retval = rmi_read_block(fn_dev->rmi_dev,
				query_base_addr + IMG_BLK_CNT_OFF,
				buf, ARRAY_SIZE(buf));

	if (retval < 0) {
		dev_err(&fn_dev->dev, "Couldn't read image block count from 0x%x, error=%d.\n",
			query_base_addr + IMG_BLK_CNT_OFF, retval);
		return retval;
	}
	f34->imageblockcount = batohs(buf);

	/* Get config block count and store it in the instance data */
	retval = rmi_read_block(fn_dev->rmi_dev, query_base_addr + 7, buf,
			ARRAY_SIZE(buf));

	if (retval < 0) {
		dev_err(&fn_dev->dev, "Couldn't read config block count from 0x%x, error=%d.\n",
			query_base_addr + CFG_BLK_CNT_OFF, retval);
		return retval;
	}
	f34->configblockcount = batohs(buf);

	return 0;
}