spi总线概述3(spi-summary)
2012-04-24 19:41
239 查看
我怎样写“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()方法通常只需要添加到的消息队列中,然后启动一些异步传输引擎(除非它是已经运行的)。
-------------------------------------------------
一个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()方法通常只需要添加到的消息队列中,然后启动一些异步传输引擎(除非它是已经运行的)。
相关文章推荐
- spi总线概述1(spi-summary)
- spi总线概述2(spi-summary)
- Linux SPI总线和设备驱动架构之一:系统概述
- Linux SPI总线和设备驱动架构之一:系统概述
- Linux SPI总线和设备驱动架构之一:系统概述
- SPI概述 一种标准的四线同步双向串行总线。
- Linux SPI总线和设备驱动架构之一:系统概述
- Linux SPI总线和设备驱动架构之一:系统概述
- Linux SPI总线和设备驱动架构之一:系统概述
- Linux SPI总线和设备驱动架构之一:系统概述
- Linux SPI总线和设备驱动架构之一:系统概述
- SPI总线的初步认识
- Linux下的SPI总线驱动
- SPI总线规范
- SPI总线协议介绍
- Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
- 关于I2C和SPI总线协议
- SPI总线在51系列单片机系统中的实现
- I2C与SPI总线简介
- SPI总线之CPOL CPHA