news 2026/9/24 7:10:28

20260125 - Linu驱动学习笔记:SPI-OLED测试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
20260125 - Linu驱动学习笔记:SPI-OLED测试

SPI-OLED测试

OLED的D/C引脚电平逻辑:

电平状态模式名称作用描述例子
低电平 (Low / 0)Command (命令)写入控制寄存器,设置屏幕的工作状态。设置亮度、开启滚动、设置起始页。
高电平 (High / 1)Data (数据)写入显存 (GDDRAM),直接改变屏幕显示的图像。发送图片点阵、发送字符字模。

设备树定义:

&ecspi1{pinctrl-names="default";pinctrl-0=<&pinctrl_ecspi1>;fsl,spi-num-chipselects=<2>;cs-gpios=<&gpio426GPIO_ACTIVE_LOW>,<&gpio424GPIO_ACTIVE_LOW>;status="okay";oled:oled{compatible="spidev";reg=<0>;spi-max-frequency=<10000000>;};};

D/C引脚接在了GPIO4_20,即116号引脚,在APP程序中控制即可,不需要写进驱动。

因此可直接使用内核通用SPI驱动spidev.c。

首先,在内核目录中打开menuconfig:

book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make menuconfig

搜索SPIDEV:

搜索结果:

之前已经被设置为了M,因此会被编译成模块:

book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make modules

然后上传到开发板的/root目录下:

book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ adb push drivers/spi/spidev.ko/root

在APP程序中D/C引脚初始化及控制函数:

voiddc_pin_init(intnumber){charcmd[100];sprintf(cmd,"echo %d > /sys/class/gpio/export",number);system(cmd);sprintf(cmd,"echo out > /sys/class/gpio/gpio%d/direction",number);system(cmd);}voidoled_set_dc_pin(intval){charcmd[100];sprintf(cmd,"echo %d > /sys/class/gpio/gpio%d/value",val,dc_pin_num);system(cmd);}voiddc_pin_exit(intnumber){charcmd[100];sprintf(cmd,"echo %d > /sys/class/gpio/unexport",number);system(cmd);![image-20260116135634897](C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20260116135634897.png)}

实验结果:

屏幕显示数据的速率肉眼可见地缓慢,性能太差。原因分析:

**设置位置 (OLED_DIsp_Set_Pos)**时:

  • 它内部调用了3 次oled_write_cmd_data
  • 每次oled_write_cmd_data都会:
    • 执行system("echo ...")创建进程,很慢
    • 执行write(fd_spidev, &uc_data, 1)1 字节写入
  • 小计:发 3 字节命令,却搞了 3 次进程创建 + 3 次 1 字节写。

发送数据 (oled_write_datas)时

  • 执行oled_set_dc_pin(1):又是一次system()创建进程)。
  • 执行write(fd, buf, 8)8 字节写

总计:显示一个8bitx16bit字符,一共执行了:

  • 8 次进程创建(system调用)
  • 6 次 1 字节写入(设置坐标)
  • 2 次 8 字节写入(实际像素数据)

优化 OLED 性能的核心思路:减少系统调用次数消除高开销操作

目前代码中, 导致性能低的最大原因是system()函数,其次是碎片化的write()操作

system()函数优化步骤:

  1. 修改dc_pin_init,提前打开文件。
  2. 修改oled_set_dc_pin,直接写文件描述符。
staticintfd_dc_value;// 定义为静态全局变量voiddc_pin_init(intnumber){charcmd[100];charpath[100];dc_pin_num=number;sprintf(cmd,"echo %d > /sys/class/gpio/export",number);system(cmd);sprintf(cmd,"echo out > /sys/class/gpio/gpio%d/direction",number);system(cmd);// 【关键优化】提前打开 value 文件sprintf(path,"/sys/class/gpio/gpio%d/value",number);fd_dc_value=open(path,O_WRONLY);}voidoled_set_dc_pin(intval){if(val)write(fd_dc_value,"1",1);elsewrite(fd_dc_value,"0",1);}

其次是 oled_write_cmd_data,目前每写 1 字节就要切换一次 DC 引脚并执行一次 write。

优化逻辑:尽量将连续的命令或连续的数据打包在一起发送。

优化Set_Pos函数:

原函数执行了 3 次write,可以合并为 1 次。

voidOLED_DIsp_Set_Pos(intx,inty){unsignedcharbuf[3];buf[0]=0xb0+y;buf[1]=(x&0x0f);buf[2]=((x&0xf0)>>4)|0x10;oled_set_dc_pin(0);// 只切换一次 DCspi_write_datas(buf,3);// 一次性发送 3 字节命令}

优化后,瞬间显示一整帧字符,无卡顿、无闪烁。

之后再试试显存缓冲区 (Frame Buffer)的优化路线。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 19:24:57

如何突破NCM格式限制?解锁音乐自由播放的3个实用技巧

如何突破NCM格式限制&#xff1f;解锁音乐自由播放的3个实用技巧 【免费下载链接】ncmdump 转换网易云音乐 ncm 到 mp3 / flac. Convert Netease Cloud Music ncm files to mp3/flac files. 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdump 问题&#xff1a;当你下…

作者头像 李华
网站建设 2026/9/23 19:23:55

企业微信智能签到工具:技术实现与合规指南

企业微信智能签到工具&#xff1a;技术实现与合规指南 【免费下载链接】AutoDingding 钉钉自动打卡 项目地址: https://gitcode.com/gh_mirrors/au/AutoDingding 企业微信签到是现代办公场景中的重要环节&#xff0c;但传统手动签到方式存在效率低下、位置限制等问题。本…

作者头像 李华
网站建设 2026/9/23 14:32:56

焕新经典游戏网络:IPXWrapper重连Windows 11局域网对战体验

焕新经典游戏网络&#xff1a;IPXWrapper重连Windows 11局域网对战体验 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 你是否也曾因系统升级失去联机乐趣&#xff1f;当Windows 11彻底移除IPX/SPX协议支持&#xff0c;《暗黑破…

作者头像 李华
网站建设 2026/9/23 20:14:08

Openpose预处理器参数缺失故障排查与解决方案

Openpose预处理器参数缺失故障排查与解决方案 【免费下载链接】comfyui_controlnet_aux 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 故障现象 在ComfyUI ControlNet Aux项目中执行Openpose预处理器时&#xff0c;系统抛出参数缺失错误&…

作者头像 李华
网站建设 2026/9/23 20:13:40

Qwen3-1.7B显存不足怎么办?量化压缩+低资源运行技巧详解

Qwen3-1.7B显存不足怎么办&#xff1f;量化压缩低资源运行技巧详解 1. 为什么Qwen3-1.7B在普通GPU上容易“卡住” 你刚下载好Qwen3-1.7B&#xff0c;满怀期待地想在自己的RTX 4060&#xff08;8GB显存&#xff09;或A10&#xff08;24GB&#xff09;上跑起来&#xff0c;结果…

作者头像 李华
网站建设 2026/9/23 11:46:07

YOLOv11医疗影像应用:肺结节检测部署全流程

YOLOv11医疗影像应用&#xff1a;肺结节检测部署全流程 YOLOv11并不是当前公开发布的官方版本——截至2024年&#xff0c;Ultralytics官方最新稳定版为YOLOv8&#xff0c;后续有社区演进的YOLOv9、YOLOv10等非官方命名变体&#xff0c;但并不存在权威定义的“YOLOv11”。本文所…

作者头像 李华