s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(二 硬件抽象层HAL 第二种 ioctl操作方法)
歡迎轉(zhuǎn)載,務(wù)必注明出處:http://blog.csdn.net/wang_shuai_ww/article/details/44407641
本篇與http://blog.csdn.net/wang_shuai_ww/article/details/44305599該篇文章不同的僅僅在HAL層的.so方面,操作方法前面一篇是使用普通接口write來(lái)操作,write接口操作單個(gè)LED沒有問題,當(dāng)有多個(gè)LED時(shí)可能就不是那么方便了,所以本篇介紹使用unlocked_ioctl的方法。
驅(qū)動(dòng)程序已經(jīng)寫好了unlocked_ioctl方法,這里不再對(duì)驅(qū)動(dòng)程序做修改了,這里修改的僅僅是硬件抽象層HAL,硬件服務(wù)層和JNI層也不需要修改,可以兼容。
注意:現(xiàn)在的Linux內(nèi)核已經(jīng)使用unlocked_ioctl取代ioctl了,寫驅(qū)動(dòng)程序時(shí)就不再使用ioctl了。
修改后的源碼如下:
#include <hardware/hardware.h> #include "led.h"#include <fcntl.h> #include <errno.h> #include <cutils/log.h> #include <cutils/atomic.h>// 引入log頭文件 #include <android/log.h> // log標(biāo)簽 #define TAG "Led_Load_HAL" // 定義info信息 #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG,__VA_ARGS__) // 定義debug信息 #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__) // 定義error信息 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__)#define DEVICE_NAME "/dev/real_led" #define MODULE_NAME "led" #define MODULE_AUYHOR "wsh_sean@qq.com"#define LED_ON 1 #define LED_OFF 0static int led_device_open(const struct hw_module_t *module, const char *id, struct hw_device_t **device); static int led_device_close(struct hw_device_t *device);static int led_set_on(struct led_device_t *dev, int num); static int led_set_off(struct led_device_t *dev, int num);static struct hw_module_methods_t led_module_methods = {open: led_device_open };struct led_module_t HAL_MODULE_INFO_SYM = {common: {tag: HARDWARE_MODULE_TAG,version_major: 1,version_minor: 0,id: LED_HARDWARE_MODULE_ID,name: DEVICE_NAME,author: MODULE_AUYHOR,methods: &led_module_methods,} };static int led_device_open(const struct hw_module_t *module, const char *id, struct hw_device_t **device) {if(!strcmp(id, LED_HARDWARE_DEVICE_ID)) {struct led_device_t *dev;dev = (struct led_device_t *)malloc(sizeof(struct led_device_t));if(!dev) {LOGE("Failed to alloc space for led_device_t");return -EFAULT;}memset(dev, 0, sizeof(struct led_device_t));dev->common.tag = HARDWARE_MODULE_TAG;dev->common.version = 0;dev->common.module = (hw_module_t *)module;dev->common.close = led_device_close;dev->set_on = led_set_on;dev->set_off = led_set_off;if((dev->fd = open(DEVICE_NAME, O_RDWR)) == -1) {LOGE("Failed to open device file "DEVICE_NAME"-- %s.", strerror(errno));free(dev);return -EFAULT;}*device = &(dev->common);LOGI("Open device file "DEVICE_NAME" successfully.");return 0;}return -EFAULT; }static int led_device_close(struct hw_device_t *device){struct led_device_t *led_device = (struct led_device_t *)device;if(led_device){close(led_device->fd);free(led_device);}return 0; }static int led_set_on(struct led_device_t *dev, int num){if(!dev){LOGE("Null dev pointer.");return -EFAULT;}LOGI("Set the first %d LED lights.", num);ioctl(dev->fd, LED_ON, num);return 0; }static int led_set_off(struct led_device_t *dev, int num){if(!dev){LOGE("Null dev pointer.");return -EFAULT;}LOGI("Set the first %d LED close.", num);ioctl(dev->fd, LED_OFF, num);return 0; }讀者可以跟前面的代碼進(jìn)行對(duì)比不同。
編譯,打包下載使用,具體的參考前面的方法。
這里說(shuō)明,我使用的是本篇的操作方法。后面的記錄也都是基于這個(gè)版本的。
總結(jié)
以上是生活随笔為你收集整理的s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(二 硬件抽象层HAL 第二种 ioctl操作方法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse 工程目录下 删除不掉目录
- 下一篇: s5p4418 Android 4.4.