android底层驱动学习之linux输入子系统的理解

1.什么叫输入子系统?

        内核的输入子系统是对分散的,多种不同类别的输入设备(如键盘,鼠标,跟踪球,操纵杆,触摸屏,加速计和手写板)等字符设备进行统一处理的一层抽象,就是在字符设备驱动上抽象出的一层。输入子系统包括两类驱动程序:事件驱动程序和设备驱动程序。事件驱动程序负责和应用程序的接口,而设备驱动程序负责和底层输入设备的通信。鼠标事件生成文件mousedev属于事件驱动程序,而PS/2鼠标驱动程序是设备驱动程序。事件驱动程序是标准的,对所有的输入类都是可用的,所以要实现的是设备驱动程序而不是事件驱动程序。设备驱动程序可以利用一个已经存在的,合适的事件驱动程序通过输入核心和用户应用程序接口。

2.输入子系统的架构是怎么样的,分为几层,是怎么实现的?

输入子系统由驱动层、系统核心层(input core)、事件处理层(event handler)三部分组成,

一个输入事件(如点击触屏)通过input driver->input core->event handler->user space 到达用户空间传递给应用程序

在这里input core是核心,linux系统提供的内核接口,作为底层驱动的开发者来说,只需编辑input driver与硬件直接打交道的这一层。那event handler事件处理层是谁来做呢,还没弄懂。---以后要弄懂


3.那首先来看input driver层,我以触屏的来分析:

注册过程:

a.首先通过input_allocate_device来峙湟桓鰅nput_dev接口,并初始化一些基本的成员

b.然后在《》里面初始化一些参数。

c.最后通过input_register_device来注册注册一个input设备

static int fts_ts_probe(struct i2c_client *client, const struct i2c_device_id *id)

{
  
	input_dev = input_allocate_device();//分配一个input_dev接口,并初始化一些基本的成员
	.......
》	input_dev->name = "fts_ts";
	input_dev->id.bustype = BUS_I2C;//总线类型是I2C
	input_dev->dev.parent = &client->dev;//父设备

	input_set_drvdata(input_dev, data);//保存data结构到錳nput_dev里面
	i2c_set_clientdata(client, data);

	__set_bit(EV_KEY, input_dev->evbit);//按键事件,每次触摸都有一个BTN_TOUCH的按键事件
	__set_bit(EV_ABS, input_dev->evbit); //绝对坐标事件,触摸屏每次发送的坐标都是绝对坐标,不同于鼠标的相对坐标
	__set_bit(BTN_TOUCH, input_dev->keybit);//touch类型按键
	__set_bit(INPUT_PROP_DIRECT, input_dev->propbit);

	input_mt_init_slots(input_dev, pdata->num_max_touches,0);
	input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, pdata->x_max, 0, 0);//这个是设置ad转换的x坐标
》	input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, pdata->y_max, 0, 0);//这个是设置ad转换的y坐标
	...........
	err = input_register_device(input_dev);//注册一个input设备
	.......
}

static struct i2c_driver fts_ts_driver = {
	.probe = fts_ts_probe,
	.remove = fts_ts_remove,
	.driver = {
		   .name = "fts_ts",
		   .owner = THIS_MODULE,
		   .of_match_table = fts_match_table,
#ifdef CONFIG_PM
		   .pm = &fts_ts_pm_ops,
#endif
		   },
	.id_table = fts_ts_id,
};

/*******************************************************************************
*  Name: fts_ts_init
*  Brief:
*  Input:
*  Output: 
*  Return: 
*******************************************************************************/
static int __init fts_ts_init(void)
{
	printk(" ### %s\n",__func__);
	return i2c_add_driver(&fts_ts_driver);
}

/*******************************************************************************
*  Name: fts_ts_exit
*  Brief:
*  Input:
*  Output: 
*  Return: 
*******************************************************************************/
static void __exit fts_ts_exit(void)
{
	printk("%s\n",__func__);
	i2c_del_driver(&fts_ts_driver);
}

module_init(fts_ts_init);
module_exit(fts_ts_exit);


至此,input drive就完成了。

4.那下面来看下上述两个重要的函数:input_allocate_device()和input_register_device()


a.input_allocate_device()

这个函数也就是做一些内存分配和一些基本的初始化

struct input_dev *input_allocate_device(void)
{
	struct input_dev *dev;

	dev = kzalloc(sizeof(struct input_dev), GFP_KERNEL);//分配一个 input_dev 结构体,并初始化为 0
	if (dev) {
		dev->dev.type = &input_dev_type;/*初始化设备的类型*/
		dev->dev.class = &input_class;/*设置为输入设备类*/
		device_initialize(&dev->dev);/*初始化 device 结构*/
		mutex_init(&dev->mutex);/*初始化互斥锁*/ 
		spin_lock_init(&dev->event_lock);/*初始化事件自旋锁*/
		INIT_LIST_HEAD(&dev->h_list);/*初始化链表*/
		INIT_LIST_HEAD(&dev->node);/*初始化链表*/

		__module_get(THIS_MODULE);/*模块引用技术加 1*/ 
	}

	return dev;
}
b. input_register_device()

input_register_device()用于注册一个输入设备。那么注册过程是怎样的呢?这是一个重点,我们在下面的代码中进行注释分析:

[cpp]  view plain   copy
  1. int input_register_device(struct input_dev *dev)  
  2. {  
  3.     /* 用于记录输入设备名称的索引值 */  
  4.     static atomic_t input_no = ATOMIC_INIT(0);  
  5.     /* 输入事件的处理接口指针,用于和设备的事件类型进行匹配 */  
  6.     struct input_handler *handler;  
  7.     const char *path;  
  8.     int error;  
  9.   
  10.     /* 默认所有的输入设备都支持EV_SYN同步事件 */  
  11.     set_bit(EV_SYN, dev->evbit);  
  12.   
  13.     /* 
  14.      * 如果设备驱动没有指定重复按键(连击),系统默认提供以下的支持 
  15.      * 其中init_timer为连击产生的定时器,时间到调用input_repeat_key函数 
  16.      * 上报,REP_DELAY用于设置重复按键的键值,REP_PERIOD设置延时时间 
  17.      */  
  18.     init_timer(&dev->timer);  
  19.     if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) {  
  20.         dev->timer.data = (long) dev;  
  21.         dev->timer.function = input_repeat_key;  
  22.         dev->rep[REP_DELAY] = 250;  
  23.         dev->rep[REP_PERIOD] = 33;  
  24.     }  
  25.   
  26.     /* 如果设备驱动没有设置自己的获取键值的函数,系统默认 */  
  27.     if (!dev->getkeycode)  
  28.         dev->getkeycode = input_default_getkeycode;  
  29.   
  30.     /* 如果设备驱动没有指定按键重置函数,系统默认 */  
  31.     if (!dev->setkeycode)  
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
书名:《Android底层开发技术实战详解——内核、移植和驱动》(电子工业出版社.王振丽)。本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解驱动移植的必要性,何为hal层深入分析,goldfish、msm、map内核和驱动解析,显示系统、输入系统、振动器系统、音频系统、视频输出系统的驱动,openmax多媒体、多媒体插件框架,传感器、照相机、wi-fi、蓝牙、gps和电话系统等。在每一章中,重点介绍了与Android驱动开发相关的底层知识,并对Android源码进行了剖析。 本书适合Android研发人员及Android爱好者学习,也可以作为相关培训学校和大专院校相关专业的教学用书。 全书压缩打包成3部分,这是第3部分。 目录: 第1章 Android底层开发基础 1 1.1 什么是驱动 1 1.1.1 驱动程序的魅力 1 1.1.2 电脑中的驱动 2 1.1.3 手机中的驱动程序 2 1.2 开源还是不开源的问题 3 1.2.1 雾里看花的开源 3 1.2.2 从为什么选择java谈为什么不开源驱动程序 3 1.2.3 对驱动开发者来说是一把双刃剑 4 1.3 AndroidLinux 4 1.3.1 Linux简介 5 1.3.2 AndroidLinux的关系 5 1.4 简析Linux内核 8 1.4.1 内核的体系结构 8 1.4.2 和Android密切相关的Linux内核知识 10 1.5 分析Linux内核源代码很有必要 14 1.5.1 源代码目录结构 14 1.5.2 浏览源代码的工具 16 1.5.3 为什么用汇编语言编写内核代码 17 1.5.4 Linux内核的显著特性 18 1.5.5 学习Linux内核的方法 26 第2章 分析Android源代码 31 2.1 搭建Linux开发环境和工具 31 2.1.1 搭建Linux开发环境 31 2.1.2 设置环境变量 32 2.1.3 安装编译工具 32 2.2 获取Android源代码 33 2.3 分析并编译Android源代码 35 2.3.1 Android源代码的结构 35 2.3.2 编译Android源代码 40 2.3.3 运行Android源代码 42 2.3.4 实践演练——演示编译Android程序的两种方法 43 2.4 编译Android kernel 47 2.4.1 获取goldfish内核代码 47 2.4.2 获取msm内核代码 50 2.4.3 获取omap内核代码 50 2.4.4 编译AndroidLinux内核 50 2.5 运行模拟器 52 2.5.1 Linux环境下运行模拟器的方法 53 2.5.2 模拟器辅助工具——adb 54 第3章 驱动需要移植 57 3.1 驱动开发需要做的工作 57 3.2 Android移植 59 3.2.1 移植的任务 60 3.2.2 移植的内容 60 3.2.3 驱动开发的任务 61 3.3 AndroidLinux的改造 61 3.3.1 AndroidLinux内核文件的改动 62 3.3.2 为Android构建 Linux的操作系统 63 3.4 内核空间和用户空间接口是一个媒介 64 3.4.1 内核空间和用户空间的相互作用 64 3.4.2 系统和硬件之间的交互 64 3.4.3 使用relay实现内核到用户空间的数据传输 66 3.5 三类驱动程序 70 3.5.1 字符设备驱动程序 70 3.5.2 块设备驱动程序 79 3.5.3 网络设备驱动程序 82 第4章 hal层深入分析 84 4.1 认识hal层 84 4.1.1 hal层的发展 84 4.1.2 过去和现在的区别 86 4.2 分析hal层源代码 86 4.2.1 分析hal moudle 86 4.2.2 分析mokoid工程 89 4.3 总结hal层的使用方法 98 4.4 传感器在hal层的表现 101 4.4.1 hal层的sensor代码 102 4.4.2 总结sensor编程的流程 104 4.4.3 分析sensor源代码看Android api 与硬件平台的衔接 104 4.5 移植总结 116 4.5.1 移植各个Android部件的方式 116 4.5.2 移植技巧之一——不得不说的辅助工作 117 第5章 goldfish下的驱动解析 125 5.1 staging驱动 125 5.1.1 staging驱动概述 125 5.1.2 binder驱动程序 126 5.1.3 logger驱动程序 135 5.1.4 lowmemorykiller组件 136 5.1.5 timed output驱动程序 137 5.1.6 timed gpio驱动程序 139 5.1.7 ram console驱动程序 139 5.2 wakelock和early_suspend 140 5.2.1 wakelock和early_suspend的原理 140 5.2.2 Android休眠 141 5.2.3 Android唤醒 144 5.3 ashmem驱动程序 145 5.4 pmem驱动程序 148 5.5 alarm驱动程序 149 5.5.1 alarm简析 149 5.5.2 alarm驱动程序的实现 150 5.6 usb gadget驱动程序151 5.7 Android paranoid驱动程序153 5.8 goldfish设备驱动154 5.8.1 framebuffer驱动155 5.8.2 键盘驱动159 5.8.3 实时时钟驱动程序160 5.8.4 tty终端驱动程序161 5.8.5 nandflash驱动程序162 5.8.6 mmc驱动程序162 5.8.7 电池驱动程序162 第6章 msm内核和驱动解析164 6.1 msm基础164 6.1.1 常见msm处理器产品164 6.1.2 snapdragon内核介绍165 6.2 移植msm内核简介166 6.3 移植msm168 6.3.1 makefile文件168 6.3.2 驱动和组件170 6.3.3 设备驱动172 6.3.4 高通特有的组件174 第7章 omap内核和驱动解析177 7.1 omap基础177 7.1.1 omap简析177 7.1.2 常见omap处理器产品177 7.1.3 开发平台178 7.2 omap内核178 7.3 移植omap体系结构180 7.3.1 移植omap平台180 7.3.2 移植omap处理器183 7.4 移植Android专用驱动和组件188 7.5 omap的设备驱动190 第8章 显示系统驱动应用195 8.1 显示系统介绍195 8.1.1 Android的版本195 8.1.2 不同版本的显示系统195 8.2 移植和调试前的准备196 8.2.1 framebuffer驱动程序196 8.2.2 硬件抽象层198 8.3 实现显示系统的驱动程序210 8.3.1 goldfish中的framebuffer驱动程序210 8.3.2 使用gralloc模块的驱动程序214 8.4 msm高通处理器中的显示驱动实现224 8.4.1 msm中的framebuffer驱动程序225 8.4.2 msm中的gralloc驱动程序227 8.5 omap处理器中的显示驱动实现235 第9章 输入系统驱动应用239 9.1 输入系统介绍239 9.1.1 Android输入系统结构元素介绍239 9.1.2 移植Android输入系统时的工作240 9.2 input输入驱动241 9.3 模拟器的输入驱动256 9.4 msm高通处理器中的输入驱动实现257 9.4.1 触摸屏驱动257 9.4.2 按键和轨迹球驱动264 9.5 omap处理器平台中的输入驱动实现266 9.5.1 触摸屏驱动267 9.5.2 键盘驱动267 第10章 振动器系统驱动269 10.1 振动器系统结构269 10.1.1 硬件抽象层271 10.1.2 jni框架部分272 10.2 开始移植273 10.2.1 移植振动器驱动程序273 10.2.2 实现硬件抽象层274 10.3 在msm平台实现振动器驱动275 第11章 音频系统驱动279 11.1 音频系统结构279 11.2 分析音频系统的层次280 11.2.1 层次说明280 11.2.2 media库中的audio框架281 11.2.3 本地代码284 11.2.4 jni代码288 11.2.5 java代码289 11.3 移植audio系统的必备技术289 11.3.1 移植audio系统所要做的工作289 11.3.2 分析硬件抽象层290 11.3.3 分析audioflinger中的audio硬件抽象层的实现291 11.4 真正实现audio硬件抽象层298 11.5 msm平台实现audio驱动系统298 11.5.1 实现audio驱动程序298 11.5.2 实现硬件抽象层299 11.6 oss平台实现audio驱动系统304 11.6.1 oss驱动程序介绍304 11.6.2 mixer305 11.7 alsa平台实现audio系统312 11.7.1 注册音频设备和音频驱动312 11.7.2 在Android中使用alsa声卡313 11.7.3 在omap平台移植Android的alsa声卡驱动322 第12章 视频输出系统驱动326 12.1 视频输出系统结构326 12.2 需要移植的部分328 12.3 分析硬件抽象层328 12.3.1 overlay系统硬件抽象层的接口328 12.3.2 实现overlay系统的硬件抽象层331 12.3.3 实现接口332 12.4 实现overlay硬件抽象层333 12.5 在omap平台实现overlay系统335 12.5.1 实现输出视频驱动程序335 12.5.2 实现overlay硬件抽象层337 12.6 系统层调用overlay hal的架构342 12.6.1 调用overlay hal的架构的流程342 12.6.2 s3c6410 Android overlay的测试代码346 第13章 openmax多媒体框架349 13.1 openmax基本层次结构349 13.2 分析openmax框架构成350 13.2.1 openmax总体层次结构350 13.2.2 openmax il层的结构351 13.2.3 Android中的openmax354 13.3 实现openmax il层接口354 13.3.1 openmax il层的接口354 13.3.2 在openmax il层中需要做什么361 13.3.3 研究Android中的openmax适配层361 13.4 在omap平台实现openmax il363 13.4.1 实现文件364 13.4.2 分析ti openmax il的核心365 13.4.3 实现ti openmax il组件实例368 第14章 多媒体插件框架373 14.1 Android多媒体插件373 14.2 需要移植的内容374 14.3 opencore引擎375 14.3.1 opencore层次结构375 14.3.2 opencore代码结构376 14.3.3 opencore编译结构377 14.3.4 opencore oscl381 14.3.5 实现opencore中的openmax部分383 14.3.6 opencore的扩展398 14.4 stagefright引擎404 14.4.1 stagefright代码结构404 14.4.2 stagefright实现openmax接口405 14.4.3 video buffer传输流程409 第15章 传感器系统415 15.1 传感器系统的结构415 15.2 需要移植的内容417 15.2.1 移植驱动程序417 15.2.2 移植硬件抽象层418 15.2.3 实现上层部分419 15.3 在模拟器中实现传感器424 第16章 照相机系统430 16.1 camera系统的结构430 16.2 需要移植的内容433 16.3 移植和调试433 16.3.1 v4l2驱动程序433 16.3.2 硬件抽象层441 16.4 实现camera系统的硬件抽象层446 16.4.1 java程序部分446 16.4.2 camera的java本地调用部分447 16.4.3 camera的本地库libui.so448 16.4.4 camera服务libcameraservice.so449 16.5 msm平台实现camera系统454 16.6 omap平台实现camera系统457 第17章 wi-fi系统、蓝牙系统和gps系统459 17.1 wi-fi系统459 17.1.1 wi-fi系统的结构459 17.1.2 需要移植的内容461 17.1.3 移植和调试461 17.1.4 omap平台实现wi-fi469 17.1.5 配置wi-fi的流程471 17.1.6 具体演练——在Android下实现ethernet473 17.2 蓝牙系统475 17.2.1 蓝牙系统的结构475 17.2.2 需要移植的内容477 17.2.3 具体移植478 17.2.4 msm平台的蓝牙驱动480 17.3 定位系统482 17.3.1 定位系统的结构483 17.3.2 需要移植的内容484 17.3.3 移植和调试484 第18章 电话系统498 18.1 电话系统基础498 18.1.1 电话系统简介498 18.1.2 电话系统结构500 18.2 需要移植的内容501 18.3 移植和调试502 18.3.1 驱动程序502 18.3.2 ril接口504 18.4 电话系统实现流程分析507 18.4.1 初始启动流程507 18.4.2 request流程509 18.4.3 response流程512 第19章 其他系统514 19.1 alarm警报器系统514 19.1.1 alarm系统的结构514 19.1.2 需要移植的内容515 19.1.3 移植和调试516 19.1.4 模拟器环境的具体实现518 19.1.5 msm平台实现alarm518 19.2 lights光系统519 19.2.1 lights光系统的结构520 19.2.2 需要移植的内容521 19.2.3 移植和调试521 19.2.4 msm平台实现光系统523 19.3 battery电池系统524 19.3.1 battery系统的结构524 19.3.2 需要移植的内容526 19.3.3 移植和调试526 19.3.4 在模拟器中实现电池系统529
### 回答1: Android是一种广泛使用的移动操作系统,其开发涉及到多个层次,其中底层驱动的开发是其中重要的一环。底层驱动开发是指为Android设备上的硬件提供驱动程序的开发过程。驱动程序是操作系统与硬件之间的桥梁,它们负责管理和控制硬件设备的工作。 在Android底层驱动开发的过程中,首先需要了解设备的硬件结构和规格,以及相应的硬件接口和协议。根据硬件设备的不同,可能包括显示器、触摸屏、摄像头、声卡等各种设备。开发者需要研究硬件设备的工作原理和特性,以便编写相应的驱动程序。 其次,开发者需要熟悉Android底层的相关开发工具和API,如HAL(硬件抽象层)、Binder IPC(进程间通信)等,以便与操作系统和应用程序进行交互。底层驱动的开发还需要理解Linux内核的相关知识,因为Android是基于Linux内核开发的。 在实际的驱动开发过程中,开发者需要根据硬件设备的特性和要求,编写对应的设备驱动程序。这些驱动程序通常使用C或C++语言编写,并需要遵循一定的编程规范和命名规则。开发者需要确保驱动程序的正确性和稳定性,以及与操作系统的兼容性。 总之,Android底层驱动开发是一项复杂且技术要求较高的工作。它需要开发者具备扎实的硬件和软件知识,以及良好的编程能力。只有通过深入研究和实践,才能开发出高质量的驱动程序,为Android设备的稳定运行做出贡献。 ### 回答2: Android 底层驱动开发是指在 Android 操作系统中编写和调试设备驱动程序的过程。设备驱动程序是连接硬件和操作系统之间的桥梁,能使操作系统识别和与硬件进行通信。对于 Android 应用程序开发人员来说,了解底层驱动开发至关重要,因为它可以帮助他们更好地理解系统的工作原理,并在需要时进行定制和优化。 编写 Android 底层驱动程序需要掌握 C/C++ 编程语言、Linux 内核知识和硬件架构相关概念。在开发过程中,需要了解设备的硬件接口和规范,包括寄存器配置、中断处理、数据传输等。通过编写驱动程序,开发人员可以为设备提供访问系统资源的接口,并处理各种硬件事件和数据传输。 开发 Android 底层驱动程序的主要步骤包括以下几个方面: 1. 硬件初始化:配置设备的寄存器、中断等硬件资源,并注册到操作系统中。这包括初始化 I/O 端口、设备中断控制器、时钟和 DMA 控制器等。 2. 中断处理:在中断发生时,驱动程序需要对中断进行处理。处理中断的程序需要根据中断的类型和来源来执行相应的操作。例如,处理数据接收中断、数据发送中断等。 3. 数据传输:驱动程序需要实现对设备的数据传输功能。这包括读取和写入设备的数据。数据传输可以使用 DMA、中断或轮询方式进行。 4. 设备控制:驱动程序需要实现对设备的控制功能。这包括设置设备的工作模式、参数调整和状态查询等。通过提供合适的接口,应用程序可以通过系统调用来与设备进行交互和控制。 5. 调试和优化:在驱动程序开发的过程中,需要使用调试工具进行问题排查和性能优化。这包括使用 printk() 输出调试信息、使用 gdb 进行调试和性能剖析等。 总之,Android 底层驱动开发涉及到多个技术领域和专业知识,需要开发人员具备扎实的编程基础和理解操作系统和硬件的能力。掌握底层驱动开发可以帮助开发人员更好地理解系统的工作原理,并在需求变化时进行相应的定制和优化。 ### 回答3: Android是目前最流行的移动操作系统之一,其特点是开放源代码、可定制性强以及适应性广泛。在Android系统中,底层驱动的开发是非常重要的一部分,它涉及到硬件和操作系统之间的交互。 Android底层驱动开发PDF主要介绍了Android系统中的底层驱动开发相关知识和技术。这些知识和技术包括硬件抽象层(HAL)、内核驱动开发、设备树(Device Tree)、引导加载程序(Bootloader)等。 首先,硬件抽象层(HAL)是Android系统的一个重要组成部分,用于提供硬件与操作系统之间的接口。通过HAL,Android系统可以与各种硬件设备进行通信和交互。PDF中会介绍如何编写和调试HAL,以及如何实现硬件的适配和兼容性。 其次,内核驱动开发是Android底层驱动开发的核心之一。PDF中将详细介绍如何编写设备驱动程序,如独立设备驱动和平台设备驱动。此外,还会涉及到设备树(Device Tree)的使用,设备树用于描述硬件设备的信息和属性。 另外,引导加载程序(Bootloader)也是Android底层驱动开发的重要环节之一。PDF中会介绍如何编写和调试引导加载程序,以及如何通过引导加载程序来引导Android系统。 总之,Android底层驱动开发PDF会全面介绍Android系统中的底层驱动开发相关知识和技术,包括HAL、内核驱动开发、设备树、引导加载程序等。对于想要深入了解Android系统底层开发的开发者来说,这本PDF是一本非常有价值的参考书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值