1. 請問要怎樣熟悉高通平台的驅動呢
謝謝!幫幫忙!
1.背景知識 1.1 手機平台: 平台是指 MTK、展訊、英特爾等晶元公司推出的,相對應於其處理器晶元的平台。 不同公司的源碼不太相同,一個公司不同平台有差異。 1.2 手機平台: 源碼+編譯工具+燒寫工具+調試工具 2.使用到的工具 2.1 dos 命令 tree 指令:用於分析源碼目錄結構,大致了解一個項目由各哪幾部分構成。 2.2 source insight / VIM : 這是常用的源碼編輯工具,可以用它們進行主要的源碼閱讀。 2.3 VS2008 : 這是常用的編輯器,調試器了,這個和手機平台中的編譯工具、調試工具是一樣的。 2.4 熟悉語言的語法,調用規則 2.5 豐富的源碼閱讀經驗(非必需) 3.分析步驟*(3.0 在你當前的環境中能成功編譯源碼) 3.1 分析源碼的組成結構。項目的目錄結構的劃分肯定是經過規劃了的。因此,拿到一部分源碼,根據其目錄的劃分,對源碼進行一次大體的了解是非常有必要的。比如說 drv 這個目錄下肯定放的是驅動相關的源碼,Game這個目錄下放置的是游戲源碼,DB目錄下放置的是訪問資料庫的源碼等。(在這一步,適當使用 tree 命令,將源碼的目錄結構輸出出來,對整個分析工作是大有幫助的) 3.2 尋找項目的主函數。每個程序都有主函數,第二步是找出他的主函數。 在C/C++ 函數中,就是 main 函數。 尋找的方法很多,比如在SourceInsight 中按 F7 查找,也可以使用 grep 工具查找,也可以在window 自帶的搜索工具。方法很多。找到主函數以後,注意看其啟動參數,以及啟動之後開了那些線程,一般是一些列的 init(), 函數構成。 3.3 尋找自己負責的部分的源碼。經過以上兩步,就能對項目有個大致了解,接下來,就是尋找自己工作相關的那部分源碼了。如果你想修改一下某個游戲的實現,則去Game文件夾中尋找對應的源碼進行熟悉,如果你是想修改驅動,你就去 drv 目錄下熟悉相關源碼。 3.3.2 熟悉重要的數據結構,重要的函數,釐清細節。 *3.4 編譯源碼,使用調試工具,列印log等各種手段,理清程序運行的規律。 3.5 多於同項目的同事交流 4.後期工作 4.1 保存文檔經過你的艱苦的工作,你終於弄明白了整個項目的構成,請不要忘記將探尋過程編寫成文檔,方便後人。
2. 高通平台代碼怎麼進入升級模式和正常模式
1、高通平台android開發總結 1.1 搭建高通平台環境開發環境 在高通開發板上燒錄文件系統 建立高通平台開發環境 高通平台,android和 modem 編譯流程分析 高通平台 7620 啟動流程分析 qcril 流程分析,設置sim卡鎖 python scons 語法學習 Python ...
3. 編譯高通出現這個錯誤,哪位大神幫個忙 /bin/bash: jar: command not found
沒有安裝jdk,jar是jdk里包含的命令。下載安裝jdk即可。注意,jre里沒這個命令。
4. 關於晶元設計你知道多少
這是一篇關於半導體行業發展的長篇介紹,文中有些表達上對行業人士來說可能會存在些許不嚴謹,歡迎交流。
首先要解釋兩個概念: 晶元設計與晶元代工
它們是有區別的,在這里舉個例子:高通、三星、華為都可以設計晶元。這其中,三星是可以自己生產晶元的,而高通和華為,是需要找代工的。
三星和台積電,是兩家最廣為人知的晶元代工廠。
比如美國高通的晶元,是自己設計的。但它並不生產晶元,比如高通的高端晶元,是交給三星來代工的,華為設計的高端晶元則是交給台積電來代工。
為什麼大陸目前生產不了高端晶元?
論晶元設計,我們已經不弱了,華為的麒麟晶元就是自己研發的,在高端晶元上已經算是很強了。
但麒麟晶元的代工卻沒有找大陸廠商。
因為即使是大陸目前第一的中芯國際,現在也沒有能力生產麒麟970晶元。
華為麒麟970晶元,工藝製程是10nm。
關於工藝製程後面會有詳細介紹,就是數字越小,說明製程越先進。我們手機里的晶元,製程工藝好不好,決定了晶元的性能。
7nm的晶元,必然比10nm的強,10nm的又強於14nm工藝的。
在2017年,三星和台積電,都掌握了最先進的10nm工藝。所以現在10nm 的生產工藝,是壟斷在英特爾、三星和台積電手裡的。
而大陸最先進的中芯國際,只能生產最高規格28nm工藝的。
為什麼大陸的生產工藝落後?
主要是光刻機: 因為晶元的生產,關鍵是要光刻機。 說到光刻機這個行業,就不得不提荷蘭 的ASML Holding N.V
簡單說一下光刻機:
其實早期的光刻機的原理像幻燈機一樣簡單,就是把光通過帶電路圖的掩膜 (Mask,後來也叫光罩) 投影到塗有光敏膠的晶圓上(關於晶圓,下面晶元設計中會有詳細介紹)。早期 60 年代的光刻,掩膜版是 1:1 尺寸緊貼在晶圓片上,而那時晶圓也只有 1 英寸大小。
因此,光刻那時並不是高 科技 ,半導體公司通常自己設計工裝和工具,比如英特爾開始是買 16 毫米攝像機鏡頭拆了用。只有 GCA, K&S 和 Kasper 等很少幾家公司有做過一點點相關設備。
60 年代末,日本的尼康和佳能開始進入這個領域,畢竟當時的光刻不比照相機復雜。
1978 年,GCA 推出真正現代意義的自動化步進式光刻機 (Stepper),解析度比投影式高 5 倍達到 1 微米。
但此時的光刻機行業依舊是個小市場,一年賣幾十台的就算大廠了。因為半導體廠商就那麼多,一台機器又能用好多年。這導致你的機器落後一點,就沒人願意買了。技術領先是奪取市場的關鍵,贏家通吃。
80 年代一開始,GCA 的 Stepper 還稍微領先,但很快尼康發售了自己首台商用 Stepper NSR-1010G,擁有更先進的光學系統極大提高了產能。兩家開始一起擠壓了其它廠商的份額。
到了 1984 年,在光刻行業,尼康和 GCA 平起平坐,各享三成市佔率。Ultratech 占約一成,Eaton、P&E、佳能、日立等剩下幾家瓜分剩下的三成。
但轉折也發生在這一年,這一年飛利浦在實驗室里研發出 stepper 的原型,但是不夠成熟。因為光刻市場太小,飛利浦也不能確認它是否有商業價值,去美國和 P&E、GCA、Cobilt、IBM 等談了一圈也沒人願意合作。
很巧合有家荷蘭小公司叫 ASM International 的老闆 Arthur Del Prado 聽說了有這么回事,主動要求合作。但這家代理出身的公司只有半導體一些經驗,對光刻其實不太懂,等於算半個天使投資加半個分銷商。飛利浦猶豫了一年時間,最後勉強同意了設立 50:50 的合資公司。1984 年 4 月 1 日 ASML 成立的時候,只有 31 名員工,在飛利浦大廈外面的木板簡易房裡工作。
ASML 最早成立時的簡易平房,後面的玻璃大廈是飛利浦。Credit: ASML
ASML 在 1985 年和蔡司 (Zeiss) 合作改進光學系統,終於在 1986 年推出非常棒的第二代產品 PAS-2500,並第一次賣到美國給當時的創業公司 Cypress,今天的 Nor Flash 巨頭。
但接下來的一年,1986 年半導體市場大滑坡,導致美國一幫光刻機廠商都碰到嚴重的財務問題。ASML 規模還小,所以損失不大,還可以按既有計劃開發新產品。但,GCA 和 P&E 這些老牌廠商就頂不住了,它們的新產品開發都停滯了下來。
1988 年 GCA 資金嚴重匱乏被 General Signal 收購,又過了幾年 GCA 找不到買主而破產。1990 年,P&E 光刻部也支撐不下去被賣給 SVG。
1980 年還占據大半壁江山的美國三雄,到 80 年代末地位完全被日本雙雄取代。這時 ASML 大約有 10% 的市場佔有率。
忽略掉美國被邊緣化的 SVG 等公司,90 年代後,一直是 ASML 和尼康的競爭,而佳能在旁邊看熱鬧。
在後來 ASML 推出浸入式 193nm 產品,緊接著尼康也宣布自己的 157nm 產品以及 EPL 產品樣機完成。然而,浸入式屬於小改進大效果,產品成熟度非常高,而尼康似乎是在做實驗,因此幾乎沒有人去訂尼康的新品。
這導致後面尼康的大潰敗。尼康在 2000 年還是老大,但到了 2009 年 ASML 已經市佔率近 7 成遙遙領先。尼康新產品的不成熟,也間接關聯了大量使用其設備的日本半導體廠商的集體衰敗。
至於佳能,當它們看到尼康和 ASML 在高端光刻打得如此厲害就直接撤了。直接開發低端光刻市場,直到現在它們還在賣 350nm 和 248nm 的產品,給液晶面板以及模擬器件廠商供貨。
再回來,英特爾、三星和台積電之所以能生產 10nm 工藝的晶元,首先是它們能從 ASML 進口到高端的光刻機,用於生產 10nm 晶元。
而大陸沒有高端的光刻機,用中低端的光刻機又缺乏技術,所以暫時只能生產工藝相對落後的晶元。
下面我們談一談晶元的設計,在談論設計之前,我們需要知道 CPU、GPU、微架構和指令集 等概念。
CPU的含義,亦即中央處理器,是負責計算機主要運算任務的組件。功能就像人的大腦。可能大家聽過CPU有 x86、ARM 這樣的分類,前者主要用於PC而後者主要用於手機平板等設備。
CPU執行在計算任務時都需要遵從一定的規范,程序在被執行前都需要先翻譯為CPU可以理解的語言。這種語言被稱為 指令集 (ISA,Instruction Set Architecture)。程序被按照某種指令集的規范翻譯為CPU可識別的底層代碼的過程叫做編譯(compile)。像x86、ARM v8、MIPS等都是指令集的代號。同時指令集可以被擴展。廠商開發兼容某種指令集的CPU需要指令集專利持有者授權,典型例子如Intel授權AMD,使後者可以開發兼容x86指令集的CPU。
CPU的基本組成單元即為核心(core)核心的實現方式被稱為 微架構 (microarchitecture)和指令集類似,像Haswell、Cortex-A15等都是微架構的代號。微架構的設計影響核心(core)可以達到的最高頻率、核心在一定頻率下能執行的運算量、一定工藝水平下核心的能耗水平等等。
但值得注意的是: 微架構與指令集 是兩個不同的概念:指令集是CPU選擇的語言,而微架構是具體的實現。
以兼容ARM指令集的晶元為例:ARM公司將自己研發的指令集叫做ARM指令集,同時它還研發具體的微架構,例如Cortex系列並對外授權。
但是,一款CPU使用了ARM指令集並不等於它就使用了ARM研發的微架構。像高通、蘋果等廠商都自行開發了兼容ARM指令集的微架構,同時還有許多廠商使用ARM開發的微架構來製造CPU,比如華為的麒麟晶元。通常,業界認為 只有具備獨立的微架構研發能力的企業才算具備了CPU研發能力 ,而是否使用自行研發的指令集無關緊要。微架構的研發也是IT產業技術含量最高的領域之一。
以麒麟980為例,最主要的部分就是 CPU 和 GPU 。其中 Cortex-A76 和 Mali-G76 都是華為找ARM買的微架構授權,華為可以自研微架構嗎?肯定是可以的,但要想達到蘋果那樣應用在手機系統上還有很長一段路要走,最起碼現在看來是這樣,除了自身研發會遇到各種問題外,因為晶元的開發和軟體開發一樣,需要EDA工具,使用ARM的微構架,它們會提供很多工具,這些東西也挺核心的,所以一旦另起爐灶就需要考慮各個方面的問題。
弄清楚了這些,就可以開始設計晶元了,但這一步也是非常復雜繁瑣的。
晶元製造的過程就像蓋房子一樣,先有 晶圓 作為地基,然後再層層往上疊,經過一系列製造流程後,就可產出必要的 IC 晶元了。
那什麼是晶圓呢?
晶圓(wafer), 是製造各種制式晶元的基礎。我們可以將晶元製造看作蓋房子,而晶圓就是一個平穩的地基。在固體材料中,有一種特殊的晶體結構──單晶(Monocrystalline)。它的特性就是原子一個接著一個緊密的排列,可以形成一個平整的原子表層。因此,我們採用單晶做成晶圓。但是,該如何產生這樣的材料呢,主要有二個步驟,分別為 純化以及拉晶 ,之後便能完成這樣的材料。
純化分成兩個階段,第一步是冶金級純化,此一過程主要是加入碳,以氧化還原的方式,將氧化硅轉換成 98% 以上純度的硅。但是,98% 對於晶元製造來說依舊不夠,仍需要進一步提升。因此,將再進一步採用 西門子製程(Siemens process) 作純化,將獲得半導體製程所需的高純度多晶硅。
接著,就是 拉晶 。
首先,將前面所獲得的高純度多晶硅融化,形成液態的硅。然後,以單晶的 硅種(seed) 和液體表面接觸,一邊旋轉一邊緩慢的向上拉起。至於為何需要單晶的硅種,是因為硅原子排列就和人排隊一樣,會需要排頭讓後來的人該如何正確的排列,硅種便是重要的排頭,讓後來的原子知道該如何排隊。最後,待離開液面的硅原子凝固後,排列整齊的單晶硅柱便完成了。
但一整條的硅柱並無法做成晶元製造的基板,為了產生一片一片的硅晶圓,接著需要以鑽石刀將硅晶柱橫向切成圓片,圓片再經由拋光便可形成晶元製造所需的硅晶圓。
至於8寸、12寸晶圓又代表什麼東西呢?很明顯就是指表面經過處理並切成薄圓片後的直徑。尺寸愈大,拉晶對速度與溫度的要求就更高,製作難度就越高。
經過這么多步驟,晶元基板的製造總算完成了,下一步便是晶元製造了。該如何製作晶元呢?
IC晶元,全名集成電路(Integrated Circuit),由它的命名可知它是將設計好的電路,以堆疊的方式組合起來。
從上圖我們可以看出,底部藍色的部分就是晶圓,而紅色以及土黃色的部分,則是於 IC 製作時要設計的地方,就像蓋房子要設計怎樣的樣式。
然後我們看 紅色的部分 ,在 IC 電路中,它是整顆 IC 中最重要的部分,將由多種邏輯閘組合在一起,完成功能齊全的 IC 晶元,因此也可以看作是 根基上的根基 。
而 黃色的部分 ,不會有太復雜的構造,它的主要作用是將紅色部分的 邏輯閘相連在一起 。之所以需要這么多層,是因為有太多線路要連結在一起,在單層無法容納所有的線路下,就要多疊幾層來達成這個目標了。在這之中,不同層的線路會上下相連以滿足接線的需求。
然後開始製作這些部分:
製作 IC 時,可以簡單分成4 種步驟。雖然實際製造時,製造的步驟會有差異,使用的材料也有所不同,但是大體上皆採用類似的原理。
完成這些步驟之後,最後便在一整片晶圓上完成很多 IC 晶元,接下來只要將完成的方形 IC 晶元剪下,便可送到封裝廠做封裝。
封裝:
經過漫長的流程,終於獲得一顆 IC 晶元了。然而一顆晶元相當小且薄,如果不在外施加保護,會被輕易的刮傷損壞。此外,因為晶元的尺寸微小,如果不用一個較大尺寸的外殼,不容易安置在電路板上,所以才需要最後的封裝。
封裝的方式有很多種,常見的有雙排直立式封裝(Dual Inline Package;DIP),球格陣列(Ball Grid Array,BGA)封裝,SoC(System On Chip)封裝以及 SiP(System In Packet)封裝。
完成封裝後,然後還需要進入測試階段 ,在這個階段是為了確認封裝完的 IC 是否能正常的運作,檢測沒問題後便可出貨給組裝廠,做成我們所見的電子產品。
至此,完成整個製作流程。
5. 如何編譯高通kernal設備樹
DTS (device tree source)
.dts文件是一種ASCII 文本格式的Device
Tree描述,此文本格式非常人性化,適合人類的閱讀習慣。基本上,在ARM
Linux在,一個。dts文件對應一個ARM的machine,一般放置在內核的arch/arm/boot/dts/目錄。由於一個SoC可能對應多個machine(一個SoC可以對應多個產品和電路板),勢必這些。dts文件需包含許多共同的部分,Linux內核為了簡化,把SoC公用的部分或者多個machine共同的部分一般提煉為。dtsi,類似於C語言的頭文件。其他的machine對應的。dts就include這個。dtsi。譬如,對於VEXPRESS而言,vexpress-v2m.dtsi就被vexpress-v2p-ca9.dts所引用,
vexpress-v2p-ca9.dts有如下一行:
/include/
「vexpress-v2m.dtsi」
當然,和C語言的頭文件類似,。dtsi也可以include其他的。dtsi,譬如幾乎所有的ARM
SoC的。dtsi都引用了skeleton.dtsi。
.dts(或者其include的。dtsi)基本元素即為前文所述的結點和屬性:
[plain] view
plainprint?
/ {
node1 {
a-string-property = 「A string」;
a-string-list-property = 「first string」, 「second string」;
a-byte-data-property = [0x01 0x23 0x34 0x56];
child-node1 {
first-child-property;
second-child-property = <1>;
a-string-property = 「Hello, world」;
};
child-node2 {
};
};
node2 {
an-empty-property;
a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
child-node1 {
};
};
};
/ {
node1 {
a-string-property = 「A string」;
a-string-list-property = 「first string」, 「second string」;
a-byte-data-property = [0x01 0x23 0x34 0x56];
child-node1 {
first-child-property;
second-child-property = <1>;
a-string-property = 「Hello, world」;
};
child-node2 {
};
};
node2 {
an-empty-property;
a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
child-node1 {
};
};
};
上述。dts文件並沒有什麼真實的用途,但它基本表徵了一個Device
Tree源文件的結構:
1個root結點「/」;
root結點下面含一系列子結點,本例中為「node1」 和
「node2」;
結點「node1」下又含有一系列子結點,本例中為「child-node1」 和
「child-node2」;
各結點都有一系列屬性。這些屬性可能為空,如「
an-empty-property」;可能為字元串,如「a-string-property」;可能為字元串數組,如「a-string-list-property」;可能為Cells(由u32整數組成),如「second-child-property」,可能為二進制數,如「a-byte-data-property」。
下面以一個最簡單的machine為例來看如何寫一個。dts文件。假設此machine的配置如下:
1個雙核ARM
Cortex-A9 32位處理器;
ARM的local bus上的內存映射區域分布了2個串口(分別位於0x101F1000 和
0x101F2000)、GPIO控制器(位於0x101F3000)、SPI控制器(位於0x10170000)、中斷控制器(位於0x10140000)和一個external
bus橋;
External bus橋上又連接了SMC SMC91111
Ethernet(位於0x10100000)、I2C控制器(位於0x10160000)、64MB NOR
Flash(位於0x30000000);
External bus橋上連接的I2C控制器所對應的I2C匯流排上又連接了Maxim
DS1338實時鍾(I2C地址為0x58)。
其對應的。dts文件為:
[plain] view
plainprint?
/ {
compatible = 「acme,coyotes-revenge」;
#address-cells = <1>;
#size-cells = <1>;
interrupt-parent = <&intc>;
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
compatible = 「arm,cortex-a9」;
reg = <0>;
};
cpu@1 {
compatible = 「arm,cortex-a9」;
reg = <1>;
};
};
serial@101f0000 {
compatible = 「arm,pl011」;
reg = <0x101f0000 0x1000 >;
interrupts = < 1 0 >;
};
serial@101f2000 {
compatible = 「arm,pl011」;
reg = <0x101f2000 0x1000 >;
interrupts = < 2 0 >;
};
gpio@101f3000 {
compatible = 「arm,pl061」;
reg = <0x101f3000 0x1000
0x101f4000 0x0010>;
interrupts = < 3 0 >;
};
intc: interrupt-controller@10140000 {
compatible = 「arm,pl190」;
reg = <0x10140000 0x1000 >;
interrupt-controller;
#interrupt-cells = <2>;
};
spi@10115000 {
compatible = 「arm,pl022」;
reg = <0x10115000 0x1000 >;
interrupts = < 4 0 >;
};
external-bus {
#address-cells = <2>
#size-cells = <1>;
ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet
1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash
ethernet@0,0 {
compatible = 「smc,smc91c111」;
reg = <0 0 0x1000>;
interrupts = < 5 2 >;
};
i2c@1,0 {
compatible = 「acme,a1234-i2c-bus」;
#address-cells = <1>;
#size-cells = <0>;
reg = <1 0 0x1000>;
interrupts = < 6 2 >;
rtc@58 {
compatible = 「maxim,ds1338」;
reg = <58>;
interrupts = < 7 3 >;
};
};
flash@2,0 {
compatible = 「samsung,k8f1315ebm」, 「cfi-flash」;
reg = <2 0 0x4000000>;
};
};
};
/ {
compatible = 「acme,coyotes-revenge」;
#address-cells = <1>;
#size-cells = <1>;
interrupt-parent = <&intc>;
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
compatible = 「arm,cortex-a9」;
reg = <0>;
};
cpu@1 {
compatible = 「arm,cortex-a9」;
reg = <1>;
};
};
serial@101f0000 {
compatible = 「arm,pl011」;
reg = <0x101f0000 0x1000 >;
interrupts = < 1 0 >;
};
serial@101f2000 {
compatible = 「arm,pl011」;
reg = <0x101f2000 0x1000 >;
interrupts = < 2 0 >;
};
gpio@101f3000 {
compatible = 「arm,pl061」;
reg = <0x101f3000 0x1000
0x101f4000 0x0010>;
interrupts = < 3 0 >;
};
intc: interrupt-controller@10140000 {
compatible = 「arm,pl190」;
reg = <0x10140000 0x1000 >;
interrupt-controller;
#interrupt-cells = <2>;
};
spi@10115000 {
compatible = 「arm,pl022」;
reg = <0x10115000 0x1000 >;
interrupts = < 4 0 >;
};
external-bus {
#address-cells = <2>
#size-cells = <1>;
ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet
1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash
ethernet@0,0 {
compatible = 「smc,smc91c111」;
reg = <0 0 0x1000>;
interrupts = < 5 2 >;
};
i2c@1,0 {
compatible = 「acme,a1234-i2c-bus」;
#address-cells = <1>;
#size-cells = <0>;
reg = <1 0 0x1000>;
interrupts = < 6 2 >;
rtc@58 {
compatible = 「maxim,ds1338」;
reg = <58>;
interrupts = < 7 3 >;
};
};
flash@2,0 {
compatible = 「samsung,k8f1315ebm」, 「cfi-flash」;
reg = <2 0 0x4000000>;
};
};
};
上述。dts文件中,root結點「/」的compatible 屬性compatible =
「acme,coyotes-revenge」;定義了系統的名稱,它的組織形式為:<manufacturer>,<model>。Linux內核透過root結點「/」的compatible
屬性即可判斷它啟動的是什麼machine。
在。dts文件的每個設備,都有一個compatible
屬性,compatible屬性用戶驅動和設備的綁定。compatible
屬性是一個字元串的列表,列表中的第一個字元串表徵了結點代表的確切設備,形式為「<manufacturer>,<model>」,其後的字元串表徵可兼容的其他設備。可以說前面的是特指,後面的則涵蓋更廣的范圍。如在arch/arm/boot/dts/vexpress-v2m.dtsi中的Flash結點:
[plain] view
plainprint?
flash@0,00000000 {
compatible = 「arm,vexpress-flash」, 「cfi-flash」;
reg = <0 0x00000000 0x04000000>,
<1 0x00000000 0x04000000>;
bank-width = <4>;
};
flash@0,00000000 {
compatible = 「arm,vexpress-flash」, 「cfi-flash」;
reg = <0 0x00000000 0x04000000>,
<1 0x00000000 0x04000000>;
bank-width = <4>;
};
compatible屬性的第2個字元串「cfi-flash」明顯比第1個字元串「arm,vexpress-flash」涵蓋的范圍更廣。
再比如,Freescale
MPC8349 SoC含一個串口設備,它實現了國家半導體(National Semiconctor)的ns16550
寄存器介面。則MPC8349串口設備的compatible屬性為compatible = 「fsl,mpc8349-uart」,
「ns16550」。其中,fsl,mpc8349-uart指代了確切的設備, ns16550代表該設備與National Semiconctor
的16550
UART保持了寄存器兼容。
接下來root結點「/」的cpus子結點下面又包含2個cpu子結點,描述了此machine上的2個CPU,並且二者的compatible
屬性為「arm,cortex-a9」。
注意cpus和cpus的2個cpu子結點的命名,它們遵循的組織形式為:<name>[@<unit-address>],<>中的內容是必選項,[]中的則為可選項。name是一個ASCII字元串,用於描述結點對應的設備類型,如3com
Ethernet適配器對應的結點name宜為ethernet,而不是3com509。如果一個結點描述的設備有地址,則應該給出@unit-address。多個相同類型設備結點的name可以一樣,只要unit-address不同即可,如本例中含有cpu@0、cpu@1以及serial@101f0000與serial@101f2000這樣的同名結點。設備的unit-address地址也經常在其對應結點的reg屬性中給出。ePAPR標准給出了結點命名的規范。
6. 高通android指紋模塊怎麼編譯
fp_shutdown_active {
qcom,pins = <&gp 23>;
qcom,pin-func = <0>;
qcom,num-grp-pins = <1>;
label = "shutdown_gpio_active";
fp_shutdown_active: fp_shutdown_active {
drive-strength = <6>;
<span style="color:#ff0000;">output-high;</span>
bias-disable= <0>;
};
};
fp_shutdown_suspend {
qcom,pins = <&gp 23>;
qcom,pin-func = <0>;
qcom,num-grp-pins = <1>;
label = "shutdown_gpio_suspend";
fp_shutdown_suspend: fp_shutdown_suspend {
drive-strength = <2>;
<span style="color:#ff0000;">out
7. 高通mdm9607 mcfg_sw.mbn配置編譯流程
1.未添加運營商mcfg_sw.mbn配置文件,存在設備找網速度慢的問題。
2.添加高通默認配置mcfg_sw.mbn,出現問題:
(1)設備插入移動卡,呼入會出現自動接聽。
(2)設備插入電信4G卡,無法4G上網。
(3)設備插入特定物聯網卡,UE無法正常切換對應運營商配置。默認切換至3GPP,導致無法正常上網。
3.使用QXDM 修改網路相關的nv參數,切換運營商卡後,nv參數配置失效。
1.設備搜網會根據對應運營商mcfg_sw.mbn中配置去搜尋相應的頻段,未添加則會導致設備輪詢所有頻段,從而導致駐網速度慢。
2.高通通過nv項中的參數來設置設備一些定製功能。
(1)查看nv850(CT電信默認配置為cs only)從而導致電信卡4G無法上網
PS域(Packet SwitchedDomain)為分組(交換)域,CS域(Circuit SwitchedDomain)為電路(交換)域。
通俗的說,打電話語音信號走的是CS,上網等數據業務信號走PS。
(2)查看nv74(CMCC移動卡默認配置為enable)nv74是控制電話自動接聽,因此出現移動卡設備呼入會出現自動接聽。
3.UE會根據插入運營商卡的iccid來切換相應mcfg_sw.mbn配置。物聯網卡採用專用號段,因此可能存在配置不支持導致無法正常切換運營商配置。
(由於這批移動物聯網卡iccid前幾位為898604,mbn未配置因此會導致UE無法正常切換mbn配置,導致無法上網。)
什麼是物聯網卡
4.使用QXDM修改參數後為何切換不同運營商卡後,nv配置參數會失效。
假設插入電信卡後,設備通過QXDM修改nv,改nv值並沒有寫入到mcfg_sw.mbn中,簡單理解為臨時參數。
當設備插入移動卡後,UE會根據iccid來切換mcfg_sw.mbn。它獲取的參數依然是從該文件內部讀取,修改的值未起到作用。
圖為運營商mbn配置,CU CMCC CT 分別對應聯通、移動、電信。其他為默認硬體軟體配置。
1.修改XML源文件
(1)路徑:modem_proc\mcfg\mcfg_gen\generic\china(有全球各個地區的運營商配置信息)
圖為生成cmcc mcfg_sw.mbn各個xml配置文件
(2)修改內容
CT:
CMCC:
目前只在已有的NvItemData項中修改參數,還未測試自己添加新的nv配置。
2.編譯流程
(1)編譯參數說明
(2)實際測試命令
a.進入/modem_proc/mcfg/build
b.編譯CT mbn命令:
perl build_mcfgs.pl --build_id=9607.genns.prod --configs=mcfg_sw:OpenMkt-Commercial --force-regenerate --force-rebuild --source-dir=generic/China/CT --xml
mbn文件生成路徑:/modem_proc/mcfg/configs/mcfg_sw/generic/China/CT/Commercial/OpenMkt
c.編譯CMCC mbn命令:
perl build_mcfgs.pl --build_id=9607.genns.prod --configs=mcfg_sw:Commercial-CSFB-SS-LocTech --force-regenerate --force-rebuild --source-dir=generic/China/CMCC --xml
mbn文件生成路徑:/modem_proc/mcfg/configs/mcfg_sw/generic/China/CMCC/CSFB/SS
3.出現問題:
(1)現象
Building MBN for mcfg_sw:Commercial-CSFB-SS-LocTech...
Could not open or create temporary file '/media/root/exdisk/workspace/L170_4K/modem_proc/mcfg/mcfg_gen/scripts/data/efs_files/cmcc/profile4'
沒有那個文件或目錄 at ../mcfg_gen/scripts/mcfg_write.pm line 1242.
(2)原因
源碼中該文件大小寫存在差異,去源碼中修改相應profile文件大小寫,問題解決。
4.xml新增移動物聯網卡支持
(1)找到移動對應的xml文件
(2)添加物聯網卡iccid前6位數字。
(3)重新編譯mcfg_sw.mbn文件,通過PDC tool重新load設備,測試成功。
8. ubuntu12.04編譯android源碼要多久
這個關鍵是要看你的電腦配置情況,以及代碼的附加情況,有的平台軟體會附加很多東西上去,編譯就比較慢了。
我們這邊使用的是四核八線程的電腦,32GB內存,
原生代碼 4.4 八線程編譯40分鍾左右,5.1,一個半小時左右,6.0的大約一個小時,以上是原生代碼編譯模擬器的時間。
高通代碼6.0編譯一般需要兩個小時左右,mtk的也是兩個小時左右,
9. 高通 ap_standard_oem test_device的區別是什麼
ap_standard_oem帶源碼,可以自己修改代碼編譯鏡像;
test_device是高通發布的編譯好的鏡像。
10. 高通到底做錯了什麼
雖然曾經的高通以先進的自研架構碾壓對手,但是目前高通已經越來越顯出疲態,個人認為,從805發布以後,高通一直在犯錯。
這次寫一篇長文,聊聊高通到底做錯了什麼。
801發布才過去三個月,高通很明顯並沒有對801的2.45g高頻滿足,進一步改進架構並提頻,推出了805,這款頻率高達2.7g的32位Soc使用了krait450架構。在當時看來,這顆soc的所有參數都無可挑剔。為了盡可能挖掘性能,高通甚至給其配備了64bit雙通道的豪華內存控制器規格,同時這也是高通首次推出支持4k顯示輸出的Soc。該Soc被國行三星note4等機型搭載,代表了當時最強的移動Soc性能,除了exynos5433可以與之一較高下外,其他Soc全部被它完全碾壓。然而,誰也想不到,這是高通最後一次如此的風光了。
在春季度剛剛發布完32位絕唱805之後,高通總算進入了64位時代。支持64位的Android5.0的發布,給64位soc的性能發揮帶來了極大的便利。在410上小嘗64位甜頭的高通,在秋季度一口氣發布了數顆64位soc,這其中就包括了msm8994,也就是傳說中的地獄炎龍810。
按照高通的傳統,8系應該由自研架構撐起一片天。但是由於恰逢32位64位交接,krait是一個純32位架構,不可能改改就強行上64位,加上留給高通的時間太過倉促,高通不得不拿公版強行頂上來。
如果說光用公版,那問題不會太大,三星在用,那時候麒麟也出現了麒麟也在用公版,老老實實做,不會出什麼事。壞就壞在高通長時間不做公版旗艦了,對公版架構的發熱一直缺乏一個理性的認識(高通在低端soc上使用公版,但是因為低端soc發熱本身就不大,高通根本沒意識到公版可以這么熱)。作為旗艦,性能是必須要堆的,為了保證能相比805有足夠的性能優勢,高通選擇了暴力堆到4xA57+4xA53。
然而,A57偏偏是歷代公版里發熱較為恐怖的,加上高通因為長期不用公版做旗艦,對公版最高頻率的設定把握不準,加上801和805的高頻大勝利,高通給A57設定了2.0g的高頻。A57在頻率突破1.4g後就會功耗直線上升,2.0g的高頻,註定不會涼快。
如果說高頻A57是認識不足,高通還幹了更睿智的一件事情:選擇了20nm製程。同樣是A57+A53的exynos7420,借著14nm的東風,活得倒也不算差,而高通這次用的20nm,進一步推動了地獄炎龍的誕生。
過於老舊的製程,導致即使是低頻,810的能效比也完全難以直視。琴梨梨手頭有一台shv32,官方鎖四個大核,然而四個A53的發熱就已經足以令人恐懼。
雖然810的真實性能並不算太弱,尤其gpu甚至性能足夠出色,可惜因為功耗翻車,凡是用了810的手機廠商甚至是和高通有關系的廠商,歷史都被改寫了。小米note頂配空有跑分,沒有體驗,葬送了小米沖擊高端市場的機會。nexus6p成為nexus系列最後一款機型。oppo不得不推遲find系列新產品,這一推遲就是接近四年。夏普也在新機型上放棄了三邊全面屏設計。一加不得不通過降頻1.8g勉強維持體驗。三星無奈只能在全球使用7420。
盡管高通嘗試對810進行修正,但是到了v2.1版本,依然還是地獄炎龍,這顆參數豪華而體驗崩盤的Soc,最終落得了epic fail的代號,火龍的名號,也在民間被廣泛認可了。
在嘗試修復810失敗後,高通馬上全力投入新架構的研發,這個新架構,就是kryo。
高通還是一如既往的發揮了在自研能力上的優勢,但是高通此時做了一個非常不理智的決定:要和x86競爭。
高通開始和巨硬密謀win10arm,巨硬很顯然對牙膏廠的擠牙膏行為並不滿意,於是開始開發win10arm。
不同於移動平台重視整數運算能力,桌面平台對浮點運算能力要求更高。為了適應高浮點的需求,kryo在浮點性能上下了大功夫,直接做到亂序五發射。在810發布整整一年後,搭載四顆kryo自研的msm8996,也就是820問世了。
雖然浮點對於移動端並不是最重要的,給力的浮點性能讓kryo的單核性能碾壓了一眾公版,820更是創下了一次次四核碾壓八核的輝煌戰績。因為810實在太熱了,使用14nm的820,發布之初廣受好評,被廣泛認為是高性能低發熱的典範。
然而,820並不是一顆完全成功的Soc。四核本身就不適合分叢集,高通卻硬生生做成了2+2,由於當時尚未誕生eas調度,hmp在雙同架構叢集上經常表現出調度不合理,導致核心經常跑在不必要的高頻。而更大的問題是高通給小核心緩存砍了一刀,加上尚不成熟的分支預測,導致小核心經常預測失效爆緩存。
這些問題直到後來推出的821,也就是820官超版,都沒有解決(琴梨梨現在主力機就是821),谷歌後來自己看不下去出手寫了eas調度,總算一定程度緩解了82x的效率問題。
設計失誤還不至於說好牌打爛,更精彩的是,上面提到高通想要進軍桌面端對吧,巨硬沒有辜負高通的期望,很快就把win10arm搞出來了,並在820上測試成功。我們可以看一下當年的視頻https://m.youtube.com/watch?v=A_GlGglbu1U
(油管視頻,怎麼打開自己想辦法)
得益於浮點性能的強大,視頻中820已經可以勉強運行PS,而系統應用的流暢度已經足夠日用。
如果在此時推出820的win10設備,是完全合適的,因為820的設計考慮了桌面端的運算需求。然而高通沒有這么做,白白浪費了這么好的機會,等到後來才推出835的win10設備,可是835的浮點性能根本不足以負擔桌面端需求,結果體驗還打不過n3450,加上牙膏廠被逼急了一屁股坐在了牙膏上,高通的危機更大了。
此時高通其實完全有對抗危機的方法。高通從600開始就內置了dsp(類似於npu),但是高通對於使用dsp的開發收取高額費用,導致僅有小部分廠家發揮了dsp的優勢。如果在此時放開對dsp的限制,高通完全可以比麒麟搶先一步引領ai潮流,但是高通畢竟專利流氓做久了,沒有這種意識。
82x錯失了進入桌面端市場的良機,又在移動端因為設計失誤並沒有大紅大紫,此時的高通,決定回歸公版。但是高通畢竟還是有那麼點骨氣,不是像810那樣迫不得已絕對不在旗艦上直接上公版,於是高通就只能選擇魔改公版。
835的設計其實非常保守,不但單核性能相比821主動倒車,而且gpu相比821提升也極其有限,甚至連15%都不到。
但是因為使用了公版,835相比高通一直堅持的第三季度發布整整提前了一個季度發布。由於當代公版效率較高,加上首批試水10nm,835的發熱控制異常的優秀,銷量大漲。但是此時高通內部完全沒有放棄全自研的想法。
與此同時,似乎820運行win10arm給了高通無比的自信,高通甚至想去伺服器行業分一杯牙膏廠的羹。
臨近17年底,Centriq出現了。使用Falkor自研架構,這個架構和前輩kryo一樣使用了亂序五發射,但是計算能力和效率大大提升,在浮點性能爆炸的情況下依然保持了A75水平的能效比。
但是Centriq根本沒能分到一點市場。高通的祖輩農企早就在推土機時代就折騰過arm伺服器,最後還是放棄了。伺服器市場的競爭比高通想的要困難的多。因為伺服器傳統應用大多使用x86編譯,無法運行在arm上,針對arm伺服器的應用少之又少。加上在牙膏廠志強屁和農企EPYC的夾擊,Centriq成了一個失敗的產物,再也沒有下一代。負責其架構自研的技術總裁Dileep Bhandarkar也在今年7月離職。
伺服器市場算是失敗了,可是高通一直沒有放棄分牙膏廠羹的想法。上文提到巨硬已經准備好了win10arm,伺服器受挫的高通,轉向了筆記本市場。
雖然835模擬x86效率損耗較大,但是因為牙膏廠多年以來一直在筆記本上一家獨大以至於擠牙膏,按照道理高通本能憑借835出色的能耗比能在細分市場中站住腳,但是進軍筆記本界遠沒高通想的那麼順利。
年初之時,農企發布了船新的ryzen架構,牙膏廠再也不能穩坐在寶座上。
835筆記本還沒正式上市,感覺到農企殺氣的牙膏廠,帶來了史上最良心升級,全面進入四核時代,835的性能在牙膏廠8代低壓面前瞬間顯得蒼白無力。這導致高通甚至只能把長續航作為835筆記本的唯一亮點,因為除了續航,高通實在拿不出什麼應敵之策了。
2017年接近尾聲,移動端ryzen帶著史上最強核顯橫空出世,給筆記本界帶來了巨大變革。因為價格便宜而性能相比牙膏廠的8代低壓甚至有略微優勢,一時在低端筆記本市場大紅大紫。農企的此舉,把牙膏廠逼急了,一屁股坐在牙膏上,帶來了atom系列的後代-J4005/J5005,這兩顆超低壓入門U的性能相比前輩atom大有改觀,J5005甚至上了真四核。N3450被取代,而在此之前,唯一在部分項目上略輸給835的就是N3450(https://www.guru3d.com/news-story/qualcomm-snapdragon-835-vs-celeron-n3450-benchmarks-with-windows-10.html)。高通進軍筆記本界的最後一絲希望破滅了。
在835打破高通傳統的年貨式迭代節奏後,高通的節奏越來越亂。今年第一季度,高通就急匆匆發布了845。太緊湊的時間導致高通沒有時間去改良本可以解決的缺陷,845存在較為嚴重的緩存漏電問題。
如果說緩存漏電還不是大問題,更大的問題就是高通的霸主地位不保了。845的性能提升依然有限,而在大洋對岸某個號稱琵琶源自於它的國家,一顆被稱為「安卓之光」的Soc誕生了。六發射配上高達4M的獨立L3,9810跑出了單核3500分的驚人戰績,而在同頻浮點效率測試中,9810跑出了接近845的兩倍效率。
在此之前,高通的地位從未被如此劇烈的動搖過,高通從來沒有在跑分上遭遇過如此奇恥大辱,要知道,當年那顆epic fail,都沒有在跑分上做出絲毫讓步。
高通的節奏進一步被打亂了。
按照往常,高通會在一顆Soc發布2-4季度後推出官超版本,比如800和801,820和821,然而這次高通只隔了一個季度不到,845的官超版850就被急著生了出來。被逼急了的高通,一口氣把大核心頻率艹到了2.96g。然而頻率再高,也難逃地位不保。
高通的地位一次次被攻擊。三星自主研發基帶成功,在CDMA上和高通拜拜了,cat18的上行,甚至把850給幹掉了。牙膏廠在基帶上持續推進,直接集成了完整的x86核心與高通競爭,並搶到了蘋果新iPhone基帶的訂單。余大嘴的嘴裡,傳出了7nm和cat21。
845依然是能耗比最優秀的Soc,但是9810已經越追越近。
排除9810效率低下的公版gpu,9810的cpu效率甚至在845之上。
高通當然急,沒有不急的理由。俗話說狗急跳牆,被逼急了的高通,w步伐越發混亂,甚至試圖威脅牙膏廠,然而牙膏廠才沒工夫打理這種小打小鬧。
而與此同時,高通還要掙扎著避免被閉源流氓博通收購。
5G時代近在咫尺,各大運營商也在加急推進淘汰2G和3G,而高通的大部分專利都局限在2G和3G。靠賣基帶維持生計的日子越來越不好過,技術部門離職的人越來越多...
節奏被打亂的高通,開始大量推出各種閹割版Soc細分市場。按照慣例,今年q4高通應該發布下一代旗艦,然而現在高通的官媒甚至都沒有一點對新旗艦的預熱宣傳,675這種小打小鬧倒是出的挺起勁。大洋彼岸的三星已經官宣9820要相比9810再來一次大提升,exynos已經從當初只會用公版的嬰兒,長成了一個極具攻擊性的成人。
一步步錯失良機,一次次翻身失敗。雖然835和845確實取得了不錯的銷量,但是高通手裡的優勢正在一點點失去。失去了自主技術,就等於把命送到別人手裡,而如今的高通,正有這樣的趨勢。
8150已經成了高通唯一翻身的希望,而這僅剩的希望,還在一點點隨著時間流逝。
寫於2018/11/22,同步首發於知乎//B站