16_使用Framebuffer改造OLED驱动
-
源码:

1. 思路

假设OLED的每个像素使用1位数据表示:
- Linux Framebuffer中byte0对应OLED上第1行的8个像素
- OLED显存中byte0对应OLED上第1列的8个像素
为了兼容基于Framebuffer的程序,驱动程序中分配一块Framebuffer,APP直接操作Framebuffer。
驱动程序周期性地把Framebuffer中的数据搬移到OLED显存上。
怎么搬移?
发给OLED线程的byte0、1、2、3、4、5、6、7怎么构造出来?
- 它们来自Framebuffer的byte0、16、32、48、64、80、96、112
- OLED的byte0,由Framebuffer的这8个字节的bit0组合得到
- OLED的byte1,由Framebuffer的这8个字节的bit1组合得到
- OLED的byte2,由Framebuffer的这8个字节的bit2组合得到
- OLED的byte3,由Framebuffer的这8个字节的bit3组合得到
- ……
2. 编程
2.1 Framebuffer编程
分配、设置、注册fb_info结构体。
- 分配fb_info
- 设置fb_info
- fb_var
- fb_fix
- 注册fb_info
- 硬件操作
2.2 数据搬移
创建内核线程,周期性地把Framebuffer中的数据通过SPI发送给OLED。
创建内核线程:
-
参考文件
include/linux/kthread.h -
参考文章:https://blog.csdn.net/qq_37858386/article/details/115573565
-
kthread_create:创建内核线程,线程处于"停止状态",要运行它需要执行
wake_up_process -
kthread_run:创建内核线程,并马上让它处于"运行状态"
-
kernel_thread
2.3 调试
配置内核,把下列配置项去掉:
