1 /*
2 * Copyright 2017-2020 NXP
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #include <stdint.h>
8 #include <string.h>
9
10 #include "mflash_drv.h"
11 #include "fsl_flash.h"
12 #include "pin_mux.h"
13
14 static flash_config_t g_flash_instance = {0};
15
16 static uint32_t g_pflashBlockBase = 0;
17 static uint32_t g_pflashTotalSize = 0;
18 static uint32_t g_pflashSectorSize = 0;
19 static uint32_t g_pflashPageSize = 0;
20
21 /* API - initialize 'mflash' */
mflash_drv_init(void)22 int32_t mflash_drv_init(void)
23 {
24 status_t result;
25
26 result = FLASH_Init(&g_flash_instance);
27 if (result != kStatus_Success)
28 return result;
29
30 result = FLASH_GetProperty(&g_flash_instance, kFLASH_PropertyPflashBlockBaseAddr, &g_pflashBlockBase);
31 if (result != kStatus_Success)
32 return result;
33
34 result = FLASH_GetProperty(&g_flash_instance, kFLASH_PropertyPflashSectorSize, &g_pflashSectorSize);
35 if (result != kStatus_Success)
36 return result;
37
38 result = FLASH_GetProperty(&g_flash_instance, kFLASH_PropertyPflashTotalSize, &g_pflashTotalSize);
39 if (result != kStatus_Success)
40 return result;
41
42 result = FLASH_GetProperty(&g_flash_instance, kFLASH_PropertyPflashPageSize, &g_pflashPageSize);
43
44 return result;
45 }
46
47 /* API - Erase single sector */
mflash_drv_sector_erase(uint32_t sector_addr)48 int32_t mflash_drv_sector_erase(uint32_t sector_addr)
49 {
50 if (0 == mflash_drv_is_sector_aligned(sector_addr))
51 return kStatus_InvalidArgument;
52
53 return FLASH_Erase(&g_flash_instance, sector_addr, MFLASH_SECTOR_SIZE, kFLASH_ApiEraseKey);
54 }
55
56 /* API - Page program */
mflash_drv_page_program(uint32_t page_addr,uint32_t * data)57 int32_t mflash_drv_page_program(uint32_t page_addr, uint32_t *data)
58 {
59 if (0 == mflash_drv_is_page_aligned(page_addr))
60 return kStatus_InvalidArgument;
61
62 return FLASH_Program(&g_flash_instance, page_addr, (uint8_t *)data, MFLASH_PAGE_SIZE);
63 }
64
65 /* API - Read data */
mflash_drv_read(uint32_t addr,uint32_t * buffer,uint32_t len)66 int32_t mflash_drv_read(uint32_t addr, uint32_t *buffer, uint32_t len)
67 {
68 memcpy(buffer, (void *)addr, len);
69 return kStatus_Success;
70 }
71
72 /* API - Get pointer to FLASH region */
mflash_drv_phys2log(uint32_t addr,uint32_t len)73 void *mflash_drv_phys2log(uint32_t addr, uint32_t len)
74 {
75 /* FLASH is directly mapped in the address space */
76 return (void *)(addr);
77 }
78
79 /* API - Get pointer to FLASH region */
mflash_drv_log2phys(void * ptr,uint32_t len)80 uint32_t mflash_drv_log2phys(void *ptr, uint32_t len)
81 {
82 /* FLASH is directly mapped in the address space */
83 return ((uint32_t)ptr);
84 }
85