spi总线概述3(spi-summary)

来源:互联网 发布:迅雷未知错误mac 编辑:程序博客网 时间:2024/05/06 07:05

我怎样写“SPI主控制器驱动程序”?

-------------------------------------------------

一个SPI控制器可能会被注册上platform_bus;写驱动程序绑定到设备,两者涉及总线。

 

这种类型的驱动程序的主要任务是提供“spi_master”。使用spi_alloc_master()分配主机,和spi_master_get_devdata()获取分配给该设备的

driver-private数据。

 

    struct spi_master   *master;

    struct CONTROLLER   *c;

 

    master = spi_alloc_master(dev, sizeof *c);

    if (!master)

        return-ENODEV;

 

    c = spi_master_get_devdata(master);

 

驱动程序将初始化spi_master,包括总线数量(可能与平台设备ID相同)和三个方法

用于核心与SPI和SPI协议驱动程序交互。它将同时初始化它自己的内部状态。 (见下文有关总线编号和方法。)

 

你的spi_master初始化后,然后使用spi_register_master()它发布到系统的其余部分。在那个时候,设备节点控制器和任何预先声明的SPI设备将可用,驱动程序模型的核心将它们绑定到驱动。

 

如果您需要删除您的SPI控制器驱动,spi_unregister_master()将扭转的spi_register_master()的效果。

 

 

总线编号

 

总线编号很重要,因为这是Linux如何确定一个给定的SPI总线(共享的SCK,MOSI,MISO)的。有效总线从零开始。SOC系统上总线的数字应该匹配的芯片制造商定义的数字。例如,硬件控制器SPI2的总线号2,spi_board_info将使用该号码连接到它的设备。

 

如果你没有这样的硬件分配总线号,由于某种原因你不能分配给他们,然后提供一个负的总线数。这将被替换为一个动态分配的号码。然后,你需要把它作为一个非静态的配置(见上文)。

 

 

SPI主方法

 

    master->setup(structspi_device *spi)

这台设备的时钟速率,SPI模式,和字的大小。驱动可能改变由board_info提供的默认值,然后调用spi_setup(SPI),调用这个例程。它可以休眠。

 

除非每个SPI从机都有其自己的配置寄存器,否则不要马上改变他们...不然可能损坏驱动器的I / O在其他SPI器件的运行。

 

**错误警告:由于某种原因,第一个版本 spi_master许多驱动似乎得到这个错误。当你的代码setup(),假设控制器正在进行处理其他设备的传输。**

 

   master->transfer(structspi_device *spi, struct spi_message *message)

 

    这不能睡眠。其职责是安排传送,并发出它的complete()回调。这些通常会发生后,其他传输完成前,如果控制器处于闲置状态,它需要被启动。

 

   master->cleanup(structspi_device *spi)

 

您的控制器的驱动程序可能会使用spi_device.controller_state保持状态,这与设备动态联合。如果你这样做,请务必提供cleanup()方法来释放该状态。

 

SPI消息队列

 

大部分驱动将通过transfer()管理的I / O队列反馈。

 

该队列可以是纯粹的概念。例如,一驱动只用低频传感器访问,可能是使用同步的PIO。(匪夷所思的一句话。。。)

 

但队列可能会是非常现实的,利用message->queue,PIO,DMA(尤其是如果根文件系统是在SPI闪存),和执行上下文如IRQ处理,tasklet,或工作队列(例如keventd)。您的驱动程序,可以花哨,或简单,因为你需要。像transfer()方法通常只需要添加到的消息队列中,然后启动一些异步传输引擎(除非它是已经运行的)。


原创粉丝点击