Linux系统自带spi驱动加载及应用程序编写方法详解

2023-05-16

硬件平台:飞思卡尔IMX6,

内核版本:kernel3.0.35


Linux系统中,和I2C一样,SPI也有系统自带的设备驱动程序,位于源码目录下drivers/spi/spidev.c,以下为驱动的移植和对应应用程序编写方法


驱动代码移植

要将此设备驱动加入到内核中,要做两件事情

第一:将此驱动编译进内核

步骤:make menuconfig

            Device Drivers -> 

            <*>SPI support ->

            <*>User mode SPI device driver support


第二:在平台文件arch/arm/mach-mx6/board-mx6q_sabresd.c  中添加对spidev的设备注册

步骤:

1、准备spi_board_info变量(全局变量)

static struct spi_board_info spidev_ecspi2_board_info[] __initdata = {
{
/* The modalias must be the same as spi device driver name */
.modalias = "spidev",
.max_speed_hz = 20000000,
.bus_num = 1,
.chip_select = 0,

},
};

2、注册spi_board_info变量到内核中,要在平台硬件初始化的函数中执行本段代码

spi_register_board_info(spidev_ecspi2_board_info,
ARRAY_SIZE(spidev_ecspi2_board_info));


注意:上面两个步骤是原则,必不可少的,但是具体的平台会有一些其他更多的修改,比如笔者使用的是飞思卡尔IMX6,还需要将GPIO口进行初始化,初始化为SPI功能

具体操作见以下补丁,源码下载地址点击打开链接


在对驱动代码进行移植之后,重新编译内核,下载到开发板上,即可看到spi设备/dev/spidev1.0,标识着SPI驱动移植成功


应用程序编写

在对驱动代码进行修改之后,需要根据驱动的架构来完成应用程序的编写,在内核源代码Documentation/spi目录下有一个spidev_test.c文件,是内核作者提供给Linux开发人员的参考文档,笔者也是参考此文件来编写的应用程序
应用程序无非是open、close、read、write、ioctl的使用。open,close没什么好说的,下面具体说下ioctl、read和write的使用。
spi应用程序编写步骤:

第一:open

第二:ioctl ,ioctl有九种cmd,分别对应不同的arg

a、设置或获取SPI工作模式

SPI_IOC_RD_MODE     //读 模式 
SPI_IOC_WR_MODE     //写 模式 
以上两种cmd对用arg是spi_device.mode
spi_device.mode有以下几种类型
#define SPI_MODE_0 (0|0)//SCLK空闲时为低电平,第一个时间延采样
#define SPI_MODE_1 (0|SPI_CPHA)//SCLK空闲时为高电平,第一个时间延采样
#define SPI_MODE_2 (SPI_CPOL|0)//SCLK空闲时为低电平,第二个时间延采样
#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)//SCLK空闲时为高电平,第二个时间延采样
#define SPI_CS_HIGH 0x04//片选为高
#define SPI_LSB_FIRST 0x08//低位数据先传输
#define SPI_3WIRE 0x10//三线式,输入输出数据线为一条线
#define SPI_LOOP 0x20//回环模式
#define SPI_NO_CS 0x40//没有片选信号
#define SPI_READY 0x80//
用法:
mode = mode | SPI_MODE_0 | SPI_CS_HIGH | SPI_LSB_FIRST | SPI_LOOP
ioctl(fd, SPI_IOC_WR_MODE, &mode);
注意:前面四种是对SCK时钟信号空闲时的电平,和采样时刻的选择,四个只能选择其中一种,后面的五种可以用或的形式选择任意几个,使用方法如上

b、设置或获取SPI读写是从高位还是低位开始

SPI_IOC_RD_LSB_FIRST    //读 LSB 
SPI_IOC_WR_LSB_FIRST    //写 LSB 
以上两种cmd对用arg是spi_device.mode
用法:同上,但是mode类型只有SPI_LSB_FIRST一种

c、设置或获取SPI读写数据位数

SPI_IOC_RD_BITS_PER_WORD    //读 每字多少位 
SPI_IOC_WR_BITS_PER_WORD    //写 每字多少位
以上两种cmd对用arg是spi_device.bits_per_word
用法:
bits = 8;
ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);

d、设置或获取SPI读写的最大频率

SPI_IOC_RD_MAX_SPEED_HZ //读 最大速率 
SPI_IOC_WR_MAX_SPEED_HZ //写 最大速率 
以上两种cmd对用arg是spi_device.max_speed_hz
用法:
speed = 50*1000;
ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);

e、传输数据

SPI_IOC_MESSAGE(n)      //传输n个数据包 
以上一种cmd对用arg是spi_ioc_transfer
用法:全双工传输数据
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
.len = ARRAY_SIZE(tx),
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);

第三:read或write

用法:和大多数的设备read函数一样的用法,但是每次读或者写的大小不能大于4096Byte。
char* buf[n];
read(fd,buf,sizeof(buf));或者write(fd,buf,sizeof(buf));

第四:close

应用程序源码可见以下地址点击打开链接





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux系统自带spi驱动加载及应用程序编写方法详解 的相关文章

  • centos7重启network报错:network.service: control process exited, code=exited status=1

    centos7虚拟机中修改固定ip地址后 xff0c 重启 xff08 命令为 xff1a systemctl restart network xff09 network服务时异常 xff1b 使用systemctl status netw
  • 用Future与CountDownLatch实现多线程执行多个异步任务,任务全部完成后返回结果

    span class token keyword import span span class token namespace java span class token punctuation span util span class t
  • gradle (v7.5) 使用

    gradle v7 5 使用 gradle 和 maven 都是项目构建工具 xff0c Gradle和Maven两种构建方式存在一些根本差异 Gradle基于任务依赖关系图 其中任务就是工作 xff0c 而Maven是基于固定的过程和线性
  • 麒麟/linux下安装MySQL,修改root用户密码报错汇总(附安装方法)

    本来用apt get一行代码装好的事情 xff0c 但是出现了大大小小的麻烦 xff0c 所以记录一下 xff0c 供有需要的朋友查看 一 Mysql的安装 apt span class token operator span get in
  • 一篇文章快速搞懂 AOP和SpringAOP

    往期相关文档 最全SpringAop切面 10分钟入门SpringAOP 读不在三更五鼓 xff0c 功只怕一曝十寒 郭沫若 文章目录 一 导言二 AOP2 1 代理模式2 2 AOP核心概念2 2 1 Aspect 切面2 2 1 1 P
  • 最通俗易懂的HashMap深度解析

    文章目录 导言Hash表什么是Hash表为什么要Hash表Hash表核心原理核心概念Hash表hash函数 常见冲突解决方法开放地址法 再散列法 再哈希法链地址法 xff08 拉链法 xff09 java HashMap原理浅析java H
  • SFTP连接失败问题解决小tips

    前几天安装了jumpserver之后 xff0c sftp服务莫名奇妙的挂了 xff0c 也不知道是不是这方面的原因 vsftpd服务检查没有问题 防火墙端口配置检查没有问题 端口监听检查没有问题 我们知道SFTP走的是SSH的端口 xff
  • Error:java: 服务配置文件不正确, 或构造处理程序对象

    在学习注解处理器使用的时候 xff0c 依据这个学习 xff0c 完成后build xff0c 报了个错误 Error java 服务配置文件不正确 或构造处理程序对象javax annotation processing Processo
  • 无自动化测试系统设计方法论

    灵活 敏捷 迭代 自动化测试 辩思 测试必不可少 想想看没有充分测试的代码 哪一次是一次过的 哪一次不需要经历下测试的鞭挞 不要以为软件代码容易改 就对于质量不切实际的自信 那是自大 不适用自动化测试的case 遗留系统 太多的依赖方 不想
  • 模仿 java Optional 设计 c# Optional

    模仿 java Optional 设计 c Optional Unity 环境下 using System span class token punctuation span using JetBrains span class token
  • 关于中台的思考和复盘

    数据中台可以做 xff0c 业务中台不能做 能力共享和聚合的入口可以做 强嵌入的业务中台不能做 中台 中台不是只能是微服务 xff0c 中台还可以是代码复用框架 xff0c 允许业务自己扩展 迭代code as service xff0c
  • 三范式分解算法

    三范式是BC范式的放宽 三范式条件 满足一个即可 gt 是平凡的函数依赖 除了子集和父集的函数依赖 大多的函数依赖都是非平凡的 是关系模式R的一个超码 属性集里的所有属性都被包含在 R的candidate key里 注意 的属性集里的所有元
  • 关系数据库设计 函数依赖 逻辑蕴含

    函数依赖 属性集 决定属性集 则称有函数依赖 to 逻辑蕴含 F能推出 原不直观存在于 函数依赖集F 中的函数依赖
  • 斯密特正交化(matlab)

    斯密特正交化 matlab 数学过程 伪代码如下 function b 61 Gram Schmidt Orthogonalization a row col 61 size a b 1 61 a 1 for i in 2 col for
  • autohotkey[启动][发送键击][click][常用窗口命令]

    启动程序或文档 run命令 run exe file in environment path Run Notepad 不在环境变量中的程序或文档 Run A ProgramFiles Winamp Winamp exe open file
  • 通过键盘移动鼠标光标 autohotkey

    通过键盘移动鼠标光标 MouseMove键 参数定义 MouseMove X Y Speed R 鼠标移动的目标位置的 x y 坐标 可以为 表达式 坐标相对于活动窗口Speed 移动鼠标的速度 xff0c 介于 0 xff08 最快 xf
  • 用Tkinter实现一个离线定时语音播报应用程序

    最近单位领导与我提起 xff0c 说要做一个语音播报功能程序 xff0c 意在定时提醒职工进行抄表工作 在下也是个刚毕业不久的小白 xff0c 从头开始学习Python 对于这个程序虽说小 xff0c 但也只是看起来而已 xff0c 在细节
  • 通过用户POI经纬度获取居住地的房价信息

    Arcmap处理数据 1 建立Map和GDB2 加载数据3加载地图4 导出为点数据5 过滤错误数据6 将过滤后的数据保存为新图层7 转换坐标系为38578 IDW插值9 绘制渔网图Fishnet10 Zonal Statistics As
  • 天干地支

    以下是天干地支的称呼 xff1a 天干地支简称 干支 xff0c 十天干 xff1a 甲 xff08 ji xff09 乙 xff08 y xff09 丙 xff08 b ng xff09 丁 xff08 d ng xff09 戊 xff0
  • spring知识总结

    什么是spring spring是一套提供IOC和AOP功能架 xff0c 为简洁开发提供的一套轻量级框架 主要包括一下几个模块 xff1a spring context xff1a 提供框架式的bean访问方式 xff0c 以及企业级任务

随机推荐