linux SPI驱动

目录

一、SPI主机驱动

二、SPI设备驱动

三、SPI设备驱动编写(设备树)


一、SPI主机驱动

1、Linux 内核使用 spi_master 表示 SPI 主机驱动, spi_master 是个结构体,定义在 include/linux/spi/spi.h 文件中,此结构体中有两个重要函数:

(1) transfer 函数控制器数据传输SPI 主机端最终会通过 transfer 函数与 SPI 设备进行通信

(2) 用于 SPI 数据发送,用于发送一个 spi_messageSPI 的数据会打包成 spi_message,然后以队列方式发送出去

 在使用 spi_message之前需要对其进行初始化

2、SPI 主机驱动的核心就是申请 spi_master,然后初始化 spi_master,最后向 Linux 内核注册spi_master

(1) a. spi_master申请,函数原型如下:

函数参数和返回值含义如下:

dev:设备,一般是 platform_device 中的 dev 成员变量;

size: 私有数据大小,可以通过 spi_master_get_devdata 函数获取到这些私有数据;
返回值: 申请到的 spi_master。

(2) spi_master 的释放函数原型如下 


master:要释放的 spi_master。

(3) spi_master 的注册,函数原型如下

 master:要注册的 spi_master。

注:I.MX6U SPI 主机驱动会采用 spi_bitbang_start 这个 API 函数来完成 spi_master 的注册,spi_bitbang_start 函数内部其实也是通过调用 spi_register_master 函数来完成 spi_master 的注册。 

(4) spi_master 注销,函数原型如下

 master:要注册的 spi_master。

注:如果使用 spi_bitbang_start 注册 spi_master 的话就要使用 spi_bitbang_stop 来注销掉spi_master 

二、SPI设备驱动

1、linux 内核使用 spi_driver 结构体来表示 spi 设备驱动,定义在include/linux/spi/spi.h 文件中,结构体内容如下:

      spi_driver 结构体,需要 SPI 设备驱动人员编写,包括匹配表、 probe 函数等i2c_driverplatform_driver 一样 

2、SPI 设备和驱动匹配过程

(1)由 SPI 总线来完成的SPI总线为 spi_bus_type,定义在 drivers/spi/spi.c 文件中

           

 (2) SPI 设备和驱动的匹配函数为 spi_match_device。

3、 SPI 设备数据收发处理流程

(1) SPI 设备驱动的核心是 spi_driver 结构体

(2) spi_transfer 结构体,用于描述 SPI 传输信息

(3) spi_transfer 需要组织成 spi_messagespi_message 也是一个结构体 

(4) SPI 数据传输步骤如下:

①、申请并初始化 spi_transfer,设置 spi_transfer tx_buf 成员变量, tx_buf 为要发送的数据。然后设置 rx_buf 成员变量, rx_buf 保存着接收到的数据。最后设置 len 成员变量,也就是要进行数据通信的长度。 

②、使用 spi_message_init 函数初始化 spi_message

 
③、使用 spi_message_add_tail函数将前面设置好的 spi_transfer添加到 spi_message队列中


④、使用 spi_sync 函数完成 SPI 数据同步传输

三、SPI设备驱动编写(设备树)

1、设备树的修改

(1) IO 的 pinctrl 子节点创建与修改

(2) SPI 设备节点的创建与修改

2、执行 probe 函数初始化时要注意:把 spi 设备设置成私有数据

3、主要函数

(1) 读函数

(2) 写函数

(3) 注意:SPI 为全双工通讯没有所谓的发送和接收长度之分要读取或者发送 N 个字节就要封装 N+1 个字节,第 1 个字节是告诉设备我们要进行读还是写,后面的 N 个字节才是要读或者发送的数据。

gitee代码链接:gitee_linux_driver: 个人理解编写的linux驱动 - Gitee.com

github代码链接:https://github.com/CanvMo/Can/tree/master/22_spi

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值