您好,我正在用2.22.19版本自定义linux内核,它不支持设备树。因此,我必须使用板初始化代码来描述外围设备。我已经在板初始化代码中检查了“ spi节点”,如下所示:
static struct resource c300v2evm_spi0_resources[] = {
{
.start = COMCERTO_SPI0_BASE,
.end = COMCERTO_SPI0_BASE + SZ_4K - 1,
.flags = IORESOURCE_MEM,
},
{
.start = IRQ_SPI0,
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device c300v2evm_spi0 = {
.name = "comcerto_spi",
.id = 0,
.num_resources = ARRAY_SIZE(c300v2evm_spi0_resources),
.resource = c300v2evm_spi0_resources,
};
并且spi总线与控制器驱动程序匹配:
static int __init comcerto_spi_probe(struct platform_device *pdev)
{
...// probe function code
}
static struct platform_driver comcerto_spi_driver = {
.driver = {
.name = "comcerto_spi",
.owner = THIS_MODULE,
},
.probe = comcerto_spi_probe,
.remove = __devexit_p(comcerto_spi_remove),
};
现在我有了设备的协议驱动程序(spi总线上的eeprom):
static int at25_probe(struct spi_device *spi)
{
... // probe function code
}
static struct spi_driver at25_driver = {
.driver = {
.name = "at25",
.owner = THIS_MODULE,
},
.probe = at25_probe,
.remove = __devexit_p(at25_remove),
};
static int __init at25_init(void)
{
return spi_register_driver(&at25_driver);
}
[我有检查日志,看到该协议已使用init函数加载到内核,但我不知道如何在板init代码中添加节点以与协议驱动程序探测功能匹配。
我已通过以下操作解决了该问题:首先,我在板初始化代码文件中定义一个描述我的spi设备的结构:
static struct legerity_platform_data c300v2evm_legerity0_platform_data = {
.type = 5,
.dummy = 0,
};
static struct spi_board_info spi0_info[] = {
{
.modalias = "spi0",
.chip_select = 1,
.max_speed_hz = 1000*1000,
.bus_num = 0,
.irq = -1,
.mode = SPI_MODE_3,
.platform_data = &c300v2evm_legerity0_platform_data,
},
};
使用字段“ .bus_num = 0”,内核将了解此spi设备属于spi0总线,其具有“ id = 0”。然后,我使用此功能向内核注册设备:
spi_register_board_info(spi0_info, 1);
我已经在我的电路板上进行了测试,并且协议驱动程序与我的设备匹配,将调用“探针”功能。此方法是在Linux内核版本2.x.x中注册新设备的基本方法,我已经检查过可以在较新版本中使用此方法。希望这对必须使用旧版本Linux内核的人们有所帮助。