我是一名写设备驱动程序的新手。
我想为ARM平台上的外围设备编写设备驱动程序。
第一个问题:在Linux中,为ARM平台上的外围设备编写设备驱动程序是否与在x86上不同?
第二个问题:我检查了/proc/iomem文件以查看处理器的当前地址映射。然而,并非所有的外围设备(包括我要访问的设备)都存在于该文件中。如何包括外围设备的地址范围?
第三个问题:设备树在编写设备驱动程序中的重要性是什么?
我是一名写设备驱动程序的新手。
我想为ARM平台上的外围设备编写设备驱动程序。
第一个问题:在Linux中,为ARM平台上的外围设备编写设备驱动程序是否与在x86上不同?
第二个问题:我检查了/proc/iomem文件以查看处理器的当前地址映射。然而,并非所有的外围设备(包括我要访问的设备)都存在于该文件中。如何包括外围设备的地址范围?
第三个问题:设备树在编写设备驱动程序中的重要性是什么?
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中看到任何内容。这与x86世界大多数设备是PCI设备的情况不同。
这是同一设备,但在设备树文件中进行了描述:
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";
};
关于外设的任何其他信息?它如何连接到SoC?
本质上,它执行与当前Linux内核中找到的“board-file”相同的功能。 它还减少了初始配置的bootargs依赖性,因为可以在设备树中提供相同的内容。 有关设备树的更多信息。
request_mem_region()