詳細(xì)說明Android手機(jī)的種種特性
Android作為一個高效的.NET程序語言。其混合了函數(shù)語言和物件導(dǎo)向程序編制語言,并且完美的適用于編程、算法、技術(shù)和探索性開發(fā),因此可以在使用的過程當(dāng)中感受到趣味性和吸引力。
都依賴于include目錄中ril.h頭文件。目前cupcake分支上帶的是gsm的支持,另有一cdma分支,這里分析的是gsm驅(qū)動。GSM模塊,由于Modem的歷史原因,AP一直是通過基于串口的AT命令與BB交互。包括到了目前的一些edge或3g模塊,或像omap這類ap,bp集成的芯片,已經(jīng)使用了USB或其他等高速總線通信。
但大多仍然使用模擬串口機(jī)制來使用AT命令。這里的RIL(Radio Interface Layer)層,主要也就是基于AT命令的操作,如發(fā)命令,response解析等。(gprs等傳輸會用到的MUX協(xié)議等在這里并沒有包含,也暫不作介紹。)
以下是詳細(xì)分析,因為篇幅原因,會以連載形式發(fā)布出來(大概3篇),本文主要涉及基本架構(gòu)和初始化的內(nèi)容,首先介紹一下rild與libril.so以及l(fā)ibrefrence_ril.so的關(guān)系:
1. rild:
僅實現(xiàn)一main函數(shù)作為整個ril層的入口點,負(fù)責(zé)完成初始化。
2. libril.so:
與rild結(jié)合相當(dāng)緊密,是其共享庫,編譯時就已經(jīng)建立了這一關(guān)系。組成部分為ril.cpp,ril_event.cpp。libril.so駐留在rild這一守護(hù)進(jìn)程中,主要完成同上層通信的工作,接受ril請求并傳遞給。
3. librefrence_ril.so:
rild通過手動的dlopen方式加載,結(jié)合稍微松散,這也是因為librefrence.so主要負(fù)責(zé)跟Modem硬件通信的緣故。這樣做更方便替換或修改以適配更多的Modem種類。
它轉(zhuǎn)換來自libril.so的請求為AT命令,同時監(jiān)控Modem的反饋信息,并傳遞回libril.so。在初始化時, rild通過符號RIL_Init獲取一組函數(shù)指針并以此與之建立聯(lián)系。
4. radiooptions:
radiooptiongs通過獲取啟動參數(shù), 利用socket與rild通信,可供調(diào)試時配置Modem參數(shù)。
接下來分析初始化流程,主入口是rild.c中的main函數(shù),主要完成三個任務(wù):
1. 開啟Android中的event機(jī)制, 在RIL_startEventLoop中,是最核心的由多路I/O驅(qū)動的消息循環(huán)。
2. 初始化librefrence_ril.so,也就是跟硬件或模擬硬件modem通信的部分(后面統(tǒng)一稱硬件), 通過RIL_Init函數(shù)完成。
3. 通過RIL_Init獲取一組函數(shù)指針RIL_RadioFunctions, 并通過RIL_register完成注冊,并打開接受上層命令的socket通道。
每個ril_event結(jié)構(gòu),與一個fd句柄綁定(可以是文件,socket,管道等),并且?guī)б粋€func指針去執(zhí)行指定的操作。具體流程是: ril_event_init完成后,通過ril_event_set來配置一新ril_event,并通過ril_event_add加入隊列之中(實際通常用rilEventAddWakeup來添加)。
add會把隊列里所有ril_event的fd,放入一個fd集合readFds中。這樣ril_event_loop能通過一個多路復(fù)用I/O的機(jī)制(select)來等待這些fd, 如果任何一個fd有數(shù)據(jù)寫入,則進(jìn)入分析流程processTimeouts(),processReadReadies(&rfds, n),firePending()。
后文會詳細(xì)分析這些流程,另外我們可以看到, 在進(jìn)入ril_event_loop之前, 已經(jīng)掛入了一s_wakeupfd_event, 通過pipe的機(jī)制實現(xiàn)的, 這個event的目的是可以在一些情況下,能內(nèi)部喚醒ril_event_loop的多路復(fù)用阻塞。
比如一些帶timeout的命令timeout到期的時候。至此第一個任務(wù)分析完畢,這樣便建立起了基于event隊列的消息循環(huán),稍后便可以接受上層發(fā)來的的請求了(上層請求的event對象建立,在第三個任務(wù)中)。
【編輯推薦】