lx_api.h 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827
  1. /***************************************************************************
  2. * Copyright (c) 2024 Microsoft Corporation
  3. *
  4. * This program and the accompanying materials are made available under the
  5. * terms of the MIT License which is available at
  6. * https://opensource.org/licenses/MIT.
  7. *
  8. * SPDX-License-Identifier: MIT
  9. **************************************************************************/
  10. /**************************************************************************/
  11. /**************************************************************************/
  12. /** */
  13. /** LevelX Component */
  14. /** */
  15. /** Application Interface (API) */
  16. /** */
  17. /**************************************************************************/
  18. /**************************************************************************/
  19. /**************************************************************************/
  20. /* */
  21. /* APPLICATION INTERFACE DEFINITION RELEASE */
  22. /* */
  23. /* lx_api.h PORTABLE C */
  24. /* 6.4.0 */
  25. /* AUTHOR */
  26. /* */
  27. /* William E. Lamie, Microsoft Corporation */
  28. /* */
  29. /* DESCRIPTION */
  30. /* */
  31. /* This file defines the basic Application Interface (API) to the */
  32. /* high-performance LevelX. All service prototypes and data structure */
  33. /* definitions are defined in this file. */
  34. /* */
  35. /* RELEASE HISTORY */
  36. /* */
  37. /* DATE NAME DESCRIPTION */
  38. /* */
  39. /* 05-19-2020 William E. Lamie Initial Version 6.0 */
  40. /* 09-30-2020 William E. Lamie Modified comment(s), and */
  41. /* updated product constants, */
  42. /* resulting in version 6.1 */
  43. /* 11-09-2020 William E. Lamie Modified comment(s), and */
  44. /* added support for lx_user.h */
  45. /* so user can specify values, */
  46. /* resulting in version 6.1.2 */
  47. /* 12-31-2020 William E. Lamie Modified comment(s), and */
  48. /* updated product constants, */
  49. /* resulting in version 6.1.3 */
  50. /* 06-02-2021 Bhupendra Naphade Modified comment(s), */
  51. /* added standalone support, */
  52. /* resulting in version 6.1.7 */
  53. /* 08-02-2021 William E. Lamie Modified comment(s), and */
  54. /* updated product constants, */
  55. /* resulting in version 6.1.8 */
  56. /* 10-15-2021 Bhupendra Naphade Modified comment(s), */
  57. /* updated configuration for */
  58. /* nand flash */
  59. /* resulting in version 6.1.9 */
  60. /* 01-31-2022 Bhupendra Naphade Modified comment(s), */
  61. /* updated include order for */
  62. /* standalone mode, */
  63. /* resulting in version 6.1.10 */
  64. /* 04-25-2022 William E. Lamie Modified comment(s), and */
  65. /* updated product constants, */
  66. /* resulting in version 6.1.11 */
  67. /* 07-29-2022 William E. Lamie Modified comment(s), and */
  68. /* updated product constants, */
  69. /* resulting in version 6.1.12 */
  70. /* 10-31-2022 Xiuwen Cai Modified comment(s), and */
  71. /* updated product constants, */
  72. /* resulting in version 6.2.0 */
  73. /* 03-08-2023 Xiuwen Cai Modified comment(s), */
  74. /* modified NAND logic, */
  75. /* added new driver interface */
  76. /* and user extension, */
  77. /* resulting in version 6.2.1 */
  78. /* 10-31-2023 Xiuwen Cai Modified comment(s), */
  79. /* made LX_NOR_SECTOR_SIZE */
  80. /* configurable, added mapping */
  81. /* bitmap and obsolete count */
  82. /* cache for NOR flash, */
  83. /* resulting in version 6.3.0 */
  84. /* 12-31-2023 Xiuwen Cai Modified comment(s), */
  85. /* added configuration checks, */
  86. /* resulting in version 6.4.0 */
  87. /* */
  88. /**************************************************************************/
  89. #ifndef LX_API_H
  90. #define LX_API_H
  91. /* Determine if a C++ compiler is being used. If so, ensure that standard
  92. C is used to process the API information. */
  93. #ifdef __cplusplus
  94. /* Yes, C++ compiler is present. Use standard C. */
  95. extern "C" {
  96. #endif
  97. /* Determine if the optional LevelX user define file should be used. */
  98. #ifdef LX_INCLUDE_USER_DEFINE_FILE
  99. /* Yes, include the user defines in lx_user.h. The defines in this file may
  100. alternately be defined on the command line. */
  101. #include "lx_user.h"
  102. #endif
  103. /* Include the ThreadX api file. */
  104. #ifndef LX_STANDALONE_ENABLE
  105. #include "tx_api.h"
  106. #endif
  107. #ifdef LX_STANDALONE_ENABLE
  108. /* Define compiler library include files. */
  109. #include <stdint.h>
  110. #include <stdlib.h>
  111. #include <string.h>
  112. #ifndef VOID
  113. #define VOID void
  114. typedef char CHAR;
  115. typedef char BOOL;
  116. typedef unsigned char UCHAR;
  117. typedef int INT;
  118. typedef unsigned int UINT;
  119. typedef long LONG;
  120. typedef unsigned long ULONG;
  121. typedef short SHORT;
  122. typedef unsigned short USHORT;
  123. #endif
  124. #ifndef ULONG64_DEFINED
  125. #define ULONG64_DEFINED
  126. typedef unsigned long long ULONG64;
  127. #endif
  128. /* Define basic alignment type used in block and byte pool operations. This data type must
  129. be at least 32-bits in size and also be large enough to hold a pointer type. */
  130. #ifndef ALIGN_TYPE_DEFINED
  131. #define ALIGN_TYPE_DEFINED
  132. #define ALIGN_TYPE ULONG
  133. #endif
  134. /* Define the LX_MEMSET macro to the standard library function, if not already defined. */
  135. #ifndef LX_MEMSET
  136. #define LX_MEMSET(a,b,c) memset((a),(b),(c))
  137. #endif
  138. #ifndef LX_MEMCPY
  139. #define LX_MEMCPY(a,b,c) memcpy((a),(b),(c))
  140. #endif
  141. /* Disable usage of ThreadX mutex in standalone mode */
  142. #ifdef LX_THREAD_SAFE_ENABLE
  143. #undef LX_THREAD_SAFE_ENABLE
  144. #endif
  145. #define LX_INTERRUPT_SAVE_AREA
  146. #define LX_DISABLE
  147. #define LX_RESTORE
  148. #else
  149. #define LX_MEMSET TX_MEMSET
  150. #ifndef LX_MEMCPY
  151. #include <string.h>
  152. #define LX_MEMCPY(a,b,c) memcpy((a),(b),(c))
  153. #endif
  154. #define LX_INTERRUPT_SAVE_AREA TX_INTERRUPT_SAVE_AREA
  155. #define LX_DISABLE TX_DISABLE
  156. #define LX_RESTORE TX_RESTORE
  157. #endif
  158. /* Disable warning of parameter not used. */
  159. #ifndef LX_PARAMETER_NOT_USED
  160. #define LX_PARAMETER_NOT_USED(p) ((void)(p))
  161. #endif /* LX_PARAMETER_NOT_USED */
  162. /* Define basic constants for the LevelX Stack. */
  163. #define AZURE_RTOS_LEVELX
  164. #define LEVELX_MAJOR_VERSION 6
  165. #define LEVELX_MINOR_VERSION 4
  166. #define LEVELX_PATCH_VERSION 0
  167. /* Define general LevelX Constants. */
  168. #define LX_FALSE 0
  169. #define LX_TRUE 1
  170. #define LX_NULL 0
  171. #define LX_BLOCK_ERASE_COUNT_MASK 0x7FFFFFFF
  172. #define LX_BLOCK_ERASE_COUNT_MAX 0x7FFFFFFF
  173. #define LX_BLOCK_ERASED 0x80000000
  174. #define LX_BLOCK_ERASE_STARTED 0
  175. #define LX_ALL_ONES 0xFFFFFFFF
  176. /* Define error codes. */
  177. #define LX_SUCCESS 0
  178. #define LX_ERROR 1
  179. #define LX_NO_SECTORS 2
  180. #define LX_SECTOR_NOT_FOUND 3
  181. #define LX_NO_PAGES 4
  182. #define LX_INVALID_WRITE 5
  183. #define LX_NAND_ERROR_CORRECTED 6
  184. #define LX_NAND_ERROR_NOT_CORRECTED 7
  185. #define LX_NO_MEMORY 8
  186. #define LX_DISABLED 9
  187. #define LX_BAD_BLOCK 10
  188. #define LX_NO_BLOCKS 11
  189. #define LX_NOT_SUPPORTED 12
  190. #define LX_SYSTEM_INVALID_FORMAT 90
  191. #define LX_SYSTEM_INVALID_BLOCK 91
  192. #define LX_SYSTEM_ALLOCATION_FAILED 92
  193. #define LX_SYSTEM_MUTEX_CREATE_FAILED 93
  194. #define LX_SYSTEM_INVALID_SECTOR_MAP 94
  195. /* Define NOR flash constants. */
  196. #define LX_NOR_FLASH_OPENED ((ULONG) 0x4E4F524F)
  197. #define LX_NOR_FLASH_CLOSED ((ULONG) 0x4E4F5244)
  198. #ifndef LX_NOR_SECTOR_SIZE
  199. #define LX_NOR_SECTOR_SIZE (512/sizeof(ULONG))
  200. #endif
  201. #define LX_NOR_FLASH_MIN_LOGICAL_SECTOR_OFFSET 1
  202. #define LX_NOR_FLASH_MAX_LOGICAL_SECTOR_OFFSET 2
  203. #ifndef LX_NOR_FLASH_MAX_ERASE_COUNT_DELTA
  204. #define LX_NOR_FLASH_MAX_ERASE_COUNT_DELTA 4
  205. #endif
  206. #define LX_NOR_SECTOR_MAPPING_CACHE_DEPTH 4
  207. #ifndef LX_NOR_SECTOR_MAPPING_CACHE_SIZE
  208. #define LX_NOR_SECTOR_MAPPING_CACHE_SIZE 16 /* Minimum value of 8, all sizes must be a power of 2. */
  209. #endif
  210. #ifndef LX_NOR_EXTENDED_CACHE_SIZE
  211. #define LX_NOR_EXTENDED_CACHE_SIZE 8 /* Maximum number of extended cache sectors. */
  212. #endif
  213. #ifdef LX_NOR_ENABLE_OBSOLETE_COUNT_CACHE
  214. #ifndef LX_NOR_OBSOLETE_COUNT_CACHE_TYPE
  215. #define LX_NOR_OBSOLETE_COUNT_CACHE_TYPE UCHAR
  216. #endif
  217. #endif
  218. /* Define the mask for the hash index into the sector mapping cache table. The sector mapping cache is divided
  219. into 4 entry pieces that are indexed by the formula:
  220. index = (sector & LX_NOR_SECTOR_MAPPING_CACHE_HASH_MASK) * LX_NOR_SECTOR_MAPPING_CACHE_DEPTH
  221. The LX_NOR_SECTOR_MAPPING_CACHE_DEPTH define must not be changed unless the related source code is also changed. */
  222. #define LX_NOR_SECTOR_MAPPING_CACHE_HASH_MASK ((LX_NOR_SECTOR_MAPPING_CACHE_SIZE/LX_NOR_SECTOR_MAPPING_CACHE_DEPTH)-1)
  223. #define LX_NOR_SECTOR_MAPPING_CACHE_ENTRY_MASK 0x7FFFFFFF
  224. #define LX_NOR_SECTOR_MAPPING_CACHE_ENTRY_VALID 0x80000000
  225. #define LX_NOR_PHYSICAL_SECTOR_VALID 0x80000000
  226. #define LX_NOR_PHYSICAL_SECTOR_SUPERCEDED 0x40000000
  227. #define LX_NOR_PHYSICAL_SECTOR_MAPPING_NOT_VALID 0x20000000
  228. #define LX_NOR_LOGICAL_SECTOR_MASK 0x1FFFFFFF
  229. #define LX_NOR_PHYSICAL_SECTOR_FREE 0xFFFFFFFF
  230. /* Check extended cache configurations. */
  231. #ifdef LX_NOR_DISABLE_EXTENDED_CACHE
  232. #ifdef LX_NOR_ENABLE_MAPPING_BITMAP
  233. #error "To enable mapping bitmap, you need to undefine LX_NOR_DISABLE_EXTENDED_CACHE."
  234. #endif
  235. #ifdef LX_NOR_ENABLE_OBSOLETE_COUNT_CACHE
  236. #error "To enable obsolete count cache, you need to undefine LX_NOR_DISABLE_EXTENDED_CACHE."
  237. #endif
  238. #endif
  239. /* Define NAND flash constants. */
  240. #define LX_NAND_GOOD_BLOCK 0xFF
  241. #define LX_NAND_BAD_BLOCK 0x00
  242. #define LX_NAND_FLASH_OPENED ((ULONG) 0x4E4F524F)
  243. #define LX_NAND_FLASH_CLOSED ((ULONG) 0x4E4F5244)
  244. #ifndef LX_NAND_FLASH_MAX_ERASE_COUNT_DELTA
  245. #define LX_NAND_FLASH_MAX_ERASE_COUNT_DELTA 64
  246. #endif
  247. /* Define the NAND sector mapping cache. */
  248. #define LX_NAND_SECTOR_MAPPING_CACHE_DEPTH 4 /* Not required if LX_NAND_FLASH_DIRECT_MAPPING_CACHE is defined. */
  249. #ifndef LX_NAND_SECTOR_MAPPING_CACHE_SIZE
  250. #define LX_NAND_SECTOR_MAPPING_CACHE_SIZE 128 /* Minimum value of 8, all sizes must be a power of 2, unless direct
  251. mapping is defined, in which there is no power of 2 requirement. */
  252. #endif
  253. #ifndef LX_NAND_ERASE_COUNT_WRITE_SIZE
  254. #define LX_NAND_ERASE_COUNT_WRITE_SIZE (nand_flash -> lx_nand_flash_pages_per_block + 1)
  255. #endif
  256. #ifndef LX_NAND_FLASH_MAPPING_LIST_UPDATE_DISABLE
  257. #define LX_NAND_FLASH_MAPPING_LIST_UPDATE_DISABLE
  258. #endif
  259. #ifndef LX_NAND_FLASH_MAX_METADATA_BLOCKS
  260. #define LX_NAND_FLASH_MAX_METADATA_BLOCKS 4
  261. #endif
  262. #ifndef LX_UTILITY_SHORT_SET
  263. #define LX_UTILITY_SHORT_SET(address, value) *((USHORT*)(address)) = (USHORT)(value)
  264. #endif
  265. #ifndef LX_UTILITY_LONG_SET
  266. #define LX_UTILITY_LONG_SET(address, value) *((ULONG*)(address)) = (ULONG)(value)
  267. #endif
  268. #ifndef LX_UTILITY_SHORT_GET
  269. #define LX_UTILITY_SHORT_GET(address) (*((USHORT*)(address)))
  270. #endif
  271. #ifndef LX_UTILITY_LONG_GET
  272. #define LX_UTILITY_LONG_GET(address) (*((ULONG*)(address)))
  273. #endif
  274. /* Define the mask for the hash index into the NAND sector mapping cache table. The sector mapping cache is divided
  275. into 4 entry pieces that are indexed by the formula:
  276. index = (sector & LX_NAND_SECTOR_MAPPING_CACHE_HASH_MASK) * LX_NAND_SECTOR_MAPPING_CACHE_DEPTH
  277. The LX_NAND_SECTOR_MAPPING_CACHE_DEPTH define must not be changed unless the related source code is also changed. */
  278. #define LX_NAND_SECTOR_MAPPING_CACHE_HASH_MASK ((LX_NAND_SECTOR_MAPPING_CACHE_SIZE/LX_NAND_SECTOR_MAPPING_CACHE_DEPTH)-1)
  279. #define LX_NAND_SECTOR_MAPPING_CACHE_ENTRY_MASK 0x7FFFFFFF
  280. #define LX_NAND_SECTOR_MAPPING_CACHE_ENTRY_VALID 0x80000000
  281. #define LX_NAND_BLOCK_VALID 0x80000000
  282. #define LX_NAND_BLOCK_EMPTY 0x40000000
  283. #define LX_NAND_BLOCK_FULL 0x20000000
  284. #define LX_NAND_PAGE_VALID 0x80000000
  285. #define LX_NAND_PAGE_SUPERCEDED 0x40000000
  286. #define LX_NAND_PAGE_MAPPING_NOT_VALID 0x20000000
  287. #define LX_NAND_LOGICAL_SECTOR_MASK 0x1FFFFFFF
  288. #define LX_NAND_PAGE_FREE 0xFFFFFFFF
  289. #define LX_NAND_PAGE_LIST_VALID 0xF0F0F0F0
  290. #define LX_NAND_PAGE_TYPE_DEVICE_INFO 0x10000000u
  291. #define LX_NAND_PAGE_TYPE_ERASE_COUNT_TABLE 0x20000000u
  292. #define LX_NAND_PAGE_TYPE_BLOCK_MAPPING_TABLE 0x30000000u
  293. #define LX_NAND_PAGE_TYPE_USER_DATA 0x40000000u
  294. #define LX_NAND_PAGE_TYPE_USER_DATA_RELEASED 0x50000000u
  295. #define LX_NAND_PAGE_TYPE_READ_COUNT_TABLE 0x60000000u
  296. #define LX_NAND_PAGE_TYPE_PAGE_MAPPING_TABLE 0x70000000u
  297. #define LX_NAND_PAGE_TYPE_BLOCK_STATUS_TABLE 0x80000000u
  298. #define LX_NAND_PAGE_TYPE_BLOCK_LINK 0x90000000u
  299. #define LX_NAND_PAGE_TYPE_USER_DATA_MASK 0x0FFFFFFFu
  300. #define LX_NAND_PAGE_TYPE_PAGE_NUMBER_MASK 0x000000FFu
  301. #define LX_NAND_PAGE_TYPE_FREE_PAGE 0xFFFFFF00u
  302. #define LX_NAND_BLOCK_STATUS_FULL 0x4000u
  303. #define LX_NAND_BLOCK_STATUS_NON_SEQUENTIAL 0x2000u
  304. #define LX_NAND_BLOCK_STATUS_MAPPING_PRESENT 0x1000u
  305. #define LX_NAND_BLOCK_STATUS_PAGE_NUMBER_MASK 0x0FFFu
  306. #define LX_NAND_BLOCK_STATUS_FREE 0xFFFFu
  307. #define LX_NAND_BLOCK_STATUS_BAD 0xFF00u
  308. #define LX_NAND_BLOCK_STATUS_ALLOCATED 0x8000u
  309. #define LX_NAND_BLOCK_LINK_MAIN_METADATA_OFFSET 0
  310. #define LX_NAND_BLOCK_LINK_BACKUP_METADATA_OFFSET 4
  311. #define LX_NAND_MAX_BLOCK_COUNT 32768
  312. #define LX_NAND_MAX_PAGE_PER_BLOCK 4096
  313. #define LX_NAND_BLOCK_UNMAPPED 0xFFFF
  314. #define LX_NAND_DEVICE_INFO_SIGNATURE1 0x76654C20
  315. #define LX_NAND_DEVICE_INFO_SIGNATURE2 0x20586C65
  316. #define LX_NAND_DEVICE_INFO_METADATA_TYPE_MAIN 0x01
  317. #define LX_NAND_DEVICE_INFO_METADATA_TYPE_SECONDARY 0x02
  318. /* Define the NAND device information structure. This will be set in the spare area. */
  319. typedef struct LX_NAND_DEVICE_INFO_STRUCT
  320. {
  321. ULONG lx_nand_device_info_signature1;
  322. ULONG lx_nand_device_info_signature2;
  323. ULONG lx_nand_device_info_major_version;
  324. ULONG lx_nand_device_info_minor_version;
  325. ULONG lx_nand_device_info_patch_version;
  326. ULONG lx_nand_device_info_metadata_block_number;
  327. ULONG lx_nand_device_info_backup_metadata_block_number;
  328. ULONG lx_nand_device_info_base_erase_count;
  329. } LX_NAND_DEVICE_INFO;
  330. /* Determine if the flash control block has an extension defined. If not,
  331. define the extension to whitespace. */
  332. #ifndef LX_NAND_FLASH_USER_EXTENSION
  333. #define LX_NAND_FLASH_USER_EXTENSION
  334. #endif
  335. /* Define the NAND flash control block structure. */
  336. typedef struct LX_NAND_FLASH_STRUCT
  337. {
  338. ULONG lx_nand_flash_state;
  339. ULONG lx_nand_flash_total_blocks;
  340. ULONG lx_nand_flash_pages_per_block;
  341. ULONG lx_nand_flash_bytes_per_page;
  342. ULONG lx_nand_flash_words_per_block;
  343. ULONG lx_nand_flash_words_per_page;
  344. ULONG lx_nand_flash_total_pages;
  345. ULONG lx_nand_flash_bad_blocks;
  346. ULONG lx_nand_flash_base_erase_count;
  347. ULONG lx_nand_flash_page_corrections;
  348. ULONG lx_nand_flash_last_block_correction;
  349. ULONG lx_nand_flash_last_page_correction;
  350. USHORT *lx_nand_flash_block_mapping_table;
  351. ULONG lx_nand_flash_block_mapping_table_size;
  352. USHORT *lx_nand_flash_block_status_table;
  353. ULONG lx_nand_flash_block_status_table_size;
  354. UCHAR *lx_nand_flash_erase_count_table;
  355. ULONG lx_nand_flash_erase_count_table_size;
  356. USHORT *lx_nand_flash_block_list;
  357. ULONG lx_nand_flash_block_list_size;
  358. ULONG lx_nand_flash_free_block_list_tail;
  359. ULONG lx_nand_flash_mapped_block_list_head;
  360. ULONG lx_nand_flash_metadata_block_number;
  361. ULONG lx_nand_flash_metadata_block_number_current;
  362. ULONG lx_nand_flash_metadata_block_number_next;
  363. ULONG lx_nand_flash_metadata_block_current_page;
  364. ULONG lx_nand_flash_metadata_block_count;
  365. USHORT lx_nand_flash_metadata_block[LX_NAND_FLASH_MAX_METADATA_BLOCKS];
  366. ULONG lx_nand_flash_backup_metadata_block_number;
  367. ULONG lx_nand_flash_backup_metadata_block_number_current;
  368. ULONG lx_nand_flash_backup_metadata_block_number_next;
  369. ULONG lx_nand_flash_backup_metadata_block_current_page;
  370. USHORT lx_nand_flash_backup_metadata_block[LX_NAND_FLASH_MAX_METADATA_BLOCKS];
  371. ULONG lx_nand_flash_spare_data1_offset;
  372. ULONG lx_nand_flash_spare_data1_length;
  373. ULONG lx_nand_flash_spare_data2_offset;
  374. ULONG lx_nand_flash_spare_data2_length;
  375. ULONG lx_nand_flash_spare_total_length;
  376. ULONG lx_nand_flash_diagnostic_system_errors;
  377. ULONG lx_nand_flash_diagnostic_system_error;
  378. ULONG lx_nand_flash_diagnostic_sector_write_requests;
  379. ULONG lx_nand_flash_diagnostic_sector_read_requests;
  380. ULONG lx_nand_flash_diagnostic_sector_release_requests;
  381. ULONG lx_nand_flash_diagnostic_page_allocates;
  382. ULONG lx_nand_flash_diagnostic_page_allocate_errors;
  383. ULONG lx_nand_flash_diagnostic_block_reclaim_attempts;
  384. ULONG lx_nand_flash_diagnostic_block_erases;
  385. ULONG lx_nand_flash_diagnostic_block_status_gets;
  386. ULONG lx_nand_flash_diagnostic_block_status_sets;
  387. ULONG lx_nand_flash_diagnostic_page_extra_bytes_sets;
  388. ULONG lx_nand_flash_diagnostic_page_writes;
  389. ULONG lx_nand_flash_diagnostic_page_extra_bytes_gets;
  390. ULONG lx_nand_flash_diagnostic_page_reads;
  391. ULONG lx_nand_flash_diagnostic_moved_pages;
  392. ULONG lx_nand_flash_diagnostic_block_erased_verifies;
  393. ULONG lx_nand_flash_diagnostic_page_erased_verifies;
  394. #ifdef LX_NAND_ENABLE_CONTROL_BLOCK_FOR_DRIVER_INTERFACE
  395. UINT (*lx_nand_flash_driver_read)(struct LX_NAND_FLASH_STRUCT *nand_flash, ULONG block, ULONG page, ULONG *destination, ULONG words);
  396. UINT (*lx_nand_flash_driver_write)(struct LX_NAND_FLASH_STRUCT *nand_flash, ULONG block, ULONG page, ULONG *source, ULONG words);
  397. UINT (*lx_nand_flash_driver_block_erase)(struct LX_NAND_FLASH_STRUCT *nand_flash, ULONG block, ULONG erase_count);
  398. UINT (*lx_nand_flash_driver_block_erased_verify)(struct LX_NAND_FLASH_STRUCT *nand_flash, ULONG block);
  399. UINT (*lx_nand_flash_driver_page_erased_verify)(struct LX_NAND_FLASH_STRUCT *nand_flash, ULONG block, ULONG page);
  400. UINT (*lx_nand_flash_driver_block_status_get)(struct LX_NAND_FLASH_STRUCT *nand_flash, ULONG block, UCHAR *bad_block_flag);
  401. UINT (*lx_nand_flash_driver_block_status_set)(struct LX_NAND_FLASH_STRUCT *nand_flash, ULONG block, UCHAR bad_block_flag);
  402. UINT (*lx_nand_flash_driver_extra_bytes_get)(struct LX_NAND_FLASH_STRUCT *nand_flash, ULONG block, ULONG page, UCHAR *destination, UINT size);
  403. UINT (*lx_nand_flash_driver_extra_bytes_set)(struct LX_NAND_FLASH_STRUCT *nand_flash, ULONG block, ULONG page, UCHAR *source, UINT size);
  404. UINT (*lx_nand_flash_driver_system_error)(struct LX_NAND_FLASH_STRUCT *nand_flash, UINT error_code, ULONG block, ULONG page);
  405. UINT (*lx_nand_flash_driver_pages_read)(struct LX_NAND_FLASH_STRUCT *nand_flash, ULONG block, ULONG page, UCHAR* main_buffer, UCHAR* spare_buffer, ULONG pages);
  406. UINT (*lx_nand_flash_driver_pages_write)(struct LX_NAND_FLASH_STRUCT *nand_flash, ULONG block, ULONG page, UCHAR* main_buffer, UCHAR* spare_buffer, ULONG pages);
  407. UINT (*lx_nand_flash_driver_pages_copy)(struct LX_NAND_FLASH_STRUCT *nand_flash, ULONG source_block, ULONG source_page, ULONG destination_block, ULONG destination_page, ULONG pages, UCHAR* data_buffer);
  408. #else
  409. UINT (*lx_nand_flash_driver_read)(ULONG block, ULONG page, ULONG *destination, ULONG words);
  410. UINT (*lx_nand_flash_driver_write)(ULONG block, ULONG page, ULONG *source, ULONG words);
  411. UINT (*lx_nand_flash_driver_block_erase)(ULONG block, ULONG erase_count);
  412. UINT (*lx_nand_flash_driver_block_erased_verify)(ULONG block);
  413. UINT (*lx_nand_flash_driver_page_erased_verify)(ULONG block, ULONG page);
  414. UINT (*lx_nand_flash_driver_block_status_get)(ULONG block, UCHAR *bad_block_flag);
  415. UINT (*lx_nand_flash_driver_block_status_set)(ULONG block, UCHAR bad_block_flag);
  416. UINT (*lx_nand_flash_driver_extra_bytes_get)(ULONG block, ULONG page, UCHAR *destination, UINT size);
  417. UINT (*lx_nand_flash_driver_extra_bytes_set)(ULONG block, ULONG page, UCHAR *source, UINT size);
  418. UINT (*lx_nand_flash_driver_system_error)(UINT error_code, ULONG block, ULONG page);
  419. UINT (*lx_nand_flash_driver_pages_read)(ULONG block, ULONG page, UCHAR* main_buffer, UCHAR* spare_buffer, ULONG pages);
  420. UINT (*lx_nand_flash_driver_pages_write)(ULONG block, ULONG page, UCHAR* main_buffer, UCHAR* spare_buffer, ULONG pages);
  421. UINT (*lx_nand_flash_driver_pages_copy)(ULONG source_block, ULONG source_page, ULONG destination_block, ULONG destination_page, ULONG pages, UCHAR* data_buffer);
  422. #endif
  423. UCHAR *lx_nand_flash_page_buffer;
  424. UINT lx_nand_flash_page_buffer_size;
  425. #ifdef LX_THREAD_SAFE_ENABLE
  426. /* When this conditional is used, the LevelX code utilizes a ThreadX mutex for thread
  427. safe operation. Generally, this is not required since FileX ensures thread safe operation at
  428. a higher layer. */
  429. TX_MUTEX lx_nand_flash_mutex;
  430. #endif
  431. /* Define the NAND flash control block open next/previous pointers. */
  432. struct LX_NAND_FLASH_STRUCT *lx_nand_flash_open_next,
  433. *lx_nand_flash_open_previous;
  434. /* Define the user extension in the flash control block. This
  435. is typically defined in lx_user.h. */
  436. LX_NAND_FLASH_USER_EXTENSION
  437. } LX_NAND_FLASH;
  438. /* Define the NOR flash sector cache entry structure. */
  439. typedef struct LX_NOR_SECTOR_MAPPING_CACHE_ENTRY_STRUCT
  440. {
  441. ULONG lx_nor_sector_mapping_cache_logical_sector;
  442. ULONG *lx_nor_sector_mapping_cache_physical_sector_map_entry;
  443. ULONG *lx_nor_sector_mapping_cache_physical_sector_address;
  444. } LX_NOR_SECTOR_MAPPING_CACHE_ENTRY;
  445. /* Define the NOR flash extended cache entry structure. */
  446. typedef struct LX_NOR_FLASH_EXTENDED_CACHE_ENTRY_STRUCT
  447. {
  448. ULONG *lx_nor_flash_extended_cache_entry_sector_address;
  449. ULONG *lx_nor_flash_extended_cache_entry_sector_memory;
  450. ULONG lx_nor_flash_extended_cache_entry_access_count;
  451. } LX_NOR_FLASH_EXTENDED_CACHE_ENTRY;
  452. /* Determine if the flash control block has an extension defined. If not,
  453. define the extension to whitespace. */
  454. #ifndef LX_NOR_FLASH_USER_EXTENSION
  455. #define LX_NOR_FLASH_USER_EXTENSION
  456. #endif
  457. /* Define the NOR flash control block structure. */
  458. typedef struct LX_NOR_FLASH_STRUCT
  459. {
  460. ULONG lx_nor_flash_state;
  461. ULONG lx_nor_flash_total_blocks;
  462. ULONG lx_nor_flash_words_per_block;
  463. ULONG lx_nor_flash_total_physical_sectors;
  464. ULONG lx_nor_flash_physical_sectors_per_block;
  465. ULONG *lx_nor_flash_base_address;
  466. ULONG lx_nor_flash_block_free_bit_map_offset;
  467. ULONG lx_nor_flash_block_bit_map_words;
  468. ULONG lx_nor_flash_block_bit_map_mask;
  469. ULONG lx_nor_flash_block_physical_sector_mapping_offset;
  470. ULONG lx_nor_flash_block_physical_sector_offset;
  471. ULONG lx_nor_flash_free_physical_sectors;
  472. ULONG lx_nor_flash_mapped_physical_sectors;
  473. ULONG lx_nor_flash_obsolete_physical_sectors;
  474. ULONG lx_nor_flash_minimum_erase_count;
  475. ULONG lx_nor_flash_minimum_erased_blocks;
  476. ULONG lx_nor_flash_maximum_erase_count;
  477. ULONG lx_nor_flash_free_block_search;
  478. ULONG lx_nor_flash_found_block_search;
  479. ULONG lx_nor_flash_found_sector_search;
  480. ULONG lx_nor_flash_write_requests;
  481. ULONG lx_nor_flash_read_requests;
  482. ULONG lx_nor_flash_sector_mapping_cache_hits;
  483. ULONG lx_nor_flash_sector_mapping_cache_misses;
  484. ULONG lx_nor_flash_physical_block_allocates;
  485. ULONG lx_nor_flash_physical_block_allocate_errors;
  486. ULONG lx_nor_flash_diagnostic_system_errors;
  487. ULONG lx_nor_flash_diagnostic_system_error;
  488. ULONG lx_nor_flash_diagnostic_initial_format;
  489. ULONG lx_nor_flash_diagnostic_erased_block;
  490. ULONG lx_nor_flash_diagnostic_re_erase_block;
  491. ULONG lx_nor_flash_diagnostic_sector_being_obsoleted;
  492. ULONG lx_nor_flash_diagnostic_sector_obsoleted;
  493. ULONG lx_nor_flash_diagnostic_mapping_invalidated;
  494. ULONG lx_nor_flash_diagnostic_mapping_write_interrupted;
  495. ULONG lx_nor_flash_diagnostic_sector_not_free;
  496. ULONG lx_nor_flash_diagnostic_sector_data_not_free;
  497. #ifdef LX_NOR_ENABLE_CONTROL_BLOCK_FOR_DRIVER_INTERFACE
  498. UINT (*lx_nor_flash_driver_read)(struct LX_NOR_FLASH_STRUCT *nor_flash, ULONG *flash_address, ULONG *destination, ULONG words);
  499. UINT (*lx_nor_flash_driver_write)(struct LX_NOR_FLASH_STRUCT *nor_flash, ULONG *flash_address, ULONG *source, ULONG words);
  500. UINT (*lx_nor_flash_driver_block_erase)(struct LX_NOR_FLASH_STRUCT *nor_flash, ULONG block, ULONG erase_count);
  501. UINT (*lx_nor_flash_driver_block_erased_verify)(struct LX_NOR_FLASH_STRUCT *nor_flash, ULONG block);
  502. UINT (*lx_nor_flash_driver_system_error)(struct LX_NOR_FLASH_STRUCT *nor_flash, UINT error_code);
  503. #else
  504. UINT (*lx_nor_flash_driver_read)(ULONG *flash_address, ULONG *destination, ULONG words);
  505. UINT (*lx_nor_flash_driver_write)(ULONG *flash_address, ULONG *source, ULONG words);
  506. UINT (*lx_nor_flash_driver_block_erase)(ULONG block, ULONG erase_count);
  507. UINT (*lx_nor_flash_driver_block_erased_verify)(ULONG block);
  508. UINT (*lx_nor_flash_driver_system_error)(UINT error_code);
  509. #endif
  510. ULONG *lx_nor_flash_sector_buffer;
  511. UINT lx_nor_flash_sector_mapping_cache_enabled;
  512. LX_NOR_SECTOR_MAPPING_CACHE_ENTRY
  513. lx_nor_flash_sector_mapping_cache[LX_NOR_SECTOR_MAPPING_CACHE_SIZE];
  514. #ifndef LX_NOR_DISABLE_EXTENDED_CACHE
  515. UINT lx_nor_flash_extended_cache_entries;
  516. LX_NOR_FLASH_EXTENDED_CACHE_ENTRY
  517. lx_nor_flash_extended_cache[LX_NOR_EXTENDED_CACHE_SIZE];
  518. ULONG lx_nor_flash_extended_cache_hits;
  519. ULONG lx_nor_flash_extended_cache_misses;
  520. #ifdef LX_NOR_ENABLE_MAPPING_BITMAP
  521. ULONG *lx_nor_flash_extended_cache_mapping_bitmap;
  522. ULONG lx_nor_flash_extended_cache_mapping_bitmap_max_logical_sector;
  523. #endif
  524. #ifdef LX_NOR_ENABLE_OBSOLETE_COUNT_CACHE
  525. LX_NOR_OBSOLETE_COUNT_CACHE_TYPE
  526. *lx_nor_flash_extended_cache_obsolete_count;
  527. ULONG lx_nor_flash_extended_cache_obsolete_count_max_block;
  528. #endif
  529. #endif
  530. #ifdef LX_THREAD_SAFE_ENABLE
  531. /* When this conditional is used, the LevelX code utilizes a ThreadX mutex for thread
  532. safe operation. Generally, this is not required since FileX ensures thread safe operation at
  533. a higher layer. */
  534. TX_MUTEX lx_nor_flash_mutex;
  535. #endif
  536. /* Define the NOR flash control block open next/previous pointers. */
  537. struct LX_NOR_FLASH_STRUCT *lx_nor_flash_open_next,
  538. *lx_nor_flash_open_previous;
  539. /* Define the user extension in the flash control block. This
  540. is typically defined in lx_user.h. */
  541. LX_NOR_FLASH_USER_EXTENSION
  542. } LX_NOR_FLASH;
  543. /* Each physical NOR block has the following structure at the beginning of the block:
  544. Offset Meaning
  545. 0 Erase count
  546. 4 Minimum logical sector number - only when the block is full
  547. 8 Maximum logical sector number - only when the block is full
  548. 12 Free physical sector bit map, where a value of 1 indicates a
  549. free physical sector. The bit map is evenly divisible by 4
  550. . Array of physical sector mapping information (4 bytes per entry,
  551. one entry for each physical sector in block). Each entry looks
  552. like the following:
  553. Bit(s) Meaning
  554. 0-29 Logical sector mapped if not 0x3FFFFFFF
  555. 30 If 0, entry is being superceded
  556. 31 If 1, entry is valid
  557. Array of physical sectors, with each of size LX_NOR_SECTOR_SIZE
  558. */
  559. typedef struct LX_NOR_FLASH_BLOCK_HEADER_STRUCT
  560. {
  561. ULONG lx_nor_flash_block_erase_count; /* Bit 31: 1 -> not used, 0 -> used */
  562. ULONG lx_nor_flash_block_min_logical_sector; /* On full block, minimum valid sector */
  563. ULONG lx_nor_flash_block_max_logical_sector; /* On full block, maximum valid sector */
  564. } LX_NOR_FLASH_BLOCK_HEADER;
  565. /* Define external structure references. */
  566. extern LX_NAND_FLASH *_lx_nand_flash_opened_ptr;
  567. extern ULONG _lx_nand_flash_opened_count;
  568. extern LX_NOR_FLASH *_lx_nor_flash_opened_ptr;
  569. extern ULONG _lx_nor_flash_opened_count;
  570. /* Map internal functions. */
  571. #ifndef LX_SOURCE_CODE
  572. #define lx_nand_flash_close _lx_nand_flash_close
  573. #define lx_nand_flash_defragment _lx_nand_flash_defragment
  574. #define lx_nand_flash_partial_defragment _lx_nand_flash_partial_defragment
  575. #define lx_nand_flash_extended_cache_enable _lx_nand_flash_extended_cache_enable
  576. #define lx_nand_flash_format _lx_nand_flash_format
  577. #define lx_nand_flash_initialize _lx_nand_flash_initialize
  578. #define lx_nand_flash_open _lx_nand_flash_open
  579. #define lx_nand_flash_page_ecc_check _lx_nand_flash_page_ecc_check
  580. #define lx_nand_flash_page_ecc_compute _lx_nand_flash_page_ecc_compute
  581. #define lx_nand_flash_sector_read _lx_nand_flash_sector_read
  582. #define lx_nand_flash_sector_release _lx_nand_flash_sector_release
  583. #define lx_nand_flash_sector_write _lx_nand_flash_sector_write
  584. #define lx_nand_flash_sectors_read _lx_nand_flash_sectors_read
  585. #define lx_nand_flash_sectors_release _lx_nand_flash_sectors_release
  586. #define lx_nand_flash_sectors_write _lx_nand_flash_sectors_write
  587. #define lx_nand_flash_256byte_ecc_check _lx_nand_flash_256byte_ecc_check
  588. #define lx_nand_flash_256byte_ecc_compute _lx_nand_flash_256byte_ecc_compute
  589. #define lx_nor_flash_close _lx_nor_flash_close
  590. #define lx_nor_flash_defragment _lx_nor_flash_defragment
  591. #define lx_nor_flash_partial_defragment _lx_nor_flash_partial_defragment
  592. #define lx_nor_flash_extended_cache_enable _lx_nor_flash_extended_cache_enable
  593. #define lx_nor_flash_initialize _lx_nor_flash_initialize
  594. #define lx_nor_flash_open _lx_nor_flash_open
  595. #define lx_nor_flash_sector_read _lx_nor_flash_sector_read
  596. #define lx_nor_flash_sector_release _lx_nor_flash_sector_release
  597. #define lx_nor_flash_sector_write _lx_nor_flash_sector_write
  598. #endif
  599. /* External LevelX API prototypes. */
  600. UINT _lx_nand_flash_close(LX_NAND_FLASH *nand_flash);
  601. UINT _lx_nand_flash_defragment(LX_NAND_FLASH *nand_flash);
  602. UINT _lx_nand_flash_initialize(void);
  603. UINT _lx_nand_flash_extended_cache_enable(LX_NAND_FLASH *nand_flash, VOID *memory, ULONG size);
  604. UINT _lx_nand_flash_format(LX_NAND_FLASH* nand_flash, CHAR* name,
  605. UINT(*nand_driver_initialize)(LX_NAND_FLASH*),
  606. ULONG* memory_ptr, UINT memory_size);
  607. UINT _lx_nand_flash_open(LX_NAND_FLASH *nand_flash, CHAR *name, UINT (*nand_driver_initialize)(LX_NAND_FLASH *), ULONG* memory_ptr, UINT memory_size);
  608. UINT _lx_nand_flash_page_ecc_check(LX_NAND_FLASH *nand_flash, UCHAR *page_buffer, UCHAR *ecc_buffer);
  609. UINT _lx_nand_flash_page_ecc_compute(LX_NAND_FLASH *nand_flash, UCHAR *page_buffer, UCHAR *ecc_buffer);
  610. UINT _lx_nand_flash_partial_defragment(LX_NAND_FLASH *nand_flash, UINT max_blocks);
  611. UINT _lx_nand_flash_sector_read(LX_NAND_FLASH *nand_flash, ULONG logical_sector, VOID *buffer);
  612. UINT _lx_nand_flash_sector_release(LX_NAND_FLASH *nand_flash, ULONG logical_sector);
  613. UINT _lx_nand_flash_sector_write(LX_NAND_FLASH *nand_flash, ULONG logical_sector, VOID *buffer);
  614. UINT _lx_nand_flash_sectors_read(LX_NAND_FLASH* nand_flash, ULONG logical_sector, VOID* buffer, ULONG sector_count);
  615. UINT _lx_nand_flash_sectors_release(LX_NAND_FLASH* nand_flash, ULONG logical_sector, ULONG sector_count);
  616. UINT _lx_nand_flash_sectors_write(LX_NAND_FLASH* nand_flash, ULONG logical_sector, VOID* buffer, ULONG sector_count);
  617. UINT _lx_nor_flash_close(LX_NOR_FLASH *nor_flash);
  618. UINT _lx_nor_flash_defragment(LX_NOR_FLASH *nor_flash);
  619. UINT _lx_nor_flash_extended_cache_enable(LX_NOR_FLASH *nor_flash, VOID *memory, ULONG size);
  620. UINT _lx_nor_flash_initialize(void);
  621. UINT _lx_nor_flash_open(LX_NOR_FLASH *nor_flash, CHAR *name, UINT (*nor_driver_initialize)(LX_NOR_FLASH *));
  622. UINT _lx_nor_flash_partial_defragment(LX_NOR_FLASH *nor_flash, UINT max_blocks);
  623. UINT _lx_nor_flash_sector_read(LX_NOR_FLASH *nor_flash, ULONG logical_sector, VOID *buffer);
  624. UINT _lx_nor_flash_sector_release(LX_NOR_FLASH *nor_flash, ULONG logical_sector);
  625. UINT _lx_nor_flash_sector_write(LX_NOR_FLASH *nor_flash, ULONG logical_sector, VOID *buffer);
  626. /* Internal LevelX prototypes. */
  627. UINT _lx_nand_flash_driver_block_erase(LX_NAND_FLASH *nand_flash, ULONG block, ULONG erase_count);
  628. UINT _lx_nand_flash_driver_block_erased_verify(LX_NAND_FLASH *nand_flash, ULONG block);
  629. UINT _lx_nand_flash_driver_page_erased_verify(LX_NAND_FLASH *nand_flash, ULONG block, ULONG page);
  630. UINT _lx_nand_flash_driver_block_status_get(LX_NAND_FLASH *nand_flash, ULONG block, UCHAR *bad_block_flag);
  631. UINT _lx_nand_flash_driver_block_status_set(LX_NAND_FLASH *nand_flash, ULONG block, UCHAR bad_block_flag);
  632. VOID _lx_nand_flash_internal_error(LX_NAND_FLASH *nand_flash, ULONG error_code);
  633. UINT _lx_nand_flash_block_find(LX_NAND_FLASH *nand_flash, ULONG logical_sector, ULONG *block, USHORT *block_status);
  634. UINT _lx_nand_flash_block_allocate(LX_NAND_FLASH *nand_flash, ULONG *block);
  635. UINT _lx_nand_flash_block_data_move(LX_NAND_FLASH* nand_flash, ULONG new_block);
  636. UINT _lx_nand_flash_block_status_set(LX_NAND_FLASH *nand_flash, ULONG block, ULONG block_status);
  637. UINT _lx_nand_flash_erase_count_set(LX_NAND_FLASH* nand_flash, ULONG block, UCHAR erase_count);
  638. UINT _lx_nand_flash_block_mapping_set(LX_NAND_FLASH* nand_flash, ULONG logical_sector, ULONG block);
  639. UINT _lx_nand_flash_data_page_copy(LX_NAND_FLASH* nand_flash, ULONG logical_sector, ULONG source_block, USHORT src_block_status,
  640. ULONG destination_block, USHORT* dest_block_status_ptr, ULONG sectors);
  641. UINT _lx_nand_flash_free_block_list_add(LX_NAND_FLASH* nand_flash, ULONG block);
  642. UINT _lx_nand_flash_mapped_block_list_add(LX_NAND_FLASH* nand_flash, ULONG block_mapping_index);
  643. UINT _lx_nand_flash_mapped_block_list_get(LX_NAND_FLASH* nand_flash, ULONG *block_mapping_index);
  644. UINT _lx_nand_flash_mapped_block_list_remove(LX_NAND_FLASH* nand_flash, ULONG block_mapping_index);
  645. UINT _lx_nand_flash_memory_initialize(LX_NAND_FLASH* nand_flash, ULONG* memory_ptr, UINT memory_size);
  646. UINT _lx_nand_flash_metadata_allocate(LX_NAND_FLASH* nand_flash);
  647. UINT _lx_nand_flash_metadata_build(LX_NAND_FLASH* nand_flash);
  648. UINT _lx_nand_flash_metadata_write(LX_NAND_FLASH *nand_flash, UCHAR* main_buffer, ULONG spare_value);
  649. VOID _lx_nand_flash_system_error(LX_NAND_FLASH *nand_flash, UINT error_code, ULONG block, ULONG page);
  650. UINT _lx_nand_flash_256byte_ecc_check(UCHAR *page_buffer, UCHAR *ecc_buffer);
  651. UINT _lx_nand_flash_256byte_ecc_compute(UCHAR *page_buffer, UCHAR *ecc_buffer);
  652. UINT _lx_nor_flash_block_reclaim(LX_NOR_FLASH *nor_flash);
  653. UINT _lx_nor_flash_driver_block_erase(LX_NOR_FLASH *nor_flash, ULONG block, ULONG erase_count);
  654. UINT _lx_nor_flash_driver_read(LX_NOR_FLASH *nor_flash, ULONG *flash_address, ULONG *destination, ULONG words);
  655. UINT _lx_nor_flash_driver_write(LX_NOR_FLASH *nor_flash, ULONG *flash_address, ULONG *source, ULONG words);
  656. VOID _lx_nor_flash_internal_error(LX_NOR_FLASH *nor_flash, ULONG error_code);
  657. UINT _lx_nor_flash_logical_sector_find(LX_NOR_FLASH *nor_flash, ULONG logical_sector, ULONG superceded_check, ULONG **physical_sector_map_entry, ULONG **physical_sector_address);
  658. UINT _lx_nor_flash_next_block_to_erase_find(LX_NOR_FLASH *nor_flash, ULONG *return_erase_block, ULONG *return_erase_count, ULONG *return_mapped_sectors, ULONG *return_obsolete_sectors);
  659. UINT _lx_nor_flash_physical_sector_allocate(LX_NOR_FLASH *nor_flash, ULONG logical_sector, ULONG **physical_sector_map_entry, ULONG **physical_sector_address);
  660. VOID _lx_nor_flash_sector_mapping_cache_invalidate(LX_NOR_FLASH *nor_flash, ULONG logical_sector);
  661. VOID _lx_nor_flash_system_error(LX_NOR_FLASH *nor_flash, UINT error_code);
  662. #ifdef __cplusplus
  663. }
  664. #endif
  665. #endif