【Android源码 栏目提醒】:本文主要为网学会员提供“Android系统原理与开发要点详解 韩超 03_Android的Linux内核与驱动程序 - 讲义教程”,希望对需要Android系统原理与开发要点详解 韩超 03_Android的Linux内核与驱动程序 - 讲义教程网友有所帮助,学习一下!
第一部分 Linux核心与驱动第二部分
Android专用驱动 第三部分
Android使用的设备驱动
Android使用标准的Linux2.6内核作为其操作系统。
Android 1.0 release-1.0 使用Linux2.6.25
Android 1.5 sdk-1.5_r1 使用Linux2.6.27
Android 1.6 sdk-1.6_r1_ 使用Linux2.6.29 获取通用内核的代码 git clone git://
android.git.kernel.org/kernel/common.gitkernel/common.git为通用Kernel的工程名称。
Android1.5之前的版本具有kernel目录其中也是参考的kernel。
Android Linux内核的配置和编译 make ARCHarm goldfish_defconfig .config make ARCHarm CROSS_COMPILEpath/arm-none-linux-gnueabi-
Android通用的Kernel使用的处理器为goldfish这是一种ARM处理器。
这个Linux编译生成的结果在
Android的模拟器中使用。
Goldfish处理器的编译结果vmlinux为内核的ELF文件zImage为内核的压缩映像文件。
LD vmlinux SYSMAP System.map SYSMAP .tmp_System.map OBJCOPY arch/arm/boot/Image Kernel: arch/arm/boot/Image is ready AS arch/arm/boot/compressed/head.o GZIP arch/arm/boot/compressed/piggy.gz AS arch/arm/boot/compressed/piggy.o CC arch/arm/boot/compressed/misc.o LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready vmlinux和zImage分别对应
Android代码prebuilt中的预编译的arm内核。
Android模拟器使用的处理器的goldfish的配置文件为 arch/arm/mach-goldfish System TypeCONFIG_ARCH_GOLDFISHy AndroidCONFIG_ANDROIDyCONFIG_
ANDROID_BINDER_IPCyCONFIG_
ANDROID_LOGGERy CONFIG_
ANDROID_RAM_CONSOLE is not setCONFIG_
ANDROID_TIMED_OUTPUTyCONFIG_
ANDROID_LOW_MEMORY_KILLERy Networking optionsCONFIG_
ANDROID_PARANOID_NETWORKy UBI - Unsorted block imagesCONFIG_
ANDROID_PMEMy goldfish是一种ARM处理器其核心内容的路径为arch/arm/mach-goldfish
Android还需要在标准的Linux内核中需要增加必要的驱动用于对系统用户程序的支持。
在
android中的驱动主要分成两种类型
Android专用驱动
Android使用的设备驱动 2.1 Ashmem2.2 binder2.3 logger Ashmem 匿名共享内存驱动Logger 轻量级的log驱动Binder驱动 Binder Driver 基于OpenBinder驱动为
Android平台提供IPC的支持能源管理
Android Power Management 轻量级的能源管理基于Linux的能源管理为嵌入式系统做了优化
Android Power ManagementPM 定时器驱动用于唤醒设备Low Memory Killer 在缺少内存的情况下杀死进程
Android PMEM 物理内存驱动
Android的Ashmem的含义为Anonymous Shared Memory 匿名共享内存通过内核的机制为用户空间程序提供分配内存的机制。
Ashmem设备节点名称/dev/ashmem 主设备号为10Misc Driver 次设备号动态生成 Ashmem的代码路径kernel/include/linux/ashmem.hkernel/mm/ashmem.c 在用户空间C libutil库对Asheme封装并提供接口system/core/include/cutils/ashmem.hsystem/core/libcutils/ashmem-dev.csystem/core/libcutils/ashmem-host.c
Android的Binder驱动程序为用户层程序提供了IPC进程间通信的支持
Android整个系统的运行依赖Binder驱动 Binder设备节点名称/dev/binder 主设备号为10Misc Driver 次设备号动态生成 binder的代码路径kernel/include/linux/binder.hkernel/drivers/misc/binder.c 在用户空间libutil工具库和Service Manager守护进程调用Binder接口提供对整个系统的支持frameworks/base/cmds/servicemanager/frameworks/base/include/utils/frameworks/base/libs/utils/
Android的Logger驱动程序为用户层程序提供Log的支持这个驱动作为一个工具来使用。
Logger有三个设备节点/dev/log/main/dev/log/event/dev/log/radio 主设备号为10Misc Driver 次设备号动态生成 Logger驱动的代码路径kernel/include/linux/logger.hkernel/drivers/misc/logger.c 在用户空间logcat程序调用Logger驱动system/core/logcat/ 3.1 framebuffer驱动3.2 Event输入设备驱动3.3 v4l2摄像头视频驱动3.4 OSS音频驱动3.5 ALSA音频驱动3.6 MTD驱动3.7 蓝牙驱动3.8 Wlan驱动 显示驱动使用framebuffer驱动。
framebuffer驱动的设备节点/dev/fb0/dev/graphics/fb0 主设备号为29次设备号递增生成。
代码路径include/linux/fb.hdrivers/video/fbmem.c 显示硬件LCD硬件字符设备驱动程序核心具体Framebuffer驱动实现struct fb_info注册调用注册调用硬件操作/dev/fbX设备号29X文件接口调用ioctl/mmap/write用户空间硬件层内核空间register_framebufferFramebuffer驱动核心fbmem.c 输入设备的驱动通常使用Input设备中的Event设备。
Event的字符设备的设备节点/dev/input/eventX 主设备号为13设备节点为64-95Input驱动程序的头文件include/linux/input.h代码路径drivers/input/input.c核心代码drivers/input/evdev.cEvent部分的实现。
鼠标、键盘、触摸屏等硬件字符设备驱动程序核心具体Event驱动实现struct input_dev注册调用注册调用硬件操作/dev/input/eventXEvent设备号1364文件接口调用ioctl/poll/read用户空间硬件层内核空间input_register_deviceEventedev.c鼠标mousedev.c游戏杆joydev.cInput驱动核心input.c 摄像头Camera视频驱动驱动通常使用Video For Linux。
v4l2驱动的设备节点/dev/video/videoX 主设备号为81次设备号0-63。
v4l2驱动主要头文件路径include/linux/videodev.hv4l第一版的头文件include/linux/videodev2.h定义主要的数据接口和常量include/media/v4l2-dev.h设备头文件具体设备使用其中的接口注册v4l2驱动核心实现路径driver/media/video/v4l2-dev.c 摄像头字符设备驱动程序核心具体V4L2驱动实现struct video_device注册调用注册调用硬件操作/dev/videoV4L2设备号81X文件接口调用ioctl/mmap用户空间硬件层内核空间video_register_deviceV4L2驱动核心v4l2-dev.c视频输出设备 OSSOpen Sound System开放声音系统。
OSS驱动的设备节点/dev/mixer/dev/sndstat/dev/dsp OSS主设备号为14次设备号为各个设备。
OSS驱动程序的主要头文件include/linux/soundcard.hOSS驱动的主要头文件include/linux/sound.h定义OSS驱动的次设备号和注册函数OSS驱动程序的核心sound/sound_core.c 音频设备字符设备驱动程序核心具体OSS驱动实现各个设备的struct file_operations注册调用注册调用硬件操作OSS设备号14X文件接口调用ioctl/read/write用户空间硬件层内核空间register_sound_mixerregister_sound_dspregister_sound_midiOSS驱动核心sound_core.c/dev/mixer/dev/XXX/dev/dsp ALSAAdvanced Linux Sound Architecture高级Linux声音体系。
ALSA驱动的设备节点/dev/snd/controlCX/dev/snd/pcmXXXc /dev/snd/pcmXXXp/dev/snd/seq/dev/snd/timer 主设备号为116次设备号为各个设备。
ALSA驱动程序的头文件include/sound/asound.hALSA驱动的主要头文件include/sound/core.hALSA驱动核心数据结构和具体驱动的注册函数ALSA驱动程序的核心实现sound/core/sound.c 音频设备字符设备驱动程序具体ALSA驱动实现数据设备和控制设备的结构注册调用注册调用硬件操作ALSA设备号116X文件接口调用ioctl/read/write用户空间硬件层内核空间ALSA驱动核心core.c/dev/snd/controlCX/dev/snd/pcmXXXc/dev/snd/pcmXXXpALSA 库ALSA 工具ALSA用户空间接口控制设备control.c数据设备pcm.csnd_pcm_new和snd_ctl_add等接口 Flash驱动通常使用MTDmemory technology device内存技术设备。
MTD的字符设备/dev/mtdX 主设备号为90。
MTD的块设备/dev/block/mtdblockX 主设备号为13。
MTD驱动程序头文件路径include/linux/mtd/mtd.hMTD源代码路径drivers/mtd/mtdcore.cMTD核心定义MTD原始设备drivers/mtd/mtdchar.cMTD字符设备drivers/mtd/mtdblock.cMTD块设备 Nor Flash 或者 Nand FlashMTD原始设备mtdcore.cMTD字符设备号90X硬件层MTD字符设备mtdchar.cMTD块设备mtdblock.cFlash驱动程序实现struct mtd_info注册调用MTD块设备号31X/dev/mtdX/dev/block/mtdblockX文件系统add_mtd_device 在Linux中蓝牙设备驱动是网络设备使用网络接口。
蓝牙设备的网络协议协议族AF_BLUETOOTH 31蓝牙协议部分头文件include/net/bluetooth/hci_core.hinclude/net/bluetooth/bluetooth.h蓝牙协议源代码文件net/bluetooth/蓝牙驱动程序部分的文件drivers/bluetooth/ 蓝牙的驱动程序一般都通过标准的HCI控制实现。
但根据硬件接口和初始化流程的不同又存在一些差别。
这类初始化动作一般是一些晶振频率波特率等基础设置。
比如CSR的芯片一般通过BCSP协议完成最初的初始化配置再激活标准HCI控制流程。
对Linux来说一旦bluez可以使用HCI与芯片建立起通信一般是hciattach hciconfig便可以利用其上的标准协议SCO L2CAP等与蓝牙通信使其正常工作了。
在Linux中Wlan设备驱动是网络设备使用网络接口。
Wlan在用户空间使用标准的socket接口进行控制。
WIFI协议部分头文件include/net/wireless.hWIFI协议部分源文件net/wireless/WIFI驱动程序部分drivers/net/wireless/