以上面的这个图为思路
1 、 Platform bus
Platform bus 对应的结构是 platform_bus_type,这个内核开始就定义好的。不需要定义。在文
件/include/linux/device.h 中
2、Platform_device
SPI 控制器对应 platform_device 的定义方式,platform_device 与 i2c 总线使用的是同一个定义
struct platform_device {
const char * name;
int id;
struct device dev;
u32 num_resources;
struct resource * resource;
const struct platform_device_id *id_entry;
/* MFD cell pointer */
struct mfd_cell *mfd_cell;
/* arch specific additions */
struct pdev_archdata archdata;
};
和 I2C 类似,SPI 也有一个描述控制器的对象叫 spi_master。其主要成员是主机控制器的序号(系统中可
能存在多个 SPI 主机控制器)、片选数量、SPI 模式和时钟设置用到的函数、数据传输用到的函数等。
struct spi_master {
struct device dev;
s16 bus_num; //表示是 SPI 主机控制器的编号。由平台代码决定
u16 num_chipselect; //控制器支持的片选数量,即能支持多少个 spi 设备
int (*setup)(struct spi_device *spi); //针对设备设置 SPI 的工作时钟及数据传输模式等。在
spi_add_device 函数中调用。
int (*transfer)(struct spi_device *spi,struct spi_message *mesg); //实现数据的双向传输,可能会睡眠
void (*cleanup)(struct spi_device *spi); //注销时调用
};
3、Platform_driver
再看 platform_driver,参看 drivers/spi/spi-omap2-mcspi.c 文件
static struct platform_driver omap2_mcspi_driver = {
.driver = {
.name = "omap2_mcspi",
.owner = THIS_MODULE,
.pm = &omap2_mcspi_pm_ops
},
.remove = __exit_p(omap2_mcspi_remove),
};
评论2