Qualcomm手机开机全过程大揭密
手机开机流程
手机开机流程1、手机加电给手机加上电池或直流稳压电源供电,电源治理芯片〔PMU〕得到电池电压后,其内部的32KHz时钟晶体模块开始工作,输出外部RTC的工作电压,为此实时时钟晶体起振2、手机复位按下开机键,PMU检测到后,输出复位信号RSTON给手机CPU,CPU 便开始启动系统自检程序,进行自检3、工作电压输出手机完成自检后,CPU通过IIC总线操纵PMU输出手机各电路的工作电压,如VDD1、VDD2、VDD3、A VDD等4、13M晶体工作CPU得到工作时钟和工作电压后,便输出REF_ON信号,操纵13M电路的工作,使其产生13MHz时钟,一路给CPU提供工作主时钟,另一路给射频主芯片提供基准频率源5、调用开机程序CPU自检完成,并得到工作电压和主时钟后,便通过IIC总线校准PMU 输出的各路工作电压,校准完成后便输出片选信号和地址信号给FLASH,调用开机程序,实现开机6、建立通信连接手机开机后,CPU从FLASH中调用射频参数,通过广播操纵信道〔BCCH〕接收小区信号强度,假如手机内有SIM卡或UIM卡,手机便将卡中的相关信息发射给临近的基站,并接收来自基站的信息,从而与对应的网络实现连接,即通常所说的搜网7、待机搜网完成后,手机便处于等待状态,期间手机还会通过慢速辅助操纵信道〔SACCH〕周期性地与基站交换一些信息,如信号强度、频率同步、接收质量和接收电平等手机开机到接入网的过程详解一、手机的入网过程手机开机后依照设定,以手动或自动方式选择网络。
手机查找选定网络中的合适小区,并调谐到该小区的操纵频点。
假如需要,手机还将进行位置更新〔LOCA TION UPDATING〕或国际移动用户识别码〔IMSI〕附着〔A TTACH〕。
选择小区后,手机通过测量如发觉更好的小区,那么进行小区重选。
当手机从网络覆盖的盲区回到覆盖区,手机将重新选网。
1.网络选择手机按照以下优先规那么选择网络:a.归属网(HPLMN)b.SIM卡中设定的网络优先顺序c.信号强度大于-85dBm的网络按随机顺序d.其它网络按信号强度的强弱顺序假如登记成功,手机显示该网络,否那么,手机显示NO SERVICE或进入受限服务状态。
mtk开机启动过程
第一步:启动simulator的时候,直接进入:MMI_task( )1. iacMemInit();2.进入一个while(1)循环。
以后的过程都是通过消息机制,即:一直在这个循环中读取消息,然后做相应的处理。
第一次进入while(1)之后,OslReceiveMsgExtQ(qid, &Message)就读取到一个消息:PRT_MMI_TIMER_IND。
然后就一直在这个循环中读消息。
第二步:Power On读取到消息:MMI_EQ_POWER_ON_INDcase MMI_EQ_POWER_ON_IND:gdi_init();switch (p->poweron_mode) //判断power on的模式{case POWER_ON_KEYPAD: //用户按下开机键OslMemoryStart(TRUE);g_charbat_context.PowerOnCharger = 0; //不是因为充电而开机的InitializeAll(); //初始化,重点学习OslDumpDataInFile();//这个函数不能进入,直接跳过InitNvramData(); //加载保存在NVRAM中的设置的参数mmi_pwron_entry_animation_screen(); //开机动画break;case case POWER_ON_PRECHARGE:case POWER_ON_CHARGER_IN:g_pwr_context.PowerOnMode = p->poweron_mode;InitializeChargingScr();break;case POWER_ON_ALARM: //定时开机AlmInitRTCPwron();break;case POWER_ON_EXCEPTION: //For abnormal reset when invalid SIMOslMemoryStart(TRUE);SetAbnormalReset();InitializeAll();OslDumpDataInFile();ClearInputEventHandler(MMI_DEVICE_ALL);ClearKeyHandler(KEY_END, KEY_LONG_PRESS);InitNvramData();AlmReInitialize();InitAllApplications();mmi_pwron_exception_check_display();break;}执行过开机之后,就不会进入这里了。
手机开机的工作原理
手机开机的工作原理
手机的开机工作原理是指当用户按下手机的电源键后,手机内部的硬件系统开始进行一系列的启动操作,从而使手机正常运行起来。
首先,当用户按下电源键时,手机内部的电源管理芯片会接收到电源的供电信号。
电源管理芯片会负责将电源信号进行适配和转换,将电源信号提供给手机的主控芯片。
接下来,主控芯片会接收到电源信号,并开始进行初始化操作。
主控芯片是手机的核心部件,它负责控制和管理整个手机的运行。
主控芯片会对各个硬件模块进行初始化配置,包括内存、存储器、显示屏等。
此外,主控芯片还会加载操作系统的启动程序。
一旦操作系统的启动程序被加载,它会开始执行一系列的启动流程。
首先,操作系统会对硬件进行检测和初始化,确保各个硬件模块正常工作。
然后,操作系统会加载相关的驱动程序和系统服务,为手机提供各种功能和服务。
同时,操作系统会启动用户界面,显示在手机的屏幕上。
用户可以通过触摸屏幕或按键来操作手机。
此时,手机已经完成开机过程,用户可以开始使用手机进行各种操作。
总的来说,手机的开机工作原理涉及到电源管理芯片、主控芯片、操作系统和相关硬件的协同工作。
通过一系列的启动操作和初始化配置,手机能够正常运行并提供各种功能和服务。
08手机CPU及开机过程
第8单元 手机CPU及开机过程
1
引言:手机整机结构
2
8.1CPU的功能
1、整机控制功能; 2、数字运算功能;
手机开机实质:CPU成功读取了字库中的程序并执行, 从而在显示屏等人机接口上产生相应输出。
3
N70主板及基带电路
RAP3G:主CPU,负责通信控制; OMAP:副CPU,负责显示,按键,
18
总线供电
C2313
PURX
R12
VIO 数据供电
多媒体CPU D4800
前置相机接口
Combo 前置相机调节 memory
后置相机接口 多媒体字库
OMAP3PS1.1E
后置相机调节 D5000
VCOREA
来自N200 E10 VEN
核心供电
OMAP核心供电管
14
N4200
8.3 手机开机过程及关键信号检测 8.3.2 手机开机五要素
C1
待机时钟
K3 PURX 复位 1.8V
D3
VBACK L8
L9
K9
G2200
C2208
C2209
后备电池
B2200 32.768KMHz晶体
VBAT PDA字库供电管 N4201
SDRAM FLASH
暂存
字库
D3001 D3000
VBAT
辅助电源 IC N2300 D2 PURX 复位
VEN
VDDR_APE 1.8V
首先查若软件问题,再查硬件问题,然后查字库和CPU;
17
思考和练习 1.手机CPU主要功能是什么?请画出手机整机功能框图。 2.请画出CPU与电源电路之间的接口图。 3.CPU和射频之间的接口有哪些? 4.请描述手机不开机问题的维修思路。 5.手机开机的五要素是什么? 6.诺基亚N70手机不开机,其时钟部分如何维修检测?
Q10请先读我_00_开机篇_A4
请先读我!0黑莓Q10——开机篇1. 如何开机按照图示,用手指向下推开后盖(注意:不要暴力掰开后盖,可能令后盖折断)。
Q10使用Micro-SIM卡(就是iPhone 4/4s用的卡),按电池仓图示插入SIM卡,插入存储卡,放入电池,盖上后盖。
(注意:切忌使用SIM卡还原卡套,会弄断SIM卡针脚。
)Q10须按上方电源键才能开机,LED闪一次红色后开机启动。
如不能开机,请先接好充电器充电,使之达到开机所需电量。
2.功能按键分布3.激活向导Q10首次开机需激活后方可使用。
按照以下步骤进行设置后进入系统界面4. 主屏幕的基本操作:5. 基本操作:Q10没有传统黑莓手机的方向导航键和返回按键,所有操作依靠手势完成。
1.手指在屏幕上下左右滑动,可以翻页,滚动屏幕或在切换不同面板。
用2个手指向上或向下滑动可直接到达页面顶部或底部。
2.从屏幕下方向上滑动,可最小化程序,并在同时运行的程序间切换,按应用程序视图右下角的x可关闭程序。
3.从屏幕上方向下滑动,可打开程序或系统的菜单选项。
4.2个手指分开滑动是放大,并拢滑动是缩小。
5.按住程序图标直到变成跳动状态,再将图标移动到想放置的位置1 2 345*TIPS:Q10在屏幕休眠状态下,手指从屏幕下方滑动到屏幕上方,即可点亮屏幕;在待机画面下,手指从左下角向上滑动即可重新进入系统。
6.打字提示:Q10的输入方式与传统黑莓手机类似。
1.输入数字及符号需按住ALT键;2.输入键盘上没有的符号需按SYM键;3.输入大写需按CAP键,按住CAP锁定在大写状态;4.按住ALT键,再按回车键在不同输入法间切换,;7.物理按键操作:黑莓Q10的电源键在手机顶部,装有电池的黑莓Q10在关机状态下直接按下电源键即可开机。
在开机状态下按住电源键不放,会弹出关机提示,3秒倒计时后就关机,如果重启可点击右下角的“重新启动”按钮。
长按【播放/暂停】键打开【语音控制】;同时按下【音量+】和【音量-】,给手机屏幕截图。
qualcomm手机开机全过程
Qualcomm手机开机全过程Tags: Android, Nand Flash, Nor Flash, QUALCOMM, 高通手机由Fgamers发表于2011 年 03 月 30 日 19 次阅读评论(0)一.开机的简要流程分析Qualcomm的平台软件支持两种启动方式:一种是Nor Flash启动方式,另外一种就是Nand Flash启动方式。
Nor Flash启动方式就相当于硬件直接找到一个入口点开始执行代码,相比较而言会比较简单,且 Amoi 没有采用此种方式,所以本文对于这种方式不做详细分析。
另外一种就是Nand Flash启动方式,这种方式和 PC 的启动方式比较相像,也是 Amoi 采用的 Boot 方式,下面将详细分析在此方式下面的开机过程。
按下开机键之后,将产生一个时钟中断,从而通知 AMSS 主芯片的 Boot Load 硬件去将放置于Nand Flash上面的第一个 Block ( 8K )里面的Boot 代码 Copy 到内核内存( RAM ,这个内存应该是 CPU 自带的内存,同后面提到的 SDRAM 有一定区别,可以把它当作 CPU 的 Cache )的0xFFFF0000 地址,并开始执行 Boot 代码。
Boot 的主要任务是完成整个系统的硬件初始化工作(类似于 PC 上面的 BIOS 所完成的硬件自检工作,至于 Boot 的详细工作机制,后文会有详细描述)。
Boot 所完成的工作里面,最重要的一件事就是会将整个手机软件代码( AMSS 软件包)拷贝到 SDRAM 中,并最后将控制权交给 AMSS 软件。
说白了,就是 Boot 执行完成之后,代码的执行点将由 Boot 跳转到 AMSS 软件的的入口点函数 main(). (此函数在 mobile.c 里实现)。
代码运行到了 Main() 之后,在这个函数里面将完成操作系统( rex )的初始化工作,其实现方法是调用 rex_init() 。
【MTK芯片】手机开机的工作条件
【MTK芯片】手机开机的工作条件手机要正常连续开机,需具备以下三个条件:一是电源IC工作正常;二是逻辑电路工作正常;三是软件运行正常。
1、电源IC工作正常(1)电源IC供电正常。
电源IC要正常工作,需有工作电压,即电池电压或外接电源电压;(2)有开机触发信号。
开机触发信号既有高电平,也有低电平,不管哪种触发方式,开机触发信号差不多上送到电源IC上,在按下开机键时,开机触发信号就有了电平的变化(从高电平变为低电平或从低电平变为高电平)。
(3)电源IC正常。
电源IC内一样集成有多组受控或非受控稳压电路,当有开机触发信号时,电源IC的稳压输出端应有电压输出。
(4)有开机坚持信号。
开机坚持信号来自CPU,电源IC只有得到开机坚持信号后才能输出连续的电压,否则,手机将不能连续开机。
2、逻辑电路工作正常(1)有正常的工作电源。
按下开机键后,电源IC输出稳固的供电电压为逻辑电路供电,包括CPU、FLASH和CSP。
(2)有正常的系统时钟。
时钟信号是CPU按节拍处理数据的基础,手机中时钟电路有两种:一种是时钟VCO模块,内含振荡电路的元件及晶体。
当电源正常接通后,可自行振荡,形成13MHZ信号输出;另一种是由中频集成电路与晶体组成,中频IC得到电源后内部振荡电路供晶体起振,由中频模块放大输出。
13MHZ时钟一样通过电容、电阻或放大电路供给CPU,另外也供给射频锁相环电路作为差不多时钟信号。
(3)有正常的复位信号。
CPU刚供上电源时,其内部各寄存器处于随机状态,不能正常运行程序,因此,CPU必须有复位信号进行复位。
手机中的CPU的复位端一样是低电平复位,即在一定时钟周期后使CPU内部各种寄存器清零,而后此处电压再升为高电平,从而使CPU从头开始运行程序。
(4)逻辑电路本身正常。
逻辑电路要紧包括CPU、FLASH、CSP。
当CPU具备电源、时钟和复位三个条件后,通过片选信号与FLASH联系,通过数据总线与地址总线相互传送数据。
android手机启动过程与刷机简单分析
android手机启动过程与刷机简单分析这几天看了一些嵌入式linux系统和智能手机android系统的资料,琢磨了一下安卓手机的启动过程,虽然每种手机的CPU、主板和存储器有差别,但大致过程相似。
分享一下:手机按下电源开关键后:1、主板上电,CPU芯片加载自身片上的一小段引导代码bootloader(代码的作用:告诉CPU到哪里去寻找系统启动程序,比如到NAND flash接口去读用户程序);2、CPU按扇区方式将NAND FLASH第一个block内的SPL(Second Program Loader二次引导程序即fastboot)加载到RAM,读取分区表,加载基本设备驱动,读取boot分区的linux内核系统;由于SPL对usb设备的支持,所以我们在手机开机时通过按开机键+音量键(不同手机可能按键组合不同),可以进入fastboot工程模式,在这种模式下能通过电脑、USB线对手机进行底层操作。
3、由linux内核加载sysytem分区内的安卓系统程序;第一段引导代码bootloader很小,cpu出厂前已经固化在芯片上了,也叫onchip引导代码,不可人工改写。
二次引导程序SPL是利用JTAG仿真器固化在Nand flash的最前端或后端,我们刷机时能进入fastboot工程模式就是它的功劳。
手机厂商对这段引导程序一般都会加锁,防止用户修改,如果这段代码被破坏,手机就成砖了,只能靠专用设备烧录或返厂维修。
只要手机能进fastboot工程模式,刷recovery、root和刷Rom都是以后的事情了,基本上不会破坏以上两段引导程序。
只要固化的引导程序完好,即使刷机时手机不能进入系统,只要能显示第一屏,一般来说都有挽救的希望,不要变砖。
刷recovery就是在recovery分区安装类似于电脑上ghost一键恢复的程序。
刷Rom包就更简单了,跟电脑装系统一样,就是将安卓系统文件覆盖进手机的system分区。
Qualcomm手机——开机过程【大揭密】(中文版)
Qualcomm手机开机全过程大揭密摘要:本文试图通过代码来深入剖析Qualcomm手机开机的整个过程,即从按下开机键一直到出现待机界面,Qualcomm的手机软件在整个流程中究竟完成了哪些工作。
本文的主要目标是理清手机的初始化流程,并为今后Amoi定做初始化工作提供一个参考。
关键字:开机、Rex、TMC、ui_task、CoreApp一、开机的简要流程分析Qualcomm的平台软件支持两种启动方式:一种是Nor Flash启动方式,另外一种就是Nand Flash启动方式。
Nor Flash启动方式就相当于硬件直接找到一个入口点开始执行代码,相比较而言会比较简单,且Amoi没有采用此种方式,所以本文对于这种方式不做详细分析。
另外一种就是Nand Flash启动方式,这种方式和PC的启动方式比较相像,也是Amoi采用的Boot方式,下面将详细分析在此方式下面的开机过程。
按下开机键之后,将产生一个时钟中断,从而通知AMSS主芯片的Boot Load 硬件去将放置于Nand Flash上面的第一个Block(8K)里面的Boot代码Copy 到内核内存(RAM,这个内存应该是CPU自带的内存,同后面提到的SDRAM有一定区别,可以把它当作CPU的Cache)的0xFFFF0000地址,并开始执行Boot 代码。
Boot的主要任务是完成整个系统的硬件初始化工作(类似于PC上面的BIOS所完成的硬件自检工作,至于Boot的详细工作机制,后文会有详细描述)。
Boot所完成的工作里面,最重要的一件事就是会将整个手机软件代码(AMSS软件包)拷贝到SDRAM中,并最后将控制权交给AMSS软件。
说白了,就是Boot 执行完成之后,代码的执行点将由Boot跳转到AMSS软件的的入口点函数main().(此函数在mobile.c里实现)。
代码运行到了Main()之后,在这个函数里面将完成操作系统(rex)的初始化工作,其实现方法是调用rex_init()。
高通芯片启动流程
⾼通芯⽚启动流程对于嵌⼊式⼯程师了解芯⽚启动过程是⼗分有必要的,在分析、调试各种问题的时候都有可能涉及到这⽅⾯的知识。
同时这部分知识也是⽐较复杂的,因为其中涉及到芯⽚内部架构,启动各个阶段软件代码执⾏顺序,启动模式等等。
下⾯以⽐较常⽤的Qualcomm MSM8953芯⽚的启动过程为例,进⾏宏观分析(⼤部分翻译了⾼通的⼿册^-^),下⼀篇⽂章进⾏代码分析。
之前负责过⼀段时间的OTA升级,对于启动流程还是⽐较了解的。
试着擦除过⾼通芯⽚⾥的个别镜像⽐如sbl1,recovery,modem,boot等,设备会进⼊不同的状态⽐如9008,和9006这个也属于经验吧,尤其是⼯⼚退回来的设备中进各种特异状态的设备还是⽐较多的。
但如果要定位是哪个模块出问题了,还是⽐较⿇烦使⽤qctm,或者看kerenl打印的⽇志来进⾏分析。
⼀层⼀层的找构建分析环境处理器核⼼可以看到MSM8953中的处理器有5个,分别为:1, APPS Cortex A53 core,运⾏android2, RPM(Resource Power Manager) CortexM3 core,主要⽤于低功耗应⽤3, Modem(MSS_QDSP6) ⾼通⾃有指令集处理器,处理3G、4G通信协议等4, Pronto(WCNSS) 处理wifi相关代码5, LPASS ⾳频相关对映下⾯芯⽚硬件结构图中各个处理器的框图来看就很清晰了。
启动相关image介绍1,PBL(Primary Boot Loader) 位于rom中,是芯⽚上电后执⾏的真正第⼀⾏代码,在正常启动流程中会加载SBL1。
如果启动异常会虚拟出9008端⼝⽤于紧急下载(短接板⼦上的force_boot_from_usb引脚(MSM8953 为gpio37)到1.8v可以强制进⼊紧急下载模式)。
2,SBL1(Second BootLoader stage 1) 位于eMMC中,由PBL加载,初始化buses、DDR、clocks等,会虚拟出9006端⼝,⽤于不能开机时dump ram3,QSEE/TrustZone 安全相关,如fuse4,DEVCFG OEM配置信息(如OEMLock)6, Debug Policy 调试相关7, APPSBL 即为BootLoader,⽬前使⽤LK(littlekernel)8,HLOS(High LevelOperating System) 即为Linux/Android9,Modem PBL 即为Modem处理器的PBL10,MBA(Modem BootAuthenticator) Modem处理器启动鉴权启动流程1,系统上电,使MSM8953从上电复位开始运⾏。
手机是怎么开的原理
手机是怎么开的原理
手机开机的原理可以简单地描述为以下几个步骤:
1. 按下手机的电源键,这会触发一个电路,告诉手机开始启动。
2. 手机的电池开始向主板提供电力,使主板上的处理器和其他电子元件开始工作。
3. 主板上的BIOS(基本输入输出系统)会开始运行。
BIOS是一个小型的程序,它会检查硬件设备是否正常运作,启动系统的硬件和软件。
4. 一旦BIOS完成自检,它会读取存储在硬盘或闪存中的引导程序(Bootloader),并将其加载到内存中。
5. 引导程序会启动操作系统内核,如Android或iOS。
内核会加载操作系统的所有组件,包括驱动程序、系统服务和用户界面等。
6. 一旦操作系统加载完成,手机就会进入待机状态,等待用户进行操作。
这就是手机开机的大致原理。
当然,这只是一个简单的概述,实际上涉及到的技术和细节非常复杂。
手机开机操作规程
手机开机操作规程一、准备工作1. 确保手机电量充足,以免开机中断。
2. 检查手机SIM卡是否插入正确,确保信号正常。
3. 备份手机中重要的数据,以免丢失。
二、开机步骤1. 按住手机侧面或顶部的电源按钮,直至屏幕亮起。
2. 屏幕上将显示手机品牌或厂商的LOGO。
3. 等待片刻,系统将自动初始化。
三、设置和登录1. 启动完成后,系统将要求进行设置和登录。
2. 根据个人喜好选择语言、时区等设置。
3. 输入或选择无线网络连接,并输入密码。
4. 同意相关条款和条件,登录手机账户。
四、个性化配置1. 设置手机屏幕锁定方式,如密码、指纹或面部识别。
2. 配置屏幕亮度、音量、震动等基本参数。
3. 安装个人常用应用程序和小工具。
4. 同步或导入联系人、日历等数据。
五、优化系统1. 关闭无用的后台应用程序,以释放内存和提高手机性能。
2. 安装安全软件和更新系统补丁,确保手机安全。
3. 清理手机缓存、垃圾文件等,优化存储空间。
4. 设置自动更新应用程序,保持软件最新版本。
六、常见问题解决1. 如果手机无法开机,尝试长按电源按钮,直至强制重启。
2. 如果系统开机后出现卡顿或异常,可尝试重启手机。
3. 如果无法连接无线网络,检查密码是否正确,或切换至其他网络。
4. 如果手机频繁重启或出现其他故障,可能需要重置手机至出厂设置。
七、开机注意事项1. 遵守国家和地区相关法律法规,不要在特定场所使用手机。
2. 避免长时间过度使用手机,以免对身体造成伤害。
3. 定期备份手机中的重要数据,以防丢失或意外损坏。
4. 关闭不需要的功能和服务,以延长手机电池寿命。
总结:手机开机操作规程旨在引导用户正确地进行手机开机和设置,确保手机正常运行和个人数据的安全。
通过遵循操作规程,用户可以更好地了解手机的功能和使用方法,提高手机的使用效率和性能。
同样,注意合理使用手机,遵守相关规定和注意事项,是保护自己的隐私和维护身体健康的重要举措。
Recovery启动流程(1)---应用层到开机进入recovery详解
Recovery启动流程(1)---应⽤层到开机进⼊recovery详解转载请注明来源: 进⼊recovery有两种⽅式,⼀种是通过组合键进⼊recovery,另⼀种是上层应⽤设置中执⾏安装/重置/清除缓存等操作进⾏recovery。
这篇⽂档主要讲解上层应⽤是如何进⼊到recovery的。
本⽂以⾼通平台为例。
1.app执⾏安装/重置/清楚缓存操作调⽤代码⽂件frameworks/base/core/java/android/os/RecoverySystem.java不同的操作使⽤不同的⽅法:安装升级包 -------- installPackage清除⽤户数据------ rebootWipeUserData清楚缓存 ----------- rebootWipeCache上⾯的所有操作都是往/cache/recovery/command⽂件中写⼊不同的命令,在进⼊recovery后(recovery.cpp)对command的关键字进⾏判断,执⾏相应的操作,下⽂会详细讲解,这⾥先简单提及。
bootable/recovery/recovery.appstatic const struct option OPTIONS[] = {{ "send_intent", required_argument, NULL, 'i' },{ "update_package", required_argument, NULL, 'u' },#ifdef TARGET_USE_REDBEND_FOTA{ "omadm_package", required_argument, NULL, 'o' },#endif{ "wipe_data", no_argument, NULL, 'w' },{ "wipe_cache", no_argument, NULL, 'c' },{ "show_text", no_argument, NULL, 't' },{ "sideload", no_argument, NULL, 's' },{ "sideload_auto_reboot", no_argument, NULL, 'a' },{ "just_exit", no_argument, NULL, 'x' },{ "locale", required_argument, NULL, 'l' },{ "stages", required_argument, NULL, 'g' },{ "shutdown_after", no_argument, NULL, 'p' },{ "reason", required_argument, NULL, 'r' },{ NULL, 0, NULL, 0 },};..................intmain(int argc, char **argv) {....get_args(&argc, &argv); //提取cache/recovery/command中的信息....while ((arg = getopt_long(argc, argv, "", OPTIONS, NULL)) != -1) { //解析cache/recovery/command⽂件中的信息printf("***** xiaolei 2\n");switch (arg) {case 'i': send_intent = optarg; break;case 'u': update_package = optarg; break;case 'w': should_wipe_data = true; break;case 'c': should_wipe_cache = true; break;case 't': show_text = true; break;case 's': sideload = true; break;case 'a': sideload = true; sideload_auto_reboot = true; break;case 'x': just_exit = true; break;case 'l': locale = optarg; break;case 'g': {if (stage == NULL || *stage == '\0') {char buffer[20] = "1/";strncat(buffer, optarg, sizeof(buffer)-3);stage = strdup(buffer);}break;}case 'p': shutdown_after = true; break;case 'r': reason = optarg; break;case '?':LOGE("Invalid command argument\n");continue;}}}本⽂以installPackage为例:frameworks/base/core/java/android/os/RecoverySystem.javapublic static void installPackage(Context context, File packageFile)throws IOException {String filename = packageFile.getCanonicalPath(); //获取升级包路径String internalPath = Environment.maybeTranslateEmulatedPathToInternal(new File(filename)).getPath();FileWriter uncryptFile = new FileWriter(UNCRYPT_FILE);try {uncryptFile.write(internalPath + "\n");} finally {uncryptFile.close();}Log.w(TAG, " REBOOTING TO INSTALL " + filename + " ");Log.w(TAG, " REBOOTING TO INSTALL REALPATH " + internalPath + " ");// If the package is on the /data partition, write the block map file// If the package is on internal storage sdcard,write the block map file// into COMMAND_FILE instead.if (filename.startsWith("/data/") //加密处理,block.map是解密的映射⽂件||filename.startsWith("/storage/emulated/0/")) {filename = "@/cache/recovery/block.map";}final String filenameArg = "--update_package=" + filename; //把“--update_package=path” 通过bootCommand⽅法写⼊到cache/recovery/command⽂件中final String localeArg = "--locale=" + Locale.getDefault().toString(); //recovery显⽰语⾔bootCommand(context, filenameArg, localeArg);}installPackage⽅法会嗲⽤bootCommand()⽅法,此时参数为(context,向cache/recovery/command⽂件中写⼊的信息,语⾔信息)private static void bootCommand(Context context, String... args) throws IOException {RECOVERY_DIR.mkdirs(); // In case we need itCOMMAND_FILE.delete(); // In case it's not writableLOG_FILE.delete();FileWriter command = new FileWriter(COMMAND_FILE); //向/cache/recovery/command中写⼊--update_package=path try {for (String arg : args) {if (!TextUtils.isEmpty(arg)) {command.write(arg);command.write("\n");}}} finally {command.close();}// Having written the command file, go ahead and rebootPowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);pm.reboot(PowerManager.REBOOT_RECOVERY); //PowerManager.REBOOT_RECOVERY的值为字符串"recovery"throw new IOException("Reboot failed (no permissions?)");}pm.reboot(PowerManager.REBOOT_RECOVERY); 参数为字符串("recovery")frameworks/base/core/java/android/os/PowerMangager.javapublic void reboot(String reason) {try {mService.reboot(false, reason, true);} catch (RemoteException e) {}}mService.reboot(false, reason, true); 参数为(false,"recovery",true)frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javapublic void reboot(boolean confirm, String reason, boolean wait) {mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);if (PowerManager.REBOOT_RECOVERY.equals(reason)) {mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null);}final long ident = Binder.clearCallingIdentity();try {shutdownOrRebootInternal(false, confirm, reason, wait);} finally {Binder.restoreCallingIdentity(ident);}}shutdownOrRebootInternal(false, confirm, reason, wait); 参数为(false,false,"recovery",true)frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javaprivate void shutdownOrRebootInternal(final boolean shutdown, final boolean confirm,final String reason, boolean wait) {if (mHandler == null || !mSystemReady) {throw new IllegalStateException("Too early to call shutdown() or reboot()");}Runnable runnable = new Runnable() {@Overridepublic void run() {synchronized (this) {if (shutdown) { //此处shutdown=falseShutdownThread.shutdown(mContext, confirm);} else {ShutdownThread.reboot(mContext, reason, confirm); //执⾏此处代码}}}};// ShutdownThread must run on a looper capable of displaying the UI.Message msg = Message.obtain(mHandler, runnable);msg.setAsynchronous(true);mHandler.sendMessage(msg);// PowerManager.reboot() is documented not to return so just wait for the inevitable.if (wait) {synchronized (runnable) {while (true) {try {runnable.wait();} catch (InterruptedException e) {}}}}}ShutdownThread.reboot(mContext, reason, confirm); 参数为(mContex,"recovery",false)此处开了⼀个线程处理rebootframeworks/base/services/core/java/com/android/server/power/ShutdownThread.javapublic static void reboot(final Context context, String reason, boolean confirm) { //⽅法中的变量为全局变量mReboot = true;mRebootSafeMode = false;mRebootUpdate = false;mRebootReason = reason;shutdownInner(context, confirm); //此⽅法是在⼿机界⾯上弹出⼀个确认框,是否重启,此处的代码不再追了}//程序⼀定会执⾏run()⽅法/***********************mReboot = true;mRebootSafeMode = false;mRebootUpdate = false;mRebootReason = "recovery";***********************/public void run() {BroadcastReceiver br = new BroadcastReceiver() {@Override public void onReceive(Context context, Intent intent) {// We don't allow apps to cancel this, so ignore the result.actionDone();}};/** Write a system property in case the system_server reboots before we* get to the actual hardware restart. If that happens, we'll retry at* the beginning of the SystemServer startup.*/{String reason = (mReboot ? "1" : "0") + (mRebootReason != null ? mRebootReason : ""); //reason的值为"recovery"SystemProperties.set(SHUTDOWN_ACTION_PROPERTY, reason); //设置系统属性sys.shutdown.requested = "recovery" }/** If we are rebooting into safe mode, write a system property* indicating so.*/if (mRebootSafeMode) {SystemProperties.set(REBOOT_SAFEMODE_PROPERTY, "1");}Log.i(TAG, "Sending shutdown broadcast...");setBootValue("silent_mode",mAudioManager.isSilentMode() ? "1" : "0");if(checkAnimationFileExist() && mContext.getResources().getBoolean(com.android.internal.R.bool.feature_tctfw_shutdown_animation_on) &&!mRebootUpdate) {lockDevice();showShutdownAnimation();}// First send the high-level shut down broadcast.mActionDone = false;Intent intent = new Intent(Intent.ACTION_SHUTDOWN);intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);mContext.sendOrderedBroadcastAsUser(intent,UserHandle.ALL, null, br, mHandler, 0, null, null);final long endTime = SystemClock.elapsedRealtime() + MAX_BROADCAST_TIME;synchronized (mActionDoneSync) {while (!mActionDone) {long delay = endTime - SystemClock.elapsedRealtime();if (delay <= 0) {Log.w(TAG, "Shutdown broadcast timed out");break;} else if (mRebootUpdate) {int status = (int)((MAX_BROADCAST_TIME - delay) * 1.0 *BROADCAST_STOP_PERCENT / MAX_BROADCAST_TIME);sInstance.setRebootProgress(status, null);}try {mActionDoneSync.wait(Math.min(delay, PHONE_STATE_POLL_SLEEP_MSEC));} catch (InterruptedException e) {}}}if (mRebootUpdate) {sInstance.setRebootProgress(BROADCAST_STOP_PERCENT, null);}Log.i(TAG, "Shutting down activity manager...");final IActivityManager am =ActivityManagerNative.asInterface(ServiceManager.checkService("activity"));if (am != null) {try {am.shutdown(MAX_BROADCAST_TIME);} catch (RemoteException e) {}}if (mRebootUpdate) {sInstance.setRebootProgress(ACTIVITY_MANAGER_STOP_PERCENT, null);}Log.i(TAG, "Shutting down package manager...");final PackageManagerService pm = (PackageManagerService)ServiceManager.getService("package");if (pm != null) {pm.shutdown();}if (mRebootUpdate) {sInstance.setRebootProgress(PACKAGE_MANAGER_STOP_PERCENT, null);}// Shutdown radios.shutdownRadios(MAX_RADIO_WAIT_TIME);if (mRebootUpdate) {sInstance.setRebootProgress(RADIO_STOP_PERCENT, null);// Mod-by-yanxi.liu, for sdcard upgrade uncrypt, Defect-1357392if (mRebootUpdate) {sInstance.setRebootProgress(MOUNT_SERVICE_STOP_PERCENT, null);// If it's to reboot to install update, invoke uncrypt via init service.uncrypt();}// Mod-by-yanxi.liu, for sdcard upgrade uncrypt, Defect-1357392// Shutdown MountService to ensure media is in a safe stateIMountShutdownObserver observer = new IMountShutdownObserver.Stub() {public void onShutDownComplete(int statusCode) throws RemoteException {Log.w(TAG, "Result code " + statusCode + " from MountService.shutdown");actionDone();}};Log.i(TAG, "Shutting down MountService");// Set initial variables and time out time.mActionDone = false;final long endShutTime = SystemClock.elapsedRealtime() + MAX_SHUTDOWN_WAIT_TIME;synchronized (mActionDoneSync) {try {final IMountService mount = IMountService.Stub.asInterface(ServiceManager.checkService("mount"));if (mount != null) {mount.shutdown(observer);} else {Log.w(TAG, "MountService unavailable for shutdown");}} catch (Exception e) {Log.e(TAG, "Exception during MountService shutdown", e);}while (!mActionDone) {long delay = endShutTime - SystemClock.elapsedRealtime();if (delay <= 0) {Log.w(TAG, "Shutdown wait timed out");break;} else if (mRebootUpdate) {int status = (int)((MAX_SHUTDOWN_WAIT_TIME - delay) * 1.0 *(MOUNT_SERVICE_STOP_PERCENT - RADIO_STOP_PERCENT) /MAX_SHUTDOWN_WAIT_TIME);status += RADIO_STOP_PERCENT;sInstance.setRebootProgress(status, null);}try {mActionDoneSync.wait(Math.min(delay, PHONE_STATE_POLL_SLEEP_MSEC));} catch (InterruptedException e) {}}}// add by feikuang for defect 1453123 startisVibrate = mContext.getResources().getBoolean(com.android.internal.R.bool.config_isVibrate); Log.i(TAG,"isVibrate " + isVibrate);// add by feikuang for defect 1453123 endwaitShutDownAnimationCompleted();rebootOrShutdown(mContext, mReboot, mRebootReason); //程序执⾏到这⾥}rebootOrShutdown(mContext, mReboot, mRebootReason); 参数为(mContext,true,"recovery") frameworks/base/services/core/java/com/android/server/power/ShutdownThread.javapublic static void rebootOrShutdown(final Context context, boolean reboot, String reason) {deviceRebootOrShutdown(reboot, reason);//[FEATURE]-Add-BEGIN by TSNJ.shu.wang,11/06/2015,TASK-871146String bootAlarms = SystemProperties.get("sys.boot.alarm");boolean isBootAlarms = bootAlarms != null && bootAlarms.equals("1");if (reboot) {Log.i(TAG, "Rebooting, reason: " + reason);PowerManagerService.lowLevelReboot(reason); //程序执⾏到这⾥Log.e(TAG, "Reboot failed, will attempt shutdown instead");} else if (SHUTDOWN_VIBRATE_MS > 0 && context != null && !isBootAlarms && isVibrate) { //[FEATURE]-Add-END by TSNJ.shu.wang,11/06/2015,TASK-871146// vibrate before shutting downVibrator vibrator = new SystemVibrator(context);try {vibrator.vibrate(SHUTDOWN_VIBRATE_MS, VIBRATION_ATTRIBUTES);} catch (Exception e) {// Failure to vibrate shouldn't interrupt shutdown. Just log it.Log.w(TAG, "Failed to vibrate during shutdown.", e);}// vibrator is asynchronous so we need to wait to avoid shutting down too soon.try {Thread.sleep(SHUTDOWN_VIBRATE_MS);} catch (InterruptedException unused) {}}// Shutdown powerLog.i(TAG, "Performing low-level shutdown...");PowerManagerService.lowLevelShutdown();}PowerManagerService.lowLevelReboot(reason); 参数为"recovery"frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javapublic static void lowLevelReboot(String reason) {if (reason == null) {reason = "";}if (reason.equals(PowerManager.REBOOT_RECOVERY)) {// If we are rebooting to go into recovery, instead of// setting sys.powerctl directly we'll start the// pre-recovery service which will do some preparation for// recovery and then reboot for us.SystemProperties.set("ctl.start", "pre-recovery"); //到这⾥可以知道,⼀个新的进程会被enable } else {SystemProperties.set("sys.powerctl", "reboot," + reason);try {Thread.sleep(20 * 1000L);} catch (InterruptedException e) {Thread.currentThread().interrupt();}Slog.wtf(TAG, "Unexpected return from lowLevelReboot!");}SystemProperties.set("ctl.start", "pre-recovery"); //到这⾥可以知道,⼀个新的进程会被enablesystem/core/rootdir/init.rcservice pre-recovery /system/bin/uncrypt --rebootclass maindisabledoneshotservice pre-recovery /system/bin/uncrypt --reboot system/bin/uncrypt 这个程序会被执⾏,传⼊的参数是--reboot uncrypt的源码位于bootable/recovery/uncrypt/uncrypt.cpp,下⾯对uncrypt进⾏分析bootable/recovery/uncrypt/uncrypt.cppint main(int argc, char** argv) { //此处argc为2 argv[1]="--reboot"const char* input_path;const char* map_file;if (argc != 3 && argc != 1 && (argc == 2 && strcmp(argv[1], "--reboot") != 0)) {fprintf(stderr, "usage: %s [--reboot] [<transform_path> <map_file>]\n", argv[0]);return 2;}// When uncrypt is started with "--reboot", it wipes misc and reboots.// Otherwise it uncrypts the package and writes the block map.if (argc == 2) { //程序执⾏到此处if (read_fstab() == NULL) {return 1;}wipe_misc(); //擦出misc分区内容reboot_to_recovery(); //重启到recovery} else {// The pipe has been created by the system server.int status_fd = open(status_file.c_str(), O_WRONLY | O_CREAT | O_SYNC, S_IRUSR | S_IWUSR);if (status_fd == -1) {ALOGE("failed to open pipe \"%s\": %s\n", status_file.c_str(), strerror(errno));return 1;}std::string package;if (argc == 3) {// when command-line args are given this binary is being used// for debugging.input_path = argv[1];map_file = argv[2];} else {if (!find_uncrypt_package(package)) {android::base::WriteStringToFd("-1\n", status_fd);close(status_fd);return 1;}input_path = package.c_str();map_file = cache_block_map.c_str();}int status = uncrypt(input_path, map_file, status_fd);if (status != 0) {android::base::WriteStringToFd("-1\n", status_fd);close(status_fd);return 1;}android::base::WriteStringToFd("100\n", status_fd);close(status_fd);}return 0;}reboot_to_recovery();bootable/recovery/uncrpty/uncrpty.cppstatic void reboot_to_recovery() {ALOGI("rebooting to recovery");property_set("sys.powerctl", "reboot,recovery");sleep(10);ALOGE("reboot didn't succeed?");}property_set("sys.powerctl", "reboot,recovery"); sys.powerctl属性出发开关在init.rc中system/core/rootdir/init.rcon property:sys.powerctl=*powerctl ${sys.powerctl}system/core/init/keywords.hKEYWORD(powerctl, COMMAND, 1, do_powerctlsystem/core/init/builtins.cppint do_powerctl(int nargs, char **args) //传⼊的参数为字符串"reboot,recovery"{char command[PROP_VALUE_MAX];int res;int len = 0;int cmd = 0;const char *reboot_target;res = expand_props(command, args[1], sizeof(command));if (res) {ERROR("powerctl: cannot expand '%s'\n", args[1]);return -EINVAL;}if (strncmp(command, "shutdown", 8) == 0) {cmd = ANDROID_RB_POWEROFF;len = 8;} else if (strncmp(command, "reboot", 6) == 0) { //程序⾛到这,cmd=ANDROID_RB_RESTART2cmd = ANDROID_RB_RESTART2;len = 6;ERROR("powerctl: unrecognized command '%s'\n", command);return -EINVAL;}if (command[len] == ',') {char prop_value[PROP_VALUE_MAX] = {0};reboot_target = &command[len + 1]; //设置reboot_target = recoveryif ((property_get("init.svc.recovery", prop_value) == 0) &&(strncmp(reboot_target, "keys", 4) == 0)) {ERROR("powerctl: permission denied\n");return -EINVAL;}} else if (command[len] == '\0') {reboot_target = "";} else {ERROR("powerctl: unrecognized reboot target '%s'\n", &command[len]);return -EINVAL;}return android_reboot(cmd, 0, reboot_target);}android_reboot(cmd, 0, reboot_target); 参数为(ANDROID_RB_RESTART2, 0, "recovery")system/core/libcutils/android_reboot.cint android_reboot(int cmd, int flags UNUSED, const char *arg){int ret;sync();remount_ro();switch (cmd) {case ANDROID_RB_RESTART:ret = reboot(RB_AUTOBOOT);break;case ANDROID_RB_POWEROFF:ret = reboot(RB_POWER_OFF);break;case ANDROID_RB_RESTART2: //程序跑到这⾥其中arg="recovery"ret = syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,LINUX_REBOOT_CMD_RESTART2, arg);break;default:ret = -1;}return ret;}ret = syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,LINUX_REBOOT_CMD_RESTART2, arg);kernel/include/uapi/asm-generic/unistd.h#define __NR_reboot 142__SYSCALL(__NR_reboot, sys_reboot)__NR_reboot被映射到sys_reboot上,会执⾏SYSCALL_DEFINE4(),为什么会这么执⾏还不清楚。
高通Andriod开机流程与镜像说明
⾼通Andriod开机流程与镜像说明Android镜像说明Android设备刷机时都需要ROM包,ROM包下⾯有很多的.img和其他的相关镜像⽂件,其中这⾥⾯包含了Android很多的分区,Android镜像⽂件是通过源码编译⽣成的,下⾯是ROM包各个镜像的作⽤:镜像⽂件说明boot.img boot分区,包括内核⽂件和虚拟内存盘Ramdisk,负责设备开机,可在recovery模式进⾏擦除,重新安装带有boot分区的新系统system.img system分区,包含Android系统的⽤户界⾯以及设置上的⼀些预装系统应⽤recovery.img recovery分区,替代启动分区,执⾏恢复和维护系统的⼀些操作userdata.img data分区,⽤于保存⽤户的数据,例如联系⼈,短信,设置偏好和应⽤程序存放的地⽅cache.img cache分区,⽤于放置系统频繁访问的数据和应⽤程序组件的分区persist.img persist分区包含了设备的传感器和信号部分的驱动程序,例如wifi,蓝⽛连接都有关系splash.img开机画⾯⽂件NON-HLOS.bin modem image负责处理通讯协议相关的基带镜像prog_emmc_firehose_8953_ddr.mbn QFIL软件烧录系统的时候,需要⽤到此⽂件,应该是关于EMMC、DDR的配置参数相关的sbl1.mbn硬件的初始化,并且保存加载其他模块信息的顺序tz.mbn trustzone是ARM TrustZone® 技术是系统范围的安全⽅法,基于安全需求和引导模式配置XPU,NAND MPU,它和其他模块代码运⾏在相互隔离的区域,主要实现底层很多安全性特性emmc_appsboot.mbn bootloader⽂件,进⼊fastboot模式相关⽂件rpm.mbn电源管理器,是⾼通MSM平台另外加的⼀块芯⽚,虽然与AP芯⽚打包在⼀起,但其是⼀个独⽴的ARM Core。
手机维修(电源开机过程的识图与维修技巧)
广东华夏技工学校教案编号:QD-751b-19 版本:A/0 流水号:运用应知知识来分析手机的开机条件要解决一部手机不开机的故障,首先得学会分析具有代表性的开机流程图,如图7-1所示。
从应知(理论)角度来分析,开机过程可以从五个方面来寻找突破口:整机供电及开机识别、主时钟、复位、软件、看门狗维持(也叫开机维持信号)。
要熟悉相关的专业英文,便于分析开机的每一个过程。
整机供电输入的英文为“VBATT”。
对于输出电压常用的英文,不同机种各不一样,但各系列手机都有自己的规律。
开机过程可以表述如下:1.整机供电流程接上主电池,VBATT 3.6V电压由电池弹簧片正极送到电源模块,此时开机线(开机键连接的那条线)处有2~3V的高电平。
按下开机键,开机线拉为低电平,触发电源模块,从而启动了电源模块,电源模块就输出了各路电压到各电路。
2.主时钟CLK工作流程(1)一种设计方式中频模块配合13MHz晶体产生13MHz主时钟信号,然后一方面送到PLL频率合成器电路,另一方面送到逻辑电路作为工作时钟。
自从BGA封装大规模集成电路应用以后,摩托罗拉等系列手机的中频模块通常配合26MHz晶体产生26MHz主时钟信号,然后在射频模块内部二分频,最终得到13MHz正弦波信号,输出后一方面送到PLL频率合成器电路,另一方面送到逻辑电路作为工作时钟。
(2)另一种设计方式 13MHz主时钟产生电路单独做在一块小电路板上,然后用金属屏蔽罩将其封装起来。
产生的13MHz主时钟信号,一方面送到PLL频率合成器电路,另一方面经13MHz放大管放大后送到逻辑电路作为工作时钟。
自从BGA封装大规模集成电路应用以后,诺基亚系列手机中单独做在一块小电路板上的VCO产生26MHz主时钟信号,然后在射频模块内部二分频,最终得13MHz正弦波信号,输出后一方面送到PLL频率合成器电路,另一方面经过13MHz放大管放大后送到逻辑电路作为工作时钟。
3.复位流程将电源模块产生的复位电压送到CPU。
手机开关机流程
手机开关机流程一、流程开机流程当手机的供电模块检测到电源开关键被按下后,会将手机电池的电压转换为适合手机电路各部分使用的电压值,供应给相应的电源模块,当时钟电路得到供电电压后产生震荡信号,送入逻辑电路,CPU在得到电压和时钟信号后会执行开机程序,首先从ROM中读出引导码,执行逻辑系统的自检。
并且使所有的复位信号置高,如果自检通过,则CPU给出看门狗(Watchdog)信号给各模块,然后电源模块在看门狗Watchdog)信号的作用下,维持开机状态。
二、上网流程手机开机后,既搜索广播控制信号道(BCCH)的载频。
因为系统随时都向在小区中的各用户发送出用户广播控制信息。
手机收集搜索到最强的(BCCH)的载频。
对应的载频频率后,读取频率校正信道FCCH),使手机(MS)的频率与同步。
所以每一个用户的手机在不同位置(既不同的小区)的载频是固定的,它是由GSM网络运营商组网时确定,而不是由用户的GSM手机来决定。
手机读取同步信道(SCH)Satellite Channel 的信息后找出基地站(BTS)Base Transceiver Station 的任别码,并同步到超高帖TDMA (Time Division Multiple Access)的帖号上。
手机在处理呼叫前读取系统的信息。
比如:邻近小区的情况、现在所处小区的使用频率及小区是否可以使用移动系统的国家号码和网络号码等等,这些信息都可以在以BCCH上得到手机在请求接入信道(RACH)上发出接入请求信息,向系统送SIM卡帐号等信息。
系统在鉴权合格后,通过允许接入信道(AGCH)使GSM手机接入信道上并分配到GSM手机一个独立专用控制信道(SDCCH)。
手机在SDDCCH上完成登记。
在满速随路控制信道(SACCH)上发出控制指令,然后手机返回空闲状态,并监听BCCH 和CCCH共控制信道上的信息。
此时手机已经做好了寻呼的准备工作。
三、待机流程用户监测BCCH时,必须与相近的基站取得同步。
手机工作流程
目录一、手机工作流程示意图(Infineon平台、Broadcom平台、MTK平台)二、射频部分讲解三、逻辑部分讲解四、电源部分讲解五、电性能部分讲解手机工作流程示意图一、射频部分讲解1、 接收电路由天线接收到的高频信号送到PR 接口,再送往射频转换开关,此时具有GSM 和DCS 两种工作状态: 频段切换的控制信号VC1、VC2 1 0 处于GSM 发射状态 0 0处于GSM 、DCS 接收状态 0 DCS 发射状态 再经射频转换开关虑波后的一路900MHZ 的接收信号经高频虑波器虑波送到中频IC ,另一路1800MHZ 的接收信号经高频虑波器虑波送到中频IC ;中频IC 对虑波后接收信号在内部进行低噪声放大,然后和接收本振送来的接收信号进行混频,产生360MHZ 的中频信号送到中频虑波器进行虑波,虑波后的中频信号送往中频IC 再进行二次混频,最终产生四路接收I/O 信号送往BGA ;在BGA 内部进行A/D 转换以及信号外理,然后再经过在D/A 转换面语音信号送往LCD 、听简等。
2、 发射电路 语音信号从MIC 输入,BGA 将语音信号转换成电流信号,在BGA 内部进行A/D 转换和数字信号处理,然后再D/A 转换调制成发射信号的I/O 信号,送到中频IC 进行调制;由中频IC 内部进行变频产生424MHZ 的发射信号,再和发射本振进行混频、虑波产生发射信号,然后发射本振振荡产生所需的GSM 、DCS 的发射频率信号送到功率放大IC ;当手机收到基站发出的功率级别要求,在BGA控制下从功率表中调出相应的功率级别数据,经过D/A转换成标准功率控制电平与实际发射的功率值比较,产生误差电压去调节激励放大电路、功放增益,将放大后的信号送到射频转换开关进行GSM900和DCS1800的频段切换,最终送往天线进行发射。
3、线路流程接收通路:天线信号射频测试点射频转换开关高频虑波器(一路GSM900信号;一路DCS1800信号)中频IC接收本振中频虑波器BGA发射通路:MIC受话BGA 中频IC发射本振功率放大IC射频转换开关射频测试点天线信号4、维修实例Infineon平台:Broadcom平台:不入软件位ABORT:A、电流为0的情况:1、32KHZ是否正常工作;2、U4外围电阻R8、R15、C73、C74的阻值是否正常;3、开机键U4#43脚BGAB、电流过小的情况:1、13MHZ是否正常工作;2、13MHZ U17BGA3、U4外围电阻R40、R39的阻值是否正常;4、U19的虚焊、不良问题引起的;C、电流正常,但不入软件:1、U1、U21、U4不良问题引起的;2、U21外围电阻R40、R39的阻值是否正常;3、尾插J4U1之间的物理通路是否导通;3、U19、FL4、FL5的虚焊、不良问题引起的;D、电流过大的情况:1、U1、U21、U4、U14不良问题引起的;2、U16、U18的短接、不良问题引起的;3、U19的短接、不良问题引起的;4、U4Q3;5、U17Q1;6、U1外围电阻的短接问题引起的;E、failed的情况:1、尾插U1的物理通路是否导通;2、U21U1的物理通路是否导通;3、13MHZ不良问题引起的;F、能入软件,但不开机的情况:1、U4U21的供电线路是否导通;(串口线路:尾插U1,尾插的7、8脚对地阻值大约在1.4MHZ左右为正常,)校准位:A、ABORT1、U21不良问题引起的;(能入软件,但校准不过)2、U4不良问题引起的;(测试机柜的电流过小的情况)3、U1不良问题引起的;(测试机柜的电流正常的情况)4、U45、U41、U6不良问题引起的;(测试机柜的电流过大的情况)5、尾插U1,尾插的7、8脚对地阻值大约在1.4MHZ左右为正常;6、U19短路、不良问题引起的;7、32KHZ是否正常工作,R11的阻值大约在1.4MHZ左右为正常;8、13MHZ U17BGA;9、FL4、FL5不良问题引起的;(能开机、但校准不过)10、CON1不良问题引起的;12、充电线路Q29、Q28、Q23不良问题引起的;13、U17不良问题引起的;B、10041、C、4002(手机电流过大)1、U4、U17、U14、U13不良问题引起的;2、U4R1、R2BGA;3、BGA外围的电阻、电容是否短接问题引起的,以及相关的电阻、电容是否阻值正常;4、U6、U18短接、不良问题引起的;D、50021(GSM的TX POWER校准不合格)1、从开机电流的大小(不低于50~60mA),判断手机能不能上网;2、若静态下电流大于100 mA,U1、U4、U17、U14不良问题引起的;3、U4U17,U4U14的供电问题;4、U1不良问题引起的;(功率控制器)5、JI不良问题引起的;(用射频头接触J1,测量J1的阻值大约在0.6~0.7M左右为正常)6、U13不良问题引起的;7、13MHZ、U17不良问题引起的;8、U16、U18不良问题引起的;9、U4不良问题引起的;10、U21不良问题引起的;(软件问题)E、50039(DCS的TX POWER校准不合格)1、U13 U14、U14 U1的DCS线路;2、4 U14的供电问题;3、J1不良问题引起的;(用射频头接触J1,测量J1的阻值大约在0.6~0.7M左右为正常)4、U13 FL1 U17;5、U16、U18不良问题引起的;(测量其对地阻值是否正常)6、DISP1短路引起的;7、U1、U4不良问题引起的;8、若转换DCS掉电,则TX VCO、U14等相关器件引起的,以及外围电路是否焊接良好;F、5002411、5002413、5002431(GSM频率较准检查)1、U1 U17 U16、U18 U14不良问题引起的;(5002411)2、U4 13MHZ U17不良问题引起的;(5002413)G、5002531(DCS的频率较准检查)1、U17 U16不良问题引起的;联发平台:不入软件位:1、U200不良,U100 U200的物理通路是否导通;(电流正常,但不入软件)2、U506、DISP1插槽短路、不良引起的;(电流有短路现象)3、U207、U208、U201贴反、短路、不良引起的;(开机电流大约在200mA左右)5、U100的外围电路以及相关的电阻、电容是否阻值正常;6、U300 C310 BGA的供电线路;7、U300 L501 IC的供电线路;8、开机键U306 U300的供电线路;(U306的引脚1对地电阻170K欧姆左右)9、U504不良;(无26M基准时钟信号会引起不开机)(串口线路:尾插、U208 U100)校准位A、C1.3(ADC的校准):1、RN301不良引起的;(RN301右边的4个引脚的对地电阻正常值为50k欧姆左右)2、U100不良引起的;B、C1.4(AFC的测量、校准):1、U504 U506,X100不良问题引起的;(能呼叫网络的情况)1、U100不良;(开机时电流静止不动)2、U506不良;(开机时电流正常跳动)C、C3.5、C5.5 (GSM、DCS中间信道发射功率):1、U502虚焊问题引起的;2、U506不良;(能呼叫网络、掉线的情况)3、U502不良;(能呼叫网络、功率过大的情况)D、C4.3、C6.3(GSM、DCS接受功率校准):1、U502虚焊问题引起的;2、U506不良;(能呼叫网络、功率过低的情况)3、U510 R330 U507,R330不良;(开机电流达不到呼叫网络的要求)二、逻辑部分讲解A、这部分电路要正常工作需要满足以下条件:1、13MHZ晶振信号要正常工作,2、电源IC的供电电压要正常工作,3、程序存储器FLASH和基带IC的物理通路能正常工作,4、相关的供电线路能正常工作(没有短路现象和电流异常现象)。
怎么进入高通9008模式
怎么进入高通9008模式高通9008模式,也叫做EDL(Emergency Download Mode),是高通芯片手机的一种特殊模式,用于进行手机固件刷写和修复等操作。
正常情况下,用户是无法通过常规操作进入该模式的,因为进入该模式需要特定的操作及工具。
下面是进入高通9008模式的方法:方法一:使用键盘快捷键1.首先,确保手机已完全关机状态。
2.将手机与电脑连接,使用正确的数据线连接。
3.按住电源键和音量键(通常是音量上键)。
4. 当手机屏幕上出现厂商的标志或者手机震动时,松开电源键但继续按住音量键。
这个时候,手机进入了Bootloader模式。
5. 在Bootloader模式下,使用音量键上下滚动选项,找到"Reboot"或者"Reboot to bootloader"(有些手机可能会显示为"Reboot to bootloader mode")。
6.使用电源键确认选择,手机将重新启动并进入高通9008模式。
方法二:使用ADB命令1.首先,确保手机已连接到电脑,并且ADBUSB驱动已正确安装。
2. 在电脑上打开一个命令提示符窗口,输入以下命令:adb reboot edl3.手机将重新启动并进入高通9008模式。
方法三:使用QFIL工具1.首先,确保手机已关机并且已经连接到电脑。
3.安装完成后,打开QFIL工具。
4. 在QFIL工具界面,点击"Flat Build"选项。
5. 在"Browse"或"Select Programmer"(或类似选项)字段中,选择正确的芯片型号的程序文件。
这个文件通常具有.mbn后缀。
6. 在"Load XML"字段中,选择具有合适分区的xml文件。
这些xml文件通常由固件包提供。
7. 点击"Download"按钮,开始刷写固件。
高通平台自动开机问题
问题现象:
发现一台样机在待机状态拔电池,三分钟后插电池,会自动开机。表象是 1)待机状态拔电池会出现自动开机,亮屏拔电池不会自动开机; 2)拔电池后要过 3min 再插电池会自动开机,拔电池后短时间内插电池不会 自动开机。
问题分析
首先我们确定硬件触发开机的几种方式: 1、KPD_PWR_N 拔电池前后 KPD_PWR_N 均为内部上拉 1.8V。 插电池后 KPD_PWR_N 处电压基本不变,保持 1.8V,所以基本可以排除 KPD_PWR_N 触发开 机。
问题分析
5、RTC 在复现自动开机时,抓 Debug_UART log,在 log 中显示 Pon_reason=4=0b000000100
而这个 Pon_reason 在规格书中定义的寄存器如下表,
而这个 Pon_reason 在规格书中定义的寄存器如下表,
Bits 名字 7 KPDPWR_N 6 CBLPWR_N 5 PON1 4 USB_CHG 3 DC_CHG 2 RTC 1 SMPL
从上图可以得出是 RTC 接受到触发信号导致自动开机了。
问题解决
采取的办法是,插拔电池仍然触发开机,但软件识别到是插电池动作且为 RTC 触发开机的情况时,迅速将开机切断,避免开机,以此规避此问题。
问题分析
2、CBL_PWR_N 该引脚在平台中是处于悬空状态,所以基本可以 排除 CBL_PWR_N 触发开机。
问题分析
3、Charger Insertion 插电池后 VBUS 电压无明显变化,实测如 下,只有小幅(100 多 mV)的电压波动, 所以可以排除 VBUS 触发开机。
问题分析
4、SMPL(Sudden momentary power loss:突然掉电) 这个模块在高通的 modem 里,用处就是:当手机突然短暂的(0.5s-2s)掉电的时候, 会自动重启。一般是当用户不小心将手机掉地上了之类的,电池松动了,导致手机关 机,会自动再开机。 测试把电池拔下迅速插上,可自动开机,该功能正常,可排除。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要:本文试图通过代码来深入剖析Qualcomm手机开机的整个过程,即从按下开机键一直到出现待机界面,Qualcomm的手机软件在整个流程中究竟完成了哪些工作。
本文的主要目标是理清手机的初始化流程,并为今后Amoi定做初始化工作提供一个参考。
关键字:开机、Rex、TMC、ui_task、CoreApp一、开机的简要流程分析Qualcomm的平台软件支持两种启动方式:一种是Nor Flash启动方式,另外一种就是Nand Flash启动方式。
Nor Flash启动方式就相当于硬件直接找到一个入口点开始执行代码,相比较而言会比较简单,且Amoi没有采用此种方式,所以本文对于这种方式不做详细分析。
另外一种就是Nand Flash启动方式,这种方式和PC的启动方式比较相像,也是Amoi采用的Boot方式,下面将详细分析在此方式下面的开机过程。
按下开机键之后,将产生一个时钟中断,从而通知AMSS主芯片的Boot Load硬件去将放置于Nand Flash 上面的第一个Block(8K)里面的Boot代码Copy到内核内存(RAM,这个内存应该是CPU自带的内存,同后面提到的SDRAM有一定区别,可以把它当作CPU的Cache)的0xFFFF0000地址,并开始执行Boot 代码。
Boot的主要任务是完成整个系统的硬件初始化工作(类似于PC上面的BIOS所完成的硬件自检工作,至于Boot的详细工作机制,后文会有详细描述)。
Boot所完成的工作里面,最重要的一件事就是会将整个手机软件代码(AMSS软件包)拷贝到SDRAM中,并最后将控制权交给AMSS软件。
说白了,就是Boot 执行完成之后,代码的执行点将由Boot跳转到AMSS软件的的入口点函数main().(此函数在mobile.c里实现)。
代码运行到了Main()之后,在这个函数里面将完成操作系统(rex)的初始化工作,其实现方法是调用rex_init()。
Rex_init()完成的工作很简单:1.完成操作系统必要的一些数据结构(timer链表、任务链表等))的初始化之外;2.接下来,它创建了三个任务,分别是:rex_idle_task、rex_dpc_task和tmc_task。
Idle任务没什么好解释的,目前这个任务为空,什么也没做,dpc_task目前不知道是做什么的,暂时可以不用管。
前面的这两个任务都属于操作系统层面的,由操作系统来维护,和手机软件关系不大。
哪一个和手机软件关系大呢?答案是:tmc_task。
大家可以把这个当作操作系统的入口(主)任务,也可以把它当作整个手机软件的入口任务。
即AMSS软件里的所有其它任务的创建和维护就是由这个tmc_task来完成的。
到此为止,整个AMSS软件还并没有跑起来,只是跑到了tmc_task里面了。
在tmc_task里面,会调用tmc_init()来完成整个AMSS软件包的初始化工作,其中最重要的一项工作就是调用tmc_define_tasks()将AMSS软件包所有需要的任务都创建起来了。
比如说slee_task、dog_task、cm_task、wms_task、ui_task 等。
这些任务,一般不需要直接和AL层软件打交道,但请大家记住,手机上所有功能的实现最根本点就是由这些服务组件(Service Task)来完成的。
将来大家跟踪一个具体的功能模块时,比如说通话模块,如果需要,可以再去深入研究它的具体实现。
好了,到现在为止,所有的AMSS核心软件就全部跑起来了(手机的功能模块,在软件方面就体现为OS层面的一个任务)。
但现在大家还根本看不到Brew和AEE的影子。
呵呵,各位不要急。
到了这个层面之后,我想稍微多说几句。
最早的Qualcomm平台,比如说5xxx系列,是根本没有Brew的,那个时候的AL(Application Layer)层软件开发,是直接调用底层Service task所提供的API来完成相应的工作的。
从这种角度来看的话,显然那时的开发是比较郁闷和难度较高的。
不过,到了65xx之后,Qualcomm平台引入了Brew,手机开发商就没必要去从这么底层(Service API)的层面进行手机开发了,他们完全可以基于Brew来实现一台手机的所有功能(Qualcomm给我们的参考代码,就是全Brew平台的)。
Brew的运行环境AEE是如何跑起来的呢?关键在于ui_task(),由于ui_task和我们手机开发的关系非常密切,其地位也相当重要,所以,后文我将单独对它进行一个深入的研究与分析。
到目前为止,大家只需要知道ui_task将AEE加载起来了,并且,它起到了一个中间层的作用,即所有AMSS底层服务组件的消息,都将经由ui_task而转到AEE,并最终转到具体的App(Applet)的执行代码里面(HandleEvent())。
注意:1.上述的开机过程,在每一次按开机键都需要走一遍,即关机之后,整个系统的所有功能都将消失,而不像有些手机,看起来是关了机,但实际上底层还是有一些软件模块在跑。
为什么可以肯定地说上述开机过程每次都必须走一遍,原因很简单,因为我们的平台软件是基于Nand Flash启动的,所有的代码都需要Copy到SDRAM才能运行,而关机断电之后,SDRAM里的东东会全部丢失,所以,毫无疑问,上述的过程必须每次开机都执行;2.关机的过程相对比较简单,系统检测到关机中断之后,将调用tmc_powerdown_handler()来完成关机动作,它将把所有AMSS的任务都Stop掉,并最后调用rex_exit()退出Rex,从而完成整个关机动作。
3.显然,关机动作前,如果有必要,每一个任务必须将它希望保存的信息保存到Flash上面,以便下次开机时可以得到这些信息;开机流程简图/p-3853281.html[attach]1237[/attach]说明:1.Tmc是操作系统层面和AMSS软件关系最密切的一个任务,不过需要OEM商在此处修改的地方应该不多;2.ui_task是在操作系统层面,OEM商需要重点研究清楚的一个任务,它是连接底层Task和上层AL的一个中间层,有可能需要加入OEM商的操作流程;3.CoreApp是在Brew层面的一个AL层的入口Applet,它其着管理整个上层AL层软件的作用,根据产品需求,这个App需要定做;4.AEE是整个上层App的运行环境,目前Qualcomm没有公开它的源码,但它的运行机制,Amoi需要好好研究清楚,我将在另外一篇《Qualcomm平台AEE运行机制深入分析与研究》中探讨它的运行机理和调度机制,大家有兴趣可以参考此文;二、Boot代码深入分析Boot代码大部分是用汇编语言写的,也有小部分,可能需要由OEM商修改,所以用C语言来写。
另外,Boot代码属于Driver范围,所以大家可以在drivers/boot目录里面找到相应的代码。
Boot的代码组织得非常模块化,整个boot的入口点是在Boot_function_table.s里面,这个汇编代码里面实际上是将Boot 需要完成的任务封装成了不同的函数,由不同的函数来完成相应的工作,接下来,我将深入分析这些函数所完成的工作,如下所述。
a)mmu_enable_instruction_cache;这个只有在Nand启动模式时才需要,打开ARM的指令Cache.b)boot_hw_ctrl_init此函数主要是完成两条总线(EBI1、EBI2)控制器的初始化,这个函数执行完了之后,系统就可以知道两条总线上连接了哪些设备,同时也可以找得到这些设备,不过,至于单个设备自身的初始化,则不在这里。
[注]这个函数很重要,OEM商如果需要加新的设备到系统中(挂在两条总线上),则需要定做此模块,目前阶段主要是内存。
另外,如前文所述,这个函数是由C语言来写的,主要目的就是为了方便OEM商定做。
内存设备的修改,可以在这个模块里找到相应的数据结构,相对还是比较简单的。
c)boot_hw_tlmm_init1.晶振时钟的初始化;2.中断表的初始化;3.GPIO的初始化;4.Msm本身的驱动,除了EBI2;d)boot_rom_test这个函数非常简单,只是做一个很简单的Rom检查.(比对两个标志位来检查,并没有一块一块地去检查)。
e)boot_ram_testRam自检,具体算法其实也很简单,就是读、写内存以判断是否成功。
f)boot_ram_init1.拷贝手机代码从Nand Flash到SDRAM。
a.Image__BB_RAM__Base:Core Code;b.Image__APP_RAM__Base:App Code;[注]上述动作是分块进行的,原因是因为Qualcomm支持分块Boot Load.2.将Image__ZI_REGION__ZI区域初始化为0;3.初始化OEM要求的动态Heap;4.至于代码段里的数据初始化,直接在Image里就完成了(编译器完成);g)boot_stack_initializeARM栈初始化,主要是为分块代码加载而预留的.h)boot_cache_mmu_initARM Mmu初始化注意:到此为止,整个Boot的工作就告完结了,那么,它又是如何跳到AMSS的main入口点呢?原因很简单,ARM编译器在链接的时候会自动做出一个__rt_entry(),由此函数来完成ARM库函数的初始化,并最后将代码执行点跳转到main()。
而__rt_entry()会在boot_reset_handler.s里调用,具体细节,大家可以不用太过关心,只需要明白,Boot跑完之后,手机软件就跑到了main里就Ok了。
三.Ui_task的深入分析从大的方向来讲,ui_task只完成两件事,一件是必要的初始化工作(这个也是我们所关心的,即ui_task 到底完成了哪些工作);另外一件事就是各种信号量的事件处理,这也是我们比较关心的,即ui_task到底将哪些事件转发给了上层App。
搞清楚了上述两点,我们也就能大致把ui_task的承上启下的工作机理研究清楚。
1.ui_Init;初始化过程中,ui_task主要完成了如下几件事。
a)创建一个用于Kick Watchdog的定时器,这样WatchDog能够及时得到Kick,假如今后发现手机在ui_task里面自动重启,很有可能就是这个定时器的Timeout设置得过短而造成的;b)注册通话相关的回调,主要是和紧急呼叫相关;c)电话本初始化,之所以要进行这个工作,主要是加快开机之后AL层软件操作电话本的速度,但这样将有可能导致开机速度过慢,如果开机速度过慢,可以考虑进入待机界面之后,在后台开一个task去完成这项工作;d)初始化Sound设备;e)向底层服务任务wms_task注册wms回调,这个回调是在IWms组件里实现的。