通常对于 arm 系统,设备树向内核 (Linux) 提供硬件信息。这些设备树作为编译并加载到内核的 dts(设备树源)文件存在。问题是我无权访问这样的dts文件,甚至无法访问dtb文件。
我可以访问/sys和/proc在机器上,我想问一下这是否允许我“猜测正确的值”以在 dts 中使用?
如果这个问题的答案还取决于是否首先使用了设备树接口(即 adtb被创建并提供给内核),而不是一些更多的黑客攻击,那么潜在的答案也可以突出另一个方面“我们只是从 vanilla 转移并修补内核以解决我们内核的设备信息问题“-解决方案?
我正在使用带有 Debian 构建的嵌入式 Arm。如何从设备树中列出已编译的设备?我想看看是否已经支持某个设备。
对于阅读本文的人来说,“设备树”是将设备添加到(嵌入式)Linux 内核的规范/标准。
在嵌入式设备中引导内核时,您需要向 Linux 内核提供设备树,而在常规 x86 pc 上引导内核不需要设备树——为什么?
据我了解,在 x86 pc 上,内核“探测”硬件(如果我错了,请纠正我),那么为什么内核不能探测嵌入式系统中的硬件?
我正在查看一个尝试指定不同节点的 DTS 文件,但有趣的是我发现一些节点具有不同的命名方式。
/ {
model = "TI AM335x BeagleBone Black";
compatible = "ti,am335x-bone-black", "ti,am335x-bone", "ti,am33xx";
};
&ldo3_reg {
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
regulator-always-on;
};
&mmc1 {
vmmc-supply = <&vmmcsd_fixed>;
};
&mmc2 {
vmmc-supply = <&vmmcsd_fixed>;
pinctrl-names = "default";
pinctrl-0 = <&emmc_pins>;
bus-width = <8>;
status = "okay";
};
/ {
hdmi {
compatible = "ti,tilcdc,slave";
i2c = <&i2c0>;
pinctrl-names = "default", "off";
pinctrl-0 = <&nxp_hdmi_bonelt_pins>;
pinctrl-1 = <&nxp_hdmi_bonelt_off_pins>;
status = "okay";
};
};
Run Code Online (Sandbox Code Playgroud)
如果一个节点有&它的前缀,它表达了什么?将它们与根节点分开的必要性是什么,而它们可以存在于根节点本身中?有趣的是,上面的例子也有两个根节点,这怎么可能?
我正在使用 TS-4900,这是一个插入基板的嵌入式“计算机模块”,运行 Yocto Linux。它使用 U-Boot 启动,据说它会根据底板的型号选择正确的 dtb 文件来启动,如果它无法找到正确的文件,它可能会回退到我的模块的“通用”文件。
但是它如何/在哪里确定正确的?我如何知道使用了哪个 .dtb,或者设置应该使用哪个?
下面是 U-Boot 的启动信息。
U-Boot 2014.10-g3ac6ec3 (Jan 29 2015 - 17:20:15)
CPU: Freescale i.MX6SOLO rev1.1 at 792 MHz
Reset cause: POR
Board: TS-4900
Revision: C
Watchdog enabled
I2C: ready
DRAM: 1 GiB
MMC: FSL_SDHC: 0, FSL_SDHC: 1
SF: Detected N25Q64 with page size 256 Bytes, erase size 4 KiB, total 8 MiB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: using phy at 7 …Run Code Online (Sandbox Code Playgroud) 我想弄清楚为什么以下设备未在我的Creator CI20上设置为其驱动程序。作为参考,我使用的是 Linux 内核 v4.13.0 并在本地进行编译:
make ARCH=mips ci20_defconfig
make -j8 ARCH=mips CROSS_COMPILE=mipsel-linux-gnu- uImage
Run Code Online (Sandbox Code Playgroud)
从正在运行的系统中,我可以看到:
ci20@ci20:~# find /sys | grep rng
/sys/firmware/devicetree/base/jz4780-cgu@10000000/rng@d8
/sys/firmware/devicetree/base/jz4780-cgu@10000000/rng@d8/compatible
/sys/firmware/devicetree/base/jz4780-cgu@10000000/rng@d8/name
/sys/bus/platform/drivers/jz4780-rng
/sys/bus/platform/drivers/jz4780-rng/bind
/sys/bus/platform/drivers/jz4780-rng/unbind
/sys/bus/platform/drivers/jz4780-rng/uevent
Run Code Online (Sandbox Code Playgroud)
所以设备在运行时被内核看到,现在缺少的部分是为什么驱动程序从未绑定?我会期待这样的事情:
/sys/bus/platform/drivers/jz4780-rng/100000d8.rng
Run Code Online (Sandbox Code Playgroud)
我确实找到了其他一些解释如何调试正在运行的系统的帖子,例如:
虽然这些帖子上的信息是准确的,但对我来说并不是很有帮助。由于我在本地构建我的内核(我printk在jz4780-rng驱动程序的探测功能中添加了),我的问题是:
jz4780-rng驱动程序调用探测函数的准确信息?driver_probe_device?我printk可以在代码中的任何地方添加来调试它。问题是:哪个函数正在遍历设备树并调用probe/init 函数?
以供参考:
$ dtc -I fs -O dts /sys/firmware/devicetree/base | grep -A 1 rng
rng@d8 {
compatible = "ingenic,jz4780-rng";
};
Run Code Online (Sandbox Code Playgroud)
兼容字符串声明为:
cgu: jz4780-cgu@10000000 {
compatible = …Run Code Online (Sandbox Code Playgroud) 设备树和设备树 blob 究竟是什么?我在哪里可以获得特定 linux 版本的源代码?我在 xilinx 芯片(具有 ARM 9)上运行 linux 时发现了这样的名称,例如:here
我有一个基于 imx233-Olinuxino-Nano 的设备。
Arch Linux Arm 发行版启动并运行。
但是,我的板上有一个从设备连接到 CPU 的 SPI。内核支持它,但很明显,Olinuxino 的通用设备树不包含它的描述。
如何让它显示在 /dev 目录中?我知道我可以在 Linux 内核中更改设备树并重新编译该设备树,但我听说可以提供设备树覆盖文件来在启动时更改设备树。我怎么做?到目前为止,我发现的信息是稀缺和模糊的。
设备树在 ARM 设备上运行时用于识别和加载正确的驱动程序及其配置。但是当我在/proc/device-tree手机上查看加载的 DT 时,有很多与实际平台无关的配置。例如,大约 15 种不同的显示配置,该特定设备从未使用过,也永远不会使用。到目前为止,我认为只有相关的 DT 被包含在内核中并加载,但似乎相关/arch源文件夹中的所有 DTS都已加载。内核如何为平台选择合适的?这不是有点多余吗?
我正在尝试在 android 电视盒上闪烁 libreelec,但没有可以放入 libreelec 烤面包机的图像。在 RPi 上它很简单,在这里我想我必须编译东西,我真的没有答案。有一个基于 S802 的前一个 Box 的图像(只找到了一个 lakka 版本(?)),但即使有 S812 的 libreelec,我也不知道谁将它从 zip/tar 中“编译”为实际usb-sd-creator 的图像。也许它比看起来容易,请给我一个提示!
开始问题:有人知道如何在基于 S812 的板上闪存/编译 Libreelec 吗?
当前问题:如何反编译 arm 固件文件,以获取在我的板上安装不同操作系统显然需要的设备树文件?
看:
烤面包机:https : //libreelec.tv/2016/08/usb-sd-creator/
lakka/libreelec build (.img) 用于之前的盒子:http ://le.builds.lakka.tv/S802.M8.arm/
libreelec 从 amlinux.ru 构建,例如基于 S812 的盒子:https ://mega.nz/#F!W0Qk2JIQ!P1iyw7dFFHvubkIUZ-i1lA!3ohmxIaJ
可能的解决方案:
以下页面包含许多用于 Amlogic 板的 Linux 版本(S805 S905 S905X S912(SD 和 USB):
见:http : //freaktab.com/forum/tv-player-support/amlogic-based-tv-players/606133-linux-images-for-s805-s905-s905x-s912-sd-and-usb
可能的解决方案:
这个页面有点帮助,显然我只需要通过 dd 在 SD 卡上复制提取的图像(.xz -> .img),因为较新的版本已经包含了启用多重启动以并行使用 android 和 …