来源:互联网 发布:用matlab实现遗传算法 编辑:程序博客网 时间:2024/04/30 12:13

Android驱动

(2012-11-02 16:11:13)
转载
标签:

android驱动

分类:Android

   Android内核的结构和标准的Linux内核基本相同,只是在其基础上增加了私有的内容。其主要增加了一些驱动程序:Android专用驱动和Android使用的设备驱动。

   Android对Linux内核的更改较少,但是增加了一些没有加入标准Linux内核的内容,如yaffs文件系统。

   一、Android专用驱动

   Android中有一些驱动程序提供辅助操作系统的功能,这些驱动程序不是Linux系统的标准驱动,它们一般并不操作实际的硬件,只是辅助系统的运行。主要的Android专用驱动如下:

   ·Ashmem:匿名共享内存驱动

   ·Logger:轻量级的log驱动

   ·Binder:基于OpenBinder系统的驱动,为Android平台提供IPC支持

    ·AndroidPower Management(PM):电源管理模块

    ·LowMemory Killer:在缺少内存的情况下,杀死进程

    ·AndroidPMEM:物理内存驱动

   ①Ashmem(Anonymous Shared Memory)

   通过这种内核机制,可以为用户空间程序提供分配内存的机制。Ashmem的设备节点名称是/dev/ashmem;其主设备号为10(MiscDriver),次设备号动态生成。在用户空间Clibutil库对Ashmem进行封装并提供接口。Ashmem为Android系统提供了内存分配功能,实现类似malloc的功能。

   ②Binder

   Binder驱动程序为用户层程序提供了IPC(进程间通信)支持,Android整个系统的运行都依赖Binder驱动。Binder的设备节点名称是/dev/binder;其设备号为10(MiscDriver),次设备号动态生成。在用户空间libutil工具库和ServiceManager守护进程中调用Binder接口以提供对整个系统的支持。Binder是Android中主要使用的IPC方式,通常只需要按照模版定义相关的累即可,不需要直接调用Binder驱动程序的设备节点。

   ③Logger

   Logger驱动程序为用户层程序提供log支持,这个驱动作为一个工具来使用。在用户空间中,Logger有3个设备节点:/dev/log/main、/der/log/event、/dev/log/radio。在Android的用户空间logcat程序调用Logger驱动。

   二、Android使用的设备驱动

   ①Framebuffer显示驱动

   在Linux中,Framebuffer驱动是标准的显示设备的驱动;对于PC系统,Framebuffer驱动是显卡的驱动;对于嵌入式系统的SOC处理器,Framebuffer通常作为其LCD控制器或者其它显示设备的驱动。Framebuffer驱动是一个字符设备,主设备号为29,次设备号递增生成(由每个Framebuffer程序的注册顺序决定);其设备节点通常是:/dev/fbX,当有多个显示设备时,使用/dev/fb0、/dev/fb1等来表示。Framebuffer驱动在用户空间大多使用ioctl、mmap等文件系统的接口进行操作,ioctl用于获得和设置信息,mmap可以将Framebuffer的内存映射到用户空间。Framebuffer驱动也可以直接支持write操作,即直接用写的方式输出显示内容。Framebuffer显示驱动的架构如下图:Android驱动
Android驱动

    ②Event输入设备驱动

   Input驱动程序是Linux输入设备的驱动程序,分成游戏杆(joystick)、鼠标(mouse和mice)和事件设备(Eventqueue)3种驱动程序。其中事件驱动程序是目前通用的驱动程序,可支持键盘、鼠标、触摸屏等多种输入设备。

   Input驱动程序的主设备号是13,3种驱动程序的设备号分配是:

   ·joystick游戏杆:0-61;

   ·mouse鼠标:33-62;

   ·mice鼠标:63;

   ·事件设备:64-95。

   实际上,每一种Input设备占用5位,因此每种设备个数是32个。

   Event设备在用户空间大多使用read、ioctl、poll等文件系统的接口进行操作,read用于读取输入信息,ioctl用于获得和设置信息,poll调用可以进行用户空间的阻塞,当内核有按键等中断时,通过在中断中唤醒poll的内核实现,这样在用户空间的poll调用也可以返回。

   Event设备在文件系统中的设备节点为:/dev/input/eventX。其架构图如下:

Android驱动   ③v4l2摄像头——视频驱动

   V4L的全称是Video4Linux(Video forLinux),是Linux内核中标准的关于视频的驱动程序。在Linux系统中,摄像头(Camera)——视频一般规范到了使用V4L2(V4L的版本2)驱动程序。其设备节点路径通常为:/dev/video/videoX。其主设备号为81,对于视频设备,其次设备号为0-63;对于Radio设备,其次设备号为64-127;对于Teletext设备,其次设备号为192-223;对于VBI(VerticalBlank Interrupt)设备,其次设备号为224-255.

   V4L2驱动的Video设备可以支持捕获和视频输出方式,通常使用其作为摄像头的驱动程序。Video设备在用户空间通过各种ioctl调用进行控制,并且可以使用mmap进行内存映射。其架构图如下:

Android驱动

Android驱动
Android驱动
Android驱动
Android驱动

   ④OSS音频驱动Android驱动

    OSS(OpenSoundSystem)是数字音频设备(有时也称codec、PCM、DSP、ADC/DAC设备),用于播放或录制数字化的声音,它的指标主要有:采样速率(电话为8K,DVD为96K)、channel数目(单声道、立体声)、采样分辨率(8bit、16bit)。

   OSS驱动是字符设备,其主设备号为14,次设备号由各个设备单独定义。OSS主要有以下几种设备文件:

   ·/dev/mixer:次设备号为0,访问声卡中内置的mixer,调整音量大小,选择音源;

   ·/dev/sndstat:次设备号为6,测试声卡,执行cat/dev/sndstat,会显示声卡驱动的信息;

   ·/dev/dsp(/dev/dspW、/dev/audio):次设备号为3,读此设备就相当于录音,写此设备就相当于放音。/dev/dsp和/dev/audio之间的区别在于采样的编码不同,/dev/audio使用μ律编码,/dev/dsp使用8位无符号数的线性编码,/dev/dspW使用16位有符号数的线性编码。/dev/audio主要实现了与SunOS的兼容;

   ·/dev/sequencer:次设备号为1,访问声卡内置的或者链接在MIDI端口的synthesizer(合成器)

   ·/dev/midiXX:次设备号为2、18、34,MIDI端口。

   在用户空间中,最常用的是使用/dev/mixer节点进行音量大小等控制,使用ioctl接口,/dev/dsp用于音频数据操作,write用于放音,read用于录音。其架构图如下:

Android驱动 
    ⑤ALSA音频驱动

   ALSA(Advanced Linux SoundArchitecture)是为音频系统提供驱动的Linux内核组件,以替代原先的OSS。ALSA是一个完全开放源代码的音频驱动程序集,除了像OSS那样提供一组内核驱动程序模块之外,ALSA还专门为简化应用程序编写提供相应的函数库,与OSS提供的基于ioctl等原始编程接口相比,ALSA函数库使用起来要更为方便一些。在用户空间中,ALSA驱动通常配合ALSA库来使用,ALSA库通过ioctl等接口调用ALSA驱动程序的设备节点。对于ALSA驱动的调用,通常调用的是用户空间的ALSA库的接口,而不是直接调用ALSA驱动程序。其架构图如下:

Android驱动   ⑥MTD驱动

   MTD(Memory TechnologyDevice)通常用于Linux中Flash驱动程序。MTD设备包括字符设备和块设备。

   ·MTD字符设备的设备节点:/dev/mtdX。主设备号为90,次设备号依次排列。

   ·MTD块设备的设备节点:/dev/block/mtdblockX。主设备号为13,次设备号依次排列。

   MTD驱动程序通常不在用户空间直接调用,而是用于构建文件系统,用户空间只需要使用文件系统即可,驱动程序的实现对用户空间是透明的。其架构图如下:

Android驱动   ⑦蓝牙驱动

   在Linux中,蓝牙设备驱动是网络设备,使用网络接口。蓝牙的驱动程序一般都通过标准的HCI控制实现,但根据硬件接口和初始化流程的不同,又存在一些差别。这类初始化动作一般是一些晶振频率、波特率等基础设置,比如CSR的芯片一般通过BCSP协议完成最初的初始化配置,再激活标准HCI控制流程。对Linux来说,一旦bluez可以使用HCI与芯片建立起通信(一般是hciattach+hciconfig),便可以利用其上的标准协议(SCO、L2CAP等)与蓝牙通信,使其正常工作。

    ⑧Wlan驱动

   在Linux中,Wlan设备驱动是网络设备,使用网络接口。Wlan在用户空间使用标准的socket接口进行控制。WiFi驱动程序在Android中一般编译成内核模块的方式,通过应用程序设置开关进行加载和卸载。同时,要使WiFi芯片正常工作,驱动中通常还需要实现烧写固件程序和一些初始化配置到WiFi芯片的逻辑。

原创粉丝点击