高通平台搭建编译平台
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芯片的手机,就是高通平台的手机,常见于摩托罗拉小米三星等等等品牌。