我是编写设备驱动程序的新手.
我想在ARM平台上为外设编写设备驱动程序.
第一个问题:在ARM平台上为外围设备编写设备驱动程序与在Linux中使用x86编写设备驱动程序有什么不同?
第二个问题:我检查了/ proc/iomem文件以查看处理器的当前地址映射.但是,并非所有外围设备(包括我要访问的外围设备)都不存在于该文件中.如何包含外设的地址范围?
第三个问题:设备树在编写设备驱动程序时的重要性是什么?
我有两个不同的设备树源的片段.
UART1: serial@ef600400 {
device_type = "serial";
compatible = "ns16550";
reg = <0xef600400 8>;
virtual-reg = <0xef600400>;
clock-frequency = <0x00a8c000>;
current-speed = <0>;
interrupt-parent = <&UIC0>;
interrupts = <1 4>;
};
serial0: serial@4500 {
cell-index = <0>;
device_type = "serial";
compatible = "ns16550";
reg = <0x4500 0x100>;
clock-frequency = <0>;
interrupts = <42 2>;
interrupt-parent = <&mpic>;
};
Run Code Online (Sandbox Code Playgroud)
我想知道什么是中断= <1 4>; 中断= <42 2>; 代表?
我们从哪里得到<1 4>,<42 2>的值?
此代码段来自RIoTBoard的设备树(/arch/arm/boot/dts/imx6dl-riotboard.dts)
&hdmi {
ddc-i2c-bus = <&i2c2>;
status = "okay";
};
Run Code Online (Sandbox Code Playgroud)
我已经遍历了devicetree.org和linux内核的documentation / devicetree文件夹中的设备树文档,但是当用作节点名称时,我无法找到任何有关phandle含义的描述。
在Xilinx ZCU102开发板上运行Linux。使用1000BASE-X和三模式以太网Mac时。我可以从以太网端口发送ping命令,但是当我运行tcpdump尝试显示数据包正在进入系统时...我从tcpdump中收到一个奇怪的错误。
tcpdump -I eth1
tcpdump: eth1: That device doesn't support monitor mode
Run Code Online (Sandbox Code Playgroud)
好奇是否有人对tcpdump的此错误消息有任何了解。
tcpdump如何知道设备是否支持监控模式?它是否在设备树的eth1设备节点中查找内容?
正在阅读设备树用法ranges并到达描述节点关键属性的部分。
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 …Run Code Online (Sandbox Code Playgroud) 我正在使用飞思卡尔 MX6 和飞思卡尔 3.10.31 修改内核。我有一个用作 IO 扩展器的 Maxim MAX7325,它的按钮连接到 P0-P2。来自 7325 的中断线连接到 GPIO_3 焊盘(我认为是 GPIO1_3...)
我在设备树中设置了 7325 和 gpio-keys,如下所示:
max7325_reset: max7325-reset {
compatible = "gpio-reset";
reset-gpios = <&gpio5 16 GPIO_ACTIVE_LOW>;
reset-delay-us = <1>;
#reset-cells = <0>;
};
gpio-keys {
compatible = "gpio-keys";
sw2 {
gpios = <&max7325 2 GPIO_ACTIVE_LOW>;
linux,code = <30>; //a
gpio-key,wakeup;
};
};
Run Code Online (Sandbox Code Playgroud)
和
&i2c1 {
clock-frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c1_2>;
status = "okay";
max7325: gpio@68 {
compatible = "maxim,max7325";
reg = <0x68>; …Run Code Online (Sandbox Code Playgroud) 如果我构建一个内核驱动程序module,它可以在运行时使用insmod或modprobe手动插入内核,我很清楚.但是关于设备树的以下陈述是否正确?
module它将在启动时自动插入内核,具体取决于它是否在设备树中列出built-in,则无论设备树如何,它都将在引导时自动插入内核我正在为小型设备在 Linux 中编写设备驱动程序。设备有一些特殊的内存限制,迫使我开辟一块内存,在我的驱动程序中,我需要知道保留内存的地址(和大小)
/ {
reserved-memory {
my_reserve: my_reserve@a0000000 {
compatible = "shared-dma-pool";
reg = <0 0xa0000000 0 0x20000>;
no-map;
};
};
my_device {
compatible = "my_device";
memory-region = <&my_reserve>;
};
};
Run Code Online (Sandbox Code Playgroud)
如何0xa000'0000在我的设备驱动程序中读取保留内存的物理地址(即如何读取值)?似乎有一个用于保留内存的 API,但是我看不到任何返回struct reserved_mem *
根据我对设备树的理解,主要用途之一是从驱动程序中删除特定于平台的代码以支持多个平台.设备树如何处理单个外设的多个配置?
例如,如果我想在平台A中使用LCD面板A而在平台B中使用LCD面板B,我是否需要将LCD面板A和面板B相关代码保留在最终二进制文件中?如果是这种情况,并且有多个外围设备有多个选项,则二进制文件中似乎会有大量额外代码.
如何将平台特定文件转换为设备树?
我理论上知道设备树.请解释它如何在覆盆子pi板或任何其他板上工作.
device-tree ×10
linux ×5
linux-kernel ×5
arm ×4
kernel ×3
device ×1
gpio ×1
max732x.c ×1
powerpc ×1
tcpdump ×1