您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 手机开发培训 03_Android的Linux内核与驱动程序
Android的Linux内核与驱动程序Android的Linux内核与驱动程序第一部分Linux核心与驱动第二部分Android专用驱动第三部分Android使用的设备驱动第一部分Linux核心与驱动Android使用标准的Linux2.6内核,作为其操作系统。Android1.0(release-1.0)使用Linux2.6.25Android1.5(sdk-1.5_r1)使用Linux2.6.27Android1.6(sdk-1.6_r1)_使用Linux2.6.29第一部分Linux核心与驱动获取通用内核的代码:$gitclonegit://android.git.kernel.org/kernel/common.gitkernel/common.git为通用Kernel的工程名称。Android1.5之前的版本具有kernel目录,其中也是参考的kernel。第一部分Linux核心与驱动AndroidLinux内核的配置和编译:$makeARCH=armgoldfish_defconfig.config$makeARCH=armCROSS_COMPILE={path}/arm-none-linux-gnueabi-Android通用的Kernel使用的处理器为goldfish,这是一种ARM处理器。这个Linux编译生成的结果在Android的模拟器中使用。第一部分Linux核心与驱动Goldfish处理器的编译结果:vmlinux为内核的ELF文件,zImage为内核的压缩映像文件。LDvmlinuxSYSMAPSystem.mapSYSMAP.tmp_System.mapOBJCOPYarch/arm/boot/ImageKernel:arch/arm/boot/ImageisreadyASarch/arm/boot/compressed/head.oGZIParch/arm/boot/compressed/piggy.gzASarch/arm/boot/compressed/piggy.oCCarch/arm/boot/compressed/misc.oLDarch/arm/boot/compressed/vmlinuxOBJCOPYarch/arm/boot/zImageKernel:arch/arm/boot/zImageisreadyvmlinux和zImage分别对应Android代码prebuilt中的预编译的arm内核。第一部分Linux核心与驱动Android模拟器使用的处理器的goldfish的配置文件为:arch/arm/mach-goldfish##SystemType#CONFIG_ARCH_GOLDFISH=y##Android#CONFIG_ANDROID=yCONFIG_ANDROID_BINDER_IPC=yCONFIG_ANDROID_LOGGER=y#CONFIG_ANDROID_RAM_CONSOLEisnotsetCONFIG_ANDROID_TIMED_OUTPUT=yCONFIG_ANDROID_LOW_MEMORY_KILLER=y##Networkingoptions#CONFIG_ANDROID_PARANOID_NETWORK=y##UBI-Unsortedblockimages#CONFIG_ANDROID_PMEM=y第一部分Linux核心与驱动goldfish是一种ARM处理器,其核心内容的路径为:arch/arm/mach-goldfishAndroid还需要在标准的Linux内核中需要增加必要的驱动,用于对系统用户程序的支持。在android中的驱动主要分成两种类型:Android专用驱动Android使用的设备驱动第二部分Android专用驱动2.1Ashmem2.2binder2.3logger第二部分Android专用驱动Ashmem:匿名共享内存驱动Logger:轻量级的log驱动Binder驱动(BinderDriver):基于OpenBinder驱动,为Android平台提供IPC的支持能源管理(AndroidPowerManagement):轻量级的能源管理,基于Linux的能源管理,为嵌入式系统做了优化AndroidPowerManagement(PM):定时器驱动,用于唤醒设备LowMemoryKiller:在缺少内存的情况下,杀死进程AndroidPMEM:物理内存驱动Android的Ashmem的含义为:AnonymousSharedMemory匿名共享内存,通过内核的机制,为用户空间程序提供分配内存的机制。Ashmem设备节点名称:/dev/ashmem主设备号为10(MiscDriver)次设备号动态生成2.1Ashmem2.1AshmemAshmem的代码路径:kernel/include/linux/ashmem.hkernel/mm/ashmem.c在用户空间Clibutil库对Asheme封装并提供接口:system/core/include/cutils/ashmem.hsystem/core/libcutils/ashmem-dev.csystem/core/libcutils/ashmem-host.c2.1BinderAndroid的Binder驱动程序为用户层程序提供了IPC(进程间通信)的支持,Android整个系统的运行依赖Binder驱动Binder设备节点名称:/dev/binder主设备号为10(MiscDriver)次设备号动态生成2.1Ashmembinder的代码路径:kernel/include/linux/binder.hkernel/drivers/misc/binder.c在用户空间libutil工具库和ServiceManager守护进程调用Binder接口提供对整个系统的支持:frameworks/base/cmds/servicemanager/frameworks/base/include/utils/frameworks/base/libs/utils/2.1LoggerAndroid的Logger驱动程序为用户层程序提供Log的支持,这个驱动作为一个工具来使用。Logger有三个设备节点:/dev/log/main/dev/log/event/dev/log/radio主设备号为10(MiscDriver)次设备号动态生成2.1AshmemLogger驱动的代码路径:kernel/include/linux/logger.hkernel/drivers/misc/logger.c在用户空间logcat程序调用Logger驱动:system/core/logcat/第三部分Android使用的设备驱动3.1framebuffer驱动3.2Event输入设备驱动3.3v4l2摄像头-视频驱动3.4OSS音频驱动3.5ALSA音频驱动3.6MTD驱动3.7蓝牙驱动3.8Wlan驱动3.1framebuffe显示驱动显示驱动使用framebuffer驱动。framebuffer驱动的设备节点:/dev/fb0/dev/graphics/fb0主设备号为29,次设备号递增生成。代码路径:include/linux/fb.hdrivers/video/fbmem.c3.1framebuffe显示驱动显示硬件(LCD硬件)字符设备驱动程序核心具体Framebuffer驱动(实现structfb_info)注册调用注册调用硬件操作/dev/fbX设备号(29,X)文件接口调用(ioctl/mmap/write)用户空间硬件层内核空间register_framebufferFramebuffer驱动核心(fbmem.c)3.2Event输入设备驱动输入设备的驱动通常使用Input设备中的Event设备。Event的字符设备的设备节点:/dev/input/eventX主设备号为13,设备节点为64-95Input驱动程序的头文件:include/linux/input.h代码路径:drivers/input/input.c:核心代码drivers/input/evdev.c:Event部分的实现。3.2Event输入设备驱动鼠标、键盘、触摸屏等硬件字符设备驱动程序核心具体Event驱动(实现structinput_dev)注册调用注册调用硬件操作/dev/input/eventXEvent设备号(13,64+)文件接口调用(ioctl/poll/read)用户空间硬件层内核空间input_register_deviceEvent(edev.c)鼠标(mousedev.c)游戏杆(joydev.c)Input驱动核心(input.c)3.3v4l2摄像头-视频驱动摄像头(Camera)-视频驱动驱动通常使用VideoForLinux。v4l2驱动的设备节点:/dev/video/videoX主设备号为81,次设备号0-63。v4l2驱动主要头文件路径:include/linux/videodev.h:v4l第一版的头文件include/linux/videodev2.h:定义主要的数据接口和常量include/media/v4l2-dev.h:设备头文件,具体设备使用其中的接口注册v4l2驱动核心实现路径:driver/media/video/v4l2-dev.c3.3v4l2摄像头-视频驱动摄像头字符设备驱动程序核心具体V4L2驱动(实现structvideo_device)注册调用注册调用硬件操作/dev/videoV4L2设备号(81,X)文件接口调用(ioctl/mmap)用户空间硬件层内核空间video_register_deviceV4L2驱动核心(v4l2-dev.c)视频输出设备3.4OSS音频驱动OSS(OpenSoundSystem)开放声音系统。OSS驱动的设备节点:/dev/mixer/dev/sndstat/dev/dspOSS主设备号为14,次设备号为各个设备。OSS驱动程序的主要头文件:include/linux/soundcard.h:OSS驱动的主要头文件include/linux/sound.h:定义OSS驱动的次设备号和注册函数OSS驱动程序的核心:sound/sound_core.c3.4OSS音频驱动音频设备字符设备驱动程序核心具体OSS驱动(实现各个设备的structfile_operations)注册调用注册调用硬件操作OSS设备号(14,X)文件接口调用(ioctl/read/write)用户空间硬件层内核空间register_sound_mixerregister_sound_dspregister_sound_midiOSS驱动核心(sound_core.c)/dev/mixer/dev/XXX/dev/dsp3.5ALSA音频驱动ALSA(AdvancedLinuxSoundArchitecture)高级Linux声音体系。ALSA驱动的设备节点:/dev/snd/controlCX/dev/snd/pcmXXXc/dev/snd/pcmXXXp/dev/snd/seq/dev/snd/timer主设备号为116,次设备号为各个设备。ALSA驱动程序的头文件:include/sound/asound.h:ALSA驱动的主要头文件include/sound/core.h:ALSA驱动核心数据结构和具体驱动的注册函数ALSA驱动程序的核心实现:sound/core/sound.c3.5ALSA音频驱动音频设备字符设备驱动程序具体ALSA驱动(实现数据设备和控制设备的结构)注册调用注册调用硬件操作ALSA设备号(116,X)文件接口调用(ioctl/read/write)用户空间硬件层内核空间ALSA驱动核心(core.c)/dev/snd/controlCX/dev/snd/pcmXXXc/dev/snd/pcmXX
本文标题:手机开发培训 03_Android的Linux内核与驱动程序
链接地址:https://www.777doc.com/doc-7211251 .html