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,...)