日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

第九章 硬件抽象层:HAL

發(fā)布時(shí)間:2025/5/22 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第九章 硬件抽象层:HAL 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 為什么要在Android中加入HAL
  • Goggle為Android 加入HAL主要有如下目的:

    統(tǒng)一硬件的調(diào)用接口。由于HAL有標(biāo)準(zhǔn)的調(diào)用接口,所以可以利用HAL屏蔽Linux驅(qū)動(dòng)復(fù)雜、不統(tǒng)一的接口。

    解決了GPL版權(quán)問題。由于 Linux 內(nèi)核基于GPL協(xié)議,而Android基于Apache Licence 2 . 0協(xié)議。

    針對(duì)一些特殊的要求。對(duì)于有些硬件,可能需要訪問一些用戶空間的資源,或在內(nèi)核空間不方便完成的工作以及特殊需求。

  • android HAL架構(gòu)?
  • 為L(zhǎng)ED驅(qū)動(dòng)增加HAL
  • 編寫一款支持 HAL 的 Linux 驅(qū)動(dòng)程序的步驟:
  • 第 1 步: 編寫 Linux 驅(qū)動(dòng);第 2 步:編寫 HAL Library;第 3 步:編寫 Service Library

  • 精簡(jiǎn) LED 驅(qū)動(dòng)
  • 基本原理是只從指定存器讀取或?qū)懭?個(gè)字節(jié).第 1 個(gè)字節(jié)用于指定讀寫的動(dòng)作以及寄存器類型.后 4 個(gè)字節(jié)是讀寫的實(shí)際的數(shù)據(jù)(因?yàn)長(zhǎng)ED驅(qū)動(dòng)只涉及操作一個(gè)int類型數(shù)據(jù)的寄存器 ,因此使用4個(gè)字節(jié)來表示一個(gè)int類型的數(shù)據(jù)〉。 在與LED驅(qū)動(dòng)交互時(shí),只要向設(shè)備文件(/dev/s3c64IO_leds_hal) 讀取或發(fā)送 5 個(gè)字節(jié)的數(shù)據(jù),就可以讀寫指定的寄存器。

  • 測(cè)試讀寫寄存器操作
  • 在編寫 Linux 驅(qū)動(dòng)以及與驅(qū)動(dòng)相關(guān)的程序的過程中應(yīng)分段測(cè)試每一部分程序。

    使用下面的命令執(zhí)行相應(yīng)目錄中的build.sh腳本文件,即可測(cè)試LED代碼的準(zhǔn)確性:sh build.sh

  • :編寫誦點(diǎn)LED驅(qū)動(dòng)的HAL模塊;
  • 編寫 HAL模塊的步驟和原理如下:

    第l步:定義結(jié)構(gòu)體和宏:編寫 HAL 模塊需要使用到 3 個(gè)非常重要的結(jié)構(gòu)體( hw_module_t 、 hw_device_t 和hw _ module_ method_ t), 在第 l 步需要定義兩個(gè)新的結(jié)構(gòu)體, 這兩個(gè)結(jié)構(gòu)體的第 l 個(gè)變量的數(shù)據(jù)類型必須是 hw_module_t和 bw_device_t。 除此之外, 還需要為HAL模塊定義一個(gè)ID. 實(shí)際上在這 l 步就是編寫leds_hal.h 頭文件的代碼。

    第 2 步:編寫 HAL模塊的 open 函數(shù):

    • open 函數(shù)是 HAL 模塊的入口點(diǎn)。該函數(shù)主要做如下 3 項(xiàng)工作:初始化 hw device_t 的子結(jié)構(gòu)體。打開設(shè)備文件。初始化寄存器。

    第3 步:定義 hw_module_methods_ t 結(jié)構(gòu)體變量

    第4 步: 定義 HAL_MODULE_INFO_SYM 變量

    第5步:編寫 HAL模塊的 close 函數(shù)

    第 6步:編寫控制 LED 的函數(shù)

  • 編寫調(diào)用 HAL 模塊的 Service
  • 調(diào)用 HAL 模塊涉及一個(gè)非常重要的 hw_get_ module 函數(shù)。該函數(shù)可以通過在 leds_hal.h 中定義的 LED_HARDWARE_MODULE_ID 宏查找LED HAL 模塊,并獲得 led_module_t 結(jié)構(gòu)體。然后調(diào)用led _module_ t.hw _ module.methods.open 函數(shù)來初始化 LED 驅(qū)動(dòng), 并通過 open 函數(shù)返回 led_control_device_t 結(jié)構(gòu)體。在 led_control_device_ t 結(jié)構(gòu)體中包含了在 HAL 模塊中定義的控制 LED 驅(qū)動(dòng)的函數(shù)指針(set_on 和 set_off)。

  • HAL模塊的存放路徑和命名規(guī)則:
  • HAL 棋塊庫文件的存放路徑有兩個(gè): /system/lib/hw 和/vendor/lib/hw。 hw_get_module 函數(shù)會(huì)先從/system/lib/hw 目錄根據(jù)庫文件命名規(guī)則尋找?guī)煳募H绻?#xff0f;system/lib/hw 目錄中未找到庫文 件, hw_get_ module 會(huì)按同樣的規(guī)則在/vendor/lib/hw 目錄中尋找.

    ? HAL 模塊庫文件的命名規(guī)則是 ID.suffix.so。其中 ID 通過 hw_get_ module 函數(shù)的 id 參數(shù)指 定。 suffix (后綴〉通過屬性文件指定。

    ? hw _get_module 會(huì)在 Android 系統(tǒng)的屬性文件中根據(jù) variant_keys 數(shù)組中定義的 4 個(gè) key 依次查找 suffix. 如果未找到 suffix, 使用默認(rèn)的 suffix (default)。

    實(shí)際上, Android 系統(tǒng)的屬性文件具有如下4 個(gè):

    ?/default.prop;/system/build.prop; /system/default.prop; /data/local.prop.

  • 編寫調(diào)用 Service 的 Java 庫
  • 可以將調(diào)用 Service程序庫的 Java 類單獨(dú)封裝在jar文件中,這樣做任何的 Android 應(yīng)用程序中只要引用了這個(gè)jar文件就可以像調(diào)用普通Java 類一樣訪問 LED 驅(qū)動(dòng)了.

  • 測(cè)試 LED 驅(qū)動(dòng)
  • 本節(jié)實(shí)現(xiàn)的測(cè)試程序?qū)⑼ㄟ^調(diào)用 LedHalService.setOn 和 LedHalService.setOff方法控制 LED.

    轉(zhuǎn)載于:https://www.cnblogs.com/beatrice/p/5656052.html

    總結(jié)

    以上是生活随笔為你收集整理的第九章 硬件抽象层:HAL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。