我期待创建一个实用程序,它可以针对来自其他工具的XML配置文件验证嵌入式(PPC或ARM)Linux*.dts(设备树源)或*.dtb(二进制)文件.所以,我需要解析dts或dtb文件.我真的很想用Python做这件事.有谁知道那里解析dts或dtb文件的Python库或工具?设备树编译器(dtc)的Python实现将是完美的,但我还没有看到.
beagleboard或beaglebone是不同的工作方式.使用以前的内核,它们位于/ sys/kernel/debug/omap_mux中.你知道最后一个内核那些文件在哪里?
我正在使用Debian wheezy文件系统和Robert Nelson的最新内核.我想禁用使用设备树覆盖的心跳.
我知道有更简单的方法可以做到这一点,但我只对使用叠加来禁用心跳导致的答案感兴趣.
我可以通过以下方式更改gpio-leds,led0 leaf in am335x-boneblack.dts:linux,default-trigger ="heartbeat"; 到linux,default-trigger ="none";
然后编译设备树并重新启动.
但是,如果我尝试使用以下叠加层实现相同的功能,则在使用echo> $ SLOTS成功应用叠加层后,心跳指示灯会继续闪烁.
我究竟做错了什么?
/dts-v1/;
/plugin/;
/
{
compatible = "ti,beaglebone", "ti,beaglebone-black";
part-number = "pru";
version = "00A0";
fragment@0
{
target = <&ocp>;
__overlay__
{
gpio-leds
{
compatible = "gpio-leds";
pinctrl-names = "default";
pinctrl-0 = <0x3>;
led0
{
label = "beaglebone:green:usr0";
gpios = <0x5 0x15 0x0>;
linux,default-trigger = "none";
default-state = "off";
};
};
};
};
};
Run Code Online (Sandbox Code Playgroud) 我是Linux内核的初学者.
据我所知,在旧版本的内核中有一个特定于板的文件,其中所有设备都已注册(通过使用某些API platform_get_register等).
在较新版本的内核中,设备所需的信息将通过设备树传递.
我的问题是内核如何从设备树中获取驱动程序的信息?设备如何通过设备树在内核中注册?
我正在尝试将PCA9557 I / O扩展器添加到I2C总线上基于手臂的系统上。系统已经在不同的I2C总线上具有另一个I / O扩展器。我试图弄清楚如何指定新扩展器上的针脚获得的GPIO编号,以及如何使它们都能正常工作。
这是I2C总线2下现有扩展器的设备树部分:
i2c2: i2c@e8007000 {
status = "ok";
pca9539: pca9539@74 {
compatible = "nxp,pca9539";
reg = <0x74>;
interrupt-parent = <&gpio>;
interrupts = <9 0x0>;
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
};
};
Run Code Online (Sandbox Code Playgroud)
使用上述方法,现有的I / O扩展器(带有16个GPIO)在Linux中显示为/ sys / class / gpio / gpiochip128,公开了GPIO编号128-143。GPIO 0-127内置于主机处理器中。
我为I2C总线0上的新扩展器添加了以下内容:
i2c0: i2c@e8003000 {
status = "ok";
pca9557: pca9557@18 {
compatible = "nxp,pca9557";
reg = <0x18>;
gpio-controller;
#gpio-cells = <2>;
};
Run Code Online (Sandbox Code Playgroud)
我还修改了内核配置,以构建GPIO_PCA953X驱动程序,该驱动程序应支持PCA9557。
当我将以上内容添加到设备树中进行编译和引导时,我现在看到映射为/ sys / class …
是否有API从用户空间读取Open-Firmware设备树?
例如,读取/ sys/firmware/fdt(flattened device tree)?
如果没有,是否发布了文件格式,以便用户空间应用程序可以读取fdt中的条目?
我读了一些关于这个主题的文章.但他们都没有描述细节.
我所知道的是:
在设备树中声明"compatible"属性:
gpio0: gpio@44e07000 {
compatible = "ti,omap4-gpio";
...
};
Run Code Online (Sandbox Code Playgroud)
并通过.建立与平台驱动程序的连接
static const struct of_device_id omap_gpio_match[] = {
{
.compatible = "ti,omap4-gpio",
},
{ },
};
...
static struct platform_driver omap_gpio_driver = {
.probe = omap_gpio_probe,
.driver = {
.name = "omap_gpio",
.pm = &gpio_pm_ops,
.of_match_table = of_match_ptr(omap_gpio_match),
},
};
Run Code Online (Sandbox Code Playgroud)
因此,of_match_table将用于匹配设备树中声明的兼容属性.
以及在platform_match(drivers/base/platform.c)函数中执行的匹配操作.我怀疑这因为I greped的参考of_match_table,并且在唯一的可能的结果of_device_get_match_data(drivers/of/device.c)函数.
~/wk/linux$ find . -name '*.c' | xargs grep '\<of_match_table\>' | …Run Code Online (Sandbox Code Playgroud) 我多次尝试为我的设备获取 CM(现为 Lineageos)13/14.1 版本,该设备是带有 EMUI 3.0(Kit Kat 4.4.4)的华为 Mediapad T1-A21W(代号:hwt1a21l),但我由于以下原因受到限制:
基本上,从一开始就绝对是零开发或基础,所以我必须制作设备树并提取供应商 blob 才能实现我想要的。幸运的是我从华为网站下载了内核源代码。
好吧,关于设备树:
经过大量搜索和设置后,我创建了一个设备树,但我不明白的是,当我将我的(这个)与另一个我知道它功能齐全的设备进行比较时,例如我的 OnePlus One 中的这个,第二个一个(OnePlus One)它有大量我的没有的文件和目录,所以我不明白它们来自哪里。另外我不太明白一些参数来自哪里,例如,OnePlus One 的 BoardConfig.mk 有大量我的没有的目标(不确定是否是这样调用的,target=parameters)。
也许将 OnePlus 与华为进行比较不是最好的主意,因为它们来自不同的品牌,但无论如何,我之前解释的内容都可以应用于与我的类似设备(荣耀 4X 代号:cherry),这与我的设备几乎相同设备在硬件方面,它们具有相同的CPU和主板。(由于缺乏声誉而无法链接)。
关于供应商 blob:
我尝试遵循许多解释如何获取供应商 blob 的指南。虽然其中 90% 基于现有的供应商 blob,但我发现的其他文件基于名为extract-files.sh的脚本,该脚本应该位于device_vendor_codename中,并根据以下内容自动提取供应商文件另一个名为propietary-files.txt的文件。问题是我的设备路径(device_huawei_hwt1a21l)中没有 extract-files.sh 和 propietary-files.txt 文件,我不知道如何获取它们。该脚本不是问题,因为我可以下载一个脚本并轻松地将其适应我的设备,但最大的问题是要提取的特定供应商文件(propietary-files.txt),这是我无法控制的。
我正在使用 Altera 的带有双 Cortex-A9 处理器的 Cyclone V SOC FPGA。嵌入式系统(linux 4.15.7)是用 Buildroot-2018.02 创建的。U-boot 用于加载系统,即 FPGA.rbf 文件、设备树 blob 和 zImage,一切正常。
我现在想将 RBF 文件集成到我的 linux 并从 Linux 对 FPGA 进行编程。我找到了几种方法,我理解的一种最常见的是将 CONFIGFS 与设备树覆盖一起使用。
因此,我更改了我的设备树以集成覆盖、u-boot 引导脚本以禁用 FPGA 加载以及 linux“.config”文件中的以下选项make linux-xconfig:
+CONFIG_OF_OVERLAY=y
+CONFIG_ALTERA_STAPL=y
+CONFIG_CONFIGFS_FS=y
+CONFIG_SAMPLES=y
+CONFIG_SAMPLE_CONFIGFS=m
Run Code Online (Sandbox Code Playgroud)
这些选项是我经过多次尝试后的状态。
在 make 和重新启动后,一旦加载了内核,我就会在控制台中输入以下命令:
mkdir /config
mount -t configfs none /config
Run Code Online (Sandbox Code Playgroud)
在这种状态下,我希望在 /config 文件夹中看到一些设备树文件,但没有,只有一个 rdma_cm 文件夹:
# ls /config
rdma_cm
Run Code Online (Sandbox Code Playgroud)
我继续阅读这个主题,发现我必须在我的 linux 内核中启用 CONFIG_OF_CONFIGFS 选项。
问题:此选项在我的 linux 内核中不可用。此外,文件drivers/of/configfs.c也不在这里。我徒劳地搜索了如何为我的内核版本启用设备树覆盖。
如何配置我的内核以使设备树在 configfs 中可用?
设备树中的address-cell和size-cells是什么?难道reg是与address-cell和size-cell?如果是,那么如何?
例如:
memory: memory@20000000 {
#address-cells = <1>;
#size-cells = <1>;
device_type = "memory";
reg = <0x20000000 0x80000000>;
};
Run Code Online (Sandbox Code Playgroud)
什么是 0x20000000 ?我们从哪里可以得到这个?
device-tree ×10
linux ×4
linux-kernel ×3
gpio ×2
android ×1
beagleboard ×1
blob ×1
cyanogenmod ×1
driver ×1
i2c ×1
intel-fpga ×1
overlay ×1
platform ×1
python ×1