这些天一直在想Android驱动框架层的实现,本文借助老罗老师的博客和现有通过过分析台湾的Jollen的mokoid 工程代码,并尝试在Android开发板上驱动一个简单的蜂鸣器,来解析Android下驱动的调用。
HAL架构由Patrick Brady (Google) 在2008 Google I/O演讲中提出的,如下图。
其实可以考虑先编写驱动代码,然后使用NDK编译库层的代码,最后在Android应用层来直接完成对硬件驱动层的调用!
先编写一个简单的蜂鸣器驱动程序,根据开发板上的硬件IO接口和Android驱动规范,在kernel中的driver目录中新建一个Buzzer文件,新建一个buzzer.c的源文件
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/ioport.h>
#include<linux/fs.h>
#include<asm/io.h>
#include<asm/uaccess.h>
#define DRIVER_AUTHOR "canjianfantasy"
#define DRIVER_DESCRIBLE "buzzer test program"
#define BUZZER_MAJOR 248 //Device Driver Major Number
#define BUZZER_NAME "BUZZER_IO_PORT" //Device Name
#define BUZZER_DRIVER_VERSION "BUZZER IO PORT V0.1" //Device Driver Version
#define BUZZER_ADDRESS 0x88000050 //physical address
#define BUZZER_ADDRESS_RANGE 0x1000 // I/O region range
//Glable variable
static int buzzer_usage = 0; //if device is already used ?
static unsigned long *buzzer_ioremap ; //io address region
//It is called when program called open() system call
int buzzer_open(struct inode