在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于OpenHarmony3.1的LittleFS文件系統hdf驅動實現

電子發燒友開源社區 ? 來源:未知 ? 作者:電子發燒友開源社 ? 2022-09-30 18:32 ? 次閱讀

1.簡介

LittleFS是一個小型的Flash文件系統,它結合日志結構(log-structured)文件系統和COW(copy-on-write)文件系統的思想,以日志結構存儲元數據,以COW結構存儲數據。這種特殊的存儲方式,使LittleFS具有強大的掉電恢復能力(power-loss resilience)。分配COW數據塊時LittleFS采用了名為統計損耗均衡的動態損耗均衡算法,使Flash設備的壽命得到有效保障。同時LittleFS針對資源緊缺的小型設備進行設計,具有極其有限的ROMRAM占用,并且所有RAM的使用都通過一個可配置的固定大小緩沖區進行分配,不會隨文件系統的擴大占據更多的系統資源。當在一個資源非常緊缺的小型設備上,尋找一個具有掉電恢復能力并支持損耗均衡的Flash文件系統時,LittleFS是一個比較好的選擇。

LittleFS在嵌入式開發過程中經常遇到,但是如何在OpenHarmony中使用呢?本文基于OpenHarmony 3.1Release + 小凌派-RK2206開發板做LittleFS文件系統移植,現將相關移植經驗發布,分享給大家。文中如有問題,請大家幫忙指正。

2.LittleFS移植過程

本文基于OpenHarmony3.1Release做LittleFS移植,小凌派-RK2206開發板內部Flash有8MB大小,其中4~8MB區間為空閑區域。我將4M~5M作為LittleFS文件系統的/data目錄掛載硬件設備。具體移植過程主要如下所示:

1、hcs配置

1.1、hdf.hcs

創建/device/soc/rockchip/rk2206/hcs_config/hdf.hcs文件,具體如下:

  #include "device_info/device_info.hcs"
  #include "fs/fs_config.hcs"
  #include "gpio/gpio_config.hcs"
  #include "i2c/i2c_config.hcs"
  #include "spi/spi_config.hcs"
  root {
    module = "rockchip,rk2206_chip";
  }

(左右移動查看全部內容)

如上所述,我將在device_info/device_info.hcs添加LittleFS設備,并在fs/fs_config.hcs添加LittleFS具體信息。

1.2、BUILD.gn
新建//device/soc/rockchip/rk2206/hdf_config/BUILD.gn,具體代碼如下所示:

  import("http://drivers/adapter/khdf/liteos_m/hdf.gni")
  module_switch = defined(LOSCFG_DRIVERS_HDF)
  module_name = get_path_info(rebase_path("."), "name")
  hdf_driver(module_name) {
   hcs_sources = [ "hdf.hcs" ]
  }

(左右移動查看全部內容)

上述代碼將在編譯OpenHarmony3.1Rlease時,將編譯hdf.hcs。

1.3、device_info.hcs
創建/device/soc/rockchip/rk2206/hcs_config/device_info/device_info.hcs文件,在文件中添加LittleFS設備,具體代碼如下所示:

device_fs :: device {
     device0 :: deviceNode {
      policy = 0;
      priority = 5;
      permission = 0777;
      moduleName = "HDF_PLATFORM_FS_LITTLEFS";
      serviceName = "littlefs_config";
      deviceMatchAttr = "rockchip_rk2206_fs_littlefs";
  }
}

(左右移動查看全部內容)

上述代碼表示建設一個設備驅動,該驅動的模塊名稱(即moduleName)為“HDF_PLATFORM_FS_LITTLEFS”,OpenHamrony系統依據該名稱匹配驅動程序;設備匹配信息(即deviceMatchAttr)添加小凌派開發板Flash特殊信息(比如:分區信息,掛載目錄名、起始地址、結束地址等)。

1.4、fs_config.hcs

新建//device/soc/rockchip/rk2206/hdf_config/fs/fs_config.hcs文件,該文件主要寫清楚設備掛載信息,具體如下:

root {
    platform {
      fs_config {
        template fs_controller {
          match_attr = "";
          mount_points = [];
          block_size = [];
          block_start = [];
          block_count = [];
        }


        fs_littefs :: fs_controller {
          match_attr = "rockchip_rk2206_fs_littlefs";
          mount_points = ["/data"];
          block_size = [4096];
          block_start = [1024];
          block_count = [256];
        }
      }
    }
  }

(左右移動查看全部內容)

(1)points:掛載目錄。
(2)block_size:Flash的擦除塊大小。
(3)block_start:該掛載Flash區域的起始塊地址,實際Flash地址為block_size * block_start。
(4)block_count:該掛載Flash區域的存儲塊總數。

注意:match_attr所表示的字符串要與device_info.hcs所表示的字符串要一致。

2、hdf驅動
新建//device/soc/rockchip/rk2206/hdf_driver/fs文件夾,文件夾下創建2個文件,具體如下所示:

2.1、fs_driver.c
2.1.1、添加必要的頭文件

#include 
#include 
#include "los_config.h"
#include "hdf_log.h"
#include "hdf_device_desc.h"
#include "device_resource_if.h"
#include "osal_mem.h"
#include "lfs_api.h"

(左右移動查看全部內容)

2.1.2、添加HDF驅動

添加LittleFS匹配的hdf驅動,具體代碼如下所示:

static struct HdfDriverEntry g_fsDriverEntry = {
  .moduleVersion = 1,
  .moduleName = "HDF_PLATFORM_FS_LITTLEFS",
  .Bind = fs_driver_bind,
  .Init = fs_driver_init,
  .Release = fs_driver_release,
};

(左右移動查看全部內容)

HDF_INIT(g_fsDriverEntry);

其中,moduleName必須要與device_info.hcs中的moduleName保持一致。

2.1.3、fs_driver_init函數

fs_driver_init為hdf驅動加載函數。OpenHarmony啟動時,將根據hcs的編寫匹配對應的驅動程序,并運行fs_driver_init函數。該函數負責:

(1)讀取hcs文件的配置參數。

(2)初始化Flash。

(3)適配LittleFS對應的read、write、erase和sync函數,并適配LittleFS相關參數。

(4)掛載LittleFS。

具體代碼如下所示:

static int32_t fs_driver_init(struct HdfDeviceObject *device)
{
   int result;
   int32_t ret;
   struct FileOpInfo *file_op_info = NULL;


   if (device == NULL) {
     PRINT_ERR("device is null
");
     return HDF_ERR_INVALID_OBJECT;
   }
   if (device->property == NULL)
   {
     PRINT_ERR("device is null
");
     return HDF_ERR_INVALID_OBJECT;
   }


   /* Flash設備初始化 */
   FlashInit();


/* 讀取hcS參數 */
   ret = fs_driver_readdrs(device->property, &m_fs_cfg[0]);
   if (ret != HDF_SUCCESS)
   {
     PRINT_ERR("%s: fs_driver_readdrs faiLED(%d)
", ret);
     return ret;
   }
    
/* 適配LitteleFS對應的函數和參數 */
   for (int i = 0; i < sizeof(m_fs_cfg) / sizeof(m_fs_cfg[0]); i++) {
     if (m_fs_cfg[i].mount_point == NULL)
     {
       PRINT_LOG("m_fs_cfg[%d].mount_point is null
", i);
       continue;
     }


     m_fs_cfg[i].lfs_cfg.read = flash_littlefs_read;
     m_fs_cfg[i].lfs_cfg.prog = flash_littlefs_write;
     m_fs_cfg[i].lfs_cfg.erase = flash_littlefs_erase;
     m_fs_cfg[i].lfs_cfg.sync = flash_littlefs_sync;


     m_fs_cfg[i].lfs_cfg.read_size = 4;
     m_fs_cfg[i].lfs_cfg.prog_size = 4;
     m_fs_cfg[i].lfs_cfg.cache_size = 256;
     m_fs_cfg[i].lfs_cfg.lookahead_size = 64;
     m_fs_cfg[i].lfs_cfg.block_cycles = 1000;


     m_fs_cfg[i].lfs_cfg.file_max = LFS_FILE_MAX;
     m_fs_cfg[i].lfs_cfg.name_max = LFS_NAME_MAX;
      
/* 準備掛載 */
     result = SetDefaultMountPath(i, m_fs_cfg[i].mount_point);
     if (result != VFS_OK)
     {
       PRINT_ERR("SetDefaultMountPath(%d, %d) failed(%d)
", i, m_fs_cfg[i].mount_point, result);
       continue;
     }
      
/* 掛載目錄 */
     result = mount(NULL, m_fs_cfg[i].mount_point, "littlefs", 0, &m_fs_cfg[i].lfs_cfg);
     printf("%s: mount fs on '%s' %s
", __func__, m_fs_cfg[i].mount_point, (result == 0) ? "succeed" : "failed");
     if (CheckPathIsMounted(m_fs_cfg[i].mount_point, &file_op_info) == TRUE) {
       int lfs_ret = lfs_mkdir(&file_op_info->lfsInfo, m_fs_cfg[i].mount_point);
       if (lfs_ret == LFS_ERR_OK) {
         PRINT_LOG("create root dir(%s) success.
", m_fs_cfg[i].mount_point);
       } else if (lfs_ret == LFS_ERR_EXIST) {
         PRINT_LOG("root dir(%s) exist.
", m_fs_cfg[i].mount_point);
       } else {
         PRINT_LOG("create root dir(%s) failed.", m_fs_cfg[i].mount_point);
       }
     }
  }
    
  return HDF_SUCCESS;
}

(左右移動查看全部內容)

2.2、BUILD.gn

BUILD.gn負責將fs_driver.c編譯到內核中,具體源代碼如下所示:

import("http://drivers/adapter/khdf/liteos_m/hdf.gni")
module_switch = defined(LOSCFG_SOC_SERIES_RK22XX) && defined(LOSCFG_DRIVERS_HDF_PLATFORM) && defined(LOSCFG_FS_LITTLEFS)
module_name = get_path_info(rebase_path("."), "name")
hdf_driver(module_name) {
 sources = [
   "fs_driver.c",
 ]
 include_dirs = [ "." ]
}

(左右移動查看全部內容)

3、測試程序

我在main函數中添加一個任務,負責每隔5秒讀寫文件。具體代碼如下所示:

/* 文件系統測試 */
static void file_rw()
{
  static unsigned int cur = 0;
  char file_name[] = "/data/a.txt";
  int fd_w, fd_r;
  unsigned char buffer[256];
  /* 寫操作 */
  fd_w = open(file_name, O_WRONLY | O_CREAT);
  if (fd_w == -1)
  {
    printf("write: %s open failed!
", file_name);
    return;
  }
  memset(buffer, 0, sizeof(buffer));
  snprintf(buffer, sizeof(buffer), "Hello World and %d
", cur++);
  printf("write: %s", buffer);
  write(fd_w, buffer, strlen(buffer));
  close(fd_w);


  /* 讀操作 */
  fd_r = open(file_name, O_RDONLY);
  if (fd_r == -1)
  {
    printf("read: %s open failed!
", file_name);
    return;
  }
  lseek(fd_r, 0, SEEK_SET);
  memset(buffer, 0, sizeof(buffer));
  read(fd_r, buffer, sizeof(buffer));
  printf("read: %s", buffer);
  close(fd_r);
}


static void IotProcess(void *arg)
{
  static const unsigned int SLEEP_MAXSEC = 5;


  while (1)
  {
    printf("%s: sleep %d sec!
", __func__, SLEEP_MAXSEC);


    /* 文件系統測試 */
    file_rw(); 


    LOS_Msleep(SLEEP_MAXSEC * 1000);
  }
}

(左右移動查看全部內容)

3

結果

程序編譯燒寫到開發板后,按下開發板的RESET按鍵,通過串口軟件查看日志如下:

[MAIN:D]Main: OpenHarmony start schedule...
Entering scheduler
IotProcess: sleep 5 sec!
write: Hello World and 0
read: Hello World and 0
IotProcess: sleep 5 sec!
write: Hello World and 1
read: Hello World and 1
IotProcess: sleep 5 sec!
write: Hello World and 2
read: Hello World and 2
......

(左右移動查看全部內容)


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • HDF框架
    +關注

    關注

    0

    文章

    10

    瀏覽量

    2891
  • OpenHarmony
    +關注

    關注

    28

    文章

    3836

    瀏覽量

    18211

原文標題:基于OpenHarmony3.1的LittleFS文件系統hdf驅動實現

文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    【北京迅為】iTOP-RK3568開發板鴻蒙OpenHarmony系統南向驅動開發實操-HDF驅動配置UART

    【北京迅為】iTOP-RK3568開發板鴻蒙OpenHarmony系統南向驅動開發實操-HDF驅動配置UART
    的頭像 發表于 03-25 11:02 ?602次閱讀
    【北京迅為】iTOP-RK3568開發板鴻蒙<b class='flag-5'>OpenHarmony</b><b class='flag-5'>系統</b>南向<b class='flag-5'>驅動</b>開發實操-<b class='flag-5'>HDF</b><b class='flag-5'>驅動</b>配置UART

    北京迅為iTOP-RK3568開發板OpenHarmony系統南向驅動開發實操-HDF驅動配置LED

    北京迅為iTOP-RK3568開發板OpenHarmony系統南向驅動開發實操-HDF驅動配置LED
    的頭像 發表于 03-14 14:41 ?535次閱讀
    北京迅為iTOP-RK3568開發板<b class='flag-5'>OpenHarmony</b><b class='flag-5'>系統</b>南向<b class='flag-5'>驅動</b>開發實操-<b class='flag-5'>HDF</b><b class='flag-5'>驅動</b>配置LED

    北京迅為RK3568開發板OpenHarmony系統南向驅動開發內核HDF驅動框架架構

    北京迅為RK3568開發板OpenHarmony系統南向驅動開發內核HDF驅動框架架構
    的頭像 發表于 03-11 14:13 ?1013次閱讀
    北京迅為RK3568開發板<b class='flag-5'>OpenHarmony</b><b class='flag-5'>系統</b>南向<b class='flag-5'>驅動</b>開發內核<b class='flag-5'>HDF</b><b class='flag-5'>驅動</b>框架架構

    迅為RK3568開發板篇OpenHarmony實操HDF驅動控制LED-編寫應用APP

    HdfIoServiceBind 綁定 LED燈的 HDF 服務,獲取 HDF 空間緩存區,并向該緩沖區寫入控制數據。然后,通過 LED_WRITE 命令將數據發送到 HDF 驅動
    發表于 02-06 10:27

    迅為RK3568開發板篇OpenHarmony實操HDF驅動控制LED-添加內核編譯

    編譯內核時將該 HDF 驅動編譯到鏡像中,接下來編寫驅動編譯腳本 Makefile,代碼如下所示: 加入編譯體系,填加模塊目錄到 drivers/hdf_core/adapter/kh
    發表于 01-22 10:35

    迅為RK3568開發板篇OpenHarmony實操HDF驅動控制LED-編寫內核 LED HDF 驅動程序

    接下來編譯 LED 驅動,該驅動用于在基于華為設備框架(HDF)的系統中控制 LED 燈的開關,完整代碼如下所示: 更多內容可以關注:迅為RK3568開發板篇
    發表于 01-17 15:13

    【S32K146 RT-thread】基于內部PFLASH的littlefs適配

    LittleFS是一個應用于單片機內部flash和外掛NORflash的文件系統。由于它相比傳統的FAT文件系統更適合于小型嵌入式系統,具有以下特點:掉電恢復能力:設計用于處理隨機電源
    的頭像 發表于 01-14 18:32 ?1442次閱讀
    【S32K146 RT-thread】基于內部PFLASH的<b class='flag-5'>littlefs</b>適配

    迅為RK3568開發板篇OpenHarmony配置HDF驅動控制LED-新增 topeet子系統

    hdf_led:子組件目錄 app:led 應用層目錄 ├── BUILD.gn:應用 APP 的 GN 文件 └── led_test.c:應用層 LED 測試程序 driver:內核 HDF
    發表于 01-13 15:59

    芯海科技系列OpenHarmony3.1芯片支持智慧生態構建

    隨著OpenHarmony3.1的正式發布,芯海科技作為OpenHarmony生態的重要參與者,及時推出了兩款與系統適配的新品:健康測量CS1262芯片和無線連接CST85F01模組,為智慧生態的構建貢獻了芯海力量。
    的頭像 發表于 12-17 17:25 ?482次閱讀
    芯海科技系列<b class='flag-5'>OpenHarmony3.1</b>芯片支持智慧生態構建

    stm32單片機基于rt-thread 的 littlefs 文件系統 的使用

    簡介littlefs是ARM官方推出的,專為嵌入式系統設計的文件系統,相比傳統的文件系統littlefs具有以下優點:1、自帶擦寫均衡2、
    的頭像 發表于 11-06 08:04 ?2581次閱讀
    stm32單片機基于rt-thread 的 <b class='flag-5'>littlefs</b> <b class='flag-5'>文件系統</b> 的使用

    Linux根文件系統的掛載過程

    Linux根文件系統(rootfs)是Linux系統中所有其他文件系統和目錄的起點,它是內核啟動時掛載的第一個文件系統
    的頭像 發表于 10-05 16:50 ?865次閱讀

    小型文件系統如何選擇?FatFs和LittleFs優缺點比較

    和刪除文件實現了數據的持久化存儲和分層次的目錄結構。文件系統的存在極大地簡化了數據管理任務,提升了系統整體的穩定性和便利性,對于系統配置、
    的頭像 發表于 09-29 16:14 ?3486次閱讀
    小型<b class='flag-5'>文件系統</b>如何選擇?FatFs和<b class='flag-5'>LittleFs</b>優缺點比較

    [2K300適配OpenharmonyV4.1]根文件系統制作請教

    文件系統rootfs.img燒錄到2k300上,燒錄失敗。對比2k300開源資料中的Openharmony 文件系統,該文件系統為ext4格式,但是2k500編譯出來的為Ubifs
    發表于 09-11 11:18

    如何修改buildroot和debian文件系統

    本文檔主要介紹在沒有編譯環境的情況下,如何修改buildroot和debian文件系統方法,如在buildroot文件系統中添加文件、修改目錄等文件操作,在debian
    的頭像 發表于 07-22 17:46 ?813次閱讀
    如何修改buildroot和debian<b class='flag-5'>文件系統</b>

    linux--sysfs文件系統

    sysfs文件系統 sysfs,全稱為System Filesystem,是一個由Linux內核實現的虛擬文件系統。它扮演著一個橋梁的角色,將內核中的設備和驅動程序信息以
    的頭像 發表于 07-08 11:37 ?1470次閱讀
    linux--sysfs<b class='flag-5'>文件系統</b>
    主站蜘蛛池模板: 看a网站| 麻豆三级在线播放 | 丁香婷婷社区 | 一级特黄aa毛片免费观看 | 4hc44www四虎永久 | 亚洲一级毛片中文字幕 | 中文字幕一区二区三区四区五区人 | h网址在线观看 | 亚洲骚片 | 毛片a区| 国外精品视频在线观看免费 | 狠狠色噜噜狠狠狠狠色综合久 | 婷婷六月激情在线综合激情 | 可以免费播放的在线视频 | 午夜影院在线视频 | 亚洲经典一区二区三区 | 开心激情五月网 | 怡红院国产 | 手机看片1024国产基地 | 欧美影院入口 | 四虎国产精品永久在线播放 | 色天使色婷婷丁香久久综合 | 午夜精品视频在线看 | 一区二区三区高清在线观看 | 日日干天天操 | 日韩亚色 | 高清一级毛片一本到免费观看 | 很黄网站 | 亚洲黄页网站 | 天堂资源在线www中文 | 一道精品一区二区三区 | 色综合色综合色综合 | 中文字幕精品一区 | 日本不卡高清免费v日本 | 国产看午夜精品理论片 | 午夜黄大色黄大片美女图片 | 6080伦理久久精品亚洲 | 国产一级特黄aa大片免费 | 中国男女全黄大片一级 | 成熟女人免费一级毛片 | 麦克斯奥特曼免费观看 |