我需要获取指向linux中注册的特定设备的指针.简而言之,该设备代表一个mii_bus对象.问题是这个设备似乎不属于总线(它dev->bus是NULL)所以我不能使用例如功能bus_for_each_dev.然而,该设备由Open Firmware层注册,我可以看到相对of_device(我感兴趣的设备的父亲)/sys/bus/of_platform.我的设备也注册了,class所以我可以找到它/sys/class/mdio_bus.现在的问题是:
可以使用指向of_device我们想要的设备的父指针来获取指针吗?
如何通过仅使用名称来获取指向已经实例化的类的指针?如果有可能,我可以迭代该类的设备.
任何其他建议都非常有用!谢谢你们.
我目前正在尝试了解 linux 驱动程序是如何工作的。据我所知,当内核解析设备树中相应的 .compatible 字符串时,会调用驱动程序的probe/init 函数。但是,在 arizona-spi 驱动程序中,似乎在不同的成员中引用了多个兼容的字符串:
static const struct spi_device_id arizona_spi_ids[] = {
{ "wm5102", WM5102 },
{ "wm5110", WM5110 },
{ },
};
MODULE_DEVICE_TABLE(spi, arizona_spi_ids);
static struct spi_driver arizona_spi_driver = {
.driver = {
.name = "arizona",
.owner = THIS_MODULE,
.pm = &arizona_pm_ops,
// Contains e.g. "wlf,wm5102"
.of_match_table = of_match_ptr(arizona_of_match),
},
.probe = arizona_spi_probe,
.remove = arizona_spi_remove,
.id_table = arizona_spi_ids, // Contains "wm5102" and "wm5110"
};
Run Code Online (Sandbox Code Playgroud)
这是这里的摘录。
那么 arizona_spi_driver.id_table 和 arizona_spi_driver.driver.of_match_table 有什么区别呢?
我想手动编译我的主板设备树。我已经dtc从官方来源下载了最新版本的,但是当我尝试运行以下命令时,出现错误提示我将所有#include指令更改/include/为#define等等。
dtc -I dts -O dtb -p 0x1000 meson-gxl-s905x-khadas-vim.dts -o kvim1.dtb
Run Code Online (Sandbox Code Playgroud)
我的董事会是Khadas Vim,其核心是amlogic S905x SoC。所有包含文件都存在,并且错误是:
Error: meson-gxl-s905x-khadas-vim.dts:8.1-9 syntax error
FATAL ERROR: Unable to parse input tree
Run Code Online (Sandbox Code Playgroud)
第八行是:
#include <dt-bindings/input/input.h>
Run Code Online (Sandbox Code Playgroud)
更改#include为/include/将抑制错误!
如果您知道设备树“语言”的某些参考(U-boot文档除外),请对其进行介绍。
我已经开发了一个内核模块来将nf4标签作为char设备进行管理。
我已经在内核外部开发了该模块,并在开发阶段对其进行了测试,将其编译为可加载的内核模块(即.ko)。
一旦驱动程序正常运行并足够稳定,我便使用补丁将其插入linux内核源代码(v4.9.30),以便将其构建为内核的一部分。
这是我在模块所在的情况 已加载 在内核引导时对其进行探测,因为它是内置的,并出现在设备树中。
现在,我想在驱动程序上进行一些改进,并且不想将这些更改直接实现到内核中。
因此,我想将驱动程序的代码集成到Linux内核中,但不要在启动时将其插入。为此,我刚刚将驱动程序的status字段更改status = "disable";为device-tree,实际上在启动时不再插入该模块。
但是我无法插入已修改的可加载模块。ENODEV由于在platform函数中找不到beeinging设备,我插入了at。
我不明白的是,为什么除了状态字段值之外,没有更改设备树,为什么找不到平台设备。
编辑:添加有关情况的精度
经过更多的探索之后,我必须弄清楚我什至没有进入回调nf4_probe。
将platform_driver_probe实现(参见此处)检查到v4.9.30内核源代码后,似乎错误来自此处:
if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
retval = -ENODEV;
Run Code Online (Sandbox Code Playgroud)
通过从命令行检查设备树,我可以看到该设备已定义为该目录/proc/device-tree/nf4tag存在,并用与设备树中对应的值填充。
编辑: @sawdust的答案后,添加有关问题的目标的精度
我显然被误解了,这status=disable意味着该设备在硬件配置上根本不存在。尽管只是描述了是否应该检测驱动程序。
为了使目标更清晰,我精确地确定了驱动程序已编码为适当的模块,并已编译为所用内核的可加载模块。
但是,我不想重新编译内核以测试我所做的每个更改。因此,我的目标是仅重新编译.ko,直到进行我的修改为止,然后,在完成所有操作后,使用补丁将这些修改添加到内置模块中。
通过这种工作方式,我可以重建.ko并将其插入到我的目标平台上,而不必为每次修改重新编译内核。
因此,恢复我的问题应该是:
如何用可加载模块替换内置模块而无需重新编译内核以禁用内置模块?
除了禁用内置模块编译到内核之外,也许没有针对此目标的解决方案。
任何人都可以解释 range 属性中的每个值代表什么。
my_pcie_0: pcie@10000000 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "mypcie";
device_type = "pcie";
reg = < 0x40000000 0x00100000 >;
ranges = < 0x02000000 0 0xf0000000 0xf00000000 0x0 0x08000000>;
}
Run Code Online (Sandbox Code Playgroud) 我想定义一个具有用户模式访问权限的SPI设备,例如http://linux-sunxi.org/SPIdev中所述
在这些示例之后,我在devicetree中添加了this:
&ecspi1 {
.... other stuff ...
mydev@0 {
compatible = "spidev";
spi-max-frequency = <5000000>;
reg = <2>; /*chipselect*/
};
};
Run Code Online (Sandbox Code Playgroud)
该平台是i.MX6。ecspi1似乎是他们的SPI控制器。然后我确实得到了/dev/spi0.2和/sys/class/spidev/spidev0.2
但是在内核跟踪中有一个警告说:
spidev spi0.2:越野车DT:spidev直接列在DT中
那么还应该如何描述spidev?正确的语法是什么?
我有两个设备树节点,一个设置 GPIO 引脚,另一个配置一个 i2c 总线,例如:
&gpio2 {
en-gpio {
gpio-hog;
gpios = <5 0>;
output-high;
};
};
&i2c1 {
gpiom1: gpio@27 {
compatible = "microchip,mcp23008";
gpio-controller;
#gpio-cells = <2>;
reg = <0x27>;
};
};
Run Code Online (Sandbox Code Playgroud)
如何在 i2c 节点和 GPIO 节点之间添加依赖关系?我想要实现的是,应该在初始化 i2c 上的设备之前设置 GPIO 引脚。
我的理解是,对于 ARM,内核启动命令行一般有以下三个来源:
一个可以附加到另一个,即我们可以使用 CONFIG_CMDLINE 传递一些参数,然后在设备树中附加硬件特定参数吗?
我首先尝试组合 1、2 和 3,但这无法编译:
/dts-v1/;
#include "imx6q.dtsi"
#include "imx6q-h.dtsi"
#include "imx6q-m.dtsi"
/ {
model = "A M";
compatible = "a,imx6q-hydra13", "a,imx6q-mercury",
"a,imx6q-hydra", "fsl,imx6q";
};
&ssd_touch {
status = "okay";
};
ERROR AT THIS LINE: chosen {
bootargs = "console=ttymxc1,115200";
};
Run Code Online (Sandbox Code Playgroud) 我使用内核 linux-ti-staging-4.14 和自定义设备树为我的 BBB 构建了 yocto 发行版 (rocko)。由于我需要将一个旧项目从 Debian 移植到 Yocto,因此我还需要在内核中启用 UIO 功能,这也可以正常工作。
现在我还需要为 UIO PRUSS 创建一个附加的设备树覆盖。我使用此处的 dts 文件并通过 bbappend 扩展了内核配方:
inherit kernel-devicetree
FILESEXTRAPATHS_prepend := "${THISDIR}/files/dts:${THISDIR}/files/beaglebone:"
# Make custom kernel with PRU enabled
SRC_URI += " \
file://bbb-pru-minimal.dts;subdir=git/arch/${ARCH}/boot/dts \
file://AM335X-PRU-UIO-00A0-overlay.dts;subdir=git/arch/${ARCH}/boot/dts/overlays \
file://0001-add-UIO-dtbo.patch \
file://defconfig \
"
KERNEL_DEVICETREE = " \
AM335X-PRU-UIO-00A0.dtbo \
bbb-pru-minimal.dtb \
"
Run Code Online (Sandbox Code Playgroud)
上面列出的补丁文件包含:
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index 7949c213a434..fe2513074893 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -610,6 +610,7 @@ dtb-$(CONFIG_SOC_TI81XX) += \
dm8168-evm.dtb \
dra62x-j5eco-evm.dtb
dtb-$(CONFIG_SOC_AM33XX) …Run Code Online (Sandbox Code Playgroud) device-tree ×10
linux-kernel ×8
linux ×3
arm ×1
bitbake ×1
command-line ×1
device ×1
dts ×1
embedded ×1
spi ×1
yocto ×1