SPI驱动之子系统架构及重要数据结构

据个人所知,Linux下SPI一直是处于被“忽略”的角色,市场上大部分板子在板级文件里面都没有关于SPI的相关代码(例如,mini2440),而大部分讲解驱动的的书籍也没有专门的一章来讲述关于Linux下SPI方面的内容(例如,宋宝华的Linux设备驱动开发详解)。与I2C相比,SPI就是一个不被重视的“家伙”,为什么?我也不甚了解。由于项目需要在UT4412BV01上移植SPI,查阅网络上几乎所
摘要由CSDN通过智能技术生成

据个人所知,Linux下SPI一直是处于被“忽略”的角色,市场上大部分板子在板级文件里面都没有关于SPI的相关代码(例如,mini2440),而大部分讲解驱动的的书籍也没有专门的一章来讲述关于Linux下SPI方面的内容(例如,宋宝华的Linux设备驱动开发详解)。与I2C相比,SPI就是一个不被重视的“家伙”,为什么?我也不甚了解。由于项目需要在UT4412BV01上移植SPI,查阅网络上几乎所有的SPI相关资料,都是对S3C2440和S3C6410的SPI驱动分析,而EXYNOS4412却只字不提,但仔细一想它们彼此之间是相通的,遂研究一番记于此,以便日后查阅之便。

1. SPI子系统架构详解

SPI总线上有两类设备:一类是主控端,通常作为SOC系统的一个子模块出现,比如很多嵌入式MPU中都常常包含SPI模块;一类是受控端,例如一些SPI接口的Flash、传感器等等。主控端是SPI总线的控制者,通过使用SPI协议主动发起SPI总线上的会话,而受控端则被动接受SPI主控端的指令,并作出相应的响应。

图还未画好,之后补上,补上后在一些写分析,哈哈。。。

2. 重要数据结构

(1)spi_master

struct spi_master用来描述一个SPI主控制器,我们一般不需要自己编写spi控制器驱动。

/** 
 * 结构体master代表一个SPI接口,或者叫一个SPI主机控制器,
 * 一个接口对应一条SPI总线,master->bus_num则记录了这个总线号。 
 */
struct spi_master {
	struct device	dev;

	struct list_head list;

	/** 
	 * 总线编号,从零开始。
	 * 系统会用这个值去和系统中board_list链表中加入的每一个boardinfo结构中的每一个spi_board_info中的bus_num进行匹配,
	 * (每个boardinfo结构都是一个spi_board_info的集合,每一个spi_board_info都是对应一个SPI(从)设备的描述)
	 * 如果匹配上就说明这个spi_board_info描述的SPI(从)设备是链接在此总线上的,因此就会调用spi_new_device去创建一个spi_device。
	 */
	s16			bus_num;

	/* 支持的片选的数量。从设备的片选号不能大于这个数.该值当然不能为0,否则会注册失败 */
	u16			num_chipselect;

	/* some SPI controllers pose alignment requirements on DMAable
	 * buffers; let protocol drivers know about these requirements.
	 */
	u16			dma_alignment;

	/* spi_device.mode flags understood by this controller driver */
	u16			mode_bits;

	/* other constraints relevant to this driver */
	u16			flags;
#define SPI_MASTER_HALF_DUPLEX	BIT(0)		/* can't do full duplex */
#define SPI_MASTER_NO_RX	BIT(1)		/* can't do buffer read */
#define SPI_MASTER_NO_TX	BIT(2)		/* can't do buffer write */

	/* lock and mutex for SPI bus locking */
	spinlock_t		bus_lock_spinlock;
	struct mutex		bus_lock_mutex;

	/* flag indicating that the SPI bus is locked for exclusive use */
	bool			bus_lock_flag;

	int			(*setup)(struct spi_device *spi); //根据spi设备更新硬
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值