在 jz_spi 内核中使用 spi_bitbang 启动 spi 设备驱动程序

问题描述 投票:0回答:0

我尝试在旧内核中使用 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);
}

非常感谢

linux-kernel linux-device-driver embedded-linux spi
© www.soinside.com 2019 - 2024. All rights reserved.