创建Linux设备驱动程序。无法获取驱动程序检测设备和调用探测功能

时间:2015-08-17 15:29:38

标签: c linux driver linux-device-driver spi

我有几个问题。首先,我正在尝试为我拥有的RTC创建一个SPI驱动程序,但是在调用驱动程序的探测函数时遇到了问题。似乎未检测到设备和/或没有正确地与驱动程序关联。

1。)在Linux 2.6.35.14中,有没有办法列出没有与之关联的驱动程序的硬件设备?

2。)Linux会自动发现SPI RTC硬件的名称/总线#是否正确?那么所有需要做的就是将驱动程序名称与此名称相匹配?例如:

 static struct spi_driver ds1305_driver = {
      .driver.name    = "ds1343", 
 ...
 }

3.。)我的探测功能未被调用。我不知道如何追踪为什么没有检测到设备。我找不到dmesg错误。 RTC是DS1343,如果它有帮助的话。我的基础是DS1305 / DS1306

为了简洁起见,我跳过了许多对我来说不感兴趣的功能。

 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/bcd.h>
 #include <linux/slab.h>
 #include <linux/rtc.h>
 #include <linux/workqueue.h>

 #include <linux/spi/spi.h>
 #include <linux/spi/ds1343.h>

 ...

 static int __devinit ds1305_probe(struct spi_device *spi)
 {
      ....
 }

 .....

 static struct spi_driver ds1305_driver = {
    .driver.name    = "ds1343",
    .driver.owner   = THIS_MODULE,
    .probe          = ds1305_probe,
    .remove         = __devexit_p(ds1305_remove),
    /* REVISIT add suspend/resume */
 };

 static int __init ds1305_init(void)
 {
    return spi_register_driver(&ds1305_driver);
 }
 module_init(ds1305_init);

 static void __exit ds1305_exit(void)
 {
    spi_unregister_driver(&ds1305_driver);
 }
 module_exit(ds1305_exit);

 MODULE_DESCRIPTION("RTC driver for DS1305 and DS1306 chips");
 MODULE_LICENSE("GPL");
 MODULE_ALIAS("spi:rtc-ds1343");

1 个答案:

答案 0 :(得分:2)

首先,您必须了解Linux中平台的基本概念。硬件平台是一组设备,包括某些CPU和外围设备。 Linux(内核)已经知道它在哪个平台上运行。在较旧的时代,我们曾经有过板文件和硬编码的平台配置,这很糟糕。现在,通过使用ACPI或OF(DeviceTree)固件机制解决了这个问题。与PCI不同的SPI无法自动枚举,因此您通过ACPI(DSDT表)或DeviceTree提供有关设备的信息,或者不太可能通过电路板文件提供有关设备的信息。您也无法列出总线后面的设备,即使是I2C,它也不可靠,并且通常可能导致总线崩溃。

P.S。你为什么不扩展现有的驱动程序?与上游的任何类似驱动程序有太多差异吗?