blob: ddcd8fcba915128c8517e4e6539e138d94c32774 [file] [log] [blame]
/*
* Copyright (c) 2023, Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/device.h>
#include <zephyr/drivers/flash.h>
#include <zephyr/kernel.h>
#include <string.h>
#include <zephyr/sys/printk.h>
#ifndef OFFSET_PAGE
#define OFFSET_PAGE 0x00
#endif
#ifndef NAND_NUM_PAGES
#define NAND_NUM_PAGES 50
#endif
#define NAND_DEV DEVICE_DT_GET(DT_ALIAS(nand));
int main(void)
{
const struct device *nand_dev;
struct flash_pages_info page;
size_t flash_block_size;
size_t total_pages;
int ret;
uint8_t *w_Page_buffer;
uint8_t *r_Page_buffer;
uint8_t page_data = 0;
printk("Nand flash driver test sample\n");
nand_dev = NAND_DEV;
if (!device_is_ready(nand_dev)) {
printk("Nand flash driver is not ready\n");
return -ENODEV;
}
total_pages = flash_get_page_count(nand_dev);
flash_block_size = flash_get_write_block_size(nand_dev);
printk("Nand flash driver block size %lx\n", flash_block_size);
ret = flash_get_page_info_by_offs(nand_dev, 0x00, &page);
if (ret < 0) {
printk("Nand flash driver page info error\n");
return ret;
}
printk("The Page size of %lx\n", page.size);
w_Page_buffer = (uint8_t *)k_malloc(page.size * NAND_NUM_PAGES);
r_Page_buffer = (uint8_t *)k_malloc(page.size * NAND_NUM_PAGES);
if (w_Page_buffer != NULL) {
for (int index = 0; index < page.size * NAND_NUM_PAGES; index++) {
w_Page_buffer[index] = (page_data++ % 255);
}
} else {
printk("Write memory not allocated\n");
return -ENOSR;
}
if (r_Page_buffer != NULL) {
memset(r_Page_buffer, 0x55, page.size * NAND_NUM_PAGES);
} else {
printk("Read memory not allocated\n");
k_free(w_Page_buffer);
return -ENOSR;
}
ret = flash_erase(nand_dev, OFFSET_PAGE, flash_block_size);
if (ret < 0) {
printk("Nand flash driver read Error\n");
k_free(w_Page_buffer);
k_free(r_Page_buffer);
return ret;
}
printk("Nand flash driver data erase successful....\n");
ret = flash_write(nand_dev, OFFSET_PAGE, w_Page_buffer, page.size * NAND_NUM_PAGES);
if (ret < 0) {
printk("Nand flash driver write error\n");
k_free(w_Page_buffer);
k_free(r_Page_buffer);
return ret;
}
printk("Nand flash driver write completed....\n");
ret = flash_read(nand_dev, OFFSET_PAGE, r_Page_buffer, page.size * NAND_NUM_PAGES);
if (ret < 0) {
printk("Nand flash driver read error\n");
k_free(w_Page_buffer);
k_free(r_Page_buffer);
return ret;
}
printk("Nand flash driver read completed....\n");
ret = memcmp(w_Page_buffer, r_Page_buffer, page.size * NAND_NUM_PAGES);
if (ret < 0) {
printk("Nand flash driver read not match\n");
k_free(w_Page_buffer);
k_free(r_Page_buffer);
return ret;
}
printk("Nand flash driver read verified\n");
ret = flash_erase(nand_dev, OFFSET_PAGE, flash_block_size);
if (ret < 0) {
printk("Nand flash driver read Error\n");
k_free(w_Page_buffer);
k_free(r_Page_buffer);
return ret;
}
printk("Nand flash driver data erase successful....\n");
ret = flash_read(nand_dev, OFFSET_PAGE, r_Page_buffer, page.size * NAND_NUM_PAGES);
if (ret != 0) {
printk("Nand flash driver read error\n");
k_free(w_Page_buffer);
k_free(r_Page_buffer);
return ret;
}
memset(w_Page_buffer, 0xFF, page.size * NAND_NUM_PAGES);
ret = memcmp(w_Page_buffer, r_Page_buffer, page.size * NAND_NUM_PAGES);
if (ret < 0) {
printk("Nand flash driver read not match\n");
k_free(w_Page_buffer);
k_free(r_Page_buffer);
return ret;
}
printk("Nand flash driver read verified after erase....\n");
printk("Nand flash driver test sample completed....\n");
return 0;
}