16_使用Framebuffer改造OLED驱动#

  • 源码:

    image-20220429174003143

1. 思路#

image-20220429173507474

假设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 调试#

配置内核,把下列配置项去掉:

image-20220125212414098