我是编写设备驱动程序的新手。
我想在ARM平台上为外设编写设备驱动程序。
第一个问题:在ARM平台上为外设编写设备驱动程序与在Linux中为x86编写设备驱动程序有什么不同?
第二个问题:我检查了/ proc / iomem文件以查看处理器的当前地址映射。但是,并非所有外围设备(包括我要访问的外围设备)都不存在于该文件中。如何包含外设的地址范围?
第3个问题:设备树在编写设备驱动程序时的重要性是什么?
答案 0 :(得分:5)
如果内核源代码树中不存在驱动程序,并且设备在设备地址空间中进行内存映射,则必须在某处声明设备资源(地址区域,irq行)。在旧版本的内核中,这是电路板文件的责任,但现在它已移至设备树。
因此,与x86架构的主要区别不在于您编写驱动程序的方式,而在于您如何匹配设备和驱动程序。在x86上,您可以使用例如pci驱动程序和可被发现的pci设备。在ARM上,通常没有这样的自描述硬件,并且为了模拟整个设备/驱动程序舞蹈,创建了平台总线。
因此ARM上的典型设备驱动程序是平台驱动程序,相关设备是平台设备。当前内核的示例以太网mac驱动程序是here。
在上面链接的驱动程序中,驱动程序代码不知道设备所在的位置。此信息在探测时使用platform_device
对象传递给驱动程序。平台设备可以这样描述(source):
static struct platform_device at91sam9260_eth_device = {
.name = "macb",
.id = -1,
.dev = {
.dma_mask = ð_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = ð_data,
},
.resource = eth_resources,
.num_resources = ARRAY_SIZE(eth_resources),
};
可以从此处所示的c代码创建平台设备,也可以在设备树中对其进行描述。在这两种情况下,在驱动程序探测到设备之前,您不会在proc / iomem中看到任何内容。这与大多数设备都是PCI设备的x86世界形成对比。
这是相同的设备,但在device tree file中描述:
macb0: ethernet@fffc4000 {
compatible = "cdns,at32ap7000-macb", "cdns,macb";
reg = <0xfffc4000 0x100>;
interrupts = <21 IRQ_TYPE_LEVEL_HIGH 3>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_macb_rmii>;
status = "disabled";
};
答案 1 :(得分:4)
1。只要外围设备的接口类似于SoC(即在两个平台上使用相同的硬件接口),就可以在x86和ARM上使用相同的驱动程序。这是开发独立于Linux内核核心的模块化驱动程序的优势。
2。如果您当前的地址地图(/proc/iomem
)中不存在您的特定外围设备,那么它可能意味着两种可能性之一:
有关外围设备的任何其他信息?它是如何与SoC连接的? 子>
3. Linux内核中的设备树用于描述众多硬件(片上和外设),它们的互连以及适用于其正确配置的基本参数并在为其写入设备树的特定平台/板上进行初始化。
基本上它执行相同的功能和当前Linux内核中的“board-file”。它还减少了bootargs对初始配置的依赖性,因为可以在设备树中提供相同的内容。有关device trees的更多信息。
答案 2 :(得分:1)
要将有关设备地址范围的信息导出到 / proc 用户空间界面 您必须在驱动程序中将该区域注册到内核:
github.com