为了3Gx项目正常power on,简单整理了工厂板子上电到telephone基本功能验证的基本流程。希望基于整理的内容,在遇到实际问题的时候,能够快速定位出当前板子卡在那一步,便于下面进一步定位解决。
我这边整理内容分为两个部分:
1. 系统启动流程
2. Telephone模块基本功能验证步骤
下面是详细内容:
一、系统启动流程
1. bootloader启动:引导过程可归纳为:CPU加载BIOS,BIOS加载内核引导程序,内核引导程序加载压缩内核,压缩内核加载解压内核
· CPU自身初始化:
CPU自身的初始化是引导过程的第一步,如果有多个CPU,即多处理器系统,则每个CPU都要进行自身初始化。接下来,CPU从某个固定位置(一般是0Xfffffff0)取得指令并执行。该指令为跳转指令,跳转到BIOS代码的首部
· BIOS
BIOS被固化于主板上一个容量相对较小的只读存储器(Read-OnlyMemory,ROM)中,它的工作主要有两个:加电自检,即进行所谓的POST(Power OnSelf Test);加载内核引导程序
· 内核引导程序
比如u-boot,将Linux内核映像加载到内存中并执行,并将控制权转交给内核
· Linux内核
内核映像被加载到内存并获得控制权之后,内核阶段开始工作。通常,内核映像以压缩形式存储,并不是一个可执行的内核。因此,内核阶段的首要工作是自解压内核映像
最后,init/main.c中的start_kernel函数被调用,进入体系结构无关的内核部分
2. kernel启动:内核的初始化过程由start_kernel函数开始,至第一个用户进程init结束,调用了一系列的初始化函数对所有的内核组件进行初始化。其中start_kernel、rest_init、kernel_init、init_post等4个函数构成了整个初始化过程的主线
· start_kernel:
从start_kernel函数开始,内核即进入了C语言部分,它完成了内核的大部分初始化工作
1) init_IRQ:初始化系统中所有的中断描述结构数组
2) softirq_init:内核的软中断机制初始化函数
3) console_init:初始化系统的控制台结构
4) profile_init:对系统剖析做相关初始化,系统剖析用于系统调用
5) vfs_caches_init:
6) mem_init:内存初始化
· rest_init:
创建两个线程:1号和2号线程
· kernel_init:
注册系统设备的驱动程序,并调用init_post函数启动用户空间的init进程
· init_post:
寻找和启动init程序
init进程是linux起来之后启动的第一个用户进程,android系统也就是在这个进程的基础上启动的。进程号是1
3. android启动
· init进程
1) 重新设置子进程终止时信号SIGCHLD的处理函数
2) 将kernel启动过程中建立好的文件系统框架mount到相应目录
3) open_devnull_stdio:将init进程的标准输入、输出、出错设备设置为新建的设备节点/dev/__null__
4) 读取并解析rc配置文件:init.rc
· init中启动的各种服务:
1) 一些基本服务:vold、netd、usbd、adbd、debuggerd、media、bt、wifi等
2) Servicemanager:这个服务管理着系统内所有binderservices
3) Zygote:这是一个非常重要的服务app_process。startAndroid Java Runtime and start systemserver
4) Rild:telephone相关功能后台服务
5) Modem相关服务:sockcli、socksrv、ril-daemon等
· Zygote:这个进程起来才会建立起真正的Android运行空间,初始化建立的Service都是Navtiveservice
AndroidRuntime:c++到java,会新建并启动一个虚拟机实例来执行ZygoteInit
ZygoteInit:fork一个子进程来启动systemserver,父进程就作为真正的孵化进程存在了,每当系统要求执行一个 Android应用程序,Zygote就会收到socket消息FORK出一个子进程来执行该应用程序
Systemserver:启动android管理服务,如ActivityManager、Power Manager、 PackageManager、NetworkManagement、Connectivity、Mount、Notification等
· 启动home界面启动
二、Telephone模块基本功能验证步骤
1. bootloader启动,如果有问题需要查看串口log
2. kernel启动,开始打印aplog
· kernel启动打印pid =0 KERNEL log:
01-02 09:48:21.000 0 0 I KERNEL : [ 0.000000] logger: register logcat console
· 运行到Android启动,打印log:
---------beginning of system
01-0209:48:31.579 162 162 I Vold : Vold 2.1 (the revenge) firing up
3. Modem正常:
· 连接phonetool工具,正常发送AT指令,回应OK
· MSM模块:
01-02 09:48:31.489 164 164 D MSM : intMEH++
01-0209:48:36.529 164 517 D MSM : pingModemRsp OK received
01-0209:48:40.539 164 164 D MSM : handleClientEvents state --> E_MODEM_UP
4. Imei修改:
连接phonetool工具,成功修改imei
5. 确认RADIO POWER ON ,正常获取到BASEBAND、IMRI信息,
01-22 02:32:19.271 1561 1561 D RILJ : [3664]>RADIO_POWER on [SUB0]
01-22 02:32:19.287 1561 2286 D RILJ : [3664]<RADIO_POWER [SUB0]
…
01-22 02:32:19.801 1561 1561 D RILJ : [3669]>BASEBAND_VERSION [SUB0]
01-22 02:32:19.803 1561 1561 D RILJ : [3670]>GET_IMEI [SUB0]
01-22 02:32:19.805 1561 1561 D RILJ : [3671]>GET_IMEISV [SUB0]
01-22 02:32:19.808 1561 2286 D RILJ : [3669]<BASEBAND_VERSION ASU_SF_3GR_MAINT_01.1603.03 [SUB0]
01-22 02:32:19.927 183 994 D RPC-RIL : IMEI NUM = 004999010641230
01-22 02:32:19.927 183 994 D RPC-RIL : IMEISV NUM = 00
01-22 02:32:19.928 1561 2286 D RILJ : [3670]<GET_IMEI [SUB0]
01-22 02:32:20.019 1561 2286 D RILJ : [3671]< GET_IMEISV [SUB0]
6. 确认CS/PS注网成功,通过下面status来查看CS/PS网络注册状态
· CS registration status:
RILJ : [3789]> VOICE_REGISTRATION_STATE [SUB0]
RPC-RIL : net_read_cs_registration_status: status = 1 lac = 43021cellid = 13349839 net_act = 15,cs_registration_reject_cause = 17, sim_id = 0
RILJ : [3789]< VOICE_REGISTRATION_STATE {1, a80d, cbb3cf, 15, 11, null, null, null, null, null, null, null, null, 0, 1d8} [SUB0]
· PS registration status:
RILJ : [3788]> DATA_REGISTRATION_STATE [SUB0]
RPC-RIL : net_read_ps_registration_status: ps_status = 1, lac =43021, cellid = 13349839, net_act = 15, sim_id = 0
RILJ : [3788]< DATA_REGISTRATION_STATE {1, a80d, cbb3cf, 15, 255, 2} [SUB0]
注(返回结果以及参数说明):
· VOICE_REGISTRATION_STATE返回结构:
typedefstruct
{
char* pszStat;
char* pszLAC;
char* pszCID;
char* pszNetworkType;
char* pszBaseStationID;
char* pszBaseStationLat;
char* pszBaseStationLon;
char*pszConcurrentServices;
char* pszSystemID;
char* pszNetworkID;
char* pszTSB58;
char* pszPRL;
char* pszDefaultRoaming;
char* pszReasonDenied;
char*pszPrimaryScramblingCode;
} S_ND_REG_STATUS_POINTERS, *P_ND_REG_STATUS_POINTERS;
· DATA_REGISTRATION_STATE返回结构:
typedefstruct
{
char* pszStat;
char* pszLAC;
char* pszCID;
char* pszNetworkType;
char* pszReasonDenied;
char* pszNumDataCalls;
} S_ND_GPRS_REG_STATUS_POINTERS, *P_ND_GPRS_REG_STATUS_POINTERS;
· pszStat参数说明:
public static final int RIL_REG_STATE_NOT_REG= 0;
public static final intRIL_REG_STATE_HOME = 1;
public static final intRIL_REG_STATE_SEARCHING = 2;
public static final intRIL_REG_STATE_DENIED = 3;
public static final intRIL_REG_STATE_UNKNOWN = 4;
public static final intRIL_REG_STATE_ROAMING = 5;
public static final intRIL_REG_STATE_NOT_REG_EMERGENCY_CALL_ENABLED = 10;
public static final intRIL_REG_STATE_SEARCHING_EMERGENCY_CALL_ENABLED = 12;
public static final intRIL_REG_STATE_DENIED_EMERGENCY_CALL_ENABLED = 13;
public static final int RIL_REG_STATE_UNKNOWN_EMERGENCY_CALL_ENABLED= 14;
· pszNetworkType参数说明:
typedef enum RAT
{
RAT_UNKNOWN = 0, /**< Unknow RAT */
RAT_GPRS = 1, /**< GPRS RAT */
RAT_EDGE = 2, /**< EDGE RAT */
RAT_UMTS = 3, /**< UMTS RAT */
RAT_IS95A = 4, /**< IS95A RAT */
RAT_IS95B = 5, /**< IS95B RAT */
RAT_1xRTT = 6, /**< 1xRTT RAT */
RAT_EVDO_0 = 7, /**< EVDO 0 RAT */
RAT_EVDO_A = 8, /**< EVDO A RAT */
RAT_HSDPA = 9, /**< HSDPA RAT */
RAT_HSUPA = 10, /**< HSUPA RAT */
RAT_HSPA = 11, /**< HSPA RAT */
RAT_EVDO_B = 12, /**< EVDO B RAT */
RAT_EHRPD = 13, /**< EHRPD RAT */
RAT_LTE = 14, /**< LTE RAT */
RAT_HSPAP = 15 /**< HSPA+ RAT */
#if defined(ANDROID_JB) ,
RAT_GSM = 16 /**< GSM RAT, only supportsvoice */
#endif
}T_RAT;
7. 查看sim卡状态,判断是否READY状态
01-22 02:32:20.795 1561 1561 D RILJ : [3690]>GET_SIM_STATUS [SUB0]
01-22 02:32:20.811 183 994 D RPC-RIL : sim_request_read_pin: SIM READY
01-22 02:32:20.814 1561 2286 D RILJ : [3690]<GET_SIM_STATUS IccCardState {CARDSTATE_PRESENT,PINSTATE_UNKNOWN,num_apps=1,gsm_id=0{APPTYPE_USIM,APPSTATE_READY,pin1=PINSTATE_DISABLED,pin2=PINSTATE_ENABLED_NOT_VERIFIED},cdma_id=-1,ims_id=-1}[SUB0]
8. 验证Phone基本功能
· MO CALL,用户主动发起DIAL请求
01-22 10:33:38.026 1561 1561 D RILJ : [3906]> DIAL[SUB0]
01-22 10:33:38.119 1561 2286 D RILJ : [3906]<DIAL [SUB0]
· MT CALL收到modem上报来来电电铃声消息
RILJ : [UNSL]< UNSOL_CALL_RING
· 挂断和接通操作
01-22 10:33:45.859 1561 1561 D RILJ : [3915]> HANGUP1 [SUB0]
01-22 10:33:45.873 1561 2286 D RILJ : [3915]<HANGUP [SUB0]
RILJ : [3789]> ANSWER
RILJ : [3789]< ANSWER
9. SMS RILJ关键log:
· 发送SMS:
RILJ : [3789]> SEND_SMS
RILJ : [3789]< SEND_SMS
· 接收SMS:
RILJ : [UNSL]< UNSOL_RESPONSE_NEW_SMS
10. MMS & Data RILJ关键log
01-22 10:33:03.425 1561 2294 D RILJ : [3847]>SETUP_DATA_CALL 3 0 3gnet 0 IP [SUB0]
01-22 10:33:04.862 1561 2286 D RILJ : [3847]<SETUP_DATA_CALL DataCallResponse: {version=6 status=0 retry=-1 cid=1 active=2type=IP ifname=veth0 mtu=0 addresses=[10.53.153.75]dnses=[210.22.70.3,210.22.84.3] gateways=[10.53.153.1] pcscf=[]} [SUB0]
注:结构和参数说明
· 发送结构以及参数说明
struct PdpData
{
char* szRadioTechnology;//表示网络类型,
char* szRILDataProfile;
char* szApn;
char* szUserName;
char* szPassword;
char* szPAPCHAP;
char* szPDPType;
};
参数值(当前取值)分别为:
stPdpData.szRadioTechnology = ((char**)pData)[0]; //3这些值都是从前面找网中得到的参数
stPdpData.szRILDataProfile =((char**)pData)[1]; //0
stPdpData.szApn = ((char**)pData)[2]; //3gnet
stPdpData.szUserName = ((char**)pData)[3]; //
stPdpData.szPassword = ((char**)pData)[4]; //
stPdpData.szPAPCHAP = ((char**)pData)[5]; //0
stPdpData.szPDPType = ((char**)pData)[6]; //IP //apn协议
stPdpData.szRadioTechnology的取值范围,这个值需要减2,对应下面的网络类型
public static final int RIL_RADIO_TECHNOLOGY_UNKNOWN= 0;
public static final intRIL_RADIO_TECHNOLOGY_GPRS = 1;
public static final intRIL_RADIO_TECHNOLOGY_EDGE = 2;
public static final intRIL_RADIO_TECHNOLOGY_UMTS = 3;
public static final int RIL_RADIO_TECHNOLOGY_IS95A= 4;
public static final int RIL_RADIO_TECHNOLOGY_IS95B= 5;
public static final int RIL_RADIO_TECHNOLOGY_1xRTT= 6;
public static final int RIL_RADIO_TECHNOLOGY_EVDO_0= 7;
public static final int RIL_RADIO_TECHNOLOGY_EVDO_A= 8;
public static final int RIL_RADIO_TECHNOLOGY_HSDPA= 9;
public static final intRIL_RADIO_TECHNOLOGY_HSUPA = 10;
public static final int RIL_RADIO_TECHNOLOGY_HSPA= 11;
public static final int RIL_RADIO_TECHNOLOGY_EVDO_B= 12;
public static final int RIL_RADIO_TECHNOLOGY_EHRPD= 13;
public static final intRIL_RADIO_TECHNOLOGY_LTE = 14;
public static final int RIL_RADIO_TECHNOLOGY_HSPAP= 15;
public static final intRIL_RADIO_TECHNOLOGY_GSM = 16;
stPdpData.szRILDataProfile的取值
/** Data profile forRIL_REQUEST_SETUP_DATA_CALL */
public static final intDATA_PROFILE_DEFAULT = 0;
public static final intDATA_PROFILE_TETHERED = 1;
public static final intDATA_PROFILE_IMS = 2;
public static final intDATA_PROFILE_FOTA = 3;
public static final intDATA_PROFILE_CBS = 4;
public static final intDATA_PROFILE_MMS = 5;
public static final intDATA_PROFILE_SUPL = 6;
public static final intDATA_PROFILE_HIPRI = 7;
public static final intDATA_PROFILE_OEM_BASE = 1000;
· 返回结构以及参数说明
/*
* Returned byRIL_REQUEST_SETUP_DATA_CALL, RIL_REQUEST_DATA_CALL_LIST
* andRIL_UNSOL_DATA_CALL_LIST_CHANGED, on error status != 0.
*/
typedef struct {
int status; /* A RIL_DataCallFailCause, 0 which isPDP_FAIL_NONE if no error */
int suggestedRetryTime; /* If status!= 0, this fields indicates the suggested retry
back-off timer value RILwants to override the one
pre-configured in FW.
Theunit is miliseconds.
Thevalue < 0 means no value is suggested.
Thevalue 0 means retry should be done ASAP.
Thevalue of MAX_INT(0x7fffffff) means no retry. */
int cid; /* Context ID, uniquely identifies thiscall */
int active; /* 0=inactive, 1=active/physical linkdown, 2=active/physical link up */
char * type; /* One of the PDP_type values in TS27.007 section 10.1.1.
For example, "IP","IPV6", "IPV4V6", or "PPP". If status is
PDP_FAIL_ONLY_SINGLE_BEARER_ALLOWED this is the type supported
such as "IP" or "IPV6" */
char * ifname; /* The network interface name */
char * addresses; /* A space-delimited list of addresses withoptional "/" prefix length,
e.g., "192.0.1.3" or "192.0.1.11/16 2001:db8::1/64".
May not be empty, typically 1 IPv4 or 1 IPv6 or
one of each. If the prefix length is absent the addresses
are assumed to be point to point with IPv4 having a prefix
length of 32 and IPv6 128. */
char * dnses; /* A space-delimited list of DNS serveraddresses,
e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1".
May be empty. */
char * gateways; /* A space-delimited list of default gatewayaddresses,
e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1".
May be empty in which case the addresses represent point
to point connections. */
} RIL_Data_Call_Response_v6;