添加HAL層代碼

這是一個系列文章:

  1. Android 內核添加驅動
  2. 測試freg驅動的功能內置C程程序
  3. 添加HAL層代碼
  4. 添加JNI層
  5. 框架層添加硬件訪問服務

該系列能對android的從下到上的各層有一個簡單的設計钮追,麻雀雖小,五臟俱全。enjoy now醉途!

在前面,我們添加里成功了驅動層的代碼,下來接著添加HAL層的代碼.讓我們的用戶空間的代碼也能使用到添加的新的虛擬寄存器設備.

hardware
    ----libhardware/include/hardware/freg.h
    ----libhardware/modules/freg
        |---freg.cpp
        |---Android.mk

freg.h:

#ifndef ANDROID_FREG_INTERFACE_H
#define ANDROID_FREG_INTERFACE_H

#include <hardware/hardware.h>

__BEGIN_DECLS

/**
 * The id of this module
 */
#define FREG_HARDWARE_MODULE_ID "freg"

/**
 * The id of this device
 */
#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.h按照android對HAL層規(guī)范的要求代芜,分別定義模塊ID指厌、模塊結構體以及硬件接口結構體.

freg.h:

#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>

#include <malloc.h>
#include <stdint.h>
#include <sys/time.h>

#include <hardware/hardware.h>
#include <system/audio.h>
#include <hardware/audio.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_set_val(struct freg_device_t* dev, int val);
static int freg_get_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,
        }
};

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) {
                        ALOGE("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) {
                        ALOGE("Failed to open device file /dev/freg -- %s.", strerror(errno));
                        free(dev);
                        return -EFAULT;
                }

                *device = &(dev->common);

                ALOGI("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;
}

static int freg_set_val(struct freg_device_t* dev, int val) {
        if(!dev) {
                ALOGE("Null dev pointer.");
                return -EFAULT;
        }

        ALOGI("Set value %d to device file /dev/freg.", val);
        write(dev->fd, &val, sizeof(val));

        return 0;
}

static int freg_get_val(struct freg_device_t* dev, int* val) {
        if(!dev) {
                ALOGE("Null dev pointer.");
                return -EFAULT;
        }

        if(!val) {
                ALOGE("Null val pointer.");
                return -EFAULT;
        }

        read(dev->fd, val, sizeof(*val));

        ALOGI("Get value %d from device file /dev/freg.", *val);

        return 0;
}

freg.cpp相對羅大神blog的修改是include文件,由于free函數(shù)和malloc方法的頭文件有變化,還有l(wèi)og系統(tǒng),LOGE->ALOGE,LOGI->ALOGI.這兩個改動是依據(jù)代碼編譯報錯修改而來.

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)

編譯該模塊:

mmm hardware/libhardware/modules/freg

這樣就會在out/target/product/generic/system/lib/hw目錄下看到freg.default.so文件.
打包system image :make snod
HAL層書寫完畢.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末虑椎,一起剝皮案震驚了整個濱河市遥昧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌褥琐,老刑警劉巖锌俱,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異敌呈,居然都是意外死亡贸宏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門磕洪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吭练,“玉大人,你說我怎么就攤上這事析显∠呓牛” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵叫榕,是天一觀的道長浑侥。 經常有香客問我,道長晰绎,這世上最難降的妖魔是什么寓落? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮荞下,結果婚禮上伶选,老公的妹妹穿的比我還像新娘。我一直安慰自己尖昏,他們只是感情好仰税,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抽诉,像睡著了一般陨簇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迹淌,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天河绽,我揣著相機與錄音,去河邊找鬼唉窃。 笑死耙饰,一個胖子當著我的面吹牛,可吹牛的內容都是我干的纹份。 我是一名探鬼主播苟跪,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼廷痘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了件已?” 一聲冷哼從身側響起笋额,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拨齐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昨寞,經...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡瞻惋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了援岩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歼狼。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖享怀,靈堂內的尸體忽然破棺而出羽峰,到底是詐尸還是另有隱情,我是刑警寧澤添瓷,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布梅屉,位于F島的核電站,受9級特大地震影響鳞贷,放射性物質發(fā)生泄漏坯汤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一搀愧、第九天 我趴在偏房一處隱蔽的房頂上張望惰聂。 院中可真熱鬧,春花似錦咱筛、人聲如沸搓幌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溉愁。三九已至,卻和暖如春饲趋,著一層夾襖步出監(jiān)牢的瞬間叉钥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工篙贸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留投队,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓爵川,卻偏偏與公主長得像敷鸦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容