3.3内核对设备树的处理——对设备树中运行时配置信息的处理

本节内容主要为,对设备树中运行时配置信息的处理

设备树主要是做一些信息的传递,简单的说就是将信息从设备树中读出出来,再赋给内核中的某个变量。

下面是之前写的设备树文件。

// SPDX-License-Identifier: GPL-2.0
/*
 * SAMSUNG SMDK2440 board device tree source
 *
 * Copyright (c) 2018 weidongshan@qq.com
 * dtc -I dtb -O dts -o jz2440.dts jz2440.dtb
 */
 
#define S3C2410_GPA(_nr)	((0<<16) + (_nr))
#define S3C2410_GPB(_nr)	((1<<16) + (_nr))
#define S3C2410_GPC(_nr)	((2<<16) + (_nr))
#define S3C2410_GPD(_nr)	((3<<16) + (_nr))
#define S3C2410_GPE(_nr)	((4<<16) + (_nr))
#define S3C2410_GPF(_nr)	((5<<16) + (_nr))
#define S3C2410_GPG(_nr)	((6<<16) + (_nr))
#define S3C2410_GPH(_nr)	((7<<16) + (_nr))
#define S3C2410_GPJ(_nr)	((8<<16) + (_nr))
#define S3C2410_GPK(_nr)	((9<<16) + (_nr))
#define S3C2410_GPL(_nr)	((10<<16) + (_nr))
#define S3C2410_GPM(_nr)	((11<<16) + (_nr))

/dts-v1/;

/memreserve/ 0x33f00000 0x100000;

/ {
	model = "SMDK24440";
	compatible = "samsung,smdk2440";

	#address-cells = <1>;
	#size-cells = <1>;
		
	memory {  /* /memory */
		device_type = "memory";
		reg =  <0x30000000 0x4000000 0 4096>;		
	};

	
/*
	cpus {
		cpu {
			compatible = "arm,arm926ej-s";
		};
	};
*/	
	chosen {
		bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";
	};

	
	led {
		compatible = "jz2440_led";
		pin = <S3C2410_GPF(5)>;
	};
};

根节点下面设置了一个chosen子节点,chosen子节点里有一个属性叫bootargs,这个就是内核启动时的命令行参数

根节点下面还有memory子节点,memory子节点则是将内存的起始地址和大小告诉内核。起始地址和大小都保存在memory节点的reg属性中。

问:起始地址和大小,分别用几个32bit的数值来说明呢

 

答:这就要看根节点下的#address-cells#size-cells的大小,设为1表示1个32bit的数值,2表示2个32bit的数值,以此类推。所以,在解析memory节点之前,要先解析#address-cells#size-cells这两个属性。

 

显然,上面的dts文件中,内存的起始地址和大小分别为1个32bit的数值,共两块内存,第一块内存的起始地址和大小分别为0x30000000和0x4000000,第二块内存的起始地址和大小分别为0和4096。

下面来分析代码。

从之前分析得出,head.S首先会调用init路径下的main.c文件中的start_kernel函数,然后在start_kernel函数中调用setup_arch函数,在setup_arch函数中再调用setup_machine_fdt函数,使用dtb文件来设置板子。

函数调用过程:start_kernel->setup_arch->setup_machine_fdt

通过of_flat_dt_match_machine函数,选择最合适的machine_desc结构体之后,会调用early_init_dt_scan_nodes函数,函数名意为早期的设备树扫描节点

early_init_dt_scan_nodes的内容如下,根据注释可以知道,分别是处理chosen节点中的bootargs属性,#address-cells和#size-cells,memory。

bootargs属性的值赋给boot_command_line变量,他是一个char类型的数组。

这三个处理过程都是调用了同一个函数,of_scan_flat_dt,只不过是传入的值不同。

查看of_scan_flat_dt函数,it是一个函数指针data主要是用来配合it使用的

根据注释,这个函数的主要作用是扫描dtb文件,提取内存信息的。

处理过程如下:

所以,对于of_scan_flat_dt函数,我们主要关心it传入的callback函数即可。

early_init_dt_scan_chosen函数的分析如下,最终就是将chosen节点的bootargs属性值赋给boot_command_line变量

再看early_init_dt_scan_root函数,它主要是处理根节点下的#address-cells#size-cells,分析过程如下图所示,处理的过程比较简单,就是取值后赋值。需要注意的是,dtb文件中是按大端字节序存储的数值信息,要先通过be32_to_cpup转换成小端字节序再赋值。

另外,dt_root_size_cellsdt_root_addr_cells的默认值都是1,表示由1个32bit表示。

最后是对memory的处理,分析如下:

从dtb中读出内存信息后,调用early_init_dt_add_memory_arch函数,在early_init_dt_add_memory_arch函数中再调用memblock_add,这个函数就是用来添加内存块的。

最后,总结下函数调用过程如下:

start_kernel // init/main.c
    setup_arch(&command_line);  // arch/arm/kernel/setup.c
        mdesc = setup_machine_fdt(__atags_pointer);  // arch/arm/kernel/devtree.c
                    early_init_dt_scan_nodes();      // drivers/of/ftd.c
                        /* Retrieve various information from the /chosen node */
                        of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);

                        /* Initialize {size,address}-cells info */
                        of_scan_flat_dt(early_init_dt_scan_root, NULL);

                        /* Setup memory, calling early_init_dt_add_memory_arch */
                        of_scan_flat_dt(early_init_dt_scan_memory, NULL);

三个函数的作用如下:

a. 解析得到根节点下的chosen节点中bootargs属性的值, 存入全局变量: boot_command_line
b. 确定根节点的这两个属性的值: #address-cells, #size-cells
   存入全局变量: dt_root_addr_cells, dt_root_size_cells
c. 解析根节点下memory节点中的reg属性, 提取出"base, size", 最终调用memblock_add(base, size)添加内存块;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
主机安全 网络安全——主机安全全文共36页,当前为第1页。 目 录 主机防火墙技术 主机入侵检测技术 操作系统安全机制 主机加固 网络安全——主机安全全文共36页,当前为第2页。 目 录 1. 主机防火墙技术 1.1 防火墙的定义 1.2 主机防火墙的用途 网络安全——主机安全全文共36页,当前为第3页。 主机安全 防火墙的定义 防火墙是一种特殊的网络控制设施,它处于被保护网络和其他网络的边界,接收进出被保护网络的数据流,并根据防火墙所配置的访问策略进行过滤或做出其他操作。 网络安全——主机安全全文共36页,当前为第4页。 主机安全 主机防火墙的用途 主机防火墙运行于被保护主机的操作系统内核,除了完成对网络数据包的过滤等处理,还对系统内应用程序的所有网络联接进行认证。 网络安全——主机安全全文共36页,当前为第5页。 目 录 2. 主机入侵检测技术 2.1 入侵检测概念 2.2 入侵检测系统 网络安全——主机安全全文共36页,当前为第6页。 主机安全 入侵检测概念 入侵检测是对计算机和网络资源上的恶意使用行为进行识别和响应。它通过从计算机网络或计算机系统的若干关键点收集信息,并对其进行分析从发现网络或系统是否有违反安全策略的行为和被攻击的迹象。 进行入侵检测的软件与硬件的合称为入侵检测系统(Intrusion Detection System,IDS)入侵检测系统需要更多的智能,它必须能将得到的数据进行分析,并得出有用的结果。 网络安全——主机安全全文共36页,当前为第7页。 主机安全 入侵检测系统 入侵检测系统(IDS)主工分为4个阶段: 数据收集: 数据收集是入侵检测的基础,通过不同途径收集的数据,需要采用不同的方法进行分析。目前的数据主要有主机日志、网络数据包、应用程序数据、防火墙日志等。 数据处理:数据收集过程得到的原始数据量一般非常大,而且还存在噪声。为了进行全面、进一步的分析,需要从去除冗余、噪声,并且进行格式化及标准化处理。 数据分析:采用统计、智能算法等方法分析以过初步处理的数据,检查数据是否正常,或显示存在入侵。 响应处理:当发现入侵时,采取措施进行防护、保留入侵证据并通知管理员。常用的措施包括切断网络连接、记录日志、通过电子邮件或电话通知管理员等。 网络安全——主机安全全文共36页,当前为第8页。 主机安全 入侵检测系统 入侵检测系统的作用 通过检测和记录网络的安全违规行为,惩罚网络犯罪,防 止网络入侵事件的发生。 检测其他安全措施未能阻止的攻击或安全违规行为。 检测黑客在攻击前的探测行为,预先给管理员发出警报。 报告计算机系统或网络存在的安全威胁。 提供有关攻击的信息,帮助管理员诊断网络存在的安全弱 点,利于其进行修补。 在大型、复杂的计算机网络布置入侵检测系统,可以显著提高网络安全管理的质量。 网络安全——主机安全全文共36页,当前为第9页。 主机安全 入侵检测系统 入侵检测系统的基本工作模式: 从系统的不同环节收集信息。 分析该信息,试图寻找入侵活动的特征。 自动对检测到的行为做出响应。 记录并报告检测过程的结果。 网络安全——主机安全全文共36页,当前为第10页。 主机安全 入侵检测系统 入侵检测系统的分类: 入侵检测系统可以按不同的方法进行分类,它们包括体系结构、同步性、数据来源、检测技术、响应方式、时效性等分类方法。 其,按检测技术、数据来源、体系结构及时效性进行分类是应用最多的分类方法。 网络安全——主机安全全文共36页,当前为第11页。 目 录 3. 操作系统安全机制 3.1 操作系统的安全性表现 3.2 操作系统安全的主要目标 3.3 操作系统的安全机制 网络安全——主机安全全文共36页,当前为第12页。 主机安全 操作系统的安全性表现 物理上分离:要求进程使用不同的物理实体 时间上分离:具有不同安全要求进程在不同时间运行 逻辑上分离:要求进程不能访问其允许范围外的实体 密码上分离:要求进程隐蔽数据及计算 网络安全——主机安全全文共36页,当前为第13页。 主机安全 操作系统安全的主要目标 依据系统安全策略对用户的操作进行访问控制,防止用户对计算机资源的非法访问(窃取、篡改和破坏) 标识系统的用户和进行身份鉴别 监督系统运行时的安全性 保证系统自身的安全性和完整性 网络安全——主机安全全文共36页,当前为第14页。 主机安全 操作系统的安全机制 安全机制的主要功能则是实现安全策略描述的安全问题,它关注的是如何实现系统的安全性,主要包括: 加密机制(Encryption) 认证机制(Authentication) 授权机制(Authorization) 审计机制(Audit) 网络安全——主机安全全文共36页,当前为第15页。 主机安全 操作系统的安全机制--数据加密的
目录 1 引子 2 1.1 上电 2 1.2 BIOS时代 3 1.3 内核引导程序 5 2 内核映像的形成 8 2.1 MakeFile预备知识 9 2.1.1 Makefile书写规则 9 2.1.2 Makefile变量 10 2.1.3 条件判断 14 2.1.4 函数 17 2.1.5 隐含规则 17 2.1.6 定义模式规则 19 2.1 KBuild体系 23 2.1.1 内核目标 24 2.1.2 主机程序 26 2.1.3 编译标志 27 2.2 内核编译分析 28 2.2.1 编译配置 29 2.2.2 寻找第一个目标 32 2.2.3 prepare和scripts目标 38 2.2.4 递归编译各对象 41 2.2.5 链接vmlinux 44 2.2.6 制作bzImage 50 3 实模式下的内核代码 57 3.1 内核映像内存布局 58 3.2 实模式汇编代码header.S 60 3.2.1 无用的bootsect代码 60 3.2.2 初始化头变量hdr 63 3.2.3 准备实模式下C语言环境 64 3.3 实模式代码main函数 69 3.3.1 复制初始化头变量 71 3.3.2 初始化堆 74 3.3.3 确保支持当前运行的CPU 75 3.3.4 设置BIOS的x86模式 76 3.3.5 内存的检测 78 3.3.6 设置键盘属性 81 3.3.7 填充系统环境配置表 82 3.3.8 填充IST信息 83 3.3.9 设置Video模式 83 3.4 实模式代码go_to_proteced_mode函数 91 3.4.1 禁止可屏蔽和不可屏蔽断 92 3.4.2 打开A20地址线 93 3.4.3 安装临时全局描述符表 99 3.4.4 第一次启动保护模式 101 4 保护模式下的内核代码 107 4.1 32位x86保护模式代码 107 4.1.1 内核解压缩的前期工作 108 4.1.2 解压缩内核 111 4.1.3 第二次启动保护模式 121 4.1.4 第一次启动分页管理 124 4.1.5 初始化0号进程 128 4.2 向start_kernel进发 131 4.2.1 初始化断描述符表 132 4.2.2 第三次启动保护模式 137 4.2.3 启动x86虚拟机 141 5 走向现代:start_kernel函数 144 5.1 初始化同步与互斥环境 148 5.1.1 屏蔽断 148 5.1.2 启动大内核锁 152 5.1.3 注册时钟通知链 153 5.1.4 激活第一个CPU 155 5.1.5 初始化地址散列表 160 5.1.6 打印版本信息 161 5.2 执行setup_arch()函数 166 5.2.1 拷贝可用内存区信息 171 5.2.2 获得总页面数 175 5.2.3 着手建立永久内核页表 177 5.2.4 第二次启动分页管理 181 5.2.5 建立内存管理架构 186 5.2.6 添砖加瓦 192 5.3 设置每CPU环境 206 5.4 初始化内存管理区列表 211 5.5 利用early_res分配内存 214 5.6 触碰虚拟文件系统 223 5.7 初始化异常服务 224 5.8 初始化内存管理 230 5.8.1 启用伙伴算法 230 5.8.2 初始化slab分配器 241 5.8.3 初始化非连续内存区 250 5.9 初始化调度程序 251 5.10 初始化处理系统 256 5.10.1 设置APIC断服务 256 5.10.2 初始化本地软时钟 264 5.10.3 软断初始化 268 5.10.4 初始化定时器断 271 5.11 走进start_kernel尾声 273 5.11.1 初始化slab的后续工作 273 5.11.2 启动console 275 5.11.3 一些简单的函数 276 5.11.4 校准CPU时钟速度 279 5.11.5 创建一些slab缓存 282 5.12 安装根文件系统 287 5.12.1 创建VFS相关slab缓存 288 5.12.2 安装rootfs 291 5.12.3 安装proc文件系统 296 6 后start_kernel时代 298 6.1 创建1号进程 298 6.2 子系统的初始化 306 6.3 启动shell环境 309
书名:《Android底层开发技术实战详解——内核、移植和驱动》(电子工业出版社.王振丽)。本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解驱动移植的必要性,何为hal层深入分析,goldfish、msm、map内核和驱动解析,显示系统、输入系统、振动器系统、音频系统、视频输出系统的驱动,openmax多媒体、多媒体插件框架,传感器、照相机、wi-fi、蓝牙、gps和电话系统等。在每一章,重点介绍了与Android驱动开发相关的底层知识,并对Android源码进行了剖析。 本书适合Android研发人员及Android爱好者学习,也可以作为相关培训学校和大专院校相关专业的教学用书。 全书压缩打包成3部分,这是第3部分。 目录: 第1章 Android底层开发基础 1 1.1 什么是驱动 1 1.1.1 驱动程序的魅力 1 1.1.2 电脑的驱动 2 1.1.3 手机的驱动程序 2 1.2 开源还是不开源的问题 3 1.2.1 雾里看花的开源 3 1.2.2 从为什么选择java谈为什么不开源驱动程序 3 1.2.3 对驱动开发者来说是一把双刃剑 4 1.3 Android和Linux 4 1.3.1 Linux简介 5 1.3.2 Android和Linux的关系 5 1.4 简析Linux内核 8 1.4.1 内核的体系结构 8 1.4.2 和Android密切相关的Linux内核知识 10 1.5 分析Linux内核源代码很有必要 14 1.5.1 源代码目录结构 14 1.5.2 浏览源代码的工具 16 1.5.3 为什么用汇编语言编写内核代码 17 1.5.4 Linux内核的显著特性 18 1.5.5 学习Linux内核的方法 26 第2章 分析Android源代码 31 2.1 搭建Linux开发环境和工具 31 2.1.1 搭建Linux开发环境 31 2.1.2 设置环境变量 32 2.1.3 安装编译工具 32 2.2 获取Android源代码 33 2.3 分析并编译Android源代码 35 2.3.1 Android源代码的结构 35 2.3.2 编译Android源代码 40 2.3.3 运行Android源代码 42 2.3.4 实践演练——演示编译Android程序的两种方法 43 2.4 编译Android kernel 47 2.4.1 获取goldfish内核代码 47 2.4.2 获取msm内核代码 50 2.4.3 获取omap内核代码 50 2.4.4 编译Android的Linux内核 50 2.5 运行模拟器 52 2.5.1 Linux环境下运行模拟器的方法 53 2.5.2 模拟器辅助工具——adb 54 第3章 驱动需要移植 57 3.1 驱动开发需要做的工作 57 3.2 Android移植 59 3.2.1 移植的任务 60 3.2.2 移植的内容 60 3.2.3 驱动开发的任务 61 3.3 Android对Linux的改造 61 3.3.1 Android对Linux内核文件的改动 62 3.3.2 为Android构建 Linux的操作系统 63 3.4 内核空间和用户空间接口是一个媒介 64 3.4.1 内核空间和用户空间的相互作用 64 3.4.2 系统和硬件之间的交互 64 3.4.3 使用relay实现内核到用户空间的数据传输 66 3.5 三类驱动程序 70 3.5.1 字符设备驱动程序 70 3.5.2 块设备驱动程序 79 3.5.3 网络设备驱动程序 82 第4章 hal层深入分析 84 4.1 认识hal层 84 4.1.1 hal层的发展 84 4.1.2 过去和现在的区别 86 4.2 分析hal层源代码 86 4.2.1 分析hal moudle 86 4.2.2 分析mokoid工程 89 4.3 总结hal层的使用方法 98 4.4 传感器在hal层的表现 101 4.4.1 hal层的sensor代码 102 4.4.2 总结sensor编程的流程 104 4.4.3 分析sensor源代码看Android api 与硬件平台的衔接 104 4.5 移植总结 116 4.5.1 移植各个Android部件的方式 116 4.5.2 移植技巧之一——不得不说的辅助工作 117 第5章 goldfish下的驱动解析 125 5.1 staging驱动 125 5.1.1 staging驱动概述 125 5.1.2 binder驱动程序 126 5.1.3 logger驱动程序 135 5.1.4 lowmemorykiller组件 136 5.1.5 timed output驱动程序 137 5.1.6 timed gpio驱动程序 139 5.1.7 ram console驱动程序 139 5.2 wakelock和early_suspend 140 5.2.1 wakelock和early_suspend的原理 140 5.2.2 Android休眠 141 5.2.3 Android唤醒 144 5.3 ashmem驱动程序 145 5.4 pmem驱动程序 148 5.5 alarm驱动程序 149 5.5.1 alarm简析 149 5.5.2 alarm驱动程序的实现 150 5.6 usb gadget驱动程序151 5.7 Android paranoid驱动程序153 5.8 goldfish设备驱动154 5.8.1 framebuffer驱动155 5.8.2 键盘驱动159 5.8.3 实时时钟驱动程序160 5.8.4 tty终端驱动程序161 5.8.5 nandflash驱动程序162 5.8.6 mmc驱动程序162 5.8.7 电池驱动程序162 第6章 msm内核和驱动解析164 6.1 msm基础164 6.1.1 常见msm处理器产品164 6.1.2 snapdragon内核介绍165 6.2 移植msm内核简介166 6.3 移植msm168 6.3.1 makefile文件168 6.3.2 驱动和组件170 6.3.3 设备驱动172 6.3.4 高通特有的组件174 第7章 omap内核和驱动解析177 7.1 omap基础177 7.1.1 omap简析177 7.1.2 常见omap处理器产品177 7.1.3 开发平台178 7.2 omap内核178 7.3 移植omap体系结构180 7.3.1 移植omap平台180 7.3.2 移植omap处理器183 7.4 移植Android专用驱动和组件188 7.5 omap的设备驱动190 第8章 显示系统驱动应用195 8.1 显示系统介绍195 8.1.1 Android的版本195 8.1.2 不同版本的显示系统195 8.2 移植和调试前的准备196 8.2.1 framebuffer驱动程序196 8.2.2 硬件抽象层198 8.3 实现显示系统的驱动程序210 8.3.1 goldfish的framebuffer驱动程序210 8.3.2 使用gralloc模块的驱动程序214 8.4 msm高通处理的显示驱动实现224 8.4.1 msm的framebuffer驱动程序225 8.4.2 msm的gralloc驱动程序227 8.5 omap处理的显示驱动实现235 第9章 输入系统驱动应用239 9.1 输入系统介绍239 9.1.1 Android输入系统结构元素介绍239 9.1.2 移植Android输入系统时的工作240 9.2 input(输入)驱动241 9.3 模拟器的输入驱动256 9.4 msm高通处理的输入驱动实现257 9.4.1 触摸屏驱动257 9.4.2 按键和轨迹球驱动264 9.5 omap处理器平台的输入驱动实现266 9.5.1 触摸屏驱动267 9.5.2 键盘驱动267 第10章 振动器系统驱动269 10.1 振动器系统结构269 10.1.1 硬件抽象层271 10.1.2 jni框架部分272 10.2 开始移植273 10.2.1 移植振动器驱动程序273 10.2.2 实现硬件抽象层274 10.3 在msm平台实现振动器驱动275 第11章 音频系统驱动279 11.1 音频系统结构279 11.2 分析音频系统的层次280 11.2.1 层次说明280 11.2.2 media库的audio框架281 11.2.3 本地代码284 11.2.4 jni代码288 11.2.5 java代码289 11.3 移植audio系统的必备技术289 11.3.1 移植audio系统所要做的工作289 11.3.2 分析硬件抽象层290 11.3.3 分析audioflinger的audio硬件抽象层的实现291 11.4 真正实现audio硬件抽象层298 11.5 msm平台实现audio驱动系统298 11.5.1 实现audio驱动程序298 11.5.2 实现硬件抽象层299 11.6 oss平台实现audio驱动系统304 11.6.1 oss驱动程序介绍304 11.6.2 mixer305 11.7 alsa平台实现audio系统312 11.7.1 注册音频设备和音频驱动312 11.7.2 在Android使用alsa声卡313 11.7.3 在omap平台移植Android的alsa声卡驱动322 第12章 视频输出系统驱动326 12.1 视频输出系统结构326 12.2 需要移植的部分328 12.3 分析硬件抽象层328 12.3.1 overlay系统硬件抽象层的接口328 12.3.2 实现overlay系统的硬件抽象层331 12.3.3 实现接口332 12.4 实现overlay硬件抽象层333 12.5 在omap平台实现overlay系统335 12.5.1 实现输出视频驱动程序335 12.5.2 实现overlay硬件抽象层337 12.6 系统层调用overlay hal的架构342 12.6.1 调用overlay hal的架构的流程342 12.6.2 s3c6410 Android overlay的测试代码346 第13章 openmax多媒体框架349 13.1 openmax基本层次结构349 13.2 分析openmax框架构成350 13.2.1 openmax总体层次结构350 13.2.2 openmax il层的结构351 13.2.3 Android的openmax354 13.3 实现openmax il层接口354 13.3.1 openmax il层的接口354 13.3.2 在openmax il层需要做什么361 13.3.3 研究Android的openmax适配层361 13.4 在omap平台实现openmax il363 13.4.1 实现文件364 13.4.2 分析ti openmax il的核心365 13.4.3 实现ti openmax il组件实例368 第14章 多媒体插件框架373 14.1 Android多媒体插件373 14.2 需要移植的内容374 14.3 opencore引擎375 14.3.1 opencore层次结构375 14.3.2 opencore代码结构376 14.3.3 opencore编译结构377 14.3.4 opencore oscl381 14.3.5 实现opencore的openmax部分383 14.3.6 opencore的扩展398 14.4 stagefright引擎404 14.4.1 stagefright代码结构404 14.4.2 stagefright实现openmax接口405 14.4.3 video buffer传输流程409 第15章 传感器系统415 15.1 传感器系统的结构415 15.2 需要移植的内容417 15.2.1 移植驱动程序417 15.2.2 移植硬件抽象层418 15.2.3 实现上层部分419 15.3 在模拟器实现传感器424 第16章 照相机系统430 16.1 camera系统的结构430 16.2 需要移植的内容433 16.3 移植和调试433 16.3.1 v4l2驱动程序433 16.3.2 硬件抽象层441 16.4 实现camera系统的硬件抽象层446 16.4.1 java程序部分446 16.4.2 camera的java本地调用部分447 16.4.3 camera的本地库libui.so448 16.4.4 camera服务libcameraservice.so449 16.5 msm平台实现camera系统454 16.6 omap平台实现camera系统457 第17章 wi-fi系统、蓝牙系统和gps系统459 17.1 wi-fi系统459 17.1.1 wi-fi系统的结构459 17.1.2 需要移植的内容461 17.1.3 移植和调试461 17.1.4 omap平台实现wi-fi469 17.1.5 配置wi-fi的流程471 17.1.6 具体演练——在Android下实现ethernet473 17.2 蓝牙系统475 17.2.1 蓝牙系统的结构475 17.2.2 需要移植的内容477 17.2.3 具体移植478 17.2.4 msm平台的蓝牙驱动480 17.3 定位系统482 17.3.1 定位系统的结构483 17.3.2 需要移植的内容484 17.3.3 移植和调试484 第18章 电话系统498 18.1 电话系统基础498 18.1.1 电话系统简介498 18.1.2 电话系统结构500 18.2 需要移植的内容501 18.3 移植和调试502 18.3.1 驱动程序502 18.3.2 ril接口504 18.4 电话系统实现流程分析507 18.4.1 初始启动流程507 18.4.2 request流程509 18.4.3 response流程512 第19章 其他系统514 19.1 alarm警报器系统514 19.1.1 alarm系统的结构514 19.1.2 需要移植的内容515 19.1.3 移植和调试516 19.1.4 模拟器环境的具体实现518 19.1.5 msm平台实现alarm518 19.2 lights光系统519 19.2.1 lights光系统的结构520 19.2.2 需要移植的内容521 19.2.3 移植和调试521 19.2.4 msm平台实现光系统523 19.3 battery电池系统524 19.3.1 battery系统的结构524 19.3.2 需要移植的内容526 19.3.3 移植和调试526 19.3.4 在模拟器实现电池系统529

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值