找回密码
 注册
搜索
查看: 4631|回复: 23

[讨论] 手机怎样开机的?很简单但是没人讲清楚

[复制链接]
发表于 2006-3-17 09:23:00 | 显示全部楼层 |阅读模式
什么事情最艰难的就是最开始的那个阶段 就好像生命的起源一样奥秘 手机开机 从最开始的晶振开始到手机开机成功 这期间到底发生了什么呢? 从rom里读出的最开始的一段10101010是怎样肇始的呢? 呵呵 请各位大虾指教
发表于 2006-3-17 11:42:00 | 显示全部楼层
<P>晕倒,这个不好讲,要看手机采用的具体平台和操作系统有关系。如果你告诉我平台和操作系统,那么我给你讲讲好了。这有什么复杂的。</P>
点评回复

使用道具 举报

发表于 2006-3-17 14:42:00 | 显示全部楼层
开机,复位,供电,晶振
点评回复

使用道具 举报

发表于 2006-3-17 19:56:00 | 显示全部楼层
PMU 上电,检测POWER ON(长按),输出电压,各IC上电RESET,RESET完成,走程序[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-3-20 20:39:00 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>aquasnake</I>在2006-3-17 19:56:00的发言:</B>
PMU 上电,检测POWER ON(长按),输出电压,各IC上电RESET,RESET完成,走程序</DIV>


这个比较准确了.
程序是从固定位置开始执行的.
点评回复

使用道具 举报

发表于 2006-4-3 12:12:00 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>aquasnake</I>在2006-3-17 19:56:00的发言:</B>
PMU 上电,检测POWER ON(长按),输出电压,各IC上电RESET,RESET完成,走程序

<P align=right><FONT color=red>+3 RD币</FONT></P></DIV>


不太准确,你的各ic是指哪些?在检测POWER ON后,我们就可以知道程序的流程了,各外设ic的上电、reset、初始化我们是可以控制的,这里就已经是走程序了。当系统电源按下时,系统程序已经开始运行,这是才能检测是否是长按键,如果是philips系统,这部分看的比较清楚!
点评回复

使用道具 举报

发表于 2006-4-3 14:04:00 | 显示全部楼层
<P 0cm 0cm 0pt">第一次登录该论坛,先赚点钱币。</P><P 0cm 0cm 0pt; TEXT-INDENT: 10.5pt; mso-char-indent-count: 1.0">手机开机,系统上电复位,这时候首先要运行一段类似<FONT face="Times New Roman">PC </FONT>的<FONT face="Times New Roman">BIOS</FONT>的<FONT face="Times New Roman">bootloader</FONT>程序。</P><P 0cm 0cm 0pt; TEXT-INDENT: 10.5pt; mso-char-indent-count: 1.0">这段程序在<FONT face="Times New Roman">OS</FONT>执行之前进行,完成基本的硬件初始化,开堆栈等等。总之,为<FONT face="Times New Roman">OS</FONT>的</P><P 0cm 0cm 0pt; TEXT-INDENT: 10.5pt; mso-char-indent-count: 1.0">运行提供必要的环境。然后调入<FONT face="Times New Roman">OS</FONT>,系统才跑到<FONT face="Times New Roman">MAIN</FONT>执行。在主程序里面有多个<FONT face="Times New Roman">task,</FONT>其中一个就是检测<FONT face="Times New Roman">powe key</FONT>是否被长按,如果长按,由该模块再逐一启动其他<FONT face="Times New Roman">task.</FONT></P>BOOTLOADER的过程,可依照本arm的书看看[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-4-3 16:50:00 | 显示全部楼层
有的系统power_on长按检测是由PMU硬件来控制,会有一个中断信号输出到DBB作为POWER_ON INT,这样开机速度会快点
点评回复

使用道具 举报

发表于 2006-4-4 14:07:00 | 显示全部楼层
<P>ARM  堆栈初始化</P><P>ARM    存储片选初始化</P><P>ARM  寄存器初始化</P><P>ARM  地址重定向</P><P>ARM   C 环境初始化 (初始化全局变量,把一些代码拷到RAM区)</P><P>操作系统初始化 (任务创建)</P><P>硬件初始化</P><P>开机条件判断</P><P>开机</P>[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-4-6 12:57:00 | 显示全部楼层
<P>假设手机的最小系统是采用ARM+SDRAM+NAND FLASH,手机上电复位后:</P><P>先把位于FLASH第一个BLOCK里面的BOOTLOADER代码拷贝到SDRAM中,这部分拷贝是由硬件完成</P><P>然后就是在SDRAM中运行这段BOOTLOADER(代码大小不能超过8K),PC指针指向SDRAM中的0xFFFF000开始运行BOOT,完成CPU模式,中断向量,时钟频率,存储器初始化和建立堆栈指针等;</P><P>BOOT完成的最重要的一项工作是把位于FLASH中的映象代码文件拷贝到SDRAM中,并把PC指针指向0x0(reset_handler)处,此时系统的控制权就转到了reset_handler这个中断处理函数中,将系统的控制权交给__rt_entry(),接下来就是运行C代码!进入main()函数,初始化操作系统等等</P><P> </P>[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-4-9 13:12:00 | 显示全部楼层
<P>说说我们的系统(因为不知道你们的系统设计)</P><P>用户按键时,电送入ARM(这里没有PMIC先上电的说法,PMU的控制也是需要程序做的,ARM都没有起来,不知道各位怎么来控制),ARM从0地址取第一条指令,这个指令通常是两种情况之一:1.  循环如干次,现成一定的时延,如果在循环结束前,按键松开,ARM断电。如果循环成功退出,jump到一个高端地址去执行初始化过程 2. 由某种机制把ARM的电始终供上,(在我们的平台上,有个寄存器可以做到这样),然后jump到一个高端地址执行初始化,然后由C程序来判断按键是否还在,是否是长按键,否则关机。</P><P>为什么都要有一个jump到高地址的过程呢? 因为ARM在reset时,从0处取地址,所以Flash最开始时应该映射到此处,但是,根据ARM的要求,前面都是放中断向量表的地方,而flash是比较慢速的设备,我们的系统在0地址处,最终会映射一个Internal SRAM,是单始终周期的,所以,jump以后,就是remap IRAM 到0地址。如果你的系统没有这种映射,那就不需要这个jump。</P><P>好,现在电已经供上了,PC也已经指到合适的位置了,接着,开始根据link制定的方式,把code,data段进行搬移(如果code都是驻留在flash,那只要搬移data段),data段分两种,一种是有初始化值的,这种初始值就来自flash,另外就是那个初始化为0的那些变量所在的data段了,boot代码根据他的长度,在前一个data段的后头,写一段0(段的长度就是所有未初始化变量的长度),然后,设置ARM各种模式下的stack 指针,然后调用C库的初始化函数,最后,jump到OS的初始化代码,最后,OS完成负责系统的启动。</P><P>boot的时候,硬件的初始化做的很少,通常都是设置为没有连接任何外设的状态(GPIO),也不知道OS需要什么样频率的时钟中断,所以,时钟其实也没有去设置,只是设置了ARM的片选参数,比如cs0上memory的read、write的wait 周期数等。最主要的还是代码的搬移,然后jump。</P>[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-4-25 16:38:00 | 显示全部楼层
<P>楼上还是先深入研究硬件的原理吧</P>
<P>开机检测完全是硬件完成的,不关软件任何事情</P>
<P>如果对时域微观分析,可以看到是PMU先起来,然后ARM才上电,然后RESET....
这个时候ARM7TDMI已经工作了
开机和BOOT不要搞混
点评回复

使用道具 举报

发表于 2006-4-26 10:37:00 | 显示全部楼层
<P>楼上的能不能把开机流程说说。</P><P>也是,开机看似很简单,但是想说清楚不容易。</P>
点评回复

使用道具 举报

发表于 2006-4-26 12:27:00 | 显示全部楼层
<P>开机:</P><P>A,   PMU上电,RESET立即输出0</P><P>B,   PMU检测VPWR电压/电流</P><P>    -1,   若在规定允许范围内,内部LDO使能,输出各路电压,RESET延迟一定时间后变1;此时DBB(ARM)已工作,程序BOOT,状态FLAG设为OFF,并进入SLEEP模式等待POW_ON_INT中断唤醒.此虽为关机状态实则SLEEP</P><P>    -2,   若不在额定区域内(欠压\过压\过流),则保护,RESET维持0;此时系统等于断电,PMU输入保护</P><P>C,   若通过B-1,等待POW_ON/OFF_KEY输入0(或1,由不同检测输入口判决)电平,产生开机中断(PWR_ON_INT)至DBB.程序计时...计时到,DBB 检测POW_ON/OFF_KEY(这个键分2路,一路到PMU开机检测,另一路到DBB的KEY ARRAY的GPIO中的一个RTN PIN作为退出/开关机功能键)是否为按下(0)</P><P>       -1,   若是则判决为长按,状态FLAG设为ON,OS开TASK,INITIAL各周边,点亮LCM.....DOWNLOAD SIM卡数据,使能RF,搜网\注册...</P><P>       -2,   若否,则判决为误触发干扰或短按,进入SLEEP</P><P>=======================================================================</P><P>关机:</P><P>STATUS为ON的状态下,POW_ON/OFF_KEY RTN中断后开任务计时, 计时到再获取键值,若仍是POW_ON/ OFF,则状态FLAG设为OFF,保护数据,退出TASK,进入SLEEP</P>[br]<p align=right><font color=red>+5 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-4-29 04:54:00 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>aquasnake</I>在2006-4-26 12:27:00的发言:</B>
<P>开机:</P>
<P>A,   PMU上电,RESET立即输出0</P>
<P>B,   PMU检测VPWR电压/电流</P>
<P>    -1,   若在规定允许范围内,内部LDO使能,输出各路电压,RESET延迟一定时间后变1;此时DBB(ARM)已工作,程序BOOT,状态FLAG设为OFF,并进入SLEEP模式等待POW_ON_INT中断唤醒.此虽为关机状态实则SLEEP</P>
<P>    -2,   若不在额定区域内(欠压\过压\过流),则保护,RESET维持0;此时系统等于断电,PMU输入保护</P>

</DIV>
这是装了电池,不得但还没做别的的情况. PMU进入保护, 不拿掉电池, 能自己恢复吗?
点评回复

使用道具 举报

发表于 2006-4-29 22:11:00 | 显示全部楼层
<P>pc os引导差不多。</P><P>从软件说:有个小小的boot短程序路到main里去引导。</P><P>看一下RTOS方面的资料。</P><P>从硬件来说:PMU 上电,拉高gpio开机键,初始int,RESET IC,</P>
点评回复

使用道具 举报

发表于 2006-4-30 01:06:00 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>aquasnake</I>在2006-4-26 12:27:00的发言:</B>

<P>开机:</P>
<P>A,   PMU上电,RESET立即输出0</P>
<P>B,   PMU检测VPWR电压/电流</P>
<P>    -1,   若在规定允许范围内,内部LDO使能,输出各路电压,RESET延迟一定时间后变1;此时DBB(ARM)已工作,程序BOOT,状态FLAG设为OFF,并进入SLEEP模式等待POW_ON_INT中断唤醒.此虽为关机状态实则SLEEP</P>
<P>    -2,   若不在额定区域内(欠压\过压\过流),则保护,RESET维持0;此时系统等于断电,PMU输入保护</P>
<P>C,   若通过B-1,等待POW_ON/OFF_KEY输入0(或1,由不同检测输入口判决)电平,产生开机中断(PWR_ON_INT)至DBB.程序计时...计时到,DBB 检测POW_ON/OFF_KEY(这个键分2路,一路到PMU开机检测,另一路到DBB的KEY ARRAY的GPIO中的一个RTN PIN作为退出/开关机功能键)是否为按下(0)</P>
<P>       -1,   若是则判决为长按,状态FLAG设为ON,OS开TASK,INITIAL各周边,点亮LCM.....DOWNLOAD SIM卡数据,使能RF,搜网\注册...</P>
<P>       -2,   若否,则判决为误触发干扰或短按,进入SLEEP</P>
<P>=======================================================================</P>
<P>关机:</P>
<P>STATUS为ON的状态下,POW_ON/OFF_KEY RTN中断后开任务计时, 计时到再获取键值,若仍是POW_ON/ OFF,则状态FLAG设为OFF,保护数据,退出TASK,进入SLEEP</P>

<P align=right><FONT color=red>+5 RD币</FONT></P></DIV>


这位老兄估计是搞硬件出生的。本人做底层的。深入研究从按键到RTOS成功调度。
关于你说的硬件部分,前面表示赞同。SW部分你的描述太简单,至少没有说那些变量如何被初始化起来,如何初始值在flash中会到RAM中。关于后部分按键长按的检测机制,我不了解你的系统,不做评论。
你说的也正确,我主要讲了boot,关于硬件的上电过程。我们的系统是这样设计的。
按POWER键,VBatt和PMIC接上,如果电池电压比较高,则LDO输出电压。否则电池需要pre-charge,系统无法启动,这个时候即使有charger连着也无法启动。 如果PMIC认为可以启动(Vbatt高于预充电电压),则输出适当的RESET信号。然后ARM转到RESET向量地址(也就是0地址)。
我们的方案中,POWER键是否长按是靠SW识别的,所以有两种机制,RESET后的jump目标代码立即识别,还是先初始化一段时间后再识别。余下如我上面所述。[br]<p align=right><font color=red>+3 RD币</font></p>
点评回复

使用道具 举报

发表于 2006-4-30 01:18:00 | 显示全部楼层
<P>PMIC 输出电压就是给ARM上电。当然,那时PMIC处于default mode,只有少数几个LDO有输出,其他LDO的输出靠SW控制。RESET信号就是让ARM开始执行,所以ARM的第一条指令一定是从0地址开始的。那时ARM的中断是关闭的,因为reset也是一种异常。所以,在RESET向量处的指令开始执行前,以及在ARM中断被打开前,是无法识别按键中断的。</P>
点评回复

使用道具 举报

发表于 2006-5-23 09:42:00 | 显示全部楼层
<P>跟各位请教:开、关机过程中,SIM卡工作过程及相应时间(大致几秒?)。比如,开机时,何时开始被检出、跟基站建立“附着”需要多长时间;关机时,如何、需要多长时间通知基站?</P><P>多谢!</P>
点评回复

使用道具 举报

发表于 2006-5-25 21:06:00 | 显示全部楼层
<P>A,   PMU上电,RESET立即输出0</P><P>弱弱的问一下不知道PMU是会在什么样的情况下上电?</P>
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-23 07:42 , Processed in 0.050105 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表