驱动架构

platform_device与platform_driver匹配进入probe,注册spi_master
在spi_master list和spi_board_info list总寻找匹配的bus num,并注册spi_device
spi_device与spi_driver匹配进入spi_probe函数开始spi device相关的操作。


添加一个spi设备

添加spi_board_info

在bsp目录下添加一个spi_board_info,并使用spi_register_board_info注册它。

static struct spi_board_info rts_spi_gpio_board_info[] __initdata = {
{
.modalias = "xxx",
.mode = SPI_MODE_0, /* CPOL=0, CPHA=0 */
.bus_num = SPI_GPIO_BUS_NUM,
.chip_select = SPI_GPIO_CHIP_SELECT_XXX,
.controller_data = SPI_GPIO_CONTROLLER_DATA_XXX,
.max_speed_hz = 25000000,
},
};

这个spi_board_info在注册的时候会寻找SPI_GPIO_BUS_NUM指定的bus num,一旦匹配便创建一个struct spi_device,name为xxx


添加spi设备驱动

可以参考drivers/spi/spidev.c文件中spidev设备驱动的注册,实现一个struct spi_driver,它的name要与上一步创建的struct spi_device的name相匹配

static struct spi_driver xxx_spi_driver = {
.driver = {
.name = "xxx",
.owner = THIS_MODULE,
},
.probe = xxx_probe,
.remove = xxx_remove,
};

至此,struct spi_device就有了对应的struct spi_driver驱动。


参考文章

  1. ​davinci平台的spi驱动框架​