高通平臺Driver開發(fā)的參考文檔_第1頁
高通平臺Driver開發(fā)的參考文檔_第2頁
高通平臺Driver開發(fā)的參考文檔_第3頁
高通平臺Driver開發(fā)的參考文檔_第4頁
免費預覽已結(jié)束,剩余34頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、 高通平臺Driver開發(fā)的參考文檔 48e10b2f0a6a09f4afe57f49615ed36b.pdf 版權(quán)說明本文本中所包含的一切信息,包括文字,圖表,數(shù)據(jù),圖形,圖象,方法和思想都是聯(lián)想移動通信科技有限公司財產(chǎn),未經(jīng)聯(lián)想移動通信科技有限公司書面授權(quán),任何個人和組織都無權(quán)透露,拷貝,復制,拍照和傳輸該文本中的一切信息。聯(lián)想移動通信科技有限公司版權(quán)所有 修訂記錄版本作者審核批準日期修改說明1.00Chenljc2009/11/13Create聯(lián)想移動產(chǎn)品開發(fā)部軟件處 - II - 48e10b2f0a6a09f4afe57f49615ed36b.pdf 目 錄第1章 前言31.1 文檔

2、目的及開發(fā)背景31.2 參考文獻31.3 術(shù)語和縮寫解釋3第2章 綜述52.1 高通平臺的硬件架構(gòu)52.2 高通平臺驅(qū)動文件結(jié)構(gòu)62.3 ARM相關知識62.3.1 ARM基本知識62.3.2 ARM存儲器格式9第3章 Driver相關模塊介紹103.1 REX簡介103.2 Boot113.2.1 Nor Boot133.2.2 Nand Boot133.2.3 Boot流程143.3 Gpio153.3.1 GPIO的作用153.3.2 GPIO的用法163.3.3 GPIO注意事項193.4 內(nèi)存管理193.4.1 隊列(Queue)193.4.2 DS存儲池203.4.3 Waterm

3、ark flow control point223.5 Sleep253.5.1 Sleep硬件相關知識253.5.2 Sleep軟件相關知識263.5.3 查Sleep電流方法273.6 SIO283.6.1 SIO模塊的架構(gòu)283.6.2 SIO數(shù)據(jù)處理流程293.7 重啟問題分析303.7.1 軟件狗檢測異常303.7.2 發(fā)生data abort導致重啟313.7.3 指針未初始化引起的系統(tǒng)重啟313.7.4 注意事項32聯(lián)想移動產(chǎn)品開發(fā)部軟件處 - 34 - 第1章 前言1.1 文檔目的及開發(fā)背景本文為高通平臺driver開發(fā)的學習文檔,對部分概念性的東西進行了學習和總結(jié)。由于dri

4、ver的跨度太大,內(nèi)容很多,加上本人水平有限。如有不足之處及遺漏地方,麻煩大家多多包涵!希望這份文檔能對大家學習高通平臺的驅(qū)動開發(fā)有所幫助!1.2 參考文獻序號文檔名稱作者出版單位180-VC881-1&QSC6055&QSC6065 QSC6075 AND QSC6085 SINGLE CHIP DEVICE SPECIFICATIONQualcomm-280-VC881-2&QSC6055,QSC6065, QSC6075,QSC6085 SOFTWARE INTERFACEQualcomm3注:高通提供的文檔比較詳細,各個模塊都有相關文檔!因為文檔提供比較齊全(需

5、要自己去下,對于初學者是個難題),相對來說他的技術(shù)支持不怎么樣!有得必有失!1.3 術(shù)語和縮寫解釋術(shù)語和縮寫解釋DSDATA ServiceSIOSerial Input&Output RDMRuntime Device MappeBTBlue ToothPBLPrimary Boot Loader第2章 綜述2.1 高通平臺的硬件架構(gòu)目前開發(fā)EVDO的手機或模塊大部分采用了QSC6085平臺。高通QSC系列的平臺是高度集成化,它將PMIC、RF相關模塊也集成到一塊芯片里(其他公司很少做到這點),對硬件來說可以省很多事。除了上述特殊模塊之外,當然也包括一般的LCD、KPD、AUDIO

6、CODEC等很多驅(qū)動模塊!具體如下圖所示:QSC6085處理器采用ARM9核+DSP的架構(gòu),一般就不需要再加DSP去處理Audio和圖片。它集成這么多,其他硬件廠商的飯碗都被他搶了,不過這也是大勢所趨!2.2 高通平臺驅(qū)動文件結(jié)構(gòu)在一般高通工程(60X5系列)目錄下有一個Drivers文件夾,在該文件夾下包含了60X5系列平臺上所有驅(qū)動文件,分門別類!從上圖中我們可以看到,每一個驅(qū)動都有獨立的文件夾,這樣對于新手學習代碼來說比較容易找到相關代碼。2.3 ARM相關知識因為高通處理器采用的ARM內(nèi)核,遵循ARM指令,我們有必要學習一下ARM的一些基礎知識。一般驅(qū)動開發(fā)中很少涉及到ARM指令,除了

7、BOOT以及flash開發(fā),大部分都在C語言環(huán)境中開發(fā)。在這部分我講的不會太深入,如果大家想深入了解ARM架構(gòu),可以去看ARM體系結(jié)構(gòu)與編程這本書,相當經(jīng)典!2.3.1 ARM基本知識ARM 采用的是32位架構(gòu)。也就是說ARM CPU內(nèi)部的總線是32位的,每條ARM匯編指令都是32位的指令。一個CPU時鐘周期最多可以處理一條32位指令或者讀取一個32位的數(shù)據(jù)。32位的指令意味著,與8位和16位的CPU相比,在一個時鐘周期內(nèi),指令可以攜帶更多的信息。ARM 有7個基本工作模式:User:非特權(quán)模式,大部分任務執(zhí)行在這種模式正常程序執(zhí)行的模式FIQ:當一個高優(yōu)先級(fast)中斷產(chǎn)生時將會進入這種

8、模式高速數(shù)據(jù)傳輸和通道處理IRQ:當一個低優(yōu)先級(normal)中斷產(chǎn)生時將會進入這種模式通常的中斷處理Supervisor:當復位或軟中斷指令執(zhí)行時將會進入這種模式供操作系統(tǒng)使用的一種保護模式Abort: 當存取異常時將會進入這種模式虛擬存儲及存儲保護Undef: 當執(zhí)行未定義指令時會進入這種模式軟件仿真硬件協(xié)處理器System: 使用和User模式相同寄存器集的特權(quán)模式特權(quán)級的操作系統(tǒng)任務ARM 有37個32-Bits長的寄存器.1 個用作PC( program counter)1個用作CPSR(current program status register)5個用作SPSR(saved

9、program status registers)30 個通用寄存器當前處理器的模式?jīng)Q定著哪組寄存器可操作. 任何模式都可以存?。?相應的r0-r12子集n相應的 r13 (the stack pointer, sp) and r14 (the link register, lr)相應的 r15 ( the program counter, pc)相應的CPSR(current program status register, cpsr)特權(quán)模式 (除system模式) 還可以存??;相應的 spsr (saved program status register)CPSR寄存器表示當前ARM的工

10、作狀態(tài)條件位:N = 1-結(jié)果為負,0-結(jié)果為正或0Z = 1-結(jié)果為0,0-結(jié)果不為0C =1-進位,0-借位V =1-結(jié)果溢出,0結(jié)果沒溢出Q 位:僅ARM 5TE/J架構(gòu)支持,指示增強型DSP指令是否溢出J 位:ARM 5TE/J架構(gòu)支持 J = 1: 處理器處于Jazelle狀態(tài)中斷禁止位:I = 1: 禁止 IRQ.F = 1: 禁止 FIQ.T Bit: T = 0: 處理器處于 ARM 狀態(tài)T = 1: 處理器處于 Thumb 狀態(tài)Mode位(處理器模式位):0b10000User0b10001FIQ0b10010IRQ0b10011Supervisor0b10111Abort0

11、b11011Undefined0b11111System2.3.2 ARM存儲器格式在ARM體系中,每個字單元包含4個字節(jié)單元或者兩個半字單元;一個半字單元中包含兩個字節(jié)單元。但是在字單元中,4個字節(jié)哪一個是高位字節(jié),哪一個是低位字節(jié)則有兩種不同的格式;big_endian格式和little-endian格式。比如一個整型數(shù)0x12345678在內(nèi)存中如下圖所示           -          |

12、    78   | xxxx_0000           -          |    56   | xxxx_0001           -    &

13、#160;    |    34   | xxxx_0002         -        |    12   | xxxx_0003          -     

14、            Little Endian- |    12   | xxxx_0000        -        |    34   | xxxx_0001     

15、;   -        |    56   | xxxx_0002        -       |    78   | xxxx_0003        -  

16、60;            Big Endian第3章 Driver相關模塊介紹3.1 REX簡介雖說目前QSC60x5平臺上采用L4操作系統(tǒng),REX只是L4上面的一個Task。但高通為了開發(fā)的兼容性,提供的API仍然采用老的一套接口(可能內(nèi)部實現(xiàn)不一樣),很容易將老的代碼移植到新的架構(gòu)中。那么我還試必要介紹一下REX。REX是一個操作系統(tǒng)的名字,它是Real-time Executive的縮寫。它是美國的QUALCOMM開發(fā)的,REX是一個簡單的、高效的、搶占式的、多任務

17、的、嵌入式實時操作系統(tǒng)。它最初是為應用于Intel的80186而設計的,如今它已經(jīng)被移植到了ARM微處理器上。下面是它比較重要的幾個概念(其實和其他操作系統(tǒng)一樣):1、 TaskREX把任務當作獨立運作的實體,每一個任務都有自己獨立的堆棧和優(yōu)先級。每個任務都有一個數(shù)據(jù)結(jié)構(gòu),我們稱為“任務控制塊”(TCB)。REX允許在運行時,在任何時間動態(tài)的創(chuàng)建任意數(shù)量的任務。但是創(chuàng)建的任務越多,REX的性能便稍微遞降,這是因為你創(chuàng)建的任務越多,任務列表越長。所以你需要確保你創(chuàng)建的任務數(shù)量盡量小。另外,REX任務的負載量還跟你選擇的處理器有關。下面的圖描述了REX任務的啟動過程:TCB也是一個比較重要的結(jié)構(gòu)體

18、,各個task都有一個全局變量tcb,這個tcb包含了很多重要信息如,任務優(yōu)先級、堆棧指針,信號量等,這些有時對查死機問題很有幫助。2、 任務調(diào)度REX總是選擇處于就緒態(tài)的最高優(yōu)先級的任務進行調(diào)度,如果任務的優(yōu)先級不是唯一的,REX可能選擇任何一個處于就緒態(tài)的最高優(yōu)先級的任務進行調(diào)度。被選擇的任務會一直執(zhí)行,直到它自愿掛起或者中斷發(fā)生而激活了更高優(yōu)先級的任務。 當被掛起的任務的等待條件得到滿足時,該任務就變成了就緒態(tài)。如果所有的認為都掛起的時候,那么空閑認為就被執(zhí)行。 REX提供了一種機制,允許任務可以動態(tài)的提高或降低自己或其它任務的優(yōu)先級。 3、 信號量信號量是任務之間進行通信和同步的橋梁。

19、信號量是REX提供的一種任務間通信的機制。每個任務都有一套與之相關聯(lián)的通用信號量,信號量通常作為任務的TCB的一部分,它們被用來通知任務某種事件的發(fā)生,任務的信號量可以被任何其它任務或中斷設置或清除。 信號量實際上是一種約定機制,在多任務內(nèi)核中普遍使用,信號量用于: 􀁺 控制共享資源的使用權(quán)(滿足互斥條件); 􀁺 標志某事件的發(fā)生; 􀁺 使2個任務的行為同步。 4、 中斷REX是一個可剝奪的內(nèi)核。當從中斷返回的時候,控制權(quán)就被傳遞給處于最高優(yōu)先級的就緒任務,而沒有必要返回到被ISR中斷了的任務處。 一般我們只會掛載GPIO中斷,后續(xù)會介紹。

20、5、 定時器定時器,英文是timer。和其它內(nèi)核一樣,REX要求給用戶提供定時時間,來實現(xiàn)超時控制等功能。REX中有些信號是事件觸發(fā)引起,也可以由timer引起。一旦由于某種原因,等待的事件信號一直等不到,這時可以用timer定時來產(chǎn)生信號量。 關于以上幾個概念,高通都提供了相關接口操作,具體參看代碼!3.2 Boot高通平臺系統(tǒng)Memory組成可以分為:NAND+SDRAM和NOR+PSRAM 。兩者配置不能并存,這也就決定了有兩種boot模式,具體決定采用哪種Boots方式是Boot_mode引腳決定。高通60x5系列采用了Multi-Image-Boot技術(shù),這可以從高通的代碼看出,從上

21、述枚舉變量中可以看出,flash中有多個image.其中QCSBL+OEMSBL =SBL,SBL就相當于bootloader, Bootloader主要是在Nand啟動方式中起作用!原因后續(xù)介紹!其中每個Image又是由三個部分組成:其中簽名段和證書段是用來校驗代碼段的完整性與合法性的。 在啟動過程中就可以看到校驗的相關步驟。代碼段就不需要我說了吧。3.2.1 Nor BootNor flash有地址線,存在Nor Flash的代碼可以本地執(zhí)行,變量存在PSRAM,所以從NOR啟動不需要BootloaderNOR啟動模式太簡單,一般只要將Nor Flash掛載到EBI1上,然后做些簡單的操作

22、,就可以直接運行。在高通代碼中關于這方面的注釋也很少。3.2.2 Nand BootNand Flash沒有地址線,代碼不能直接運行,因此需要Bootloader,那么bootloader的作用:可以看出相對NOR boot,Nand boot復雜很多。它需要將falsh中的Image復制到SDRAM,然后才能執(zhí)行。并且要對各個image進行校驗。3.2.3 Boot流程Boot是一個很復雜的過程,尤其是Nand Boot,需要你對ARM架構(gòu)很深的了解,這邊只是簡單示意相關流程,具體大家可以參考代碼!3.3 Gpio3.3.1 GPIO的作用GPIO 作為QSC60X5 與外界溝通的橋梁,主要

23、有四個作用:1 通過GPIO 向外部輸出一個高/低電平,控制外部的器件或者通知外部器件某事件的發(fā)生。例如我們可以通過GPIO 輸出一個高電平點亮一個LED, 或者輸出低電平關掉一個LED。2 通過GPIO 讀入一個外界的高低電平輸入,檢測外部器件的當前狀態(tài)。例如鍵盤按鍵是否按下的探測。3 將GPIO 口作為外部中斷信號的一個輸入口,實時檢測外部事件的發(fā)生。4 將GPIO 用作其他特定用途。例如用作I2C 通信、數(shù)據(jù)線、地址線等。3.3.2 GPIO的用法1 配置一個GPIO 口。通常一個GPIO 有多種功能,我們可以將GPIO 配置為符合我們當前需要的功能;同時我們也可以將GPIO配置為內(nèi)部具

24、有上拉電阻、下拉電阻或者沒有任何上下拉電阻。文件GPIO_60x5.c 中定義了配置GPIO 的函數(shù)接口void gpio_tlmm_config(GPIO_SignalType gpio_signal)gpio_signal 指定要配置成的功能,文件GPIO_60x5.h 枚舉出了每個GPIO 的可配置的功能選項:typedef enumGPIO_OUTPUT_3 = GPIO_OUT(3,0),GPIO_INPUT_3 = GPIO_IN(3,0,GPIO_PULL_DOWN),SDCC_DATA0 = GPIO_ALT(3,0,1,GPIO_PULL_UP),DBG_BUS_IN_7 =

25、 GPIO_ALT(3,0,2,GPIO_PULL_DOWN),例子:SDCC_DATA0 = GPIO_ALT(3,0,1,GPIO_PULL_UP) gpio_tlmm_config(SDCC_DATA); /* 將GPIO3 配置為SD卡 的數(shù)據(jù)線1*/ gpio_tlmm_config(GPIO_INTPUT_3); /* 將GPIO26 配置為通用的有下拉電阻的輸入端口*/2 從GPIO 輸出高/低電平。首先應該通過函數(shù)接口gpio_out來確定GPIO輸出高電平或者低電平,然后通過函數(shù)接口gpio_tlmm_config把該GPIO配置為通用功能(非特定功能),在該配置函數(shù)中調(diào)用一

26、個宏函數(shù)接口BIO_TRISTATE 打開GPIO 使能,將此電平輸出出去。void gpio_out(GPIO_SignalType gpio_signal,GPIO_ValueType gpio_value) /*將GPIO 寄存器設置輸出的電平*/ BIO_TRISTATE(io, mask, val) /*GPIO 寄存器中的值輸出出去:輸出使能*/例子:使GPIO 31 輸出低電平gpio_out(GPIO_OUTPUT_31, GPIO_LOW_VALUE);gpio_tlmm_config(GPIO_OUTPUT_31); 3 從GPIO 讀入外部器件輸入的高/低電平,檢測外部的

27、事件或者狀態(tài)。只能從一個輸出已被disable 的GPIO 讀入輸入的高/低電平,也就是說只能從一個已被設置為輸入模式的GPIO 讀入高/低電平。從GPIO 讀入外部輸入的高/低電平的宏函數(shù)接口:GPIO_ValueType gpio_in(GPIO_SignalType gpio_signal), gpio_signal解釋見上面的說明,而返回值typedef enum GPIO_LOW_VALUE = 0, GPIO_HIGH_VALUE = 1 GPIO_ValueType;例:判斷GPIO3的當前狀態(tài) gpio_tlmm_config(GPIO_INTPUT_3);if (gpio_i

28、n(GPIO_INTPUT_3) = GPIO_LOW_VALUE).4 將GPIO 設置為某個中斷信號的輸入口。這樣外部器件一旦有中斷信號(高電平或者低電平)輸入到此GPIO 端口,將直接觸發(fā)一個中斷,指定的ISR 將被調(diào)用,處理中斷事件。中斷的好處在于中斷事件可以實時得到處理,無論系統(tǒng)是否處于睡眠狀態(tài)。接口函數(shù)有兩個:A)gpio_int_set_detect(gpio_int_type which_group_int, gpio_int_detect_type detect) /*指定邊沿觸發(fā)還是電平觸發(fā)*/B) boolean gpio_int_set_handler(gpio_int

29、_type which_group_int,gpio_int_polarity_type polarity,gpio_int_handler_type handler) /*指定ISR 以及觸發(fā)極性*/typedef enum/* GPIO_GROUP 1*/GPIO_INT_0 = 0,GPIO_INT_1,GPIO_INT_2,GPIO_INT_3,GPIO_INT_4, gpio_int_type;typedef enumDETECT_LEVEL = 0,DETECT_EDGE gpio_int_detect_type;typedef enumACTIVE_LOW = 0,ACTIVE_

30、HIGH gpio_int_polarity_type;A) 參數(shù)which_group_int 指定GPIO , detect 指定中斷是電平觸發(fā)方式還是邊沿觸發(fā)方式。B) 參數(shù)which_group_int 指定GPIO, polarity 與gpio_int_set_detect 中指定的detect 值相關, 若detect 指定電平觸發(fā)方式,polarity 就表示指定中斷是高電平觸發(fā)還是低電平觸發(fā);若detect 指定邊沿觸發(fā)方式,polarity 就表示指定中斷是上升沿觸發(fā)還是下降沿觸發(fā)。handler 指定該中斷的ISR,若handle 為NULL 則表示取消此GPIO 的中斷

31、處理,也就是說以后此GPIO 輸入任何信號都不會觸發(fā)中斷了。例子:/*將GPIO 3 設置為中斷高電平觸發(fā)*/gpio_int_set_detect (GPIO_INT_3, DETECT_LEVEL );gpio_int_set_handler(GPIO_INT_3, ACTIVE_HIGH, &GPIO_3_isr);3.3.3 GPIO注意事項1 必須保證我們要用的GPIO 沒有已被其他地方用作其它用途,否則可能會出現(xiàn)一些莫名其妙的現(xiàn)象。2 確保GPIO 已被正確配置。每個GPIO 都有缺省的配置,如果缺省的配置不符合我們的要求,我們就需要對GPIO 進行重新配置。3 注意GPI

32、O 的上拉電阻或者下拉電阻的設置情況。例如:將GPIO 設置為有下來電阻輸入口,若外部輸入的高電平電壓不夠高,就可能導致讀入電平介于高低電平電壓之間,從而無法準確辨別出高電平還是低電平。3.4 內(nèi)存管理高通平臺上內(nèi)存管理機制由三個部分組成:隊列(Queue)、DS存儲池、Watermark。其中真正存放數(shù)據(jù)的DS存儲池,其他兩個則是管理機制。3.4.1 隊列(Queue) Single-linked list of data blocks (數(shù)據(jù)塊單鏈表) Each data block has a link field to the next data block (每個數(shù)據(jù)塊有一個指針域(

33、link field)指向下一個數(shù)據(jù)塊) Always use queue functions to use the queues (總是使用隊列函數(shù)來操作隊列) Declared in queue.h q_init( ) initializes the queue (初始化隊列) q_link( ) initializes the link field of the item (初始化隊列的指針域) q_get() removes the element from the head of the queue (從隊列頭部取出一個元素并將其從隊列中去除) q_check() returns t

34、he pointer to the first element; does not remove (返回隊列的第一個元素的指針,但不刪除它) q_put() puts the element at the tail of the queue (添加一個元素到隊列尾部) q_cnt() counts the number of elements in the queue (計算隊列中有幾個元素) The model of Queue :隊列廣泛使用在DS的存儲池中,貫穿于整個DS的相關代碼中。 3.4.2 DS存儲池在高通軟件平臺上,它的數(shù)據(jù)存儲方式比較特別。事先劃分一塊區(qū)域用于數(shù)據(jù)存儲,并且為

35、不同應用再細分一個Pool(池),這個Pool是由固定大小item(用于存儲數(shù)據(jù)塊)組成。應用不同,這個item的數(shù)據(jù)容量也不一樣。每個用戶申請的就是這個item.它的具體特點: Statically allocated memory in RAM (靜態(tài)分配于RAM中) A number of DSM pools (不止一個DSM pool) Each pool is allocated as a static array(每一個pool都是以一個靜態(tài)數(shù)組的形式分配空間的) Flow control is built into each pool based on the number of

36、 free items many, few, dont_exceed (流控制被構(gòu)造于每個DSM pool中) Each pool has a fixed number of items (called DSM items)(每個存儲池都有固定數(shù)量的item成為DSM items) Each DSM item in each pool has the same fixed number of payload bytes (在同一個存儲池中的所有DSM item都有相同的有效字節(jié)數(shù)) All DSM items across all pools have the same overhead by

37、tes(所有存儲池中的所有DSM item都有相同的字節(jié)數(shù)?) Can link each DSM two dimensionally (每個DSM都可以以二維方式連接構(gòu)造) link_ptr for queues (隊列方式) pkt_ptr for items (條目方式)使用時,只要將數(shù)據(jù)Copy到data_ptr,并將數(shù)據(jù)長度賦給used,其他成員在申請,系統(tǒng)已經(jīng)初始化好了。注:Copy時要注意每個Item最大數(shù)據(jù)容量size.如果一個不夠,再申請一個,強制copy一個超出范圍的數(shù)據(jù),會將Pool污染。導致后續(xù)莫名死機。3.4.3 Watermark flow control poin

38、tWatermark用于提供通用數(shù)據(jù)流控制解決方案,具體怎樣實現(xiàn)可以從它的結(jié)構(gòu)體和代碼入手分析:可以看出,一個watermark中包含了字節(jié)數(shù)(current_cnt)、底限(lo_watermark)、上限(hi_watermark)以及各種call back指針(hiwater_func_ptr)和隊列Q的指針等。當上層應用(比如DS)通過底層設備來進行數(shù)據(jù)傳輸時(具體流程我們會在SIO章節(jié)中介紹),他們共同維護watermark,高通提供一些使用watermark的函數(shù)。以下是代碼中提供的幾個watermark相關函數(shù)接口: dsm_enqueue(wmark, item) Adds a

39、n item to the watermark(添加一條記錄到watermark中) Calls each_item_func(), if any(調(diào)用函數(shù)each_item_func()) If this is the first item in the watermark, calls non_empty_func_ptr(如果這是watermark的第一條記錄(隊頭),則調(diào)用non_empty_func_ptr) If highwater mark in bytes is reached, calls hiwater_func_ptr(deassert CTS)(如果字節(jié)數(shù)到達了wate

40、rmark上線則調(diào)用hiwater_func_ptr) If it does not_exceed_cnt bytes in the watermark, drops the item(如果item中的字節(jié)數(shù)沒有達到要求則忽略這個item) dsm_dequeue(wmark) Removes the first item from the watermark(從watermark中去掉隊頭(出隊) If no other items are left in the watermark, calls gone_empty_func_ptr(如果watermark中已經(jīng)沒有item了,則調(diào)用go

41、ne_empty_func_ptr) If low-water mark is reached, calls lowater_func_ptr(assert CTS)(如果到達watermark底線,則調(diào)用lowater_func_ptr) 注意: watermark counts是指byte數(shù)而不是item數(shù)。 可以看出,dsm watermark就是通過對隊列的出隊入隊的管理來實現(xiàn)流控制的。在DSM入隊操作中,其中有這么一句:這里就是對隊列進行watermark監(jiān)測,下面看watermark監(jiān)測做了什么事情。 上面的代碼可以看出,在入隊時,根據(jù)隊列的情況進行了相應情況的call back調(diào)

42、用。換句話講,就是當隊列發(fā)生變化時,watermark將調(diào)用不同的函數(shù)以響應這些變化。 可見,watermark可以看成是一種基于隊列操作的隊列管理機制。示意圖如下 3.5 Sleep3.5.1 Sleep硬件相關知識一般我們直觀觀察高通是否進入睡眠可以通過數(shù)字電源來觀察,那么有必要對睡眠相關的Sleep電流概念有所了解:CDMA 手機的Idle 狀態(tài)的電流如上。有3 個概念描述如下:Average sleep current: 0.4-0.9mA.根據(jù)手機功能,顯示屏的要求不同而不同。Average Rx current:手機處于睡眠狀態(tài)時,需要定時從基站接收消息。此刻手機接收系統(tǒng)喚醒。正常

43、的手機paging 應是規(guī)則的。Idle 電流: 是指手機 sleep current 和Rx current 的時間平均值。影響手機Idle 電流的主要因素是sleep 底電流。RX 電流的寬度和高度在芯片組和協(xié)議棧定好以后,一般開發(fā)者沒有能力改變。3.5.2 Sleep軟件相關知識在高通平臺上,Sleep由sleep task進行管理, sleep任務的優(yōu)先級最低(優(yōu)先級2). 當沒有其他任務使用CPU時, 調(diào)度器才會讓sleep task獲得CPU的使用權(quán)限, sleep task會根據(jù)當前的任務調(diào)用狀態(tài), 決定CPU是否可以進入睡眠狀態(tài), 如果判定當前狀態(tài)可以進入sleep狀態(tài), 則通

44、過sleep_power_down_and_halt關閉主晶振TCXO及其他LDO電源, 以獲得省電效果。具體流程如下圖所示:Sleep鑒權(quán):sleep_power_down_and_halt能否關閉TCXO及其他LDO電源, 以獲得省電效果由sleep鑒權(quán)機制決定Sleep鑒權(quán)機制大體可以分為兩塊鑒權(quán)部分:1) sleep任務本身是否容許進行睡眠2) 是否有其他任務不容許進行睡眠3.5.3 查Sleep電流方法1. 首先確保所有 task 都可以進sleep. 在Sleep.c 里面添加代碼,把所有not_okts 的task 從log 打出來, 如果這時只有SLEEP_DIAG_OKTS_

45、SIG 和SLEEP_USB_OKTS_SIG 則正常. 再把上面加的代碼去掉, 用示波器測量TCXO, 看是否有周期性關閉. 如果有則正常,沒有則需查diag 和usb task 是否有問題.2. 在 TCXO 關閉基礎上,查板子是否存在漏電. 測量板上所有電阻兩端是否存在壓降;. 把板子一些無關器件吹掉;. 測試PM 輸出的幾個電壓值是否正常3.6 SIO3.6.1 SIO模塊的架構(gòu)在高通平臺,SIO模塊的整體架構(gòu)如下圖所示:Service layer主要實現(xiàn)相關服務,如DIAG、DATA等等,Control layer主要負責設備與服務的管理,并且加上相應管理機制。Device laye

46、r可以分為兩層,SIO Interface向上層提供統(tǒng)一的接口,隱藏了硬件的相關操作。SIO Device driver實現(xiàn)相關硬件驅(qū)動。開機時,在tmc_init函數(shù)中,會依次調(diào)用rdm_get_prev_port及rdm_issue_open函數(shù),rdm_get_prev_ports()的作用在于讀取保存在efs中的設備映射表。在設備映射表中保存了上次斷電前的設備映射表。讀出設備映射表內(nèi)容將其放入到rdm_current_device_map RDM_DEV_MAX 之中。 接著調(diào)用rdm_issue_opens(),根據(jù)讀出的rdm_current_device_map RDM_DEV_

47、MAX 的內(nèi)容,打開相應的port。 RDM的作用在于動態(tài)的修改設備映射關系,那么在應用中可以動態(tài)修改設備映射關系。只要調(diào)用相關接口rdm_assign_port就可以。3.6.2 SIO數(shù)據(jù)處理流程在上一節(jié)介紹了高通平臺中SIO模塊的整體架構(gòu),但我們經(jīng)常涉及到其中一部分(device layer),通常也是修改這一部分。在這一節(jié)我們將詳細介紹SIO的數(shù)據(jù)處理流程。SIO數(shù)據(jù)接收: RX FIFO中如果有數(shù)據(jù),則會從DSM Pool中申請得到一個DSM item,然后將RX FIFO中的數(shù)據(jù)裝載到這個DSM item中,然后將這個DSM item入隊到對應的watermark中,waterma

48、rk在有新的DSM item加入時會進行監(jiān)測,看數(shù)據(jù)是否達到要求以調(diào)用不同的call back,發(fā)出信號通知application來處理這些數(shù)據(jù)。 當然也可以直接通過回調(diào)函數(shù)rx_fun直接處理DSM item。SIO數(shù)據(jù)發(fā)送: 數(shù)據(jù)發(fā)送前會先申請一個DSM item,然后將要發(fā)送的數(shù)據(jù)填充到dsm item中,如果TX FIFO為空,則直接將這個dsm item中的數(shù)據(jù)傳送到TX FIFO中,如果TX FIFO不為空(發(fā)送器正忙),則將這個dsm item入隊到相應的water mark中,watermark會在適當?shù)臅r候?qū)⑦@些數(shù)據(jù)發(fā)送到TX FIFO中。3.7 重啟問題分析萬事皆有根源。

49、重起及異常無非就是軟件和硬件的原因;我們在分析的過程中通常需要排除,定位。 硬件上的異?,F(xiàn)象通常表現(xiàn)在: 1 電壓過低(或限流過低)2. 程序跑飛,沒有規(guī)律(這通常是flash的原因,時序太緊了);等等這些原因用調(diào)試器,軟件的方法是沒法查找的,是一些經(jīng)驗問題,在驅(qū)動調(diào)試階段一般可以解決。 還有就是軟件上的問題, 這些問題我們一般都可以尋根溯源, 在異常向量表的地方打斷點,逐步嘗試, 一般可以定位到:指令沒定義,指令預取異常, data abort, 或者就是reset。 這些原因我們都可以根據(jù)r14 的值來回溯, 查找; 這些方法技巧做嵌入式的軟件工程師都應該有所了解,加以掌握。3.7.1 軟件狗檢測異常通常重起時,我們跟蹤會在0地址打斷點, 然后

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論