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文章
1818浏览量
85103 -
SPI
+关注
关注
17文章
1688浏览量
91174 -
系统
+关注
关注
1文章
1006浏览量
21288
发布评论请先 登录
相关推荐
【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
嵌入式Linux系统的驱动原理和使用ARM Linux实现SPI驱动程序的说明
介绍嵌入式Linux系统的驱动原理;分析SPI协议的通信原理和微处理器S3C2440A中SPI接口的硬件结构;阐述SPI
发表于 11-14 16:36
•11次下载
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次下载
硬件SPI与软件模拟SPI速度区别实测
硬件SPI与软件模拟SPI速度区别实测目前为了程序移植方便,许多以SPI接口的芯片所提供的参考代码大多都使用的是软件SPI,比如笔者用过的存储芯片W25Q16,
发表于 12-22 19:13
•9次下载
SPI控制器驱动层功能介绍
和相应的设备进行正确的数据交换 向通用接口层提供接口,使得上层的协议驱动可以通过通用接口层访问控制器驱动 配合通用接口层,完成数据消息队列的排队和处理,直到消息队列变空为止 SPI 主
Vision Board上的SPI设备驱动配置和SPI主控的外部loopback功能测试
感谢发烧友/* attach spi device */static int rt_spi_device_init(void){ struct rt_spi_configuration cfg
评论