树莓派默认是不带 screen 的,如果只是单纯用来作为简易的 console 使用,ssd1306 是一个不错的选择。
某宝上 ssd1306 不到十块钱,而适配树莓派的led屏幕,基本不会低于一百块。
参数
- 分辨率 128 * 64
- 接口 i2c
- 芯片 ssd1306
- 驱动 ssd1307fb
driver
ssd1306 需要编上 ssd1307fb 的驱动,
1
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
定位到 Device Drivers -> Graphics support -> Frame buffer Devices
选中 Solomon SSD1307 framebuffer support 即可
这里需要注意的是,因为硬件规格不同,直接使用上游的driver可能显示的图像是反的。需要打上这个patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 6439231f2..3aaea25b0 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -189,7 +189,7 @@ static void ssd1307fb_update_display(struct ssd1307fb_par *par)
for (i = 0; i < (par->height / 8); i++) {
for (j = 0; j < par->width; j++) {
- u32 array_idx = i * par->width + j;
+ u32 array_idx = ((par->height / 8) - 1 - i) * par->width + j;
array->data[array_idx] = 0;
for (k = 0; k < 8; k++) {
u32 page_length = par->width * i;
@@ -197,7 +197,7 @@ static void ssd1307fb_update_display(struct ssd1307fb_par *par)
u8 byte = *(vmem + index);
u8 bit = byte & (1 << (j % 8));
bit = bit >> (j % 8);
- array->data[array_idx] |= bit << k;
+ array->data[array_idx] |= bit << (7 - k);
}
}
}
device tree
写一个 overlays 加载驱动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Definitions for Rpi-Proto
/dts-v1/;
/plugin/;
/ {
compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";
fragment@0 {
target = <&i2c>;
__overlay__ {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
ssd1306: oled@3c {
compatible = "solomon,ssd1306fb-i2c";
reg = <0x3c>;
solomon,width = <128>;
solomon,height = <64>;
solomon,page-offset = <0>;
};
};
};
};
编译 overlays
1
dtc -@ -I dts -O dtb -o ssd1306.dtbo ssd1306.dts
载入 overlays
1
2
cp ssd1306.dtbo /boot/overlays/ssd1306.dtbo
dtoverlay ssd1306
载入成功就可以看到 /dev/fb1
con2fbmap
将 tty1 映射到 fb1 上去
1
con2fbmap 1 1
大功告成!
赏
使用支付宝打赏
使用微信打赏
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章