当前位置: 首页 > news >正文

瑞芯微rv1126 linux内核使用spidev驱动

对于linux的spi驱动框架来讲,如果在spi总线上挂载了一个设备,是可以不用写内核驱动代码就可以操作此设备的,直接在用户应用层就可以操作。原理是借助spidev这个spi设备驱动,将自己的spi设备跟spidev设备驱动匹配就行了,应用层生成设备/dev/spidev0.0节点供应用层操作。

如下使用正点原子的瑞芯微rv1126开发板做个测试:

1 修改内核配置,让他支持spidev驱动的应用层设备,内核目录执行:

make ARCH=arm menuconfig

2 修改设备树,将自己的spi设备挂载到spidev驱动,修改compatible为

compatible = "rockchip,spidev";

3 重新编译内核后烧录固件:

./build.sh kernel

./build.sh updateimg

4 重启后进入设备命令行,应该可以在/dev下找到spidev0.0这个节点,进一步到/sys文件系统确认下:

[root@ATK-DLRV1126:/]# cat /sys/bus/spi/drivers/spidev/spi0.0/of_node/name
icm20608

5 内核搞定以后,需要准备应用层工具用来测试这个设备,可以使用linux自带的工具,在~/sdk/kernel/tools/spi目录中,直接交叉编译这个文件夹就行了:

make CC=/opt/atk-dlrv1126-toolchain/usr/bin/arm-linux-gnueabihf-gcc LD=/opt/atk-dlrv1126-toolchain/usr/bin/arm-linux-gnueabihf-ld

编译完了会产生spidev_test和spidev_fdx这两个工具,我们使用spidev_test来做测试。其实原始的测试工具写了功能,但是没有显示,有点蛋疼,我们还可以修改spidev_test.c把读到的数据显示出来:

static void transfer_escaped_string(int fd, char *str)
{size_t size = strlen(str);uint8_t *tx;uint8_t *rx;tx = malloc(size);if (!tx)pabort("can't allocate tx buffer");rx = malloc(size);if (!rx)pabort("can't allocate rx buffer");//zero tx&rxmemset(tx, 0, size);memset(rx, 0, size);//copy tx datasize = unescape((char *)tx, str, size);//show tx dataprintf("spi_tx:");for(int i=0;i<size;i++)printf("%02x ", tx[i]);printf("\r\n");//transfertransfer(fd, tx, rx, size);//show rx dataprintf("spi_rx:");for(int i=0;i<size;i++)printf("%02x ", rx[i]);printf("\r\n");//freefree(rx);free(tx);
}

可以重新编译后,把spidev_test推送到开发板:

alientek@ubuntu:~/sdk/kernel/tools/spi$ adb push spidev_test /tmp
spidev_test: 1 file pushed. 1.3 MB/s (40168 bytes in 0.029s)
 

6 进入开发板命令行,进入/tmp目录,找到spidev_test这个工具,输入如下命令:

[root@ATK-DLRV1126:/tmp]# ./spidev_test -D /dev/spidev0.0 -s 1000000 -b 8 -p "\x
f5\x00\x00"
spi mode: 0x0
bits per word: 8
max speed: 1000000 Hz (1000 KHz)
spi_tx:f5 00 00
spi_rx:ff ae 00
 

这个命令的意思是,

-D指定操作设备为/dev/spidev0.0

-s 1000000指定频率为1MHz

-b 8指定位宽为8bit

-p "\xf5\x00\x00"指定发送数据为"\xf5\x00\x00",0xf5为0x75|0x80,意思是读取寄存器地址为0x75的数据,连续读3字节。

从回复可以看到0x75寄存器的内容为0xae,是正确的,跟原来的驱动打印一样的。

如果需要更加详细的操作,自己根据spidev_test.c去编写自己的应用程序即可。

参考:RK3568驱动指南|第十六篇 SPI-第193章 Linux中通用SPI设备驱动_瑞芯微指纹spi驱动适配-CSDN博客

http://www.dtcms.com/a/365504.html

相关文章:

  • 【Unity基础】两个关于UGUI中Text对非英文字体支持的问题
  • 在线性代数里聊聊word embedding
  • 在Excel和WPS表格中隔多行插入一个空白行
  • 【Linux 内存管理】2 进程地址空间 - vm_area_struct 数据结构
  • 【Zotero】插入中文参考文献遇到的问题
  • 【数据处理工具】依据图层批量分割要素,并自动处理碎图斑
  • Zynq中级开发七项必修课-第七课:AXI DMA (PL→PS) 数据上传
  • 深入掌握sed:Linux文本处理的流式编辑器利器
  • 权威认证!华宇TAS应用中间件获得商用密码产品认证证书
  • MongoDB 性能调优:十大实战经验总结 详细介绍
  • (Me)Adobe Media Encoder 2025音视频格式转码软件及视频编码软件,全新版免激活,安装即永久使用!
  • 面经分享二:Kafka、RabbitMQ 、RocketMQ 这三中消息中间件实现原理、区别与适用场景
  • windows server2008R2 远程提示用户名密码错误
  • 往届生还有机会进入计算机这个行业吗?还能找见好工作吗
  • 软件测试基础知识(数据库篇)
  • [光学原理与应用-377]:ZEMAX - 优化 - ZEMAX中的评价函数、类型、优化算法及其关系解析
  • Coze源码分析-资源库-创建提示词-前端源码
  • 聚焦诊断管理(DM)的传输层设计、诊断服务器实现、事件与通信管理、生命周期与报告五大核心模块
  • 集成学习算法简介
  • 水资源论证方法与报告编制技术及实际案例分析
  • ruoyi vue element 实现点击、返回首页收起已经展开的菜单栏
  • CI/CD流水线驱动自动化流程深度解析:选型、竞品、成本与资源消耗
  • Java项目打包成EXE全攻略​
  • 企业内网安全守护全面指南:从基础防护到智能管理的一站式解决方案
  • vue3前端开发的基础教程——快速上手
  • BERT实战|推理与微调
  • 如何从PDF中高效提取表格数据
  • Top 10 Kali Linux Tools for Hacking 2025.2
  • Flutter + Web:深度解析双向通信的混合应用开发实践
  • 深入解析 MySQL 存储引擎架构