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站