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_romapi.h"
12 #include "pin_mux.h"
13 
14 static flash_config_t g_flash_instance;
15 
16 static uint32_t pflashBlockBase;
17 static uint32_t pflashTotalSize;
18 static uint32_t pflashSectorSize;
19 static uint32_t pflashPageSize;
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_API->flash_init(&g_flash_instance);
27     if (result != kStatus_Success)
28     {
29         return result;
30     }
31 
32     result = FLASH_API->flash_get_property(&g_flash_instance, kFLASH_PropertyPflashBlockBaseAddr, &pflashBlockBase);
33     if (result != kStatus_Success)
34     {
35         return result;
36     }
37 
38     result = FLASH_API->flash_get_property(&g_flash_instance, kFLASH_PropertyPflashSectorSize, &pflashSectorSize);
39     if (result != kStatus_Success)
40     {
41         return result;
42     }
43 
44     result = FLASH_API->flash_get_property(&g_flash_instance, kFLASH_PropertyPflashTotalSize, &pflashTotalSize);
45     if (result != kStatus_Success)
46     {
47         return result;
48     }
49 
50     result = FLASH_API->flash_get_property(&g_flash_instance, kFLASH_PropertyPflashPageSize, &pflashPageSize);
51     if (result != kStatus_Success)
52     {
53         return result;
54     }
55 
56     if ((pflashSectorSize != MFLASH_SECTOR_SIZE) || (pflashPageSize != MFLASH_PAGE_SIZE))
57     {
58         return kStatus_Fail;
59     }
60 
61     return kStatus_Success;
62 }
63 
64 /* API - Erase single sector */
mflash_drv_sector_erase(uint32_t sector_addr)65 int32_t mflash_drv_sector_erase(uint32_t sector_addr)
66 {
67     if (false == mflash_drv_is_sector_aligned(sector_addr))
68     {
69         return kStatus_InvalidArgument;
70     }
71     else
72     {
73         return FLASH_API->flash_erase_sector(&g_flash_instance, sector_addr, MFLASH_SECTOR_SIZE, kFLASH_ApiEraseKey);
74     }
75 }
76 
77 /* API - Page program */
mflash_drv_page_program(uint32_t page_addr,uint32_t * data)78 int32_t mflash_drv_page_program(uint32_t page_addr, uint32_t *data)
79 {
80     if (false == mflash_drv_is_page_aligned(page_addr))
81     {
82         return kStatus_InvalidArgument;
83     }
84     else
85     {
86         return FLASH_API->flash_program_page(&g_flash_instance, page_addr, (uint8_t *)data, MFLASH_PAGE_SIZE);
87     }
88 }
89 
90 /* API - Phrase program */
mflash_drv_phrase_program(uint32_t page_addr,uint32_t * data)91 int32_t mflash_drv_phrase_program(uint32_t page_addr, uint32_t *data)
92 {
93     if (false == mflash_drv_is_phrase_aligned(page_addr))
94     {
95         return kStatus_InvalidArgument;
96     }
97     else
98     {
99         return FLASH_API->flash_program_phrase(&g_flash_instance, page_addr, (uint8_t *)data, MFLASH_PHRASE_SIZE);
100     }
101 }
102 
103 /* API - Read data */
mflash_drv_read(uint32_t addr,uint32_t * buffer,uint32_t len)104 int32_t mflash_drv_read(uint32_t addr, uint32_t *buffer, uint32_t len)
105 {
106     (void)memcpy(buffer, (void *)addr, len);
107     return kStatus_Success;
108 }
109 
110 /* API - Get pointer to FLASH region */
mflash_drv_phys2log(uint32_t addr,uint32_t len)111 void *mflash_drv_phys2log(uint32_t addr, uint32_t len)
112 {
113     /* FLASH is directly mapped in the address space */
114     return (void *)(addr);
115 }
116 
117 /* API - Get pointer to FLASH region */
mflash_drv_log2phys(void * ptr,uint32_t len)118 uint32_t mflash_drv_log2phys(void *ptr, uint32_t len)
119 {
120     /* FLASH is directly mapped in the address space */
121     return ((uint32_t)ptr);
122 }
123