概述
linux SPI体系结构 分别是SPI核心、spi控制器驱动、SPI设备驱动
1.1 SPI核心
SPI核心层代码位于drivers/spi/spi.c,头文件位于include/linux/spi/spi.h,SPI核心提供了SPI控制器驱动和设备驱动的注册、注销方法,并提供一些需要控制器驱动实现的回调函数。
核心层包含一些重要的数据结构,如struct spi_master、struct spi_transfer、struct spi_message等,还有一些重要的注册、注销函数等。
#define devm_spi_register_master(_dev, _ctlr) \
devm_spi_register_controller(_dev, _ctlr)
int devm_spi_register_controller(struct device *dev,
struct spi_controller *ctlr)
{
struct spi_controller **ptr;
ptr = devres_alloc(devm_spi_unregister, sizeof(*ptr), GFP_KERNEL);
ret = spi_register_controller(ctlr);
...
return ret;
}
#define spi_register_driver(driver) \
__spi_register_driver(THIS_MODULE, driver)
int __spi_register_driver(struct module *owner, struct spi_driver *sdrv)
{
....
return driver_register(&sdrv->driver);
}
1.2 SPI控制器驱动
SPI控制器驱动是对SPI硬件体系结构中控制器端的实现,主要需要实现SPI硬件数据收发的功能,只有这样,挂接在SPI总线上的SPI设备才能通过SPI控制器读写数据并与CPU进行数据交互。
1.3 SPI设备驱动
SPI设备驱动是对SPI硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的SPI控制器上,通过SPI控制器与CPU进行数据交互。
SPI设备驱动主要包含数据结构spi_driver和spi_device,我们需要根据具体设备实现其中的成员函数。
关于总线
SPI 控制器 驱动 和设备树中的SPI 控制器设备(描述),挂载在platform_bus_type 总线
spi 设备驱动 和 设备树中的spi设备(描述), 挂载在 spi_bus_type总线
注册spi_bus_type 总线
static int __init spi_init(void)
{
int status;
buf = kmalloc(SPI_BUFSIZ, GFP_KERNEL);
if (!buf) {
status = -ENOMEM;
goto err0;
}
status = bus_register(&spi_bus_type);
if (status < 0)
goto err1;
.....
}
参考链接
https://blog.csdn.net/MisakiMe1/article/details/126855252