s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(二 硬件抽象层HAL 第二种 ioctl操作方法)
欢迎转载,务必注明出处: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操作方法)相关推荐
- s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(二 硬件抽象层HAL)
欢迎转载,务必注明出处:http://blog.csdn.net/wang_shuai_ww/article/details/44305599 本篇文章记录硬件抽象层. 还是跟之前一样,主要参考< ...
- s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(一 硬件驱动层)
欢迎转载,务必注明出处:http://blog.csdn.net/wang_shuai_ww/article/details/44303069 本文章是记录Android开发中驱动层.HAL层.应用层 ...
- s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录(三 APP应用)
欢迎转载,务必注明出处:http://blog.csdn.net/wang_shuai_ww/article/details/44416041 eclipse完整工程下载地址:http://downl ...
- Android 10.0 SystemUI下拉状态栏UI定制化开发系列(十二)
目录 1.概述 2.核心代码 3.核心代码部分分析 3.1 NotificationStackScrollLayout.java代码分析 3.2接下来分析Activat
- Android应用开发 led 驱动层 hal硬件抽象层 应用层 详细教程记录(含源码)
本篇文章是为了能够更好的搜索到介绍驱动到应用的详细介绍文章. 关于驱动层 hal硬件抽象层 应用层请参考s5p4418 Android 4.4.2 驱动层 HAL层 服务层 应用层 开发流程记录系列, ...
- 解密:IT运维艺术之集群(4层AND7层)
负载均衡 概述; 负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 负载均衡,英文名称为Load ...
- android调频收音机代码,android 收音机 FM 驱动 hal层 框架层以及应用层代码
[实例简介] android 收音机 FM 驱动 hal层 框架层以及应用层代码 方法一 不需要framework部分 1.fm放到 \hardware\rk2x 2.FmRadio 放到 packa ...
- Android 底层驱动开发步骤——linux内核层、HAL层、JNI层
1.Linux驱动实现 2.Linux内核驱动测试 3.Android HAL层实现 4.Aidl实现 5.Service java实现 6.Service jni 实现 7.注册service和jn ...
- Android 系统(4)---Android HAL层与Linux Kernel层驱动开发简介
Android HAL层与Linux Kernel层驱动开发简介 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记. HAL:Hardw ...
最新文章
- 连接此产品到计算机并打开此产品电源,n6705c 直流电源分析仪.pdf
- python解析json_python3 解析 json 字符串并返回支持属性访问的对象
- pycharm和vs code的使用体验
- 雅思听力的词语练习打字!!!
- getbean方法找不到bean_iphone手机静音找不到怎么办 iphone静音找不到解决方法【图文】...
- axios的数据请求方式及跨域
- android点击灰色背景图片,android button按键失去焦点和点击后改变背景图片
- 使用Google Font API
- debug命令_Python 必备 debug 神器:pdb
- 通过VS2010性能分析来查找代码中那些地方最损耗资源
- 28181之安装SPVMN的视频插件
- j2ee核心模式_Java设计模式是什么?
- 移动端高保真动态交互Axure元件库
- 【11】MINST数据集的分类与效果验证
- 用pdf转cad转换器进行操作的简单步骤
- 视频流(自适应算法)
- GPUImage学习日记(4)之添加文字水印
- 餐饮日销售情况分析仪
- 向上取整向下取整探讨
- python—计算矩阵标准差
热门文章
- codematic2连接mysql失败_codematic2.rar
- bean覆盖 springboot_Springboot配置加载覆盖值顺序
- php 开启mail函数 wo,php mail 函数发送邮件
- django mysql connector,MySQL Connector / Python作为Django引擎?
- 单例模式应用场景_【简易设计模式04】单例模式
- oracle24550,ORA-24550 Signal Received Error From Client Based Application
- java 调用webapi json_java通过url调用web api并接收其返回的json
- py提取文字中的时间_怎样提取照片中的文字?照片文字提取软件推荐
- viewpager 自定义翻页效果_轻松打造专业的录音棚效果,连网红用了都说好的唱吧声卡K10套装...
- zeppelin安装使用