高通平台搭建編譯平台
A. 如何編譯高通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標准給出了結點命名的規范。
B. 高通 spf 5.0 怎麼編譯
如果是改暗黑的話,還是ATMA比較方便一些.如果喜歡用金山的話,修改也並不難.比如說金錢吧,假如目前你擁有 萬(前提是先打開金山主程序,並打開游戲,在游戲中啟動快捷鍵,切到金山),那麼在金山的框中輸入你的 萬(輸入數值,不是中文)點搜索,會出現一堆,不要管它,回遊戲,繼續游戲,等錢數發生改變後(比如有 . 萬了)再回金山,再輸入 . 萬,點搜索,又會出現很多,但比之前的少了.再回遊戲,等錢多了(如 萬),回金山搜 萬幾次後,就會剩下幾個結果了,這時去把它們改成你想要的數值就行,不過要注意的,是你擁有的金錢是有上限的,不要改過那個上限,要不就該死機了(每個人物等級都能帶不同數量的錢,箱子也是).將幾個結果改成需要的數值後,屬性改為自動鎖定(一般都是),還有手動修改,和熱鍵修改,根據自己需求.這樣進游戲後,該值就不變了,而且為你需要的值.還有一點要注意,並非所有搜出的結果都是該金錢的項目值,要看下它後邊的參數值,比如你剛才搜的是 萬,那麼參數為 萬的那些項才是(比如有一項為 ,那它就不是,不要改它)就是這樣的了,其實並不難,只要這個游戲能夠進行修改,那麼它的所有數值就都能夠修改,無論什麼,技能點,屬性點,體力,等級,經驗,血,法力等等,都行.只是技能點的話,要等很久,因為加一個技能點,要等升級後才有,而且一般只得 點這樣,一次一搜,一般到個 至 點就差不多了,或者你先把等級(或經驗)改上去,那也就升級了,這時技能點就一下多了,再到金山去搜,就會非常容易行到.改了就會無限,技能點最大上限為 .不過金山有個問題,它不能改過上限,那樣會死機,甚至無法游戲(而且退出金山前,請不要結束游戲,即,先退金山,後退游戲)多試試吧,不過說實話,如果是改暗黑的話,還是用ATMA方便,且實用,而且它還能改裝備,或導入一些極品裝備(在游戲中很難得到)可是話又說回來,ATMA有時導入後,會出現一些小問題,比如無法進入游戲人物,資料損壞等,呵呵,看個人喜好吧,兩者個有個的好.希望對你有所幫助.
C. 網曝華為鴻蒙OS計劃適配高通平台,這意味著什麼
華為一直以來都是一家非常出色的企業,它在通信晶元以及消費者電子產品領域等均有著不菲的成績,但是由於之前美國針對國內的一批企業進行了制裁,其中就包括禁止提供給華為美國的晶元產品,並且但凡涉及到美國專利的晶元均不允許使用,導致了華為遇到了成立以來最大的滑鐵盧。晶元短缺導致消費者手機業務遭受重創。好在華為早有居安思危的本能,它在美國制裁之前就已經囤積了大量的晶元以備不時之需,但是現在看來美國的封鎖將是一個持久戰,華為所囤積的晶元顯然不能應對這一長期的封鎖,因此華為決定轉攻軟體方面。鴻蒙os是華為近期主攻的項目之一,到目前為止,華為已經開始陸陸續續的對其旗下的手機進行升級更新配置鴻蒙os。日前根據消息稱華為鴻蒙OS可能會適配高通平台,我認為這主要意味著以下幾個方面。
一、鴻蒙os作為一個開源項目,目的是為了和安卓以及IOS競爭市場鴻蒙os是一個開源項目,華為發布他的目的不僅僅是為了自救,還為了在系統端佔領一席之地,最終實現華為生態互聯的終極目標,和蘋果以及安卓相競爭。
D. 高通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
E. 如何在qualcomm平台Android點亮一個LED工作流程分析
1.FW層代碼分析
BatteryService.java
public Led(Contextcontext, LightsManager lights) {
mBatteryLight =lights.getLight(LightsManager.LIGHT_ID_BATTERY);
mBatteryLowARGB =context.getResources().getInteger(
com.android.internal.R.integer.config_notificationsBatteryLowARGB);
mBatteryMediumARGB =context.getResources().getInteger(
com.android.internal.R.integer.config_);
mBatteryFullARGB =context.getResources().getInteger(
com.android.internal.R.integer.config_notificationsBatteryFullARGB);
mBatteryLedOn =context.getResources().getInteger(
com.android.internal.R.integer.config_notificationsBatteryLedOn);
mBatteryLedOff =context.getResources().getInteger(
com.android.internal.R.integer.config_notificationsBatteryLedOff);
}
public void updateLightsLocked() {
final int level =mBatteryProps.batteryLevel;
final int status =mBatteryProps.batteryStatus;
if (level <mLowBatteryWarningLevel) {
if (status ==BatteryManager.BATTERY_STATUS_CHARGING) {
// Solid red when battery is charging
mBatteryLight.setColor(mBatteryLowARGB);
} else {
// Flash red when batteryis low and not charging
mBatteryLight.setFlashing(mBatteryLowARGB, Light.LIGHT_FLASH_TIMED,
mBatteryLedOn,mBatteryLedOff);
}
} else if (status ==BatteryManager.BATTERY_STATUS_CHARGING
|| status ==BatteryManager.BATTERY_STATUS_FULL) {
if (status ==BatteryManager.BATTERY_STATUS_FULL || level >= 90) {
// Solid green when full orcharging and nearly full
mBatteryLight.setColor(mBatteryFullARGB);
} else {
if (isHvdcpPresent()) {
// Blinking orange ifHVDCP charger
mBatteryLight.setFlashing(mBatteryMediumARGB, Light.LIGHT_FLASH_TIMED,
mBatteryLedOn,mBatteryLedOn);
} else {
// Solid orange whencharging and halfway full
mBatteryLight.setColor(mBatteryMediumARGB);
}
}
} else {
// No lights if not chargingand not low
mBatteryLight.turnOff();
}
}
LightsService.java
public voidsetColor(int color) {
synchronized (this) {
setLightLocked(color, LIGHT_FLASH_NONE,0, 0, 0);
}
}
private void setLightLocked(int color, int mode, int onMS, int offMS,int brightnessMode) {
if (color != mColor || mode !=mMode || onMS != mOnMS || offMS != mOffMS) {
if (DEBUG) Slog.v("jyf","setLight #" + mId + ": color=#"
+Integer.toHexString(color));
mColor = color;
mMode = mode;
mOnMS = onMS;
mOffMS = offMS;
Trace.traceBegin(Trace.TRACE_TAG_POWER,"setLight(" + mId + ", 0x"
+Integer.toHexString(color) + ")");
try {
setLight_native(mNativePointer, mId, color, mode, onMS, offMS,brightnessMode);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_POWER);
}
}
2.JNI Java Native Interface
它可以使Java虛擬機內部運行的Java代碼能夠與其它的編程語言編寫的應用程序和庫進行交互操作。所以,在android中Java層調用底層的C/C++函數庫必須通過Java的JNI來實現。而該過程需要五個步驟:
a.編寫Java應用程序
在java程序中必須通過System.LoadLibrary(「library」);對庫文件進行載入並聲明用native聲明本地方法。
b.生成共享庫的頭文件:
javac FileName.java FileName.class
Javah Filename package_FileName.h
JNI頭文件里對應的函數的命名規范:
Java_packagename_classname_介面名。
c.編寫實現本地方法的C文件
新建package_FileName.c,並根據頭文件實現本地方法
d.編譯生成so庫
使用NDK-BUILD編譯步驟3)中的.c文件,生成.so的庫文件。並編寫相應的makefile文件。
include $(CLEAR_VARS) -清除之前的一些系統變數
LOCAL_MODULE - 編譯生成的目標對象
LOCAL_SRC_FILES - 編譯的源文件
LOCAL_C_INCLUDES - 需要包含的頭文件目錄
LOCAL_SHARED_LIBRARIES - 鏈接時需要的外部庫
LOCAL_PRELINK_MODULE - 是否需要prelink處理
include$(BUILD_SHARED_LIBRARY) - 指明要編譯成動態庫
3.Makefile
Android.mk是Android提供的一種makefile文件,用來指定諸如編譯生成so庫名、引用的頭文件目錄、需要編譯的.c/.cpp文件和.a靜態庫文件等。
Android.mk的用途:
一個android子項目中會存在一個或多個Android.mk文件
a、單一的Android.mk文件
直接參考NDK的sample目錄下的hello-jni項目,在這個項目中只有一個Android.mk文件
b、多個Android.mk文件
如果需要編譯的模塊比較多,我們可能會將對應的模塊放置在相應的目錄中,這樣,我們可以在每個目錄中定義對應的Android.mk文件(類似於上面的寫法),
最後,在根目錄放置一個Android.mk文件,內容如下:
include $(call all-subdir-makefiles)
只需要這一行就可以了,它的作用就是包含所有子目錄中的Android.mk文件
c、多個模塊共用一個Android.mk
這個文件允許你將源文件組織成模塊,這個模塊中含有:
-靜態庫(.a文件)
-動態庫(.so文件)
只有共享庫才能被安裝/復制到您的應用軟體(APK)包中
include $(BUILD_STATIC_LIBRARY),編譯出的是靜態庫
include $(BUILD_SHARED_LIBRARY),編譯出的是動態庫
4.自定義變數
以下是在 Android.mk中依賴或定義的變數列表,可以定義其他變數為自己使用,但是NDK編譯系統保留下列變數名:
-以 LOCAL_開頭的名字(例如 LOCAL_MODULE)
-以 PRIVATE_, NDK_ 或 APP_開頭的名字(內部使用)
-小寫名字(內部使用,例如『my-dir』)
如果為了方便在 Android.mk 中定義自己的變數,建議使用 MY_前綴,一個小例子:
MY_SOURCES := foo.c
ifneq ($(MY_CONFIG_BAR),)
MY_SOURCES += bar.c
endif
LOCAL_SRC_FILES += $(MY_SOURCES)
注意:『:=』是賦值的意思;'+='是追加的意思;『$』表示引用某變數的值。
5. GNU Make系統變數
這些 GNU Make變數在你的 Android.mk 文件解析之前,就由編譯系統定義好了。注意在某些情況下,NDK可能分析 Android.mk 幾次,每一次某些變數的定義會有不同.
a.CLEAR_VARS: 指向一個編譯腳本,幾乎所有未定義的 LOCAL_XXX 變數都在"Mole-description"節中列出。必須在開始一個新模塊之前包含這個腳本:include$(CLEAR_VARS),用於重置除LOCAL_PATH變數外的,所有LOCAL_XXX系列變數。
b.BUILD_SHARED_LIBRARY: 指向編譯腳本,根據所有的在 LOCAL_XXX 變數把列出的源代碼文件編譯成一個共享庫。
注意,必須至少在包含這個文件之前定義 LOCAL_MODULE 和 LOCAL_SRC_FILES。
c.BUILD_STATIC_LIBRARY: 一個 BUILD_SHARED_LIBRARY 變數用於編譯一個靜態庫。靜態庫不會復制到的APK包中,但是能夠用於編譯共享庫。
示例:include $(BUILD_STATIC_LIBRARY)
注意,這將會生成一個名為 lib$(LOCAL_MODULE).a 的文件
d.TARGET_ARCH: 目標 CPU平台的名字
e.TARGET_PLATFORM: Android.mk 解析的時候,目標 Android 平台的名字
f.TARGET_ARCH_ABI: 暫時只支持兩個 value,armeabi 和 armeabi-v7a。。
g.TARGET_ABI: 目標平台和 ABI 的組合。
6.模塊描述變數
下面的變數用於向編譯系統描述你的模塊。應該定義在'include $(CLEAR_VARS)'和'include $(BUILD_XXXXX)'之間。$(CLEAR_VARS)是一個腳本,清除所有這些變數。
a.LOCAL_PATH: 這個變數用於給出當前文件的路徑。
必須在 Android.mk 的開頭定義,可以這樣使用:LOCAL_PATH := $(call my-dir)
如當前目錄下有個文件夾名稱 src,則可以這樣寫 $(call src),那麼就會得到 src 目錄的完整路徑
這個變數不會被$(CLEAR_VARS)清除,因此每個 Android.mk 只需要定義一次(即使在一個文件中定義了幾個模塊的情況下)。
b.LOCAL_MODULE: 這是模塊的名字,它必須是唯一的,而且不能包含空格。
必須在包含任一的$(BUILD_XXXX)腳本之前定義它。模塊的名字決定了生成文件的名字。
c.LOCAL_SRC_FILES: 這是要編譯的源代碼文件列表。
只要列出要傳遞給編譯器的文件,因為編譯系統自動計算依賴。注意源代碼文件名稱都是相對於 LOCAL_PATH的,你可以使用路徑部分,例如:
LOCAL_SRC_FILES := foo.c toto/bar.c\
Hello.c
文件之間可以用空格或Tab鍵進行分割,換行請用"\"
如果是追加源代碼文件的話,請用LOCAL_SRC_FILES +=
注意:可以LOCAL_SRC_FILES := $(call all-subdir-java-files)這種形式來包含local_path目錄下的所有java文件。
e.LOCAL_C_INCLUDES: 可選變數,表示頭文件的搜索路徑。
默認的頭文件的搜索路徑是LOCAL_PATH目錄。
f.LOCAL_STATIC_LIBRARIES: 表示該模塊需要使用哪些靜態庫,以便在編譯時進行鏈接。
g.LOCAL_SHARED_LIBRARIES: 表示模塊在運行時要依賴的共享庫(動態庫),在鏈接時就需要,以便在生成文件時嵌入其相應的信息。
注意:它不會附加列出的模塊到編譯圖,也就是仍然需要在Application.mk 中把它們添加到程序要求的模塊中。
h.LOCAL_LDLIBS: 編譯模塊時要使用的附加的鏈接器選項。這對於使用『-l』前綴傳遞指定庫的名字是有用的。
例如,LOCAL_LDLIBS := -lz表示告訴鏈接器生成的模塊要在載入時刻鏈接到/system/lib/libz.so
可查看 docs/STABLE-APIS.TXT 獲取使用 NDK發行版能鏈接到的開放的系統庫列表。
i.LOCAL_MODULE_PATH 和 LOCAL_UNSTRIPPED_PATH
在 Android.mk 文件中, 還可以用LOCAL_MODULE_PATH 和LOCAL_UNSTRIPPED_PATH指定最後的目標安裝路徑.
不同的文件系統路徑用以下的宏進行選擇:
TARGET_ROOT_OUT:表示根文件系統。
TARGET_OUT:表示 system文件系統。
TARGET_OUT_DATA:表示 data文件系統。
用法如:LOCAL_MODULE_PATH :=$(TARGET_ROOT_OUT)
至於LOCAL_MODULE_PATH 和LOCAL_UNSTRIPPED_PATH的區別,暫時還不清楚。
j.LOCAL_JNI_SHARED_LIBRARIES:定義了要包含的so庫文件的名字,如果程序沒有採用jni,不需要LOCAL_JNI_SHARED_LIBRARIES := libxxx 這樣在編譯的時候,NDK自動會把這個libxxx打包進apk; 放在youapk/lib/目錄下
7.HAL HARDWORE ABSTRACTION LAYER
圖2 HAL框架結構
Lights.c
static int set_speaker_light_locked(struct light_device_t* dev,
struct light_state_t const* state)
{
int red, green, blue;
int blink;
int onMS, offMS;
unsigned int colorRGB;
ALOGE("liuyonglin set_speaker_light_locked enter test");
if(!dev) {
ALOGE("liuyonglin, light HAL dev is null");
return -1;
}
switch (state->flashMode) {
case LIGHT_FLASH_TIMED:
onMS = state->flashOnMS;
offMS = state->flashOffMS;
break;
case LIGHT_FLASH_NONE:
default:
onMS = 0;
offMS = 0;
break;
}
colorRGB = state->color;
ALOGE("liuyonglin set_speaker_light_locked mode %d, colorRGB=%08X, onMS=%d, offMS=%d\n",
state->flashMode, colorRGB, onMS, offMS);
red = (colorRGB >> 16) & 0xFF;
green = (colorRGB >> 8) & 0xFF;
blue = colorRGB & 0xFF;
if (onMS > 0 && offMS > 0) {
/*
* if ON time == OFF time
* use blink mode 2
* else
* use blink mode 1
*/
if (onMS == offMS)
blink = 2;
else
blink = 1;
} else {
blink = 0;
}
if (blink) {
if (red) {
if (write_int(RED_BLINK_FILE, blink))
write_int(RED_LED_FILE, 0);
}
if (green) {
if (write_int(GREEN_BLINK_FILE, blink))
write_int(GREEN_LED_FILE, 0);
}
if (blue) {
if (write_int(BLUE_BLINK_FILE, blink))
write_int(BLUE_LED_FILE, 0);
}
} else {
write_int(RED_LED_FILE, red);
write_int(GREEN_LED_FILE, green);
write_int(BLUE_LED_FILE, blue);
ALOGE("liuyonglin, write_int red green blue");
}
return 0;
}
F. 高通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設備,測試成功。
G. android裡面的高通平台是什麼
基於高通cpu晶元的手機,就是高通平台的手機,常見於摩托羅拉小米三星等等等品牌。