我正在经历Uboot和内核启动过程.FDT(平面设备树)的用途究竟是什么?
许多链接我已经读过他们声明uboot以FDT的形式将板和SOC配置信息传递给内核
https://wiki.freebsd.org/FlattenedDeviceTree
为什么内核需要板配置信息?
我问这个问题,因为当我们在linux中创建设备驱动程序时,我们使用probe()或module_init()调用初始化设备并使用request_mem_region()和ioremap()函数来获取地址范围然后设置时钟和其他司机登记.
request_mem_region()实际上做什么以及何时需要它?
现在,如果我的片上和片上器件的设备驱动程序正在进行全板初始化.
那么flattened device tree内核的用途是什么?
我可以看看/sys/kernel/debug/pinctrl/44e10800.pinmux/pins我感兴趣的引脚:
pin 38 (44e10898.0) 00000037 pinctrl-single
Run Code Online (Sandbox Code Playgroud)
这对应于GPIO[2]4,或P8.10.
我正在使用带有内核的Fedora 21 3.17.7-300.fc21.armv7hl.
我想将多路复用器更改为0x27.总之,这会将引脚配置为具有内部下拉电阻(之前,它是上拉电阻).
期望的输出是:
pin 38 (44e10898.0) 00000027 pinctrl-single
Run Code Online (Sandbox Code Playgroud)
可以做些什么?
注意:没有/sys/devices/bone_capemgr.*,因为这不是Angstrom.典型的DTO方法通过修改开普管理器来导出更改.这不是一个选择.
编辑:经过tad思考,我做了:
dtc -I dtb -O dts -o ~/am335x-boneblack.dts /boot/dtb-3.17.7-300.fc21.armv7hl/am335x-boneblack.dtb.我编辑了这个文件:
...
pinmux@44e10800 {
...
example {
pinctrl-single,pins = <0x898 0x27>;
};
};
...
Run Code Online (Sandbox Code Playgroud)
然后,我再次编译它dtc,插入/boot/dtb-3.17.7-300.fc21.armv7hl/并重新启动.然而,没有任何改变.发生了什么?
编辑:
正如Charles Steinkuehler所指出的那样,0x800需要从偏移量中减去,而"某些东西"需要引用"示例".
如果我添加0x098 0x27到我的条目中user_leds_s0,则会观察到所需的行为:
...
user_leds_s0 {
pinctrl-single,pins = <0x54 0x7 0x58 0x17 …Run Code Online (Sandbox Code Playgroud) 我正在为设备开发一个设备驱动程序.我想知道除了编写设备驱动程序之外什么以及何时需要它 - 设备树blob(dtb)或设备树覆盖(dtbo).
是否可以动态插入dtb(在使用dtc编译器编译之后)并测试驱动程序(可动态加载).
对于静态构建dtb,除了设备驱动程序的Kconfig之外,我还需要处理dtb文件的任何Kconfig.
gpio-hog声明的目的和用例是什么?我正在尝试配置许多(10+)GPIO,以便与Userspace中的低级芯片通信。我已经很容易使用sysfs导出对芯片进行了交谈,但是内核和编程论坛中的文档都让我担心在生产系统中使用这种机制。
阅读更多的内核文档,我阅读了有关gpio-hog声明的信息,这似乎是至少初始配置GPIO的理想机制。从文档中:
GPIO触发是一种机制,提供自动GPIO请求和配置,作为gpio控制器的驱动程序探测功能的一部分。
除了设置正确的低位供应商设置外,我还启用了所需gpio引脚的暂存功能,他们提出了正确的设置。问题在于,gpio似乎是内核拥有的,不能通过任何Userspace工具(例如sysfs或)进行接口libgpiod。这对我来说使猪圈基本上毫无用处,也使我怀疑它的真正目的是什么。我正在libgpiod最后一种探索方式,但是文档表明,这hogging应该是我使用的机制。
什么是Linux中的设备树?设备树的优点和缺点是什么?
如果有人详细了解设备树,请帮助回答上述问题.
我正在尝试使用自己的U-Boot构建来在Jetson TK1板上启动Linux.当我们推动验证启动时,我使用平面图像树(统一内核映像,设备树blob,...)来描述我的系统.U-Boot可以加载ITB文件并尝试启动内核,但系统会在此消息后挂起.
我假设这是因为没有引导参数传递给内核(原始启动添加了参数的加载)但我对如何将参数传递给内核有点傻眼.我尝试设置bootargs环境变量,但这并没有改变这种情况.
使用ITB文件时如何将内核参数传递给内核?
命令行参数(取自示例extlinux.conf的APPEND命令):
console=ttyS0,115200n8 console=tty1 no_console_suspend=1
lp0_vec=2064@0xf46ff000 video=tegrafb mem=1862M@2048M memtype=255 ddr_die=2048M@2048M
section=256M pmuboard=0x0177:0x0000:0x02:0x43:0x00 vpr=151M@3945M tsec=32M@3913M
otf_key=c75e5bb91eb3bd947560357b64422f85 usbcore.old_scheme_first=1 core_edp_mv=1150
core_edp_ma=4000 tegraid=40.1.1.0.0 debug_uartport=lsport,3 power_supply=Adapter
audio_codec=rt5640 modem_id=0 android.kerneltype=normal usb_port_owner_info=0
fbcon=map:1 commchip_id=0 usb_port_owner_info=0 lane_owner_info=6 emc_max_dvfs=0
touch_id=0@0 tegra_fbmem=32899072@0xad012000 board_info=0x0177:0x0000:0x02:0x43:0x00
root=/dev/mmcblk0p1 rw rootwait tegraboot=sdmmc gpt
Run Code Online (Sandbox Code Playgroud)
ITS文件的内容:
/dts-v1/;
/ {
description = "Simple image with single Linux kernel and FDT blob";
#address-cells = <1>;
images {
kernel@1 {
description = "Vanilla Linux kernel";
data = /incbin/("./zImage");
type = "kernel";
arch = "arm";
os = "linux"; …Run Code Online (Sandbox Code Playgroud) 应该有一种独立于标准、主板和架构的方法来做到这一点,就像 initfamfs 一样,不是吗?
如果重要的话,我正在使用 powerpc 和 linux-3.10。如果以后有更好的设施,我很想听听。
如果有人知道目前正在工作的董事会,我可以将其用作参考,那也会有所帮助。
我一直在搜索和搜索,我找到了很多关于为什么 dts/dtb 存在的信息,大量关于它们是否有用的持续讨论,以及一些关于如何编写 dts 或使用现有 dts 的信息,但没有关于如何嵌入它们。
快速描述或相关文档的指针将非常感激。
我使用Yocto为Beaglebone Black创建一个小的linux映像.我想我的大部分工作都像我想要的那样,除了我需要访问UART 2和4.当我使用标准的Debian图像时,我用设备树覆盖和capemgr做了这个.但是,我发现使用Yocto构建的内核没有capemgr.
我的选择似乎是:
选项2似乎更容易.
UART的设备树覆盖在这里和这里.我已经尝试过以某种方式包含这些内容.
这两种方法都会产生如下错误:
Error: am335x-boneblack.dts:1.1-2 syntax error
FATAL ERROR: Unable to parse input tree
Run Code Online (Sandbox Code Playgroud)
但是,我注意到在尝试编译am335x-boneblack.dts时我得到了类似的错误,即使没有修改它,所以我可能甚至没有做到这一点.(使用命令dtc -I dts -O dtb -o result.dtb am335x-boneblack.dts)
显然我不知道我在做什么.我怀疑设备树覆盖必须以某种方式进行修改,以便在我尝试使用它们的方式中使用.或者也许我没有做包含权限(只需在文件顶部添加#include).
有没有人有任何想法我可能做错了什么?我正在努力做甚么可能吗?
在struct device \xef\xbc\x8c的定义中有一个fwnode字段\xef\xbc\x8c
\nstruct device {\n ...\n struct fwnode_handle *fwnode; /* firmware device node */\n ...\n}\nRun Code Online (Sandbox Code Playgroud)\n相应的文件位于include/linux/fwnode.h中:
\nstruct fwnode_reference_args {\n struct fwnode_handle *fwnode;\n unsigned int nargs;\n unsigned int args[NR_FWNODE_REFERENCE_ARGS];\n};\n...\nRun Code Online (Sandbox Code Playgroud)\n然后我在网站上搜索它,但找不到内核这部分(fwnode)的详细解释,那么这是什么意思?它有什么作用?\n你能提供一个文档以供参考吗?
\n当我使用 Yocto Kirkstone 为机器 beaglebone-yocto 构建核心映像时,我得到一个文件/boot/extlinux/extlinux.conf. 该文件如下所示:
default Yocto
label Yocto
kernel /zImage
fdtdir /
append root=PARTUUID=f8fbccd5-02 rootwait console=ttyS0,115200
Run Code Online (Sandbox Code Playgroud)
我可以在标签 a 内附加DEVICETREE /mycustom.dtb,它将在下次启动时加载 mycustom.dtb 作为设备树。我不知道如何将其包含在 Yocto 构建中,因此mycustm.dtsi会被编译并添加到 /boot 文件夹中。
我尝试过使用如下食谱mycustom.dts进行编译:mycustom.dtb
inherit devicetree
FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
SRC_URI = " \
file://mycustom.dts;subdir=git/overlays \
"
S = "${WORKDIR}/git/overlays"
COMPATIBLE_MACHINE = ".*(beaglebone).*"
Run Code Online (Sandbox Code Playgroud)
它构建正确,但是当我在图像中使用它时,我收到错误:No match for argument: mycustom因为do_rootfs: Could not invoke dnf. 看起来 do_root 作为mycustom参数添加到命令中,导致命令失败。
device-tree ×10
linux-kernel ×8
linux ×3
gpio ×2
u-boot ×2
acpi ×1
arguments ×1
c ×1
embedded ×1
powerpc ×1
yocto ×1
yocto-layer ×1
yocto-recipe ×1