1 /*
2 * Copyright 2022 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 "fsl_mcm.h"
13 #include "pin_mux.h"
14
15 static flash_config_t s_flashDriver = {0};
16
17 static uint32_t pflashBlock0Base = 0;
18 static uint32_t pflashBlock0Size = 0;
19 static uint32_t pflashSectorSize = 0;
20 static uint32_t pflashBlockCount = 0;
21 static uint32_t pflashTotalSize = 0;
22
23 /* API - initialize 'mflash' */
mflash_drv_init(void)24 int32_t mflash_drv_init(void)
25 {
26 status_t result;
27
28 (void)memset(&s_flashDriver, 0, sizeof(flash_config_t));
29
30 result = FLASH_Init(&s_flashDriver);
31 if (result != kStatus_Success)
32 {
33 return result;
34 }
35
36 #if defined(SMSCM_CACHE_CLEAR_MASK) && SMSCM_CACHE_CLEAR_MASK
37 /* disable flash cache/Prefetch */
38 FLASH_CACHE_Disable();
39 #endif /* SMSCM_CACHE_CLEAR_MASK */
40
41 result = FLASH_GetProperty(&s_flashDriver, kFLASH_PropertyPflash0BlockBaseAddr, &pflashBlock0Base);
42 if (result != kStatus_Success)
43 {
44 return result;
45 }
46
47 result = FLASH_GetProperty(&s_flashDriver, kFLASH_PropertyPflash0BlockSize, &pflashBlock0Size);
48 if (result != kStatus_Success)
49 {
50 return result;
51 }
52
53 result = FLASH_GetProperty(&s_flashDriver, kFLASH_PropertyPflash0SectorSize, &pflashSectorSize);
54 if (result != kStatus_Success)
55 {
56 return result;
57 }
58
59 result = FLASH_GetProperty(&s_flashDriver, kFLASH_PropertyPflash0BlockCount, &pflashBlockCount);
60 if (result != kStatus_Success)
61 {
62 return result;
63 }
64
65 result = FLASH_GetProperty(&s_flashDriver, kFLASH_PropertyPflash0TotalSize, &pflashTotalSize);
66
67 return result;
68 }
69
70 /* API - Erase single sector */
mflash_drv_sector_erase(uint32_t sector_addr)71 int32_t mflash_drv_sector_erase(uint32_t sector_addr)
72 {
73 uint32_t primask = 0;
74 int32_t ret = kStatus_Fail;
75
76 primask = DisableGlobalIRQ();
77
78 flash_cache_speculation_control(true, FLASH);
79
80 ret = FLASH_Erase(&s_flashDriver, FLASH, sector_addr, MFLASH_SECTOR_SIZE, (uint32_t)kFLASH_ApiEraseKey);
81
82 /* Clear code bus cache */
83 MCM_ClearCodeBusCache(MCM);
84
85 flash_cache_speculation_control(false, FLASH);
86
87 EnableGlobalIRQ(primask);
88
89 return ret;
90 }
91
92 /* API - Page program */
mflash_drv_page_program(uint32_t page_addr,uint32_t * data)93 int32_t mflash_drv_page_program(uint32_t page_addr, uint32_t *data)
94 {
95 uint32_t primask = 0;
96 int32_t ret = kStatus_Fail;
97
98 primask = DisableGlobalIRQ();
99
100 flash_cache_speculation_control(true, FLASH);
101
102 ret = FLASH_ProgramPage(&s_flashDriver, FLASH, page_addr, (uint8_t *)data, MFLASH_PAGE_SIZE);
103
104 /* Clear code bus cache */
105 MCM_ClearCodeBusCache(MCM);
106
107 flash_cache_speculation_control(false, FLASH);
108
109 EnableGlobalIRQ(primask);
110
111 return ret;
112 }
113
114 /* API - Read data */
mflash_drv_read(uint32_t addr,uint32_t * buffer,uint32_t len)115 int32_t mflash_drv_read(uint32_t addr, uint32_t *buffer, uint32_t len)
116 {
117 (void)memcpy((void *)buffer, (void *)(uint32_t *)addr, len);
118
119 return kStatus_Success;
120 }
121
122 /* API - Get pointer to FLASH region */
mflash_drv_phys2log(uint32_t addr,uint32_t len)123 void *mflash_drv_phys2log(uint32_t addr, uint32_t len)
124 {
125 /* FLASH is directly mapped in the address space */
126 return (void *)(addr);
127 }
128
129 /* API - Get pointer to FLASH region */
mflash_drv_log2phys(void * ptr,uint32_t len)130 uint32_t mflash_drv_log2phys(void *ptr, uint32_t len)
131 {
132 /* FLASH is directly mapped in the address space */
133 return ((uint32_t)ptr);
134 }