【Android源码 栏目提醒】:本文主要为网学会员提供“Android嵌入式系统软件开发【PPT-精品】 - 综合课件”,希望对需要Android嵌入式系统软件开发【PPT-精品】 - 综合课件网友有所帮助,学习一下!
Android嵌入式系统软件开发
Android Embedded System Software Development 周 庆 国 (zhouqglzu.edu.cn) 兰 州 大 学 1 5.1 framebuffer驱动 5.2键盘驱动第五章
Android 5.3音频驱动设备驱动 5.4蓝牙驱动 5.5 wlan驱动 25.1 Framebuffer驱动 Framebuffer驱动是标准的显示设备的驱动 Framebuffer驱动是一个字符设备,这个驱动在文件系统 中的设备节点通常是:/dev/fbX 每个系统可以有多个显 示设备,使用/dev/fb0、/dev/fb1等来表示主设备号为29, 次设备号递增增长由每个Framebuffer程序的注册顺序决 定 Framebuffer驱动在用户空间大多使用ioctl、mmap等文件 系统的接口进行操作,ioctl用于获得和设置信息,mmap 可以将Framebuffer的内存映射到用户空间。
Framebuffer驱动也可以直接支持write操作,直接用写的 方式输出显示内容。
Framebuffer驱动的主要头文件:include/linux/fb.h Framebuffer驱动核心实现:drivers/video/fbmem.c Framebuffer驱动中核心的数据接口是fb_info 3Framebuffer驱动 Framebuffer驱动需要定义一个实现fb_info结构、实现 fb_ops中的各个函数指针。
在配置Linux系统时,Framebuffer驱动的配置选项是: Device DriversGraphics support 其配置文件为:drivers/video/Kconfig,其中也包含了 文本模式和控制台、启动图标bootup Logo等子选项支 持,具体的Framebuffer驱动由每一个平台支持 Framebuffer驱动是
android中的标准设备,但是路径稍有 不同/dev/graphic/fb0,
android对Framebuffer驱动的使 用方式是标准的,在
android的GUI系统中,通过调用 Framebuffer驱动的标准接口,实现显示设备的抽象。
Framebuffer设备节点由init进程自动创建,被libui库调 用。
4FrameBuffer SurfaceFlinger是一个服务,主要是负责 合成各窗口的Surface,通过OpenGLES显示 到FrameBuffer上。
DisplayHardware是对显示设备的抽象,包 括FrameBuffer和Overlay。
它加载 FrameBuffer和Overlay插件,并初始化 OpenGLES。
5FrameBuffer FramebufferNativeWindow 是framebuffer 的抽象,它负责加载libgralloc,并打开 framebuffer设备。
FramebufferNativeWindow并不直接使用 framebuffer,而是自己创建了两个Buffer: queueBuffer负责显示一个Buffer到屏幕上,它 调用fb-post去显示。
dequeueBuffer获取一个空闲的Buffer,用来在 后台绘制。
这两个函数由eglSwapBuffers调过来,调 到 6FrameBufferegl_window_surface_v2_t::swapBuffers: nativeWindow-queueBuffernativeWindow buffer nativeWindow-dequeueBuffernativeWindow buffer msm7k/liboverlay是Overlay的实现,与其它 平台不同的是,高通平台上的Overlay并不是 提供一个framebuffer设备,而通过fb0的 ioctl来实现的,ioctl分为两类操作: OverlayControlChannel用于设置参数,比如 设置Overlay的位置,宽度和高度。
7FrameBuffer OverlayDataChannel用于显示Overlay,其中最重要的函数就是 queueBuffer msm7k/libgralloc 是显示缓存的抽象,包括framebuffer和普 通Surface的Buffer。
framebuffer只是/dev/graphic/fb0的包装,Surface的Buffer 则是对/dev/pmem、ashmem和GPU内存msm_hw3dm的包装,它的 目标主要是方便硬件加速,因为 DMA传输使用物理地址,要求 内存在物理地址上连续。
msm7k/libcopybit这是2D加速库,主要负责Surface的拉伸、旋 转和合成等操作。
它有两种实现方式: copybit.cpp: 基于fb0的ioctlMSMFB_BLIT的实现。
copybit_c2d.cpp: 基于kgsl的实现。
pmem misc/pmem.c: 对物理内存的管理,算法和用户空间的接口。
board-msm7x27.c定义了物理内存的缺省大小。
8FrameBuffer msm_msm7x2x_allocate_memory_regions分配几大块内 存用于给pmem做二次分配。
KGSL 3D图形加速驱动程序,源代码drivers/gpu/msm目录下, 是对GPU的包装,给OpenGLES 2.0提供抽象的接口。
msm_fb msm_fb.c: framebuffer overlay和blit的用户接口。
mdp_dma.c: 对具体显示设备的包装,提供两种 framebuffer更新的方式: mdp_refresh_screen: 定时更新。
mdp_dma_pan_update: 通过pan display主动更新。
mdp_dma_lcdc.c:针对LCD实现的显示设备, mdp_lcdc_update用更新framebuffer。
95.2 键盘驱动
Android基本键盘驱动采用了Linux的input和event 机制,内核中通过platform机制将按键信息注册进 系统 键盘驱动通过input_register_device调用,注册 成标准输入设备/dev/input/event0 驱动上报按键值要和
Android里面的 /system/usr/keylayout/.kl文件里面键值表的一 致 按键信息:事件类型事件码事件值(键值) 事件类型:表示键盘或touch或其他输入设备; 事件码 :表明是键盘上什么键被操作; 事件值 :表明这项操作是按下还是松开; 10键盘 按键结构体中特别重要的是code变量中的数据,
android通过event机制可以获取这个数据。
在
android系统中,获取到键盘的键值后,会搜索 /system/usr/keylayout/gpio-keys.kl这个文件 key 158 BACK WAKE_DROPPED key 139 MENU WAKE_DROPPED key 102 HOME WAKE key 116 ENDCALL WAKE_DROPPED key 99 ROTATOR 如果code与其中的键值相对应,
android就会响应 对应的按键信息。
至于
android如何建立gpio-key.kl这个文件,以及 获取到键值后的处理,感兴趣的可以自行研究。
115.3 音频驱动 12音频 1Audio的Java部分代码路径: frameworks/base/media/java/
android/media 与audio相关的java package是
android.media,主 要包含audio manager和audio系统的几个类,这部 分主要给上层的AP部分提供audio相关的接口 2Audio的JNI部分代码路径: frameworks/base/core/jni
Android系统会生成一个libandroid_runtime.so, audio的JNI是其中的一个部分。
13音频 3audio frameworks头文件路径: frameworks/base/include/media/代码路径: frameworks/base/media/libmedia/ Audio本地框架是media库的一部分,本部 分的内容被编译成库libmedia.so,提供 audio部分的接口其中包括基于binder的 IPC机制。
14音频 4Audio Flinger代码路径: frameworks/base/libs/audioflinger 这部分内容被编译成库libaudioflinger.so, 它是audio系统的本地服务部分 5HAL头文件路径: hardware/libhardware_legacy/include/hard ware Audio硬件抽象层的实现在各个系统中可能不 同,需要使用代码继承相应的类并实现他们, 作为
android系统本地框架和驱动程序的接口 15音频 6ALAS lib代码路径:external/alsa-lib 在HAL中通过继承
android提供的基本类, 并实现类中函数,但是并不是直接操作 linux kernel driver,而是通过alsa lib 提供的API,而alsa lib中接口会使用系统 调用的接口open ioctl write read etc.实现与driver的对接。
16音频 7audio driver系统相关代码: sound/soc/s3c24xx/smdks5p_rt5625.c声卡驱动核心:sound/soc/soc-core.cCodec驱动代码:sound/soc/codecs/rt5625.c 系统相关代码是和s5pc100平台相关的codec一 些配置和资源的定义,声卡驱动核心主要是根 据linux kernel已经成熟的driver体系架构来 注册驱动统一管理声卡相关组件的驱动, codec驱动代码是和具体使用 audio codec芯 片的驱动部分代码。
17 音频 Audio管理 Audio输出 Audio输入Java层
Android.media.
Android.media.
Android.media. andioSystem audioTrack audioRecorder本地框架层 audioSystem audioTrack audioRecorderAudio Flinger IaudioFlinger IAudioTrack IaudioRecorderHAL AudioHardwareInterf AudioStreamOut AudioStreamIn ace 185.4 蓝牙驱动 19 蓝牙 在linux中,蓝牙设备驱动是网络设备,使用网络接口。
蓝牙设备的网络协议,所定义的协议族为: AF_BLUETOOTH 31 蓝牙协议部分头文件: include/net/bluetooth/hci_core.h include/net/bluetooth/bluetooth.h 蓝牙协议源代码文件: net/bluetooth/ 蓝牙系统的协议和驱动程序在内核进行menuconfig配 置时,配置选项为:networking support bluetooth subsystem support bluetooth device drivers 20
上一篇:
推荐几本android学习书籍
下一篇:
7*30m公路预应力混凝土连续梁桥上部结构设计