spi 体系结构

概述

        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

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐分享-程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值