我的任务是将spi驱动程序导入到运行Openwrt的现有平台中
在“成功”构建完整的Openwrt:包和与运行到平台的内核相匹配的内核(包括spidev内核模块)之后,我遇到了一些麻烦,使得这个模块工作。
驱动程序的 insmod 终止且没有错误,我在 / sys / class 中看到创建目录 spidev ,但它是空的。
看一下spidev内核模块的代码,函数 probe 引起了我的注意。我的感觉是,这个功能实际上是分配次要设备号,使设备可供使用。但我不清楚是谁,或者应该叫什么
我的另一个疑问是关于架构。 spi取决于底层架构,在我的例子中,MT7620 soc是一个mipsel架构,具有特定的spi代码。根据我的理解,这个SOC特定代码由spidev内核模块包装,这两个实体之间的链接应该是
status = spi_register_driver(&spidev_spi_driver);
中的
static int __init spidev_init(void)
功能。
再一次,我很清楚我在写什么,我在这里要求指示。
答案 0 :(得分:0)
首先,您可能需要阅读Linux Device Driver - Chapter 14。
一般来说,在Linux内核中,devices
(drivers
)上有bus
和subsystem
。您必须使用函数register_device()
和register_driver()
注册它们(具体名称取决于子系统)。当设备或驱动程序注册后,subsystem
会尝试将devices
与drivers
匹配。如果匹配,则subsystem
会调用驱动程序的函数probe()
。因此,probe()
功能的执行可以由驱动程序注册或设备注册触发。这也意味着设备在执行probe()
回到你的具体情况:SPI。要注册设备实例,您需要使用spi_alloc_device和spi_add_device或spi_new_device。在哪里放这个代码?这取决于您的需要。通常,SPI设备在某些体系结构文件或设备树描述中声明。也许你也可以在一个模块中做(不确定)。
spidev
是一个Linux设备驱动程序,它将SPI原始接口导出到用户空间。这意味着一旦注册SPI设备实例,驱动程序spidev
就会控制它。实际上,spidev
什么都不做:它等待用户空间程序在SPI总线上读/写数据。因此,您最终将在用户空间中为您的设备编写驱动程序。