0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SPI子系统:SPI设备驱动

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-25 11:05 次阅读

SPI 设备驱动

【设备】声明在设备树中

图片

图片

注意:设备的声明,slave device node 应该包含在你所要挂载的 &spi node 下,将 device 绑定在 master 上。然后通过 pinctrl 方式指定 GPIO,并在驱动中操作 pinctrl 句柄。

【驱动】demo

Linux 内核使用 spi_driver 结构体来表示 spi 设备驱动,我们在编写 SPI 设备驱动的时候需要实现 spi_driver。spi_driver 结构体定义在 include/linux/spi/spi.h 文件中。

spi_register_driver:注册 spi_driver
spi_unregister_driver:销掉 spi_driver
/* probe 函数 */
static int xxx_probe(struct spi_device *spi)
{

 /* 具体函数内容 */
 return 0;
}

/* remove 函数 */
static int xxx_remove(struct spi_device *spi)
{

 /* 具体函数内容 */
 return 0;
}

/* 传统匹配方式 ID 列表 */
static const struct spi_device_id xxx_id[] = {

 {"xxx", 0},
 {}
};

/* 设备树匹配列表 */
static const struct of_device_id xxx_of_match[] = {

 { .compatible = "xxx" },
 { /* Sentinel */ }
};

/* SPI 驱动结构体 */
static struct spi_driver xxx_driver = {

 .probe = xxx_probe,
 .remove = xxx_remove,
 .driver = {
  .owner = THIS_MODULE,
  .name = "xxx",
  .of_match_table = xxx_of_match,
  },
 .id_table = xxx_id,
};

/* 驱动入口函数 */
static int __init xxx_init(void)
{

 return spi_register_driver(&xxx_driver);
}

/* 驱动出口函数 */
static void __exit xxx_exit(void)
{

 spi_unregister_driver(&xxx_driver);
}

module_init(xxx_init);
module_exit(xxx_exit);

在驱动入口函数中调用 spi_register_driver 来注册 spi_driver。

在驱动出口函数中调用 spi_unregister_driver 来注销 spi_driver。

spi 读写数据demo

/* SPI 多字节发送 */
static int spi_send(struct spi_device *spi, u8 *buf, int len)
{
 int ret;
 struct spi_message m;
 
 struct spi_transfer t = {
  .tx_buf = buf,
  .len = len,
 };
 
 spi_message_init(&m); /* 初始化 spi_message */
 spi_message_add_tail(t, &m);/* 将 spi_transfer 添加到 spi_message 队列 */
 ret = spi_sync(spi, &m); /* 同步传输 */
 return ret;
}
/* SPI 多字节接收 */
static int spi_receive(struct spi_device *spi, u8 *buf, int len)
{
 int ret;
 struct spi_message m;
 
 struct spi_transfer t = {
  .rx_buf = buf,
  .len = len,
 };
 
 spi_message_init(&m); /* 初始化 spi_message */
 spi_message_add_tail(t, &m);/* 将 spi_transfer 添加到 spi_message 队列 */
 ret = spi_sync(spi, &m); /* 同步传输 */
 return ret;
}

除了 init、exit、probe、remove、read、write 函数外,其他的函数看需求实现,这几个是最基本的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    12

    文章

    1838

    浏览量

    85262
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1706

    浏览量

    91507
  • 系统
    +关注

    关注

    1

    文章

    1014

    浏览量

    21332
收藏 人收藏

    评论

    相关推荐

    深度解析Linux SPI总线和设备驱动架构

    SPI控制器不用关心设备的具体功能,它只负责把上层协议驱动准备好的数据按SPI总线的时序要求发送给SPI
    的头像 发表于 02-07 08:16 8080次阅读
    深度解析Linux <b class='flag-5'>SPI</b>总线和<b class='flag-5'>设备</b><b class='flag-5'>驱动</b>架构

    【DragonBoard 410c试用体验】9.DB410c开发板SPI驱动加载测试与nfc设备(PN532)-spi方式测试(failed)

    linux kernel3.2版本以后推荐使用dts来描述设备信息,spi驱动框架按照这个规定做了一些修改。SPI子系统core部分首先被加
    发表于 10-11 16:57

    如何使用RT-Thread SPI设备驱动

    菜单,修改the device name for console为uart1。开启SPI总线及设备驱动并注册SPI总线到系统:进入RT-Th
    发表于 10-25 14:20

    你想玩转RT-Thread之SPI设备吗?

    本应用笔记以驱动SPI接口的OLED显示屏为例,说明了如何添加SPI设备驱动框架及底层硬件驱动
    的头像 发表于 04-17 10:20 1.9w次阅读
    你想玩转RT-Thread之<b class='flag-5'>SPI</b><b class='flag-5'>设备</b>吗?

    浅谈SPI驱动API的使用方法

    针对SPI接口的应用特点,EM9280的SPI驱动进行了专门的优化,不仅可支持常规的SPI读、写操作,还可支持外部中断触发的读写操作。
    的头像 发表于 10-12 11:42 4645次阅读
    浅谈<b class='flag-5'>SPI</b><b class='flag-5'>驱动</b>API的使用方法

    嵌入式Linux系统驱动原理和使用ARM Linux实现SPI驱动程序的说明

    介绍嵌入式Linux系统驱动原理;分析SPI协议的通信原理和微处理器S3C2440A中SPI接口的硬件结构;阐述SPI
    发表于 11-14 16:36 11次下载
    嵌入式Linux<b class='flag-5'>系统</b>的<b class='flag-5'>驱动</b>原理和使用ARM Linux实现<b class='flag-5'>SPI</b><b class='flag-5'>驱动</b>程序的说明

    SPI检测是什么,SPI检测设备的作用又是什么

    SPI是什么?SPI检测是什么意思?SPI检测设备的作用是什么?SPI是【Solder Paste Inspection】的简称,中文叫【锡
    发表于 07-08 16:14 3w次阅读

    嵌入式Linux SPI驱动

    函数transfer_one_message: SPI发送护具函数,发送一个spi_message数据1.2 SPI设备驱动Linux内核使
    发表于 11-01 17:05 14次下载
    嵌入式Linux <b class='flag-5'>SPI</b><b class='flag-5'>驱动</b>

    硬件SPI与软件模拟SPI速度区别实测

    硬件SPI与软件模拟SPI速度区别实测目前为了程序移植方便,许多以SPI接口的芯片所提供的参考代码大多都使用的是软件SPI,比如笔者用过的存储芯片W25Q16,
    发表于 12-22 19:13 9次下载
    硬件<b class='flag-5'>SPI</b>与软件模拟<b class='flag-5'>SPI</b>速度区别实测

    SPI驱动源文件目录在哪

    /drivers/ spi/spidev.c linux 提供的 SPI 通用设备驱动程序kernel- 4.14 /include/ linux /
    的头像 发表于 07-25 10:49 781次阅读
    <b class='flag-5'>SPI</b><b class='flag-5'>驱动</b>源文件目录在哪

    SPI通用接口层介绍

    SPI 通用接口层 SPI 通用接口层把具体的 SPI 设备的协议驱动SPI 控制器
    的头像 发表于 07-25 10:52 751次阅读

    SPI控制器驱动层功能介绍

    和相应的设备进行正确的数据交换 向通用接口层提供接口,使得上层的协议驱动可以通过通用接口层访问控制器驱动 配合通用接口层,完成数据消息队列的排队和处理,直到消息队列变空为止 SPI
    的头像 发表于 07-25 10:58 1211次阅读
    <b class='flag-5'>SPI</b>控制器<b class='flag-5'>驱动</b>层功能介绍

    SPI子系统driver软件流程

    软件流程 看懂该图,对SPI 驱动框架就有完整的了解了。 1、2、3 按顺执行,首先有 spi 总线的注册,然后是 spi 控制器驱动加载,
    的头像 发表于 07-25 11:01 768次阅读
    <b class='flag-5'>SPI</b><b class='flag-5'>子系统</b>driver软件流程

    SPI子系统SPI时序图

    ,硬件设计必须注意信号质量风险,软件开发人员也要会看波形图。 这里的参数,一般 spi 驱动不需要设置,但是半导体厂商提供的 spi 控制器驱动中,可以修改这些参数
    的头像 发表于 07-27 10:51 3616次阅读
    <b class='flag-5'>SPI</b><b class='flag-5'>子系统</b>之<b class='flag-5'>SPI</b>时序图

    Vision Board上的SPI设备驱动配置和SPI主控的外部loopback功能测试

    感谢发烧友/* attach spi device */static int rt_spi_device_init(void){    struct rt_spi_configuration cfg
    的头像 发表于 06-04 09:21 605次阅读
    Vision Board上的<b class='flag-5'>SPI</b><b class='flag-5'>设备</b><b class='flag-5'>驱动</b>配置和<b class='flag-5'>SPI</b>主控的外部loopback功能测试