#include <qsee_sync.h>

#include <ese_hal.h>
#include <ese_log.h>

#include <grdm_common.h>
#include <grdm_log.h>

#define ESE_UDELAY				qsee_spin

#define MAX_FILE_DATA_SIZE 256
#define MAX_POLLING_COUNT 100

#ifdef GRDM_CHECK_FACTORY
GRDM_RESULT grdm_check_bl_authkey()
{
	unsigned char txdata[] = {0x12, 0x00, 0x05, 0x80, 0x88, 0x00, 0xb0, 0x01, 0xae};
	unsigned int txdata_size = 9;
	unsigned char rxdata[MAX_FILE_DATA_SIZE] = {0};
	int rxdata_size = 0;
	int ret = GRDM_NO_ERROR;
	unsigned char expdata[] = {0x21, 0x00, 0x03, 0x00, 0x90, 0x00, 0xb2};
	unsigned int expdata_size = 7;

	unsigned int poll_cnt = MAX_POLLING_COUNT;
	GRDM_RESULT grdm_ret = GRDM_NO_ERROR;

	LOG_E("grdm_check_bl_authkey:");
/*
	if (eseHal_Open() != 0) {
		LOG_E("failed to open");
		return GRDM_COMM_ERROR;
	}
*/
	grdm_ret = grdm_openLogicalChannel();
	if (grdm_ret != GRDM_NO_ERROR) {
		LOG_E("grdm_openLogicalChannel failed : %d\n", grdm_ret);
		return grdm_ret;
	}

	rxdata_size = eseHal_Send(txdata, txdata_size);
	if (rxdata_size != txdata_size) {
		LOG_E("mismatch send size : %u, %d", txdata_size, rxdata_size);
		ret = GRDM_COMM_ERROR;
		goto exit;
	}

	do {
		ESE_UDELAY(2 * 1000);
		rxdata_size = eseHal_Receive(rxdata, 1);
		if (rxdata_size != 1) {
			LOG_E("mismatch receive size : %d, %d", 1, rxdata_size);
			ret = GRDM_COMM_ERROR;
			goto exit;
		}
	} while (rxdata[0] == 0x00 && --poll_cnt > 0);

	if (poll_cnt == 0) {
		LOG_E("response timeout");
		ret = GRDM_COMM_ERROR;
		goto exit;
	}

	if (rxdata[0] != expdata[0]) {
		LOG_E("invalid slave address : 0x%02x", rxdata[0]);
		ret = GRDM_COMM_ERROR;
		goto exit;
	}

	rxdata_size += eseHal_Receive(rxdata + 1, 2);
	if (rxdata_size != 3) {
		LOG_E("mismatch receive size %d, %d", 3, rxdata_size);
		ret = GRDM_COMM_ERROR;
		goto exit;
	}
	if (rxdata[1] != expdata[1] || rxdata[2] != expdata[2]) {
		LOG_E("invalid data : 0x%02x, 0x%02x", rxdata[1], rxdata[2]);
		ret = GRDM_COMM_ERROR;
		goto exit;
	}

	rxdata_size += eseHal_Receive(rxdata + 3, 4);
	if (rxdata_size != expdata_size) {
		LOG_E("mismatch receive size : %d, %d", expdata_size, rxdata_size);
		ret = GRDM_COMM_ERROR;
		goto exit;
	}


	if (rxdata[4] != expdata[4] || rxdata[5] != expdata[5]) {
		LOG_E("invalid rxdata SW : 0x%02x 0x%02x", rxdata[4], rxdata[5]);
		ret = GRDM_COMM_ERROR;
		goto exit;
	}

/*
	if (rxdata[6] != expdata[6]) {
		LOG_E("invalid crc : 0x%02x", rxdata[6]);
		return -1;
	}
*/
	if (rxdata[3] != expdata[3]) {
		LOG_E("BL authkey is injected");
		ret = GRDM_ALREADY_INJECTED;
	}

exit:
/*
	if (eseHal_Close() != 0) {
		LOG_E("failed to close");
		//ret = GRDM_COMMUNICATION_ERROR;
	}
*/
	grdm_ret = grdm_closeLogicalChannel();
	if (grdm_ret != GRDM_NO_ERROR) {
		LOG_E("grdm_closeLogicalChannel failed : %d\n", grdm_ret);
	}

	LOG_E("result : %d", ret);

	return ret;
}
#endif
