我尝试在旧内核中使用 spi 启动设备(意味着没有设备树)。内核使用平台设备,它使用 jz_spi 和 spi_bitbang_start 来注册 spi 控制器。 在我的设备驱动程序源代码中,我在调用 spi_register_driver 之前使用了 spi_register_board_info 函数。问题是 struct spi_board_info 的字段 chip_select 是 0。所以当我调用命令“insmod test.ko”时,它报告错误“chipselect 0 已经在使用中”。如果我将字段 chip_select 更改为 1,则总线上的信号看起来不像数据和时钟。 当我尝试在我的设备驱动程序代码中使用 spi_register_board_info 函数而内核使用 jz_spi 和 spi_bitbang_start 来注册 spi 控制器时,我错了吗?
这是内核中 jz_spi_probe 的源代码的一部分
/* setup chipselect */
hw->set_cs = &jz_spi_cs;
/* SSI controller initializations for SPI */
jz_spi_init_setup(hw);
/* register our spi controller */
err = spi_bitbang_start(&hw->bitbang);
if (err) {
dev_err(&pdev->dev, "Failed to register SPI master ERR_NO:%d\n",err);
goto err_register;
}
这是我的设备驱动程序代码:
struct spi_board_info jz_spi1_board_info[1] = {
[0] ={
.modalias = "jz_spi_nand",
//.platform_data = &jz_spi_nand_data,
.platform_data = NULL,
.controller_data = 0,
.max_speed_hz = 12000000,
.bus_num = 1,
.chip_select = 0,
},
};
struct spi_device_id jz_id_table[] = {
{
.name = "jz_spi_nand",
},
};
static struct spi_driver my_spi_driver = {
.driver = {
.name = "jz_spi_nand",
.owner = THIS_MODULE,
},
.id_table = jz_id_table,
.probe = my_probe,
.remove = my_remove,
.shutdown = NULL, //forever start
};
static int __init test_init(void)
{
pr_info("spi_register_driver begin\n");
spi_register_board_info(jz_spi1_board_info, ARRAY_SIZE(jz_spi1_board_info));
return spi_register_driver(&my_spi_driver);
}
非常感谢