本文介绍如何在zephyr上配置ssd1306和lvgl,并让二者协同工作.
LittlevGL(lvgl) 是一个开源免费的GUI, zephyr将其作为gui组件。SSD1306是一款单色的OLED屏,只有0.96寸大,分辨率为128*64。 一般情况下我们都是直接对SSD1306进行控制,在其framebuffer上画图需要的东西。但在Zephyr上,我们可用通过lvgl很方便在SSD1306上显示出我需要的内容。本文描述如何在Zephyr上配置ssd1306和lvgl,并基于nrf52832演示lvgl和ssd1306协同工作。
配置SSD1306
ssd1306一般有SPI和I2C接口,这里使用的I2C接口,配置SSD1306很简单只用在设备树中描述SSD1306使用的I2C情况,并在配置文件中启动SSD1306既可
设备树修改
在你板子的dts文件中加入如下内容
1 | &i2c0 { |
以上内容含义如下:
- ssd1306使用i2c0,SDA为引脚5, SCK为引脚4
- I2C通讯速率为400kbps(参考nclude/dt-bindings/i2c/i2c.h)
- ssd1306的i2c地址为3c
- ssd1306的lable为SSD1306 (zephyr display drv name,后面配置LVGL display name要用到)
其它ssd1306的参数可以参考dts/bindings/display/solomon,ssd1306fb.yaml,都会被对应的转化为宏在驱动代码ssd1306.c里面体现,这里就不做详细介绍。
配置文件修改
详见注释
1 | # 启用I2C驱动 |
LVGL
zephyr已经针对不同的显示形式用自己的display drv对接了LVGL的显示驱动接口,所以对于LVGL来说基本就是配置好就可以直接使用了
配置
基础配置
要想ssd1306能在lvgl下工作,需要启动lvgl并针对ssd1306的显示特性进行配置
1 | # 启用display drv |
组件配置
为了最小化image,zephyr默认是关闭所有lvgl组件的,因此要根据需求启用组件
1 | #启用lable |
使用
lvgl的使用不是本文重点,因此这里只列一下测试代码。
在zephyr中一旦配置ssd1306和lvgl,对应的初始化代码就会被打开,不需要手动再写,只用进行主题初始化就可以使用lvgl组件了
1 | //ssd1306是单色屏,因此只能初始化为mono |
以上显示的结果如下
其它
驱动
目前zephyr master的code按照前面配置会工作异常,是因为上ssd1306的驱动支援并不完整,只能进行全屏更新,无法对指定显示区域进行更新,因此要进行修改后才能支援lvgl, 详见ssd1306驱动要点最后一个小节, 我已提交PR: https://github.com/zephyrproject-rtos/zephyr/pull/18817, merge后就可以生效了。由于没有SH1106无法对其测试,因此该修改只针对SSD1306有效,这就是为什么要在前面将关闭CONFIG_SSD1306_SH1106_COMPATIBLE的原因。
lvgl的porting
在lvgl外设驱动上zephyr目前只对display和fs进行了对接,porting代码见lib/gui/lvgl
ssd1306单色屏的display porting文件是lib/gui/lvgl/lvgl_display_mono.c