<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                每一個硬件抽象層模塊在內核中都對應有一個驅動程序,硬件抽象層模塊就是通過這些驅動程序來訪問硬件設備的,它們是通過讀寫設備文件來進行通信的。 硬件抽象層中的模塊接口源文件一般保存在hardware/libhardware目錄中。為了方便起見,我們將虛擬硬件設備freg在硬件抽象層中的模塊名稱定義為freg,它的目錄結構如下: ~~~ ~/Android/hardware/libhardware ----include ----hardware ----freg.h ----modules ----freg ----freg.cpp ----Android.mk ~~~ 它由三個文件組成,其中,freg.h和freg.cpp是源代碼文件,而Android.mk是模塊的編譯腳本文件。下面我們就分別介紹這三個文件的內容。 **freg.h** ~~~ #ifndef ANDROID_FREG_INTERFACE_H #define ANDROID_FREG_INTERFACE_H #include <hardware/hardware.h> __BEGIN_DECLS /*定義模塊ID*/ #define FREG_HARDWARE_MODULE_ID "freg" /*定義設備ID*/ #define FREG_HARDWARE_DEVICE_ID "freg" /*自定義模塊結構體*/ struct freg_module_t { struct hw_module_t common; }; /*自定義設備結構體*/ struct freg_device_t { struct hw_device_t common; int fd; int (*set_val)(struct freg_device_t* dev, int val); int (*get_val)(struct freg_device_t* dev, int* val); }; __END_DECLS #endif ~~~ 這個文件中的常量和結構體都是按照硬件抽象層模塊編寫規范來定義的。宏FREG_HARDWARE_MODULE_ID和FREG_HARDWARE_DEVICE_ID分別用來描述模塊ID和設備ID。結構體freg_module_t用來描述自定義的模塊結構體,它的第一個成員變量的類型為hw_module_t。結構體freg_device_t用來描述虛擬硬件設備freg,它的第一個成員變量的類型為freg_device_t。此外,結構體freg_device_t還定義了其他三個成員變量,其中,成員變量fd是一個文件描述符,用來描述打開的設備文件/dev/freg,成員變量set_val和get_val是函數指針,它們分別用來寫和讀虛擬硬件設備freg的寄存器val的內容。 **freg.cpp** 這是硬件抽象層模塊freg的實現文件,我們分段來閱讀。 文件首先包含相關頭文件并且定義相關結構體變量。 ~~~ #define LOG_TAG "FregHALStub" #include <hardware/hardware.h> #include <hardware/freg.h> #include <fcntl.h> #include <errno.h> #include <cutils/log.h> #include <cutils/atomic.h> #define DEVICE_NAME "/dev/freg" #define MODULE_NAME "Freg" #define MODULE_AUTHOR "shyluo@gmail.com" /*設備打開和關閉接口*/ static int freg_device_open(const struct hw_module_t* module, const char* id, struct hw_device_t** device); static int freg_device_close(struct hw_device_t* device); /*設備寄存器讀寫接口*/ static int freg_get_val(struct freg_device_t* dev, int* val); static int freg_set_val(struct freg_device_t* dev, int val); /*定義模塊操作方法結構體變量*/ static struct hw_module_methods_t freg_module_methods = { open: freg_device_open }; /*定義模塊結構體變量*/ struct freg_module_t HAL_MODULE_INFO_SYM = { common: { tag: HARDWARE_MODULE_TAG, version_major: 1, version_minor: 0, id: FREG_HARDWARE_MODULE_ID, name: MODULE_NAME, author: MODULE_AUTHOR, methods: &freg_module_methods, } }; ~~~ 在這段代碼中,最值得關注的就是模塊變量HAL_MODULE_INFO_SYM的定義。按照硬件抽象層模塊編寫規范,每一個硬件抽象層模塊必須導出一個名稱為HAL_MODULE_INFO_SYM的符號,它指向一個自定義的硬件抽象層模塊結構體,而且它的第一個類型為hw_module_t的成員變量的tag值必須設置為HARDWARE_MODULE_TAG。除此之外,還初始化了這個硬件抽象層模塊結構體的版本號、ID、名稱、作者和操作方法列表等。 虛擬硬件設備freg的打開和關閉分別由函數freg_device_open和freg_device_close來實現,如下所示。 ~~~ static int freg_device_open(const struct hw_module_t* module, const char* id, struct hw_device_t** device) { if(!strcmp(id, FREG_HARDWARE_DEVICE_ID)) { struct freg_device_t* dev; dev = (struct freg_device_t*)malloc(sizeof(struct freg_device_t)); if(!dev) { LOGE("Failed to alloc space for freg_device_t."); return -EFAULT; } memset(dev, 0, sizeof(struct freg_device_t)); dev->common.tag = HARDWARE_DEVICE_TAG; dev->common.version = 0; dev->common.module = (hw_module_t*)module; dev->common.close = freg_device_close; dev->set_val = freg_set_val; dev->get_val = freg_get_val; if((dev->fd = open(DEVICE_NAME, O_RDWR)) == -1) { LOGE("Failed to open device file /dev/freg -- %s.", strerror(errno)); free(dev); return -EFAULT; } *device = &(dev->common); LOGI("Open device file /dev/freg successfully."); return 0; } return -EFAULT; } static int freg_device_close(struct hw_device_t* device) { struct freg_device_t* freg_device = (struct freg_device_t*)device; if(freg_device) { close(freg_device->fd); free(freg_device); } return 0; } ~~~ 前面提到,一個硬件抽象層模塊可能會包含多個硬件設備,而這些硬件設備的打開操作都是由函數freg_device_open來完成的,因此,函數freg_device_open會根據傳進來的參數id來判斷要打開哪一個硬件設備。 在硬件抽象層模塊freg中,只有一個虛擬硬件設備freg,它使用結構體freg_device_t來描述。因此,函數freg_device_open發現參數id與虛擬硬件設備freg的ID值匹配以后,就會分配一個freg_device_t結構體,并且對它的成員變量進行初始化。按照硬件抽象層模塊編寫規范,硬件抽象層中的硬件設備標簽(dev->common.tag)必須設置為HARDWARE_DEVICE_TAG。除此之外,我們還將虛擬硬件設備freg的關閉函數設置為freg_device_close,并且將它的讀寫函數設置為freg_get_val和freg_set_val。 初始化完成用來描述虛擬硬件設備freg的結構體freg_device_t之后,我們就可以調用open函數來打開虛擬硬件設備文件/dev/freg了,并且將得到的文件描述符保存在結構體freg_device_t的成員變量fd中。 虛擬硬件設備freg的關閉函數freg_device_close的實現比較簡單,它主要是關閉設備文件/dev/freg,以及釋放設備在打開時所分配的資源。 虛擬硬件設備freg的讀寫函數freg_get_val和freg_set_val的實現如下所示。 ~~~ static int freg_get_val(struct freg_device_t* dev, int* val) { if(!dev) { LOGE("Null dev pointer."); return -EFAULT; } if(!val) { LOGE("Null val pointer."); return -EFAULT; } read(dev->fd, val, sizeof(*val)); LOGI("Get value %d from device file /dev/freg.", *val); return 0; } static int freg_set_val(struct freg_device_t* dev, int val) { if(!dev) { LOGE("Null dev pointer."); return -EFAULT; } LOGI("Set value %d to device file /dev/freg.", val); write(dev->fd, &val, sizeof(val)); return 0; } ~~~ 這兩個函數分別通過調用read和write函數來實現讀寫虛擬硬件設備freg的寄存器val的內容。 **Android.mk** ~~~ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_PRELINK_MODULE := false LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw LOCAL_SHARED_LIBRARIES := liblog LOCAL_SRC_FILES := freg.cpp LOCAL_MODULE := freg.default include $(BUILD_SHARED_LIBRARY) ~~~ 這是硬件抽象層模塊freg的編譯腳本文件。第9行指定include命令的參數為$(BUILD_SHARED_LIBRARY),表示要將該硬件抽象層模塊編譯成一個動態鏈接庫文件,名稱為freg.default,并且保存在$(TARGET_OUT_SHARED_LIBRARIES)/hw目錄下,即out/target/product/generic/system/lib/hw目錄下。 > 注意:我們將硬件抽象層模塊freg對應的文件名稱定義為freg.default,編譯成功后,系統就會自動在后 面加后綴.so,于是就得到了一個freg.default.so文件。根據硬件抽象層模塊文件的命名規范,當我們要加載硬件抽象層模塊freg時,只需要指定它的ID值,即“freg”,系統就會根據一定的規則成功地找到要加載的freg.default.so文件。 硬件抽象層模塊freg的所有文件都準備好之后,我們就可以執行mmm和make snod命令對它進行編譯和打包了。 ~~~ USER@MACHINE:~/Android$ mmm ./hardware/libhardware/modules/freg USER@MACHINE:~/Android$ make snod ~~~ 最終就可以在out/target/product/generic/system/lib/hw目錄下得到一個freg.default.so文件。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看