OpenHarmonyにおけるファイルサブシステムの移植方法

OpenHarmonyのutilsコンポーネントは、各業務サブシステムおよび上位アプリケーションから利用可能であり、チップ側のファイルシステム実装に依存している。具体的には、チッププラットフォームがファイルのオープン・クローズ、読み書き、サイズ取得などの基本機能を提供する必要がある。

HALインタフェースの要件

OpenHarmonyのファイルシステムを移植するには、以下のHAL(Hardware Abstraction Layer)インタフェースを実装する必要がある。

ファイルのオープン・クローズ

インタフェース名説明
HalFileOpen既存ファイルを開く、または新規ファイルを作成する。
HalFileCloseファイルを閉じる。

ファイル操作関連インタフェース

インタフェース名説明
HalFileReadファイルからデータを読み込む。
HalFileWriteファイルにデータを書き込む。
HalFileDeleteファイルを削除する。
HalFileStatファイルのメタ情報を取得する。
HalFileSeekファイル内の位置を移動する。

これらのインタフェースの定義は、OpenHarmonyの以下パスに存在する:

//utils/native/lite/file
├── BUILD.gn
└── src
    └── file_impl_hal
        └── file.c             # ファイル操作のラッパー実装

//utils/native/lite/hals
└── file
    └── hal_file.h            # HALインタフェースのヘッダ

対応するBUILD.gnの内容は以下の通りである:

import("//build/lite/config/component/lite_component.gni")

static_library("native_file") {
  sources = [
    "src/file_impl_hal/file.c",
  ]
  include_dirs = [
    "//utils/native/lite/include",
    "//utils/native/lite/hals/file",
  ]
  deps = ["$ohos_vendor_adapter_dir/hals/utils/file:hal_file_static"]
}

lite_component("file") {
  features = [ ":native_file" ]
}

この設定から、ベンダーによるHAL実装は$ohos_vendor_adapter_dir/hals/utils/file配下に置かれ、そのBUILD.gnでhal_file_staticという静的ライブラリとして定義される必要があることがわかる。

移植アプローチの選択肢

  • フラッシュ直接アクセス方式:RAWフラッシュ領域に対して直接読み書きを行い、ファイル操作をエミュレートする。
  • 軽量ファイルシステムの利用:littlefsやFatFsなどの軽量ファイルシステムを用いて実装する。OpenHarmonyの//third_partyディレクトリにはFatFsの参考実装が含まれている。
  • 既存ファイルシステムの統合:ベンダーがすでに搭載しているファイルシステムを再利用し、HALインタフェースにマッピングする。

実際の移植手順

1. config.jsonへのコンポーネント追加

製品設定ファイル(例:vendor/MyVendorCompany/MyProduct/config.json)にutilsサブシステムのfileコンポーネントを追記する:

{
  "subsystem": "utils",
  "components": [
    { "component": "file", "features": [] }
  ]
}

2. HAL実装の配置

config.json内でvendor_adapter_dirが以下のように定義されている場合:

"vendor_adapter_dir": "//device/MyDeviceCompany/MyBoard/adapter"

このディレクトリ配下にHAL実装を配置する:

device/MyDeviceCompany/MyBoard/adapter/hals/utils/file/
├── BUILD.gn
└── src
    └── hal_file.c

対応するBUILD.gnの内容は以下のようになる:

import("//build/lite/config/component/lite_component.gni")

static_library("hal_file_static") {
  sources = [ "src/hal_file.c" ]
  include_dirs = [
    "//utils/native/lite/hals/file",
  ]
}

これにより、OpenHarmonyのファイル操作APIがベンダー固有のファイルシステムと接続され、utilsコンポーネントが正常に動作するようになる。

タグ: OpenHarmony HAL ファイルシステム littlefs FatFs

5月17日 06:59 投稿