android驱动开发介绍
向内核注册和注销一个块设备可使用如下函数: int register_blkdev(unsigned int major, const char *name); int unregister_blkdev(unsigned int major, const char *name);
• 网络设备驱动
• 二 Hal module Stub框架分析 每个硬件对象都由hw_module_t来描述,只要我们拿到了这个硬件对象,就可 以调用它的open方法,返回这个硬件对象的硬件操作接口,然后就可以通过 这些硬件操作接口来间接操作硬件。
• 模块管理(module management) • 虚拟文件系统接口(VFS layer) • 文件系统(file system) • 设备驱动程序(device driver) • 进程间通信(inter-process communication) • 网络管理(network management) • 系统启动(system init)
Stub是存根或者桩的意思,上层应用层或者框架层代码加载so库代码,so库代码我们称之为 module,在Hal层注册了每个硬件对象的存根stub,当上层需要访问硬件的时候,就从当前注 册的硬件对象stub里查找,找到之后stub会向上层module提供该硬件对象的operations interface(操作接口),该操作接口就保存在module中,上层应用或框架层再通过这个 module操作接口来访问硬件。 新的Stub框架虽然也要加载module库,但是这个module已经不包含操作底层硬件驱动的功能 了,它里面保存的只是底层stub提供的操作接口,底层stub扮演了“接口提供者”的角色, 当stub第一次被使用时加载到内存,后续再使用时仅返回硬件对象操作接口,不会存在设备 多次打开的问题。
理的基本单位。通常,1个块由1个或多个扇区组成。 段(Segments):由若干个相邻的块组成。是Linux内存
管理机制中一个内存页或者内存页的一部分。
• 块设备相关的数据结构以及接口:
struct block_device { …
}; struct gendisk {
… }; struct gendisk *alloc_disk(int minors); //分配磁盘 void add_disk(struct gendisk *disk); //增加磁盘信息 void unlink_gendisk(struct gendisk *disk) //删除磁盘信息 void delete_partition(struct gendisk *disk, int part); //删除分区 void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len, int flags);
• PMEM PMEM用于向用户空间提供连续的物理内存区域, DSP和某些设备只能工作在连续的物理内存上
• Logger 一个轻量级的日志设备,用于抓取Android系统的各 种日志
• Ram Console 为了提供调试功能,Android允许将调试日志信息写 入一个被称为RAM Console的设备里,它是一个基于 RAM的Buffer
Linux网络设备驱动程序体系结构分为四层: (1)网络协议接口层向网络层协议提供统一的数据包收
发接口,不论上层协议是ARP还是IP,都通过 dev_queue_xmit()函数发送数据,并通过netif_rx()函数接 收数据。这一层的存在使得上层协议独立于具体的设备。 (2)网络设备接口层向协议接口层提供的用于描述具体 网络设备属性和操作的结构体net_device,该结构体是 设备驱动功能层各函数的容器。 (3)设备驱动功能层的各函数是网络设备接口层 net_device数据结构的具体成员,是驱使网络设备硬件 完成相应动作的程序,它通过nto_start_xmit()函数启动 发送操作,并通过网络设备上的中断触发接收操作。 (4)网络设备与媒介层是完成数据包发送和接收的物理 实体,包括网络适配器和具体的传输媒介,网络适配器 被设备驱动功能层中的函数在物理上驱动。
Android特有驱动 • Binder IPC 驱动
基于OpenBinder框架的一个驱动,用于提供 Android平台的进程间通讯(IPC,inter-process communication) • 电源管理 PM 一个基于标准Linux电源管理系统的轻量级的 Android电源管理驱动,针对嵌入式设备做了 很多优化 (wakelock ) • 匿名共享内存 ashmem 为进程间提供大块共享内存,同时为内核提供 回收和管理这个内存的机制
Android驱动开发介绍
Edward.shen 2018.12.03
知识点:
• 什么是驱动 • Android 系统架构 • 驱动分类 • Android和Linux驱动联系 • 开源和版权 • Android内核配置 • linux驱动三种类型 • 字符设备驱动 • 块设备驱动 • 网络设备驱动 • Hal层开发
开源和版权
• Linux Kernel的版权是GPL。 GPL: 许可社会公众享有:运行、复制软件的自 由,发行传播软件的自由,获得软件源码的自 由,改进软件并将自己作出的改进版本向社会 发行传播的自由。 GPL还规定,只要这种修改文本在整体上或者其 某个部分来源于遵循GPL的程序,该修改文本 的整体就必须按照GPL流通,不仅该修改文本 的源码必须向社会公开,而且对于这种修改文 本的流通不准许附加修改者自己作出的限制。
什么是驱动
• 驱动是硬件和软件之间的媒介和载体,其 中包含有关硬件设备的信息,没有驱动程 序,系统中的硬件就无法工作。操作系统 不同,硬件的驱动程序也不同。
Android 系统架构
驱动分类
按硬件分: • 显示驱动 • 相机驱动 • 音频驱动 • 传感器驱动 • Flash内存驱动 • 键盘、触摸屏驱动 • wifi驱动 • 蓝牙驱动 • 电源管理驱动
Android内核配置
• 要编译一个支持Android的Kernel,需要先进 行配置。make menuconfig
• 配置的文件在 arch/arm/configs/xxx_defconfig
linux驱动三种类型
• 字符设备驱动
I/O传输过程中以字符为单位进行传输的设备。
struct cdev {
• timed device 提供了对设备进行定时控制功能,目前支持vibrator 和LED设备
Android和Linux驱动联系
• 驱动实现方面:两者都是在Linux内核中实 现的,不同的是Android系统将复杂的实现 抽取出来放到用户空间去实现。
• 用户空间和内核空间交互方面:Linux系统 可以直接用C语言调用系统接口,跟内核进 行交互;而Android系统上层应用是java实现, 因此就产生了一个叫JNI的中间桥梁,通过 它去调用本地的C/C++实现的方法去与内核 交互。
//添加分区 struct block_device_operations {
… }; const struct file_operations def_blk_fops = {
… };
请求队列和相关的处理函数:
struct request_queue{ …
}; request_queue_t *blk_init_queue(request_fn_proc *rfn, spinlock_t
struct kobject kobj;
struct module *owner;
//所属的模块
struct file_operation *ops
//文件操作结构体
struct list_head list;
dev_t dev;
unsigned int count;
}
static struct file_operations my driver_fops={
*lock); struct request *elv_next_request(request_queue_t *q); void end_request(struct request *req, int uptodate);//请求完成 void blk_stop_queue(request_queue_t *queue); //停止请求 void blk_start_queue(request_queue_t *queue); //开始请求 void blk_cleanup_queue(request_queue_t *);//清除请求队列
• Android采用ASL(Apache Software License)许 可证。
ASL: 用户可以随意使用源代码而不用开源。
Google把驱动程序移到userspace中,上驱 动程序在Linux Kernel上面运行,而在Kernel 开一个小门,使之可以直接控制到硬件, 只需公布这个开的“小门”程序源码,即 不违反GPL许可,又不上外界看到厂商的硬 件驱动和应用程序的源代码,保护了厂商 的硬件规格。
Hal层开发
• Android Hal层(即 Hardware Abstraction Layer硬件抽象层)是Google开发的Android 系统里上层应用对底层硬件操作屏蔽的一 个软件层次,说直白点,就是上层应用不 必关心底层硬件具体是如何工作的,只需 要调用底层提供的统一接口即可。
• 一 moduux是一套免费使用和自由传播的类Unix操作系统,是一个基 于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作 系统。由linus于1991年发布。
组成: • 进程管理(process management) • 定时器(timer) • 中断管理(interrupt management) • 内存管理(memory management)