设备驱动程序在Linux内核中扮演着特殊的角色。它们是以编程方式抽象的“黑盒子”,使特定的硬件响应明确定义的内部编程接口;他们完全隐藏了设备如何工作的细节。
设备树中的地址单元和尺寸单元是什么? reg 与地址单元和大小单元有关吗?如果是,那么如何? 例如: 内存:内存@20000000 { #地址单元=<...
我想知道是否有一个宏可以为我的设备分配一个Linux当前未使用的随机“魔法”数字。这显然是为了可移植性。另外,如果这不是 po...
我正在开发 IA64 的 Linux 模块。我当前的问题是驱动程序使用 PAGE_SIZE 和 PAGE_SHIFT 宏进行 dma 页面分配。我遇到的问题是机器编译...
如何通过修改 devicetree 来重建 Coral mendel?
我正在尝试修改 Coral SoM 上的设备树以支持不同的 DSI 显示,并且可以使用一些指针。 我编辑了 arch/arm64/boot/dts/freescale/fsl-imx8mq-phanbell.dts 然后用“m”来...
我遵循了 DMA API https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt 并且我了解 DMA 有 2 种方法: 一致的 DMA 映射 - 例如
我正在编写一个内核模块,需要大量没有默认值的配置选项。内核模块访问配置文件是否可以接受(我猜存储在...
我目前正在阅读《Linux 模块编程指南》,我偶然发现了两个有点令人困惑的术语——设备文件和设备驱动程序。在仔细研究这些术语后,我发现了......
我有一个关于内核中 /dev/ 和 /sys/ 伪文件系统创建的问题。内核启动时,rootfs 将在最后挂载,然后启动 init 进程。在内核启动时,...
我已经开始学习linux设备驱动程序了。作为学习的一部分,我正在做一些示例程序。为了理解内存映射 IO,我编写了以下代码。(此处仅显示 init)。没有
我希望将一些 USB 设备连接到我的嵌入式 Linux 板上。 它是运行嵌入式 Linux 的 TI-ARM 处理器,但我猜它可以是任何嵌入式 Linux 板。 如果我购买 USB 设备...
我正在尝试按照本指南编译一个简单的 hello world 模块,但我对 Makefile 实际在做什么感到困惑。 这里是: obj-m += hello-1.o 全部: make -C /lib/modules/$(sh...
我正在尝试按照本指南编译一个简单的 hello world 模块,但我对 Makefile 实际在做什么感到困惑。 这里是: obj-m += hello-1.o 全部: make -C /lib/modules/$(sh...
什么情况下dma_alloc_coherent()函数的*dma_handle返回物理地址?
在linux中,函数dma_alloc_coherent()具有这种形式(在include/linux/dma-mapping.h中声明) 静态内联无效* dma_alloc_coherent(结构设备* dev,size_t大小, dma_addr_t *dma_h...
我正在编写 pci 驱动程序来访问 ID 为 PCI_DEVICE_ID_INTEL_BROADWELL_IMC_HA0. 的 Intel 设备,该设备位于 ff:12.0(设备 ID 0x6fa0)。 但是,结果发现 sbridge_edac 驱动程序已经安装了...
用于设置MSI基地址的结构体地址,它是如何工作的? (在 Xilinx PCIe RC 驱动程序中)
通常在 PCIe RC 侧,S/W 应在 PCIe 核心前面的电路中设置 MSI(消息信号中断)基址寄存器地址,我猜这样 PCIe 核心(或桥接器连接...
我尝试编译这段代码: #包括 #包括 int init_module(void) { printk(KERN_INFO "你好世界"); 返回(0); } 随着
我的板上有一个复用为 GPIO 的焊盘。当我尝试通过 /sys/class/gpio/export 导出它时,我得到 -sh: echo: 写入错误: 设备或资源繁忙 我猜是其他司机在要求...
我有一个预构建的 Linux 内核 4.19。我无法建造一个新的。我可以毫无问题地将 emmc 分区挂载为只读。我在安装分区读写时遇到问题。它报告“正在运行 CQE
正如我们所知,分散列表收集物理上分散在内存中的内存,但实际上是连续的。当与 DMA 通信时,它向 DMA 提供内存的抽象视图...
我正在尝试创建一个平台驱动程序我有以下代码 模块 // SPDX 许可证标识符:GPL-2.0 #包括 #包括 #包括 我正在尝试创建一个平台驱动程序,我有以下代码 模块 // SPDX-License-Identifier: GPL-2.0 #include <linux/module.h> #include <linux/init.h> #include <linux/pm.h> #include <linux/of_device.h> #include <linux/fb.h> static int simple_probe(struct platform_device *pdev) { printk(KERN_ERR "SIMPLE: %s\n", "Probing"); return 0; } const struct of_device_id simple_of_match[] = { { .compatible = "example,simple", }, { /*End of List*/ }, }; struct platform_driver simple_driver = { .probe = simple_probe, .driver = { .name = "simple", .owner = THIS_MODULE, .of_match_table = simple_of_match } }; static int __init init(void) { if (platform_driver_register(&simple_driver)) { printk(KERN_ERR "SIMPLE: %s\n", "Registerered"); } else { printk(KERN_ERR "SIMPLE: %s\n", "Failed"); } return 0; } static void __exit deinit(void) { platform_driver_unregister(&simple_driver); } module_init(init); module_exit(deinit); MODULE_DESCRIPTION("Simple Platform driver"); MODULE_AUTHOR("Bret Joseph Antonio <[email protected]>"); MODULE_LICENSE("GPL"); 我的设备树似乎没有运行覆盖,因此设备状态正常。它仍然没有运行探测回调。 设备树 /dts-v1/; / { simple@0 { compatible = "example,simple"; pinctrl-names = "lcm_rst_out1_gpio", "lcm_rst_out0_gpio"; pinctrl-0 = <&PHANDLE1>; pinctrl-1 = <&PHANDLE2>; status = "okay"; }; }; 我希望内核注册我的驱动程序,然后运行探测函数,但是代码 if (platform_driver_register(&simple_driver) == 0) { printk(KERN_ERR "SIMPLE: %s\n", "Registered"); } else { printk(KERN_ERR "SIMPLE: %s\n", "Failed"); } 返回[ 0.178889] SIMPLE: Registered,但探测功能保持沉默。探针功能取决于什么? 难道它不应该在设备树中找到节点后立即运行探测吗? 您需要使用 struct of_device_id simple_of_match[] 语句将您的 MODULE_DEVICE_TABLE(of, simple_of_match); 公开/导出到 of(开放固件)子系统。 内核代码的约定是尽可能将所有符号声明为static。您的代码在这方面不一致,即 struct of_device_id simple_of_match[] 和 struct platform_driver simple_driver 是全局的。