我有几个问题。首先,我正在尝试为我拥有的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");
答案 0 :(得分:2)
首先,您必须了解Linux中平台的基本概念。硬件平台是一组设备,包括某些CPU和外围设备。 Linux(内核)已经知道它在哪个平台上运行。在较旧的时代,我们曾经有过板文件和硬编码的平台配置,这很糟糕。现在,通过使用ACPI或OF(DeviceTree)固件机制解决了这个问题。与PCI不同的SPI无法自动枚举,因此您通过ACPI(DSDT表)或DeviceTree提供有关设备的信息,或者不太可能通过电路板文件提供有关设备的信息。您也无法列出总线后面的设备,即使是I2C,它也不可靠,并且通常可能导致总线崩溃。
P.S。你为什么不扩展现有的驱动程序?与上游的任何类似驱动程序有太多差异吗?