Android驱动入门-LED--HAL硬件抽象层程序设计①
硬件平台: FriendlyARM Tiny4412 Cortex-A9
操作系统: UBUNTU 14.04 LTS
时间:2016-09-21 16:15:26
设计HAL硬件抽象层程序,则需要打开Android源代码。
在 Android-5.0.2\hardware\libhardware\modules\目录下都是HAL文件。
创建LED文件夹。在文件夹中创建led.c文件。
#include <cutils/log.h>
#include <fcntl.h>
#include <string.h>
#include <hardware/led.h> //自己创建的头文件
#include <stdbool.h>
#include <stdint.h>
#include <sys/cdefs.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <hardware/hardware.h> #define LOG_TAG "ledhal" //打印调试信息 方便在查看调试信息时筛选 static int fd; int led_on(struct led_device_t *dev, int no )
{
ioctl( fd, LED_ON, no );
return ;
} int led_off(struct led_device_t *dev, int no )
{
ioctl( fd, LED_OFF, no );
return ;
} static int led_close(hw_device_t *dev) {
struct led_device_t *led = (struct led_device_t *)dev; //强制转换指针类型
free(led); //在这里 在退出程序时释放掉之前的申请的空间 close(fd); return ;
} static struct led_device_t led_dev = { //此处已经静态分配自己定义的结构体空间
.led_device = {
.tag = HARDWARE_DEVICE_TAG, //固定格式
.close = led_close,
}, .set_on = led_on,
.set_off = led_off,
}; static int open_led_hal(const hw_module_t* module, const char* name,
hw_device_t** device)
{
*device = &led_dev; //直接赋值已静态分配的结构体指针
fd = open( "/dev/my_led",O_RDWR );
if( fd< )
{
ALOGD("open device file failed\n"); // logcat -s ledhal
return ;
}
return ;
} static struct hw_module_methods_t led_methods = {
.open = open_led_hal, //在程序启动时自动执行
};
struct hw_module_t HAL_MODULE_INFO_SYM = { //程序入口 .tag = HARDWARE_MODULE_TAG,
.id = "led",
.methods = &led_methods, //首先调用其中的open函数 };
在 Android-5.0.2\hardware\libhardware\include\hardware\ 下创建头文件led.h
#ifndef _HARDWARE_LED_H
#define _HARDWARE_LED_H #include <hardware/hardware.h> struct led_device_t { //自己设定的结构体
struct hw_device_t led_device; //此成员为固定格式
int (*set_on)(struct led_device_t *dev, int no );
int (*set_off)(struct led_device_t *dev, int no ); }; #define LED_ON _IOW('G',0,int)
#define LED_OFF _IOW('G',1,int) #endif
在 Android-5.0.2\hardware\libhardware\modules\ 目录下创建Android.mk文件,这里我是复制其他文件夹中的。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := led.default //生成的库名称 # HAL module implementation stored in
# hw/<VIBRATOR_HARDWARE_MODULE_ID>.default.so
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_C_INCLUDES := hardware/libhardware
LOCAL_SRC_FILES := led_hal.c //源文件名称
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_MODULE_TAGS := eng //这里我选用的是工程模式 include $(BUILD_SHARED_LIBRARY)
上面有注释的代表是需要修改的地方。
然后退到Android源代码的目录。执行命令生成相关文件。
mmm hardware/libhardware/modules/led/
将在 out/target/product/tiny4412/system/lib/hw/ 目录下生成相关文件。
在执行 ./gen-img.sh 将生成新的system.img文件 重新安装安卓系统,在控制台模式下,可看到在system\lib\hw目录下有相关文件。
Android驱动入门-LED--HAL硬件抽象层程序设计①的更多相关文章
- Android驱动入门-Led控制+app+ndk库+底层驱动
硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-20 21:56:48 本次实验使用的是 安卓APP + ...
- Android驱动入门-LED--HAL硬件访问服务层②
硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-21 16:58:56 为了避免访问冲突,则创建了硬件访 ...
- android驱动学习---led实验
======================== 驱动: 内核:android-kernel 2.6.36 (必须对应你的板子上内核,不然会出现insmod错误) 目的:通过android应用层用户 ...
- Android驱动入门-LED--测试APP编写③
硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-24 10:47:03 在Android Studio中 ...
- Android驱动入门-在Android系统上运行JAVA程序
在linux上运行java程序,直接用javac编译,再用java运行就行了.但是在Android上,由于虚拟机和pc端的不同,所以操作方法也是不一样的. 如果想在Android上运行Hello wo ...
- Android驱动学习-APP操作新硬件的两种方法(支持添加的驱动)
在给Android添加新的驱动后,app要如何使用呢? 正常的使用一个设备,需要getService.但是像LED等我们自己添加的硬件驱动,Android源代码根本没有我们自己添加的服务. 第一种: ...
- 自己动手写最简单的Android驱动---LED驱动的编写【转】
本文转载自:http://blog.csdn.net/k_linux_man/article/details/7023824 转载注明出处,作者:K_Linux_Man, 薛凯 山东中医药大学,给文章 ...
- 深入浅出 - Android系统移植与平台开发(十) - led HAL简单设计案例分析
作者:唐老师,华清远见嵌入式学院讲师. 通过前两节HAL框架分析和JNI概述,我们对Android提供的Stub HAL有了比较详细的了解了,下面我们来看下led的实例,写驱动点亮led灯,就如同写程 ...
- Android驱动学习-app调用内核驱动过程(驱动框架回顾)
考研已经过去了,android驱动的学习也断了半年多了,现在重新捡起来学习,回顾一下Android驱动的大体框架. Android系统的核心是java,其有一个David虚拟机.Android-app ...
随机推荐
- Web前端面试笔试题总结
最近一段时间要毕业了,忙着找工作,见过不少笔试面试题,自己总结了一些加上网上找的一些整合了一下.答案暂时都东拼西凑出来了,但是还是先不发出来,一方面是答案并不是唯一的并且自己的答案不能保证对,另一方面 ...
- js调用soapWebService服务
js调用soapWebService服务 什么是 SOAP? SOAP 指简易对象访问协议 SOAP 是一种通信协议 SOAP 用于应用程序之间的通信 SOAP 是一种用于发送消息的格式 SOAP 被 ...
- %1$s,%2$s等的用法
String.format(String format, Object... args)方法中: format:格式字符串. 如:%1$s,%1$d,%2$s... ...
- JAVA IO 序列化与设计模式
➠更多技术干货请戳:听云博客 序列化 什么是序列化 序列化:保存对象的状态 反序列化:读取保存对象的状态 序列化和序列化是Java提供的一种保存恢复对象状态的机制 序列化有什么用 将数据保存到文件或数 ...
- iOS中的小知识点
1.tableView隐藏滚动条 self.tableView.showsVerticalScrollIndicator = NO; 2.关于属性 使用assign: 对基础数据类型 (NSI ...
- 网络编程--ASI--(ASIHTTPRequest)介绍
ASIHTTPRequest 虽然是明日黄花,但是还是稍微归纳一下,理清思路,知道这个曾经的她都能干嘛. 1. ASI基于底层的 CFNetworking 框架,运行效率很高. 2. 黄金搭档:ASI ...
- 单例模式-用GCD实现
用GCD实现单例模式的步骤: 步骤1. 创建头文件 XZSingleton.h,里面代码如下: // .h文件 #define XZSingletonH(name) + (instancetype)s ...
- php并发编程相关扩展
Stream:PHP内核提供的socket封装Sockets:对底层Socket API的封装Libevent:对libevent库的封装Event:基于Libevent更高级的封装,提供了面向对象接 ...
- IntelliJ IDEA 12.1.4 解决中文乱码
一.进入IDE Settings 里的 Appearance项,选中Override default fonts by ,把 Name 设置为 SimSun,Size 根据自己喜好设置(我一般设为 1 ...
- 在【Xamarin+Prism开发详解三:Visual studio 2017 RC初体验】中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很是感兴趣。于是发时间深入研究了一下Visual Studio 2017RC 是不是和微软Connect()://2016上说得一样神。
总共列出了12点,耐心点慢慢看! 1,添加了不少[代码样式]的设置项目. 通过合理的设置每个人都能写出优美的代码,而且团队项目也可以达到统一代码风格. this首选项:可以设置[字段,属性,方法,事件 ...