SSD1306 是 128x64(也有 128x32)OLED 屏幕的驱动板。在 Linux 5.10 中,SSD1306 已有驱动,这里简单介绍使用方法。注意这个驱动在主线中有所变化,这里只关注 5.10。

设备树

&i2c1 {
    status = "okay";
    ssd1306:ssd1306@3c {
        compatible = "solomon,ssd1306fb-i2c";
        reg = <0x3c>;
        solomon,width = <128>;
        solomon,height = <64>;
        solomon,com-invdir;
    };
};

驱动文档:ssd1307fb.txt。要注意驱动要选择 ssd1307fb.c 中的solomon,ssd1306fb-i2c,而不是 fb_ssd1306.c 中的solomon,ssd1306(难怪在 staging 目录下,质量确实不行)。屏幕大小需要指定,否则默认的大小为 96x16。屏幕分辨率可以用fbset命令查看。这里我还设置了solomon,com-invdir,把屏幕上下翻转。注意solomon,com-lrremap似乎只会在块内左右翻转,不要使用。

设置后,cat /dev/random > /dev/fb0 测试,可以看到全屏都有变化。如果分辨率设置错误,则可能屏幕只有一小块会刷新。

刷新率

默认的刷新率只有 1Hz,可以下列参数增大。没啥用,不知道为什么。

// linux/drivers/video/fbdev/ssd1307fb.c
#define REFRESHRATE 50

开启驱动

上述驱动对应的内核配置是

CONFIG_FB_SSD1307=y

作为控制台

这个屏幕是个单色屏,作为控制台用挺合适。在 Framebuffer 显示启动日志需要启用 fbcon,配置为CONFIG_FRAMEBUFFER_CONSOLE,并且注意配置字体CONFIG_FONTS=yCONFIG_FONT_MINI_4x6=yCONFIG_DUMMY_CONSOLE_COLUMNS=32CONFIG_DUMMY_CONSOLE_ROWS=10

开启后,cat 1234 > /dev/tty1 可以看到屏幕上显示了对应文字。 如果在自启动的文件中运行dmesg > /dev/tty1 &即可显示启动日志。(但是滚动速率极慢,原因不明)

https://stackoverflow.com/questions/76228076/boot-up-logo-is-not-getting-diplayed-on-embedded-linux-kernel-5-4-31 由于这个屏幕开得比较慢,所以可能无法在早期显示 Logo。