欢迎转载,务必注明出处:http://blog.csdn.net/wang_shuai_ww/article/details/44407641

本篇与http://blog.csdn.net/wang_shuai_ww/article/details/44305599该篇文章不同的仅仅在HAL层的.so方面,操作方法前面一篇是使用普通接口write来操作,write接口操作单个LED没有问题,当有多个LED时可能就不是那么方便了,所以本篇介绍使用unlocked_ioctl的方法。

驱动程序已经写好了unlocked_ioctl方法,这里不再对驱动程序做修改了,这里修改的仅仅是硬件抽象层HAL,硬件服务层和JNI层也不需要修改,可以兼容。

注意:现在的Linux内核已经使用unlocked_ioctl取代ioctl了,写驱动程序时就不再使用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标签
#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;
}

读者可以跟前面的代码进行对比不同。

编译,打包下载使用,具体的参考前面的方法。

这里说明,我使用的是本篇的操作方法。后面的记录也都是基于这个版本的。

s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(二 硬件抽象层HAL 第二种 ioctl操作方法)相关推荐

  1. s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(二 硬件抽象层HAL)

    欢迎转载,务必注明出处:http://blog.csdn.net/wang_shuai_ww/article/details/44305599 本篇文章记录硬件抽象层. 还是跟之前一样,主要参考< ...

  2. s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(一 硬件驱动层)

    欢迎转载,务必注明出处:http://blog.csdn.net/wang_shuai_ww/article/details/44303069 本文章是记录Android开发中驱动层.HAL层.应用层 ...

  3. s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(三 APP应用)

    欢迎转载,务必注明出处:http://blog.csdn.net/wang_shuai_ww/article/details/44416041 eclipse完整工程下载地址:http://downl ...

  4. Android 10.0 SystemUI下拉状态栏UI定制化开发系列(十二)

    目录 1.概述 2.核心代码 3.核心代码部分分析 3.1 NotificationStackScrollLayout.java代码分析 3.2接下来分析Activat

  5. Android应用开发 led 驱动层 hal硬件抽象层 应用层 详细教程记录(含源码)

    本篇文章是为了能够更好的搜索到介绍驱动到应用的详细介绍文章. 关于驱动层 hal硬件抽象层 应用层请参考s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录系列, ...

  6. 解密:IT运维艺术之集群(4层AND7层)

    负载均衡 概述; 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 负载均衡,英文名称为Load ...

  7. android调频收音机代码,android 收音机 FM 驱动 hal层 框架层以及应用层代码

    [实例简介] android 收音机 FM 驱动 hal层 框架层以及应用层代码 方法一 不需要framework部分 1.fm放到 \hardware\rk2x 2.FmRadio 放到 packa ...

  8. Android 底层驱动开发步骤——linux内核层、HAL层、JNI层

    1.Linux驱动实现 2.Linux内核驱动测试 3.Android HAL层实现 4.Aidl实现 5.Service java实现 6.Service jni 实现 7.注册service和jn ...

  9. Android 系统(4)---Android HAL层与Linux Kernel层驱动开发简介

    Android HAL层与Linux Kernel层驱动开发简介 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记. HAL:Hardw ...

最新文章

  1. 连接此产品到计算机并打开此产品电源,n6705c 直流电源分析仪.pdf
  2. python解析json_python3 解析 json 字符串并返回支持属性访问的对象
  3. pycharm和vs code的使用体验
  4. 雅思听力的词语练习打字!!!
  5. getbean方法找不到bean_iphone手机静音找不到怎么办 iphone静音找不到解决方法【图文】...
  6. axios的数据请求方式及跨域
  7. android点击灰色背景图片,android button按键失去焦点和点击后改变背景图片
  8. 使用Google Font API
  9. debug命令_Python 必备 debug 神器:pdb
  10. 通过VS2010性能分析来查找代码中那些地方最损耗资源
  11. 28181之安装SPVMN的视频插件
  12. j2ee核心模式_Java设计模式是什么?
  13. 移动端高保真动态交互Axure元件库
  14. 【11】MINST数据集的分类与效果验证
  15. 用pdf转cad转换器进行操作的简单步骤
  16. 视频流(自适应算法)
  17. GPUImage学习日记(4)之添加文字水印
  18. 餐饮日销售情况分析仪
  19. 向上取整向下取整探讨
  20. python—计算矩阵标准差

热门文章

  1. codematic2连接mysql失败_codematic2.rar
  2. bean覆盖 springboot_Springboot配置加载覆盖值顺序
  3. php 开启mail函数 wo,php mail 函数发送邮件
  4. django mysql connector,MySQL Connector / Python作为Django引擎?
  5. 单例模式应用场景_【简易设计模式04】单例模式
  6. oracle24550,ORA-24550 Signal Received Error From Client Based Application
  7. java 调用webapi json_java通过url调用web api并接收其返回的json
  8. py提取文字中的时间_怎样提取照片中的文字?照片文字提取软件推荐
  9. viewpager 自定义翻页效果_轻松打造专业的录音棚效果,连网红用了都说好的唱吧声卡K10套装...
  10. zeppelin安装使用