--作者:赖玉平(Peter Lai)aulyp@163.com

本例子,讲述在android2.1上完全自已开发一个驱动去控制硬件口并写应用测试该驱动,通过这样一个例子,解析android下的驱动开发流程的应用调用流程,可以说是很好的入门引导

要达到的效果:通过android的应用,调用驱动程序,在开发板上控制4个LED的亮灭。

一、硬件原理

如上图,通过4个IO口控制这LED,低电平LED亮,

这4个IO口分别是GPM1, GPM2, GPM3, GPM4,

二、驱动程序

1、在kernel文件夹下的driver目录,新键驱动文件夹

# cd kernel_android_2.6.28.6/drivers

进到开发板的kernel目录,建驱动文件夹

2、在/driver/ledtest目录下,新建leddriver.c ,leddriver.h , Kconfig, Makefile 等4个文件

leddriver.c

leddriver.h文件

leddriver.h文件

ssize_t GPIO_VIB_read(struct file * file,char * buf,size_t count,loff_t * f_ops);

ssize_t GPIO_VIB_write (struct file * file,const char * buf, size_t count,loff_t * f_ops);

static int GPIO_VIB_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);

ssize_t GPIO_VIB_open(struct inode * inode,struct file * file);

ssize_t GPIO_VIB_release(struct inode * inode, struct file * file);

static int GPIO_VIB_CTL_init(void);

Kconfig 文件

Kconfig 文件

config LEDTEST

tristate "LED test for ARMeasy"

default n

help

this is a LED driver for ARMEASY with S3C6410

Makefile文件

Makefile文件

obj-$(CONFIG_LEDTEST)+=leddriver.o

3、在内核配置里菜单里加入本驱动的配置项

达到的效果是,可以通过内核配置来选择是否把本驱动编译进内核里,也就是出现在make menuconfig 后出来的界面里,可以参考9.8章

1)在arch/arm/Kconfig文件里 menu "Device Drivers"与 endmenu之间添加

source "drivers/ledtest/Kconfig"

2)在drivers/Kconfig menu "Device Drivers" 和 endmenu之间添加

source "drivers/ledtest/Kconfig"

3)修改/drivers/Makefile文件

Obj-$(CONFIG_LEDTEST) +=ledtest/

4、编译驱动

在kernel目录下,终端输入

#make menuconfig

“Device Drivers” 下面会看到 “LED test for ARMeasy”,选择它,

保存并退出

#make

这样,就会在/drivers/ledtest目录下得到leddrivr.ko文件,它就是驱动目标文件,已级编译进了zImage 里了,只要用这个kernel烧录到开发板,开机就会自动加载本驱动,

PS,如果发现如上编译,没有在ledtest目录下生成leddriver.ko文件,也就是本根没有去编译本驱动,那就把ledtest目录入到/drivers/misc目录下,相应的修改misc下面,然后,在makefile里,不用选直接写成obj-y += leddriver.o,这样强制的包含进去编译。

三、 应用程序(测试驱动)

用C语言写一个应用,测试上面写的驱动是否工作正常,这是一般的驱动开发流程

主要有两个文件:Android.mk和ledtest.c

1、

在$(YOUR_ANDROID)/external/LEDTEST/目录编写ledtest.c文件,

ledtest.c

ledtest.c

#include

#include

#include // contact the open(),close(),read(),write() and so on!

#define DEVICE_NAME "/dev/vib"//device point

#define LED_ON  0x11

#define LED_OFF  0x22

int main(int argc,char **argv)

{

int fd;

int ret;

char *i;

printf("\n start gpio_led_driver test \r\n");

fd = open(DEVICE_NAME,O_RDWR);//Open device ,get the handle

printf("fd = %d \n",fd);

if(fd == -1) //open fail

{

printf("open device %s error \n",DEVICE_NAME);

}

else

{

while(1)

{

ioctl(fd,LED_OFF); //call the output function to off LEDs

sleep(1);//wait 1 second

ioctl(fd,LED_ON);

sleep(1);

}

ret = close(fd); //close device

printf("ret = %d \n",ret);

printf("close gpio_led test \n");

}

return 0;

}

2、在$(YOUR_ANDROID)/external/ LEDTEST /目录编写Android.mk文件。这是Android Makefile的标准命名,不要更改。Android.mk文件的格式和内容可以参考其他已有的Android.mk文件的写法,针对helloworld程序的Android.mk文件内容如下:

Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \/par hello.c

LOCAL_MODULE := ledtestapp

include $(BUILD_EXECUTABLE)

注意上面LOCAL_SRC_FILES用来指定源文件;

LOCAL_MODULE指定要编译的模块的名字,下一步骤编译时就要用到;

include $(BUILD_EXECUTABLE)表示要编译成一个可执行文件,如果想编译成动态库则可用BUILD_SHARED_LIBRARY,这些可以在

$(YOUR_ANDROID)/build/core/config.mk查到。

3、 回到Android源代码顶层目录进行编译:

例如我这里的实际操作是

#make ledtestapp

注意make ledtestapp中的目标名ledtestapp就是上面Android.mk文件中由LOCAL_MODULE指定的模块名。编译结果如下

============================================

PLATFORM_VERSION=2.1-update1

TARGET_BUILD_VARIANT=eng

TARGET_BUILD_TYPE=release

HOST_ARCH=x86

HOST_BUILD_TYPE=release

============================================

target thumb C: ledtestapp <= external/LEDTEST/ledtest.c

Install: out/host/linux-x86/bin/soslim

target Non-prelinked: ledtestapp (out/target/product/generic/symbols/system/bin/ledtestapp)

Install: out/target/product/generic/system/lib/libdl.so

Install: out/target/product/generic/system/lib/libstdc++.so

Install: out/target/product/generic/system/bin/ledtestapp

4、如上面的编译结果所示,编译后的可执行文件存放在

out/target/product/generic/system/bin/目录 可执行文件是ledtestapp

5、拷贝ledtestapp可执行文件到T卡,插入开发板

6、开电,在启动进入android的过程中,串口终端 按回车,进入命令行模式

7、拷贝可执行文件到根目录

8、执行程序

通过上面的步骤,可以看到开发板上相应的LED在闭,每秒钟闪一次!

后语:近来老发现有网站盗用我的博客文章,又不注明出处,很不尊重我的劳动果实,所以设计了以上签名,做成图片,望理解!

android驱动例子(led灯控制),android驱动例子(LED灯控制)相关推荐

  1. 实现Android底层驱动开发并裁剪定制Android操作系统

    毕业论文 题   目实现Android底层驱动开发并裁剪定制Android操作系统 学   院电子信息与电气工程学院 姓   名牛xxx民 专   业电子信息科学与技术 学   号2012xxxxxx ...

  2. 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(八)使用domoticz+mosquitto+Android客户端实现控制mini2440上的LED(一)

    本篇将在上一篇交叉编译paho.mqtt.embedded-c官方的源代码例程基础上,稍作修改,尝试实现domoticz+mosquitto联合做服务器,使用Android客户端APP或浏览器对min ...

  3. LED灯串控制芯片,8模式灯串IC芯片,跑马闪灯IC芯片,FH8A15G圣诞灯串驱动IC

    FH8A15G是一款用于LED灯串控制芯片,8模式灯串IC芯片,跑马闪灯IC芯片,圣诞灯串驱动IC FH8A15G特点描述                      1/2/3/4线八功能灯串IC芯片 ...

  4. Android硬件服务框架实例之Vibrator(驱动到应用)

    转载于:http://www.cnblogs.com/skywang12345/p/3404808.html,内容有所修改,这篇vibrator源码是基于安卓7.1分析.      系列:安卓硬件访问 ...

  5. 米尔科技zynq利用MIO操作LED灯的linux驱动

    一.目标 在米尔科技zynq的z-turn开发板上,通过编写驱动,实现对两盏灯的控制. 二.分析 ①硬件部分 这两盏绿灯位于zynq的MIO0和MIO9上. 有关操作IO口的地址,查找ug585-zy ...

  6. Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记

    Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记     本章学习了使用git下载两套源代码并搭建两个开发环境.分别为Android源代码和Linux内核源代码.A ...

  7. android 电容屏(二):驱动调试之基本概念篇

    关键词:android  电容屏 tp 工作队列 中断 多点触摸协议 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0  平台:S5PV310(sams ...

  8. Android深度探索(卷1)HAL与驱动开发第六章总结

    操作系统是通过各种驱动程序赖家与硬件设备的,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式.设备驱动程序是操作系统最基本的组成部分之一,在Linux内核源程序中也 ...

  9. Android深度探索(卷1)HAL与驱动开发 心得体会 第十章 嵌入式Linux的调用技术

    Android深度探索(卷1)HAL与驱动开发 心得体会 第十章  嵌入式Linux的调用技术 对于复杂的Linux驱动以及HAL等程序库,需要使用各种方法对其进行调试.例如,设置断点,逐步跟踪代码. ...

最新文章

  1. background 距离右边固定距离
  2. (转载)(官方)UE4--图像编程----Parallel Rendering Overview
  3. Vue指令之v-model和双向数据绑定
  4. Jackson反序列化提示:Can not deserialize instance of Task out of START_ARRAY token
  5. DOM对象与Jquery对象区别
  6. 从714里连续减去6减几次得0_一年级下册数学想加算减、破十法、连减法,家长来看看...
  7. 01. 慎重选择容器类型
  8. 《AngularJS高级程序设计》学习笔记
  9. unity3D跑酷游戏源码,支持安卓+IOS双端 unity2019 C#语言开发
  10. Java| MANIFEST.MF讲解
  11. JSP中文乱码解决方案了解和TOMCAT中文乱码解决
  12. python常用library
  13. GitHub 上值得收藏的100个精选前端项目!你知道几个?
  14. Android 调起系统相机拍照
  15. 常见的web中间件java框架漏洞总结
  16. EMI(干扰)和EMS(产品抗干扰和敏感度)。
  17. 使用Sharding-Proxy完成mysql分库分表和主从复制
  18. 涪陵计算机二级培训机构排名,涪陵计算机培训_众鑫教育信得过的品牌
  19. C++嵌套循环打印99乘法表
  20. 影评之火影忍者博人传

热门文章

  1. python模拟萌妹音让室友疯狂吃鸡
  2. MTK平台安卓Qcamera驱动移植——sensor部分
  3. php手术要休息多久,囊肿切除后需要休息多久
  4. 程序员在大学的自我管理
  5. 单链表存储一元多项式[IMUT 数据结构实验]
  6. EV3 直接命令 - 第 3 课 遥控车辆
  7. Excel 数据处理操作 学术研究、办公场景疑难解决(毕设数据、公务员)
  8. 搞笑台词,意想不到之语却似在情理之中
  9. Lintcode题目总结
  10. (导航页)OpenStack-M版-双节点手工搭建-附B站视频