/*
 * Copyright (c) 2016 Intel Corporation.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr.h>
#include <flash.h>
#include <flash_map.h>
#include <device.h>
#include <stdio.h>
#include <logging/log.h>
LOG_MODULE_REGISTER(test_flash);

#define FLASH_TEST_REGION_OFFSET 0x3F0000
#define FLASH_SECTOR_SIZE        0x10000
#define TEST_DATA_BYTE_0         0x4f
#define TEST_DATA_BYTE_1         0x4a
#define TEST_DATA_LEN            128

int flash_region_is_empty(u32_t off, void *dst, u32_t len)
{
	u8_t i;
	u8_t *u8dst;
	int rc;
	const struct flash_area *fap;

	rc = flash_area_open(DT_FLASH_AREA_IMAGE_SCRATCH_ID, &fap);
	if (rc != 0) {
		LOG_ERR("SPI flash area open failed!\n");
		return -1;
	}

	rc = flash_area_read(fap, off - fap->fa_off, dst, len);
	if (rc) {
		LOG_ERR("SPI flash efailed!\n");
		return -1;
	}

	for (i = 0, u8dst = (uint8_t *)dst; i < len; i++) {
		if (u8dst[i] != 0xFF) {
			flash_area_close(fap);
			return 0;
		}
	}

	flash_area_close(fap);

	return 1;
}

void test_flash(void)
{
	struct device *flash_dev;
	u8_t buf[TEST_DATA_LEN];
	u32_t magic[4];
	int i;

	flash_dev = device_get_binding(DT_JEDEC_SPI_NOR_0_LABEL);

	if (!flash_dev) {
		LOG_ERR("SPI flash driver was not found!\n");
		return;
	}

	LOG_INF("SPI flash driver was found!\n");

	flash_write_protection_set(flash_dev, false);

	if (flash_erase(flash_dev,
			FLASH_TEST_REGION_OFFSET,
			FLASH_SECTOR_SIZE) != 0) {
		LOG_ERR("   Flash erase failed!\n");
	} else {
		LOG_INF("   Flash erase succeeded!\n");
	}

	buf[0] = TEST_DATA_BYTE_0;
	buf[1] = TEST_DATA_BYTE_1;

	for (i = 2 ; i < TEST_DATA_LEN; i++) {
		buf[i] = 0x63;
	}

	LOG_INF("   Attempted to write %x %x\n", buf[0], buf[1]);
	if (flash_write(flash_dev, FLASH_TEST_REGION_OFFSET, buf,
	    TEST_DATA_LEN) != 0) {
		LOG_ERR("   Flash write failed!\n");
		return;
	}

	if (flash_read(flash_dev, FLASH_TEST_REGION_OFFSET, buf,
	    TEST_DATA_LEN) != 0) {
		LOG_ERR("   Flash read failed!\n");
		return;
	}

	if ((buf[0] == TEST_DATA_BYTE_0) && (buf[1] == TEST_DATA_BYTE_1)) {
		LOG_INF("   Data read matches with data written. Good!!\n");
	} else {
		LOG_ERR("   Data read does not match with data written!!\n");
	}

	if (flash_region_is_empty(
			FLASH_TEST_REGION_OFFSET - 16, magic, 16) == 1) {
		LOG_INF("   Flash region is empty. Good!!\n");
	} else {
		LOG_ERR("   Flash region is not empty!!\n");
	}
}
