导航:首页 > 源码编译 > 设备树编译错误

设备树编译错误

发布时间:2022-12-30 01:23:17

⑴ u-boot使用make编译出现找不到dtc命令,如何解决啊

我在ubuntu14.04上编译uboot时也遇到了这个问题,dtc是device-tree-compiler的缩写,即设备树编译器,说明系统中没有安装这个编译器,我用的是apt-get install device-tree-compiler安装后就可以成功编译了哈。

⑵ 如何使用dtc编译设备树 devicetree

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 Flashethernet@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标准给出了结点命名的规范。

⑶ 居住地code格式错误是怎么回事

一、软件方面的
1、先检查设备管理器 看设备的驱动和运行状态是否正常(如驱动错误、设备禁用等)。
2、有些电脑有自我的过流保护功能(就是外接设备电流大于正常电流时会自动断开连接防止对电脑本身造成不可逆的损坏)。
二、硬件方面的
打开设备管理器 然后再插入U盘 看设备树列表是否有收起再张开现象,如果没有就可以基本判定线路断开或接触不良了(保护电阻烧断、或插口赃污生锈松动等)。
追加一点:也有可能是外接设备的问题! 具体可以追问 希望能帮到你

⑷ 单独编译内核和设备树

source /opt/fsl-imx-xwayland/4.19-warrior/environment-setup-aarch64-poky-linux
export ARCH=arm64
make -j 16
生成的Image 和dtb在下面的路径
~/imx-yocto-bsp/build-imx8mmevk/tmp/work/imx8mmevk-poky-linux/linux-imx/4.19.35-r0/git/arch/arm64/boot

⑸ jetson TX2

Jetson TX2 安装JetPack3.3教程

TX2的CH340驱动的安装

上文中对应的英文博客链接如下:

Build Kernel and Moles – NVIDIA Jetson TX2

其中必须先装qt然后才能make xconfig

How to configure the devicetree for dsi ?

关于jetson平台的一些名称

nVIDIA Jetson TX1 内核kernel编译

TX2中设备树烧写

英伟达TX2的USB口无法使用的解决办法

jetson-TX2 的设备树修改

Jetson-TX2 新底板移植

⑹ 在鸿蒙(OHOS3.0)编译框架中添加树莓派4B

之前在树莓派4b上点亮了OHOS3.0,不过内核是用tftp拉取的,根文件系统挂在了NFS上,拔了网线就无法启动。当然这么操作只是为了方便调试,而最终需要的是一个可以烧录到TF卡上的img镜像文件。这就需要将所有调试好的内容添加到OHOS3.0的编译框架,本以为是很简单的事情,好家伙,整了这么久,感觉添加编译框架比移植本身更复杂。于是我整理了添加树莓派单板到编译框架的内容,希望对各位有所帮助,为大家避坑。

主要参考 hisilicon build组件仓,添加一个procts编译组件,这个组件是在产品配置文件中指定的。比如

proctdefinecommonproctsRPI4B.json

其他部分参考Hi3516,但是其中2条,指定单板组件路径,并添加组件。如果删除这两条,将不能编译内核,只生成OHOS的文件系统。

接下来在device目录下,新建一个raspberrypi编译组件文件夹,并添加 ohos.build 文件。和前面产品配置文件中的设置对应起来了。

deviceraspberrypibuildohos.build

新建 deviceraspberrypibuildBUILD.gn 当然每个厂家不可能只有1个板子,如果有其他单板就在这里指定,比如树莓派2B、3B等

既然前面指定了rpi4b的编译配置组件,那么就在 deviceraspberrypi 新建一个 rpi4b 的目录,可以参考 hi3516dv300 build组件

deviceraspberrypirpi4bBUILD.gn

至此一个rpi4b build组件就添加到OHOS3.0的编译框架了,之后相关内容添加到这个文件夹下就可以了。

接下来分析下目前移植了树莓派4B的哪些内容,如何将这些内容编译进OHOS3.0。

关于补丁可以参考 Patch组件,可以得知内核编译由kernel.mk来执行

kernellinuxbuildkernel.mk

所以补丁文件需要放到正确的路径下,以正确的名字命名就可以patch到内核。

hdf.patch补丁文件,现在还没有移植HDF相关内容,所以可以先使用Hi3516的

rpi4b.patch补丁文件,使用树莓派的官方镜像,https://github.com/raspberrypi/linux

kernellinuxconfiglinux-5.10archarmconfigsrpi4b_standard_defconfig

内核配置文件目前已知的需要开启下面内容,但是肯定不止这些,以后会继续更新

Pi4的GPU是VideoCore VI支持OpenGL ES 3.2,而Pi3的GPU是VideoCore IV支持OpenGL ES 2.0。VideoCore IV 驱动程序是 VC4,VideoCore VI 驱动程序的 V3D。内核已经提供驱动,参考rpi4b_standard_defconfig将驱动直接编入到内核。

同时需要在config.txt中开启设置

OHOS中修改weston的配置文件,指定显示驱动

systemetcweston.ini

具体思路就是先查找设备号,根据设备号找到驱动程序。

前面内核配置的时候rpi4b_standard_defconfig中已经将触摸驱动编入内核,所以后面不需要在init加载模块了,修改下eudev的配置文件即可。

third_partyeudevrules.d ouchscreen.rules

正常情况下内核是由uboot进行引导的,而且OHOS默认生成uImage。但是树莓派自带BootLoader,虽然可以先用树莓派自带的BootLoader启动uboot,再用uboot加载uImage,但是这样会比较麻烦,而且会增加启动时间。不过目前 zImage是写死在kernel.mk中的,没办法改下编译脚本把。

kernellinuxbuildkernel.mk 将 uImage 改为 zImage moles dtbs

kernellinuxbuildbuild_kernel.sh

kernellinuxbuildBUILD.gn

kernellinuxbuildkernel_mole_build.sh

这里内核编译会依赖proct_path="vendor/$proct_company/$proct_name"下的hdf.hcs文件,得先新建一个应付下,不然会报下面这个错误。

ninja: error: '../../vendor/raspberrypi/RPI4B/hdf_config/uhdf/hdf.hcs', needed by 'gen/drivers/adapter/uhdf2/hcs/hdf_default.hcb', missing and no known rule to make it

新建:vendor/raspberrypi/RPI4B/hdf_config/uhdf/hdf.hcs

对于镜像烧录,Hi3516会将uImage、system.img、vendor.img等镜像烧写到emmc,但是树莓派使用TF卡启动,所以需要对TF卡进行分区,然后复制对应的内容到各个分区。首先制作树莓派boot目录,这个用来目录存放树莓派设备树、config.txt、cmdline.txt、内核镜像等信息。写一个简单的mkboot.py脚本来实现这个功能,位置在码仓.py将会生成boot.img。

为了方便烧录,需要将boot.img、system.img、updater.img、vendor.img、userdata.img合并成一个rpi4b.img。还是写一个简单的脚本来处理这个步骤.py。

不过有个问题,主分区只支持4个,所以updater.img暂时先不合并了,这个问题等以后再来处理。

最后将会得到一个rpi4b.img的镜像文件,将这个文件烧录到SD卡就可以了。

Linux:可以使用dd命令

windows:使用Win32 Disk Imager工具烧录即可。

到这里总算是跑通了一个完整的添加新单板的流程,只不过目前只适配了显示和触摸。接下来打算尝试HDF或者distributed部分。

⑺ 如何学习zynq以太网控制器及协议栈

第 9 章 ZedBoard 入门
前面大家已经对 ZYNQ 架构以及相应的开发工具有一定的认识,接下来我们将带领大家来一起 体验 ZYNQ,体验软硬件协同设计的魅力。由于时间的关系,下面的一些实验(本章及后续章节的实验) 可能有不完善的地方,欢迎读者向我们反馈。 9.1 跑马灯 本实验将指导大家使用 Vivado 集成设计环境创建本书的第一个 Zynq 设计。这里,我们使用跑马灯 这个入门实验来向大家介绍 Vivado IDE 的 IP Integrator 环境,并在 Zedboard 上实现这个简单的 Zynq 嵌 入式系统。之后,我们将会使用 SDK 创建一个简单的软件应用程序,并下载到 Zynq 的 ARM 处理器中, 对在 PL 端实现的硬件进行控制。本实验分为三个小节来向大家进行介绍: ? 第一节我们将使用 Vivado IDE 创建一个工程。 ? 在第一节的基础上,第二节我们将继续构建一个 Zynq 嵌入式处理系统,并将完成后的硬件导入 到 SDK 中进行软件设计。 ? 最后一节我们将使用 SDK 编写 ARM 测试应用程序, 并下载到 ZedBoard 上进行调试。 实验环境:Windows 7 x64 操作系统, Vivado2013.4,SDK 2013.4

9.1.1 Vivado 工程创建
1) 双击桌面 Vivado 快捷方式 ,或者浏览 Start > All Programes > Xilinx Design Tools > Vivado

2013.4 > Vivado 2013.4 来启动 Vivado. 2) 当 Vivado 启动后,可以看到图 9-1 的 Getting Started 页面。

图 9- 1 Vivado 开始界面

3) 选择 Create New Project 选项,图 9-2 所示的 New Project 向导将会打开,点击 Next。

图 9- 2 New Project 对话框 4) 在 Project Name 对话框中,输入 first_zynq_design 作为 Project name, 选择 C:/XUP/Zed 作为 Project location,确保 Create project subdirectory 被勾选上,如图 9-3,点击 Next。

图 9- 3 Project Name 对话框 5) 在 Project Type 对话框中,选择 RTL Project,确保 Do not specify sources at this time 选项没有 被勾选,如图 9-4,点击 Next。

图 9- 4 Project Type 对话框 6) 在 Add Source 对话框中, 选择 Verilog 作为目标语言,如果你对 VHDL 熟悉的话, 你也可以 选择 VHDL,如果这里你忘记了选择,在工程创建完成后,也可以在工程设置中选择你熟悉的 HDL 语言。如果你已经有了源文件,在这里就可以选择 Add file 或者 Add directory 进行添加, 由于我们没有任何的源文件, 所以这里我们直接点击 Next 即可,如图 9-5。

图 9- 5 添加源文件 7) 在 Add Existing IP 对话框中,点击 Next。 8) 在 Add Constraints 对话框中,点击 Next。 9) 在 Default Part 对话框中,在 Specify 框中选择 Boards 选项,在下面的 Board 列表中选择 ZedBoard Zynq Evaluation and Development Kit,点击 Next,如图 9-6。

图 9- 6 芯片选择 10) 在 New Project Summary 对话框中,点解 Finish 完成工程创建,至此,我们已经使用 Vivado 创建了一个 Zynq 设计的工程框架,图 9-7 为 Vivado 的工程界面,在第四章我们已经对该界面 进行过介绍,如果还不熟悉的读者再回到前面复习一下。下面我将使用 Flow Navigator 的 IP Integrator 功能完成第二节的嵌入式系统设计。

图 9- 7 Vivado 工程界面

9.1.2 在 Vivado 中创建 Zynq 嵌入式系统 这一节我们将创建一个简单的 Zynq 嵌入式系统,该系统使用 Zynq PL 部分实现一个通用 I/O 控制 器 (GPIO),控制器同 ZedBoard 上的 8 个 LED 相连接,并且通过 AXI 总线连接到 PS 端,这样我们就可 以通过将要在第三小节中实现的 ARM 应用程序来对 LED 进行控制。系统结构图如图 9-8 所示。

⑻ 如何在linux-3.x内核编译设备树

可以让设备树文件和内核一起编译,单独编译的化,可以参考下面的文档:
http://blog.csdn.net/woshigaoyuan/article/details/13996277

⑼ 编译linux内核设备树文件使用什么命令

Linux源码的arch/powerpc/boot/dts/目录下存放了很多dts文件,可以作为参考文件。另外dtc编译器在内核源码2.6.25版本之后已经被包含进去。在2.6.26版本之后,生成blob的简单规则已经加入makefile,如下命令:
$ make ARCH=powerpc canyonlands.dtb

也可以根据自己的硬件修改好dts文件后,用下面类似命令生成dtb文件。
$ dtc -f -I dts -O dtb -R 8 -S 0x3000 test.dts > mpc836x_mds.dtb

$ mkimage -A ppc -O Linux -T flat_dt -C none -a 0x300000 -e 0 -d mpc836x_mds.dtb mpc836x_mds.dtu

阅读全文

与设备树编译错误相关的资料

热点内容
客户端框架源码 浏览:206
python自动办公能干嘛 浏览:873
程序员追爱 浏览:252
程序员逻辑故事 浏览:768
加密icsot23i2c 浏览:713
你们有什么好的解压软件 浏览:607
常州空气压缩机厂家 浏览:241
安卓如何关闭app内弹出的更新提示 浏览:409
e4a写的app怎么装苹果手机 浏览:201
海立压缩机海信系 浏览:210
社保如何在app上合并 浏览:220
小米加密照片后缀 浏览:236
我的世界网易手机怎么创服务器 浏览:978
载入单页源码 浏览:930
阿里云服务器seo 浏览:777
海洋斗什么时候上线安卓 浏览:86
中行app如何查每日汇款限额 浏览:840
输入服务器sn是什么意思 浏览:725
sha1算法java 浏览:90
asp代码压缩 浏览:851