Avatar

终端第一次开机,应将终端IMEI,厂商名称,终端型号,软件版本以短信方式上传到终端管理(DM)平台。终端发送短信的特服号码和端口号在DM 管理生命周期中不可变。终端第一次开机发送自注册信息后,转入手机正常开机后的空闲状态。

如果终端收到来自终端管理(DM)平台特服号码的短信,正确解析短信,从短信中得到成功的信息,则终端纪录此次注册成功的SIM 卡的IMSI 信息到终端某个预先确定的位置,(这个位置的数值应是终端自注册功能专用的标记位,终端其他部分不能修改此值。)以便终端可以在下次开机的时候检测此IMSI。

此后,每次终端重新启动,都应检测SIM 卡的IMSI 与保存在终端中的IMSI 是否一致,如果不一致,则终端应重新向平台侧发送自注册信息更新对应信息。

终端只向预制的DM 平台的短信特服号码和端口号发送信息,并只认为来自这个特服号码的短信是可以信任的DM 信息。终端自注册短信(上行)及DM 平台确认短信(下行)均为为带端口号的短信。

终端自注册时应判断SIM 卡是中国移动的SIM 卡,否则终端不发送任何信息。

终端网络参数配置应通过OMA DM 方式设置,平台侧使用get 命令将终端参数收集到平台侧后,平台侧经过分析和诊断,判断参数配置是否有误,及错误点,平台使用DM 的Replace 命令更新错误配置值。平台侧也可以不收集参数而直接使用Replace 命令更新参数设置。

DM 平台侧发起终端固件除错和功能升级更新操作,该操作使用标准的OMA FUMO 对象。为实现断点续传功能,推荐使用OMA DL 协议下载更新数据包,升级状态必须使用DM 方式报告给平台侧。

平台侧主动发起的固件升级FOTA基本流程如下:
a) 平台侧发起,通过短信提示用户现在有新版本的软件包, 询问用户是否下载升级;
b) 如下载应出现一个状态条, 提示用户下载进度状态;
c) 如果下载中断, 提示用户是否继续下载;
d) 下载完成后, 提示用户是否立即升级或稍后升级.;
e) 如果选择稍后升级,用户下次开机时终端自动升级;
f) 如果选择立即升级, 用户手机重启, 接着进行终端软件升级;
g) 升级,过程中显示升级进度状态条;
h) 升级成功后, 手机重新启动到正常开机状态;
i) 终端上报升级完成的信息;

新版本的软件包的下载必须支持断点续传,终端更新过程中掉电,再次开机,终端应返回断电前的更新现场,继续更新,直到更新完成。

Tagged with: , , .
Avatar

终端管理(DM)平台是基于OMA 国际标准的移动数据增值业务,开放性与标准化是DM 业务系统赖以生存发展的基础。支持DM 业务的终端产品应同样符合这一原则,基于业界开放式标准,包括各种网络协议、内容格式,并且要体现良好的扩展性和互操作能力。

主要涉及的标准及其协议有
中国移动GPRS移动终端规范,CMPP协议,SyncML,OMA,OTA,WAP.

终端管理(DM)业务是中国移动用于管理用户终端的新业务,它使得中国移动实现了通过无线方式对移动终端进行远程管理的能力。终端管理业务一阶段应包括:终端自注册,软件补丁修复和功能升级,终端参数收集以及终端参数配置。

如终端出现软件故障或参数配置问题,用户无须前往维修中心进行诊断和软件更新,而是通过终端管理(DM)平台提供的服务进行远程终端诊断,通过无线方式下载终端软件补丁程序或执行自动远程设置即可解决终端软件故障和参数配置问题。使用终端管理业务平台,手机业务参数的设置以及新的终端软件版本的下载升级也可通过DM 平台的用户自服务门户,由用户自行完成相关参数设置和软件升级,极大的方便了用户对终端的使用。

中国移动的未来新业务部署工作,可以通过在原有终端上推送新版本的软件完成,避免了过去为了支持新业务给中国移动和用户带来的各种不便,同时也利于中国移动迅速推广新业务。使用终端管理(DM)平台,中国移动可以对终端的界面进行更新,辅助用户实现个性化终端设置。这将还有助于树立中国移动品牌形象,提升用户满意度。终端管理(DM) 平台的业务分析统计功能,通过分析终端厂商上传的终端能力信息和无线方式收集的终端其他信息,可用于中国移动的业务分析和经营决策。

终端通过终端自注册,将终端的基本信息上报到终端管理(DM)平台。终端管理(DM)平台使用OMA DM 协议对终端的参数进行配置。通过OMA DM1.1.2 协议实现了终端信息与终端管理(DM)平台的信息同步和信息发现过程,以及对终端的远程无线方式的参数收集和参数配置功能。终端管理(DM)平台使用OMA FUMO 规范,实现终端软件补丁修复和功能升级。

终端自注册成功后,移动用户可以通过多种方式使用终端管理服务。
网络侧发起,对终端进行批量参数设置、参数收集或软件除错或功能升级;
移动用户通过登录用户自服务网站,通过DM 平台触发终端管理业务;
移动用户通过手机DM WAP Portal,触发终端管理业务;
通过终端侧发起的DM 服务;(二阶段)

Tagged with: , , .
Avatar

直接通过一个例子来解释。
-c /* Autoinitialize variables at runtime */
在代码中可以使用scatter file中的符号。

以下这个MEMORY字段是这个系统的整体上划分。包括系统的flash,片外ram,片内ram,还有也表明了已经固化的ROM的地址及其长度。

MEMORY
{
/* Secure Boot ROM */
BOOT_MEM (RXI)  : org = 0×00000000   len = 0×00100000
名称(属性) 要固定的起始地址  长度。
/* CS0: External SRAM 2 Mbytes */
D_MEM0   (RW)  : org = 0×00400000   len = 0×002d0000

/* code Area */
P_MEM0   (RXI) : org = 0×06000000   len = 0×00210000
P_MEM1   (RXI) : org = 0×06210000   len = 0×001f0000
P_MEM2   (RXI) : org = 0×06400000   len = 0×00080000
P_MEM3   (RXI) : org = 0×06480000   len = 0×00180000

/* resource Area */
R_MEM      (RXI)  : org = 0×06600000   len = 0×00200000

/* FFS Area  */
FFS_MEM  (RI)  : org = 0×06800000   len = 0×00800000

S_ROM   (RXI) : org = 0×08050000   len = 0×00030000

/* Allocate memory for MIDI and JPEG */

/* CS6: Calypso+ Internal SRAM 320 kbytes */
/* Code & Variables Memory */
S_MEM    (RXW) : org = 0×08000000   len = 0×00037560 /*0×0004FB60*/
}

-heap 0×10000    /*HEAP AREA SIZE*/
Heap是留给系统实时库使用的空间。

SECTIONS字段是对MEMORY中各个段的详细描述。

SECTIONS
{
/* Entry point of the Firmware */
.start   : {} > 0×06000000
.start是使用预处理指定定义的一个标识,代码中是
.sect “.start”
这里将其地址固定在0×06000000处。

/*
*  Interrupt vector re-mapping management
*/
.intload : {} > 0×06000004
.indint  : {} load = 0×06000008, run = 0×0800000C
.indint的代码储存在flash中的地址也就是load的地址是0×06000008,但是可以通过run = 0×0800000C来实现其在ram运行,在ram中的地址是0×0800000C,链接器在link时对该处使用在ram中的地址来进行链接。

.inttext : {} > P_MEM0     /* int.s Code */

.bss_dar : > D_MEM0        /* DAR SWE Variables */
{
$(BSS_DAR_LIB)
}
名称为BSS_DAR_LIB的lib的bss,也就是全局变量放入到D_MEM0,而且他们有一个标识.bss_dar
.bss     : > D_MEM0        /* Global & Static Variables */
{
$(BSS_BOOT_LIB)
}
.bss是编译器默认的全局变量的名称。以上一段是将名称为BSS_BOOT_LIB的lib中的全局变量放入到D_MEM0中。
Read the rest of this post »

Tagged with: , .
Avatar

scatter-loading机制允许我们通过scatter file将image中的各个区域指定到特定的地址上。其实对于一个特定的系统,这个也是必须的,因为每个系统的片选地址是不一样的。

以下这个简单的例子中,flash的开始地址是0×0000,其长度为0×8000,用于存放code和各种Read-Olny数据。RAM的起始地址是0×10000,其可用大小为0×6000,用于存放Read-Write数据。

Load和Run时的情况如下

我们也可以通过类似bootarm.obj (C$$code,+First)的格式,来手动指定特定c文件中特定部分(使用预处理指令命名,例子中为C$$code)出现在该段的最前面(+First)或最后面(+Last)。
当然scatter file支持更加复杂的应用,比如多个load rom,内存共用,代码在ram中执行等等…

使用scatter file会对应生成一些与之相对应的符号(symbols)。这些符号是可以在我们的代码中进行引用的。生成的符号及其意义如下:
Load$$region_name$$Base                 Load address of the region.
Image$$region_name$$Base               Execution address of the region.
Image$$region_name$$Length            Execution region length in bytes (multiple of 4).
Image$$region_name$$Limit               Address of the byte beyond the end of the execution region.
Image$$region_name$$ZI$$Base         Execution address of the ZI output section in this region.
Image$$region_name$$ZI$$Length      Length of the ZI output section in bytes (multiple of 4).
Image$$region_name$$ZI$$Limit         Address of the byte beyond the end of the ZI output section in the execution region.
在我们的代码中使用如下例子。
IMPORT ||Image$$region_name$$ZI$$Limit||
__user_initial_stackheap
LDR r0, =||Image$$region_name$$ZI$$Limit||
MOV pc, lr

Tagged with: .
Avatar

一般一个ARM系统的boot过程是这样的。首先ARM在上电后直接跳转到0地址,在这个地址上存放的是系统的启动代码。系统开始执行时一般会先设置DPLL和clock,然后进行片选,接着将需要放到ram中代码手动copy到ram中,设置EMI等系统必要参数,设置ARM各个模式的系统堆栈,切回SVC模式进行操作系统初始化。
以下是一个实际的基于ARM平台的一个bootloader示例。
编译环境:ADSv1.2
Read the rest of this post »

Tagged with: , .
Avatar

典型的手机ic由以下几部分组成
The Digital Base Band structure
The Radio Frequency Sub-System
The RF Sub-System Wrapper

这部分主要由MCU部分,DSP部分,外设GPIO,数据总线等部分组成。

Read the rest of this post »

Tagged with: , , .
Avatar

在我的wordpress中,根据饭否提供的api,使用php写了一个读取饭否最新的一条消息。为什么不用饭否的wordpress插件呢?因为我只需要简单的读取,不需要那么复杂的应用。

代码如下

<?php
$url = 'http://api.fanfou.com/statuses/user_timeline.xml?count=1';
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_USERPWD,"ilived.cn@gmail.com:XXXXXX");
ob_start();
curl_exec($ch);
curl_close($ch);
$content = ob_get_contents();
ob_end_clean();
preg_match("#<text>(.*?)</text>#s",$content,$matches);
?>

其中$matches[0]就是最新的消息文本。

例子见右边的About Me

Tagged with: .
Avatar

在Nucleus中timer的创建函数是NU_Create_Timer,其定义是

#define         NU_Create_Timer                 TMS_Create_Timer

通过其参数我们就可以看出如何设置一个timer。

STATUS  TMS_Create_Timer(NU_TIMER *timer_ptr, CHAR *name,
VOID (*expiration_routine)(UNSIGNED), UNSIGNED id,
UNSIGNED initial_time, UNSIGNED reschedule_time, OPTION enable)

timer -> tm_actual_timer.tm_timer_type =    TM_APPL_TIMER;
CSC_Place_On_List(&TMD_Created_Timers_List, &(timer -> tm_created));
TMD_Total_Timers++;

创建一个timer是很容易看懂的,我们主要分析timer时间到了之后的系统流程。

在TI平台中使用一个硬件晶振产生中断来作为系统的定时器,每次中断间隔时间作为操作系统的一个tick,也就是一个时间片。当中断发生时也就是产生了一个irq,在以前的irq流程中分析中我们可以知道每个irq都有一个自己的处理函数。在ti的平台的这个函数中我们可以发现如下代码

TMT_Timer_Interrupt();

这个函数就是Nucleus timer的接口函数,在这个函数中会检查是否有timer的时间到了,如果有timer active需要进行对应的操作,该函数会激活timer的HISR,这个HISR是在Nucleus初始化时TMI_Initialize函数中创建的。

status =  TCCE_Create_HISR((NU_HISR *) &TMD_HISR, "SYSTEM H",
TMC_Timer_HISR, (OPTION) TMD_HISR_Priority,
TMD_HISR_Stack_Ptr, TMD_HISR_Stack_Size);

在这个HISR的处理函数中,使用timer函数创建的timer的最主要的代码是

/* Determine if the task timer has expired.  */
if (TMD_Timer_State == TM_EXPIRED)

/* Resume the timer task.  */
TMC_Timer_Expiration();

在TMC_Timer_Expiration函数中

id =                  app_timer -> tm_expiration_id;
expiration_routine =  app_timer -> tm_expiration_routine;
//app_timer的tm_expiration_id和tm_expiration_routine就是创建函数TMS_Create_Timer传入的参数。
if (!done)
{

/* Determine which type of timer has expired.  */
if (type == TM_APPL_TIMER)
//类型为TM_APPL_TIMER,也就是task调用timer函数创建的类型。
//调用创建传入的timer超时时需要调用的函数。
/* Call application timer's expiration function.  */
(*(expiration_routine)) (id);
else
//这里是Nucleus进行task的时间片处理的部分。
/* Call the task timeout function in the thread control
function.  */
TCC_Task_Timeout((NU_TASK *) pointer);
}

基本上Nucleus的timer主要流程就是这些了。

« Previous Page