ramdisk下基本就是android 根目录的内容,例如init,init.rc等等。所以,如果你在模拟器上改了这些文件,重启机器后也没有用。因为这个根目录是解压ramdisk后得到的,而原始的ramdisk并不会得到修改。所以,如果你要修改根目录下的内容,那只能重新制作ramdisk了。方法就是上面讲的,非常非常简单。【请阅读《Embed Liux Primer》一书】
三 Android goldFish输入设备
3.1 /dev/input/event0的来历
说实话,我刚开始唯一知道的就是FWK中读取输入事件的是在EventHub的getEvents中,里边将打开/dev/input/event0设备。从此往上溯源。event0这个设备按道理应该是通过ueventd这种方式自动生成的。系统里边倒是有一个ueventd,在sbin下,可惜这是一个链接,由指向了/system下的init。init可以处理ueventd事件?我印象中2.2好像没这么搞。那有可能是之后的版本了。
查看init的代码,果然里边有个if分支将走向ueventd_main,这里就是打开ueventd.xxx.rc文件。这个文件和我之前理解的不太一样。它就是根据配置文件建立/dev/下的设备文件,并设置权限。
根据Ueventd.c的代码,当收到kernel报上来的属于input设备的事件后,将在/dev/input下按uevent传入的path名建立一个文件。【这部分代码需要兄弟们好好看看,不难。但以后如果有需要修改的话,事先了解下流程也行】
3.2 是谁发出了输入的uevent事件呢?
这个..我还真是第一次接触相关代码,只能靠野蛮搜索了。
driver/input/input.c中的input_init函数建立了input输入系统的相关框架。 这个文件中定义了一个函数input_register_handler,用于注册输入事件处理handler。没办法,野蛮搜索cgrep input_register_handler。有较多地方会注册这个处理事件。但我重点关注evdev和keyboard的地方。用source insight打开这两个文件,加上一些printk输出。给个示例图:图1 野蛮搜索使用input_register_handler的地方。重点关注evdev和keyboard
在那两个文件中,加上一点输出。(kernel的一些基本API还是需要知道的吧?建议阅读linux driver develop的第三版。) goldfish也有一个通用的driver,叫driver/input/keyboard/goldfish_events.c,其中它会注册一个platform_driver。platform_driver方面有一些基本的API,大家上网查查就知道用法了。和嵌入式系统关系很大。这个driver中有一个events_probe函数,用来判断哪些device可以交给goldfish_event driver来处理。这个应该是goldfish专用的driver。它应该和上面介绍的input是两个不同的东西。(我目前认为:input是input系统的一些通用框架,而goldfish_events是一个driver,它将探测一些device,然后再将这些device注册到input框架中。应该是这样,暂时不细研究了)。 大家可看看此驱动的events_probe函数,它将探测到一个qwerty2设备,然后注册到input框架中。图示如下:图2 探测到一个设备,keymap为qwerty2,然后注册到input框架中
继续跟踪events_probe函数,里边有大量和input框架交互的地方。比较重要的一点就是为刚才那个qwerty2设备设置一些handler。从图1可知,两个重要的handler就是evdev和keyboard。
分别在这个两个文件中加一点输出。发现evdev中有个poll函数,而EventHub也会调用poll函数获取输入事件。从此可知,evdev这个handler将数据传递给EventHub。
3.3 小结
此趟目标还算是达到了,把输入事件的产生流程搞清楚了,这里简单总结如下:
goldfish_events注册一个platform_driver。当它探测到输入设备时候,就会往input系统中注册
kernel会往input设备中注册一些handler。一个设备可以有多个串行的handler
goldfish_events将设置一个输入事件中断函数events_interrupt,当有事件来时候,该函数会将信息投递给input框架处理(调用input_event函数)
input_event函数将调用各个handler处理之。对于goldfish来说,最重要的handler就是evdev,它把信息整理并上报给EventHub。
四 总结
本随笔的目标:
搭建一个虚拟设备环境,以及编译goldfish kernel并运行之。 简单理顺了BSP中input相关的流程。再次强调说明:这一系列的随笔是快速理顺Android BSP中各块驱动的流程。