openharmony移植案例原理 - startup子系統(tǒng)之syspara_lite系統(tǒng)屬性部件(1)

      網(wǎng)友投稿 687 2022-05-30

      移植案例與原理 - startup子系統(tǒng)之syspara_lite系統(tǒng)屬性部件(1)

      系統(tǒng)屬性部件syspara_lite負(fù)責(zé)提供獲取與設(shè)置操作系統(tǒng)相關(guān)的系統(tǒng)屬性,包括默認(rèn)系統(tǒng)屬性、OEM廠(chǎng)商系統(tǒng)屬性和自定義系統(tǒng)屬性。為滿(mǎn)足OpenHarmony產(chǎn)品兼容性規(guī)范,產(chǎn)品解決方案需要實(shí)現(xiàn)獲取設(shè)備信息的接口,如:產(chǎn)品名、品牌名、廠(chǎng)家名等,同時(shí)提供設(shè)置/讀取系統(tǒng)屬性的接口。本文介紹下移植開(kāi)發(fā)板時(shí)如何適配系統(tǒng)屬性部件syspara_lite,并介紹下相關(guān)的運(yùn)行機(jī)制原理。系統(tǒng)屬性部件syspara_lite包含系統(tǒng)參數(shù)特性syspara_lite和token。系統(tǒng)屬性部件syspara_lite定義在build\lite\components\startup.json。源代碼目錄如下:

      base/startup/syspara_lite/ # 系統(tǒng)屬性部件 ├── frameworks # 系統(tǒng)屬性部件源文件目錄 ├── hals # 系統(tǒng)屬性部件硬件抽象層頭文件目錄 └── interfaces # 系統(tǒng)屬性部件對(duì)外接口目錄

      1、系統(tǒng)參數(shù)syspara適配

      適配啟動(dòng)恢復(fù)子系統(tǒng)startup的syspara_lite部件的一個(gè)實(shí)例vendor\bestechnic\display_demo\config.json的代碼片段如下,⑴處的配置項(xiàng)enable_ohos_startup_syspara_lite_use_posix_file_api設(shè)置為true,下文通過(guò)分析syspara_lite部件的代碼來(lái)解釋。

      { "product_name": "display_demo", ...... "subsystems": [ { ...... { "subsystem": "startup", "components": [ { "component": "bootstrap_lite" }, { "component": "syspara_lite", "features": [ ⑴ "enable_ohos_startup_syspara_lite_use_posix_file_api = true" ] } ] }, ...... ], "vendor_adapter_dir": "", "product_adapter_dir": "http://vendor/bestechnic/display_demo/hals", ...... }

      我們知道,syspara_lite部件支持獲取和設(shè)置操作系統(tǒng)的參數(shù),當(dāng)設(shè)置系統(tǒng)參數(shù)時(shí),系統(tǒng)參數(shù)會(huì)最終寫(xiě)到文件中進(jìn)行持久化保存。在輕量系統(tǒng)中,文件操作相關(guān)接口有POSIX接口與HalFiles接口這兩套實(shí)現(xiàn)。POSIX文件系統(tǒng)接口代碼位置kernel\liteos_m\kal\libc\musl\fs.c,HalFiles文件系統(tǒng)接口位置為utils\native\lite\file\src\file_impl_hal\file.c。當(dāng)對(duì)接內(nèi)核的文件系統(tǒng),采用POSIX相關(guān)的接口時(shí),需要在features字段中需要增加enable_ohos_startup_syspara_lite_use_posix_file_api = true。如果對(duì)接HalFiles相關(guān)的接口,則無(wú)須修改。enable_ohos_startup_syspara_lite_use_posix_file_api默認(rèn)為false,定義在文件base\startup\syspara_lite\frameworks\parameter\config.gni。我們通過(guò)看下編譯配置文件來(lái)了解下實(shí)現(xiàn)的原理機(jī)制,打開(kāi)文件base\startup\syspara_lite\frameworks\parameter\src\BUILD.gn,片段如下。

      ⑴處解釋了上文的配置參數(shù)enable_ohos_startup_syspara_lite_use_posix_file_api。⑵處依賴(lài)產(chǎn)品解決方案中的適配的sys_param實(shí)現(xiàn)代碼。ohos_product_adapter_dir是產(chǎn)品解決方案config.json中的配置項(xiàng),該配置項(xiàng)一遍設(shè)置為"hals"。sys_param實(shí)現(xiàn)代碼文件的路徑一遍為"hals/utils/sys_paramn/hal_sys_param.c",并且同級(jí)目錄的BUILD.gn文件中的靜態(tài)庫(kù)名稱(chēng)必須為hal_sysparam。⑶處表示如果需要使用安全函數(shù),則需要配置項(xiàng)enable_ohos_startup_syspara_lite_use_thirdparty_mbedtls設(shè)置為true。⑷處設(shè)置一些配置項(xiàng)宏,這些屬于構(gòu)建類(lèi)別的參數(shù)。

      if (ohos_kernel_type == "liteos_m") { static_library("sysparam") { include_dirs = [ "http://base/startup/syspara_lite/interfaces/kits", "http://utils/native/lite/include", "http://base/startup/syspara_lite/frameworks/parameter/src", "http://base/startup/syspara_lite/hals", "http://third_party/mbedtls/include", ] sources = [ "parameter_common.c" ] ⑴ if (enable_ohos_startup_syspara_lite_use_posix_file_api) { sources += [ "param_impl_posix/param_impl_posix.c" ] } else { sources += [ "param_impl_hal/param_impl_hal.c" ] } ⑵ deps = [ "$ohos_product_adapter_dir/utils/sys_param:hal_sysparam" ] ⑶ if (enable_ohos_startup_syspara_lite_use_thirdparty_mbedtls) { deps += [ "http://third_party/mbedtls:mbedtls" ] } if (enable_ohos_startup_syspara_lite_use_posix_file_api) { deps += [ "http://third_party/bounds_checking_function:libsec_static" ] } defines = [ ⑷ "INCREMENTAL_VERSION=\"${ohos_version}\"", "BUILD_TYPE=\"${ohos_build_type}\"", "BUILD_USER=\"${ohos_build_user}\"", "BUILD_TIME=\"${ohos_build_time}\"", "BUILD_HOST=\"${ohos_build_host}\"", "BUILD_ROOTHASH=\"${ohos_build_roothash}\"", "USE_MBEDTLS", "DATA_PATH=\"${config_ohos_startup_syspara_lite_data_path}\"", ] } }

      看個(gè)產(chǎn)品解決方案的實(shí)際例子,vendor\bestechnic\display_demo\hals\utils\sys_param\BUILD.gn的代碼如下,⑴處的靜態(tài)庫(kù)的名字是不能隨意更改的,見(jiàn)上文解釋。

      openharmony移植案例與原理 - startup子系統(tǒng)之syspara_lite系統(tǒng)屬性部件(1)

      ⑴ static_library("hal_sysparam") { sources = [ "hal_sys_param.c" ] include_dirs = [ "http://base/startup/syspara_lite/hals" ] defines = [ "INCREMENTAL_VERSION=\"${ohos_version}\"", "BUILD_TYPE=\"${ohos_build_type}\"", "BUILD_USER=\"${ohos_build_user}\"", "BUILD_TIME=\"${ohos_build_time}\"", "BUILD_HOST=\"${ohos_build_host}\"", "BUILD_ROOTHASH=\"${ohos_build_roothash}\"", ] }

      文件vendor\bestechnic\display_demo\hals\utils\sys_param\hal_sys_param.c實(shí)現(xiàn)接口文件base\startup\syspara_lite\hals\hal_sys_param.h中聲明的函數(shù),如下所示,主要包含設(shè)備廠(chǎng)商信息,軟件版本信息,構(gòu)建信息等。

      const char* HalGetDeviceType(void); const char* HalGetManufacture(void); const char* HalGetBrand(void); const char* HalGetMarketName(void); const char* HalGetProductSeries(void); const char* HalGetProductModel(void); const char* HalGetSoftwareModel(void); const char* HalGetHardwareModel(void); const char* HalGetHardwareProfile(void); const char* HalGetSerial(void); const char* HalGetBootloaderVersion(void); const char* HalGetAbiList(void); const char* HalGetDisplayVersion(void); const char* HalGetIncrementalVersion(void); const char* HalGetBuildType(void); const char* HalGetBuildUser(void); const char* HalGetBuildHost(void); const char* HalGetBuildTime(void); int HalGetFirstApiVersion(void);

      在適配HalGetSerial接口時(shí),開(kāi)發(fā)板不像產(chǎn)線(xiàn)生產(chǎn)過(guò)程那樣,會(huì)寫(xiě)入一個(gè)具體的序列號(hào)Serial Number,因而需要確定一個(gè)數(shù)據(jù)對(duì)開(kāi)發(fā)板進(jìn)行唯一標(biāo)識(shí)。vendor\bestechnic\display_demo\hals\utils\sys_param\hal_sys_param.c中提供了一種方法,采用WiFi Mac地址進(jìn)行適配。

      const char* HalGetSerial(void) { char macAddr[ETH_ALEN]; // as devboard has no production serial number, we just // use wifi mac address as device serial number. if (serialNumber[0] == STR_END_FLAG) { extern int bwifi_get_own_mac(u8 *addr); bwifi_get_own_mac(macAddr); int j = 0; for (int i = 0; i < ETH_ALEN; i++) { u8 lowFour, highFour; highFour = (macAddr[i] & MAC_HIGH_MASK) >> MAC_BITS; serialNumber[j] = Hex2Char(highFour); j++; lowFour = macAddr[i] & MAC_LOW_MASK; serialNumber[j] = Hex2Char(lowFour); j++; } } return serialNumber; }

      2、Token令牌適配

      在文件base\startup\syspara_lite\hals\hal_token.h中定義令牌相關(guān)的接口聲明,包含寫(xiě)令牌,獲取AcKey,獲取產(chǎn)品編碼和產(chǎn)品鍵值。在移植開(kāi)發(fā)板時(shí),需要實(shí)現(xiàn)這些接口。

      在base\startup\syspara_lite\frameworks\token\BUILD.gn文件中,查看令牌如何編譯的,以L(fǎng)iteOS-M為例,片段為:

      ⑴處可以看出編譯使用的源文件是"src/token_impl_hal/token.c",對(duì)于linux和liteos-a內(nèi)核使用的源文件是"src/token_impl_posix/token.c"。"token.c"文件代碼很簡(jiǎn)單,判斷下參數(shù)然后調(diào)用產(chǎn)品解決方案中的適配函數(shù),比如函數(shù)ReadToken()會(huì)調(diào)用HalReadToken()函數(shù)。

      ⑵處需要注意,這里依賴(lài)的就是產(chǎn)品解決方案適配的token實(shí)現(xiàn)代碼。ohos_product_adapter_dir是產(chǎn)品解決方案config.json中的配置項(xiàng),該配置項(xiàng)一遍設(shè)置為"hals"。token實(shí)現(xiàn)代碼文件的路徑一遍為"hals/utils/token/hal_token.c",并且同級(jí)目錄的BUILD.gn文件中的靜態(tài)庫(kù)名稱(chēng)必須為hal_token_static。⑶處表示token部件由特性token_static組成。

      if (ohos_kernel_type == "liteos_m") { static_library("token_static") { ⑴ sources = [ "src/token_impl_hal/token.c" ] include_dirs = [ "http://base/startup/syspara_lite/interfaces/kits", "http://utils/native/lite/include", "http://base/hiviewdfx/hilog_lite/interfaces/native/kits/hilog_lite", "http://base/startup/syspara_lite/hals", ] ⑵ deps = [ "$ohos_product_adapter_dir/utils/token:hal_token_static" ] } } lite_component("token") { features = [] if (ohos_kernel_type == "liteos_a" || ohos_kernel_type == "linux") { features += [ ":token_shared" ] } if (ohos_kernel_type == "liteos_m") { ⑶ features += [ ":token_static" ] } }

      看個(gè)產(chǎn)品解決方案的實(shí)際例子,vendor\bestechnic\display_demo\hals\utils\token\BUILD.gn的代碼如下,⑴處的靜態(tài)庫(kù)的名字是不能隨意更改的,見(jiàn)上文解釋。

      ⑴ static_library("hal_token_static") { sources = [ "hal_token.c" ] include_dirs = [ "http://base/startup/syspara_lite/hals", "http://utils/native/lite/include", ] deps = [] }

      文件vendor\bestechnic\display_demo\hals\utils\token\hal_token.c中的令牌實(shí)現(xiàn)代碼片段如下,當(dāng)前均為空實(shí)現(xiàn),沒(méi)有實(shí)際使用起來(lái)。

      static int OEMReadToken(char *token, unsigned int len) { // OEM need add here, read token from device (void)(token); (void)(len); return EC_SUCCESS; } ...... int HalReadToken(char *token, unsigned int len) { if (token == NULL) { return EC_FAILURE; } return OEMReadToken(token, len); }

      參考站點(diǎn)

      OpenHarmony / startup_syspara_lite

      HarmonyOS Device > 文檔 > 指南 > 基礎(chǔ)能力: syspara系統(tǒng)屬性部件

      輕量帶屏解決方案之恒玄芯片移植案例

      小結(jié)

      本文介紹了startup子系統(tǒng)之syspara系統(tǒng)屬性部件的移植適配案例及原理。因?yàn)闀r(shí)間關(guān)系,倉(cāng)促寫(xiě)作,或能力限制,若有失誤之處,請(qǐng)各位讀者多多指正。感謝閱讀,有什么問(wèn)題,請(qǐng)留言。

      IoT 輕量級(jí)操作系統(tǒng) LiteOS

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:如何閱讀Java源碼?
      下一篇:Sentinel落地與應(yīng)用
      相關(guān)文章
      精品国产_亚洲人成在线| 亚洲AV无码成人专区片在线观看| 亚洲人成在线观看| 亚洲无av在线中文字幕| 中文国产成人精品久久亚洲精品AⅤ无码精品| 亚洲色偷精品一区二区三区| 亚洲一区二区三区成人网站| 亚洲日日做天天做日日谢| 亚洲一区二区三区在线网站| 亚洲香蕉久久一区二区| 亚洲va成无码人在线观看| 亚洲AV成人无码天堂| 亚洲人成777在线播放| 国产成人精品日本亚洲网址| 亚洲欧洲日韩极速播放 | 在线精品亚洲一区二区| 麻豆狠色伊人亚洲综合网站| 亚洲综合一区国产精品| 亚洲AV无码成人精品区狼人影院| 亚洲av无码一区二区三区人妖| 日产国产精品亚洲系列| 亚洲精品成a人在线观看| 久久久久国产亚洲AV麻豆| 亚洲最大AV网站在线观看| 国产成人无码综合亚洲日韩| 亚洲国产精品无码久久久不卡| 久久精品国产亚洲香蕉| 亚洲视频在线观看地址| 亚洲一区二区三区高清视频| 亚洲最大天堂无码精品区| 亚洲av最新在线观看网址| 亚洲高清免费视频| 亚洲码国产精品高潮在线| 亚洲av色影在线| 亚洲成a人片在线观看中文!!! | 久久久国产亚洲精品| 欧洲亚洲综合一区二区三区| 国产成人亚洲综合无码| 国产亚洲精品观看91在线| 久久亚洲AV无码精品色午夜 | 亚洲一区精品无码|