/*
 * Copyright (C) 2014 Andrew Duggan
 * Copyright (C) 2014 Synaptics Inc
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _UPDATEUTIL_H_
#define _UPDATEUTIL_H_

enum update_error {
	UPDATE_SUCCESS				= 0,
	UPDATE_FAIL,
	UPDATE_FAIL_TIMEOUT,
	UPDATE_FAIL_VERIFY_IMAGE,
	UPDATE_FAIL_VERIFY_CHECKSUM,
	UPDATE_FAIL_VERIFY_FIRMWARE_SIZE,
	UPDATE_FAIL_VERIFY_CONFIG_SIZE,
	UPDATE_FAIL_VERIFY_IMAGE_PRODUCTID_NOT_MATCH,
	UPDATE_FAIL_UNSUPPORTED_IMAGE_VERSION,
	UPDATE_FAIL_NO_FUNCTION_01,
	UPDATE_FAIL_NO_FUNCTION_34,
	UPDATE_FAIL_QUERY_BASIC_PROPERTIES,
	UPDATE_FAIL_READ_F34_QUERIES,
	UPDATE_FAIL_READ_BOOTLOADER_ID,
	UPDATE_FAIL_READ_F34_CONTROLS,
	UPDATE_FAIL_WRITE_BOOTLOADER_ID,
	UPDATE_FAIL_ENABLE_FLASH_PROGRAMMING,
	UPDATE_FAIL_NOT_IN_IDLE_STATE,
	UPDATE_FAIL_PROGRAMMING_NOT_ENABLED,
	UPDATE_FAIL_SCAN_PDT,
	UPDATE_FAIL_READ_DEVICE_STATUS,
	UPDATE_FAIL_DEVICE_NOT_IN_BOOTLOADER,
	UPDATE_FAIL_READ_F01_CONTROL_0,
	UPDATE_FAIL_WRITE_F01_CONTROL_0,
	UPDATE_FAIL_WRITE_INITIAL_ZEROS,
	UPDATE_FAIL_WRITE_BLOCK,
	UPDATE_FAIL_WRITE_FLASH_COMMAND,
	UPDATE_FAIL_TIMEOUT_WAITING_FOR_ATTN,
	UPDATE_FAIL_ERASE_ALL,
	UPDATE_FAIL_FIRMWARE_IMAGE_IS_OLDER,
	UPDATE_FAIL_INVALID_PARAMETER,
	UPDATE_FAIL_OPEN_FIRMWARE_IMAGE,
	UPDATE_FAIL_WRITE_PROTECTED,
	UPDATE_FAIL_MSL_CHECKING,
};

const char * update_err_to_string(int err);

#endif // _UPDATEUTIL_H_