29#define sp_fal() (sp_fal_ctx)
33#define XF_FAL_CTX_MUTEX_TRY_INIT() \
35 if (NULL == sp_fal()->mutex) { \
36 xf_lock_init(&sp_fal()->mutex); \
40#define XF_FAL_CTX_MUTEX_TRY_DEINIT() \
42 if (NULL != sp_fal()->mutex) { \
43 xf_lock_destroy(sp_fal()->mutex); \
44 sp_fal()->mutex = NULL; \
48#define XF_FAL_CTX_TRYLOCK__RETURN_ON_FAILURE(_ret) \
50 if (sp_fal()->mutex) { \
51 if (XF_LOCK_FAIL == xf_lock_trylock(sp_fal()->mutex)) { \
56 if (true == sp_fal()->is_lock) { \
59 sp_fal()->is_lock = true; \
62#define XF_FAL_CTX_TRYLOCK__ANYWAY() \
64 if (sp_fal()->mutex) { \
65 xf_lock_trylock(sp_fal()->mutex); \
68 sp_fal()->is_lock = true; \
71#define XF_FAL_CTX_UNLOCK() \
73 if (sp_fal()->mutex) { \
74 xf_lock_unlock(sp_fal()->mutex); \
77 sp_fal()->is_lock = false; \
80#if XF_FAL_LOCK_IS_ENABLE == 0
81#undef XF_FAL_CTX_MUTEX_TRY_INIT
82#undef XF_FAL_CTX_MUTEX_TRY_DEINIT
83#undef XF_FAL_CTX_TRYLOCK__RETURN_ON_FAILURE
84#undef XF_FAL_CTX_TRYLOCK__ANYWAY
85#undef XF_FAL_CTX_UNLOCK
86#define XF_FAL_CTX_MUTEX_TRY_INIT()
87#define XF_FAL_CTX_MUTEX_TRY_DEINIT()
88#define XF_FAL_CTX_TRYLOCK__RETURN_ON_FAILURE(_ret)
89#define XF_FAL_CTX_TRYLOCK__ANYWAY()
90#define XF_FAL_CTX_UNLOCK()
117 if (p_dev ==
sp_fal()->flash_device_table[i]) {
121 if ((NULL ==
sp_fal()->flash_device_table[i])
122 && (-1 == idle_idx)) {
126 if (idle_idx == -1) {
131 sp_fal()->flash_device_table[idle_idx] = p_dev;
145 if ((NULL == p_table)
146 || ((0 == table_len))) {
157 if (p_table ==
sp_fal()->partition_table[i]) {
161 if ((NULL ==
sp_fal()->partition_table[i])
162 && (-1 == idle_idx)) {
166 if (idle_idx == -1) {
171 sp_fal()->partition_table[idle_idx] = p_table;
172 sp_fal()->partition_table_len[idle_idx] = table_len;
195 if ((p_dev ==
sp_fal()->flash_device_table[i])) {
205 sp_fal()->flash_device_table[dev_idx] = NULL;
218 if (NULL == p_table) {
228 if ((p_table ==
sp_fal()->partition_table[i])) {
232 if (table_idx == -1) {
237 sp_fal()->partition_table[table_idx] = NULL;
238 sp_fal()->partition_table_len[table_idx] = 0;
248 if (0 ==
sp_fal()->cached_num) {
270 device_table =
sp_fal()->flash_device_table[i];
271 if ((!device_table) || (!device_table->
ops.
init)) {
276 "addr: 0x%08x | len: 0x%08x | sector_size: 0x%08x | "
277 "initialized finish.",
283 if (xf_ret !=
XF_OK) {
305 device_table =
sp_fal()->flash_device_table[i];
306 if ((!device_table) || (!device_table->
ops.
deinit)) {
313 sp_fal()->is_init =
false;
330 flash_device =
sp_fal()->flash_device_table[i];
354 for (i = 0; i <
sp_fal()->cached_num; i++) {
355 if (
sp_fal()->cache[i].partition == part) {
356 flash_dev =
sp_fal()->cache[i].flash_dev;
385 p_table =
sp_fal()->partition_table[i];
386 table_len =
sp_fal()->partition_table_len[i];
387 if ((NULL == p_table) || (0 == table_len)) {
390 for (j = 0; j < table_len; j++) {
406 size_t src_offset,
void *dst,
size_t size)
417 if (!part || !dst || !size) {
420 if (src_offset + size > part->
len) {
422 "Partition(%s) address(0x%08x) out of bound(0x%08x).",
423 part->
name, (
int)(src_offset + size), (
int)part->
len);
428 if (flash_dev == NULL) {
430 "Do NOT found the flash device(%s).", part->
flash_name);
434 xf_ret = flash_dev->
ops.
read(part->
offset + src_offset, dst, size);
435 if (xf_ret !=
XF_OK) {
437 "Flash device(%s) read failed.", part->
flash_name);
445 size_t dst_offset,
const void *src,
size_t size)
456 if (!part || !src || !size) {
459 if (dst_offset + size > part->
len) {
461 "Partition(%s) address(0x%08x) out of bound(0x%08x).",
462 part->
name, (
int)(dst_offset + size), (
int)part->
len);
467 if (flash_dev == NULL) {
469 "Do NOT found the flash device(%s).", part->
flash_name);
473 xf_ret = flash_dev->
ops.
write(part->
offset + dst_offset, src, size);
474 if (xf_ret !=
XF_OK) {
476 "Flash device(%s) write failed.", part->
flash_name);
494 if (!part || !size) {
497 if (offset + size > part->
len) {
499 "Partition(%s) address(0x%08x) out of bound(0x%08x).",
500 part->
name, (
int)(offset + size), (
int)part->
len);
505 if (flash_dev == NULL) {
507 "Do NOT found the flash device(%s).", part->
flash_name);
512 if (xf_ret !=
XF_OK) {
514 "Flash device(%s) write failed.", part->
flash_name);
532 char *item1 =
"name";
533 char *item2 =
"flash_dev";
534 size_t part_name_max = strlen(item1);
535 size_t flash_dev_name_max = strlen(item2);
539 p_table =
sp_fal()->partition_table[i];
540 table_len =
sp_fal()->partition_table_len[i];
541 if ((NULL == p_table) || (0 == table_len)) {
544 for (j = 0; j < table_len; j++) {
547 if (part_name_max < len_max) {
548 part_name_max = len_max;
551 if (flash_dev_name_max < len_max) {
552 flash_dev_name_max = len_max;
557 XF_LOGI(
TAG,
"==================== FAL partition table ===================");
558 XF_LOGI(
TAG,
"| %-*.*s | %-*.*s | offset | length |",
561 XF_LOGI(
TAG,
"-------------------------------------------------------------");
563 p_table =
sp_fal()->partition_table[i];
564 table_len =
sp_fal()->partition_table_len[i];
565 if ((NULL == p_table) || (0 == table_len)) {
568 for (j = 0; j < table_len; j++) {
570 XF_LOGI(
TAG,
"| %-*.*s | %-*.*s | 0x%08lx | 0x%08lx |",
576 XF_LOGI(
TAG,
"=============================================================");
592 p_table =
sp_fal()->partition_table[i];
593 table_len =
sp_fal()->partition_table_len[i];
594 if ((NULL == p_table) || (0 == table_len)) {
597 for (j = 0; j < table_len; j++) {
600 if (flash_dev == NULL) {
601 XF_LOGD(
TAG,
"Warning: Do NOT found the flash device(%s).",
606 if (part->
offset >= (
size_t)flash_dev->
len) {
608 "Partition(%s) offset address(%ld) out of flash bound(<%d).",
619 sp_fal()->cache[
sp_fal()->cached_num].flash_dev = flash_dev;
xf_err_t xf_fal_partition_read(const xf_fal_partition_t *part, size_t src_offset, void *dst, size_t size)
从指定分区读取数据。
xf_err_t xf_fal_register_flash_device(const xf_fal_flash_dev_t *p_dev)
注册一个 flash 设备到 xf_fal 中。
xf_err_t xf_fal_deinit(void)
反初始化 FAL.
xf_err_t xf_fal_partition_erase(const xf_fal_partition_t *part, size_t offset, size_t size)
擦除指定分区数据。
xf_err_t xf_fal_partition_erase_all(const xf_fal_partition_t *part)
擦除指定分区所有数据。
bool xf_fal_check_register_state(void)
检查 xf_fal 注册状态。
xf_err_t xf_fal_init(void)
初始化 FAL.
xf_err_t xf_fal_check_and_update_cache(void)
更新分区表中的分区与关联的 flash 设备的缓存。
xf_err_t xf_fal_unregister_partition_table(const xf_fal_partition_t *p_table)
从 xf_fal 中注销一个分区表。
const xf_fal_ctx_t * xf_fal_get_ctx(void)
获取 xf_fal 上下文。
xf_err_t xf_fal_partition_write(const xf_fal_partition_t *part, size_t dst_offset, const void *src, size_t size)
将数据写入指定分区。
const xf_fal_flash_dev_t * xf_fal_flash_device_find(const char *name)
根据 flash 名称查找 flash 设备。
void xf_fal_show_part_table(void)
打印分区表信息。
xf_err_t xf_fal_register_partition_table(const xf_fal_partition_t *p_table, size_t table_len)
注册一个分区表到 xf_fal 中。
const xf_fal_partition_t * xf_fal_partition_find(const char *name)
根据分区名称查找分区句柄。
xf_err_t xf_fal_unregister_flash_device(const xf_fal_flash_dev_t *p_dev)
从 xf_fal 中注销一个 flash 设备。
const xf_fal_flash_dev_t * xf_fal_flash_device_find_by_part(const xf_fal_partition_t *part)
通过给定分区查找 flash 设备。
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
#define xf_strncmp(dest, src, n)
xf_fal_flash_ops_t ops
flash 操作集,见 xf_fal_flash_ops_t .
size_t sector_size
扇区大小。扇区大小是最小擦除大小。单位: byte.
xf_err_t(* write)(size_t dst_offset, const void *src, size_t size)
写数据到 flash 的指定偏移地址。
xf_err_t(* read)(size_t src_offset, void *dst, size_t size)
从 flash 的指定偏移地址读取数据。
xf_err_t(* deinit)(void)
反初始化 flash 设备。
xf_err_t(* init)(void)
初始化 flash 设备。
xf_err_t(* erase)(size_t offset, size_t size)
擦除 flash 的指定偏移地址指定长度。
size_t len
flash 设备上的该分区长度。
size_t offset
flash 设备上的该分区偏移地址。
Flash 抽象层 FAL (Flash Abstraction Layer).
static xf_fal_ctx_t s_fal_ctx
static xf_fal_ctx_t * sp_fal_ctx
#define XF_FAL_CTX_TRYLOCK__RETURN_ON_FAILURE(_ret)
#define XF_FAL_CTX_MUTEX_TRY_INIT()
#define XF_FAL_CTX_UNLOCK()
#define XF_FAL_FLASH_DEVICE_NUM
#define XF_FAL_PARTITION_TABLE_NUM
#define XF_FAL_DEV_NAME_MAX
#define XF_LOGI(tag, format,...)
#define XF_LOGE(tag, format,...)
#define XF_LOGW(tag, format,...)
#define XF_LOGD(tag, format,...)