FEATURED · 精选文章

正点原子docker下开发RK3506踩坑记录,用SPI LCD 显示LVGL

发布时间 / 2026/9/8 18:38:26
来源 / 创域科博编辑部
栏目 / 资讯中心
正点原子docker下开发RK3506踩坑记录,用SPI LCD 显示LVGL 1、docker 环境搭建搜轩辕镜像先安装好docker下载好Ubuntu 20.4的镜像。输入如下指令搭建容器创建好用户。docker run -itd \ --name rk3506_test_sudo \ --privileged \ -v /home/xjf/share:/share \ -v /dev:/dev \ -v /dev/bus/usb:/dev/bus/usb \ -v /run/udev:/run/udev:ro \ 57ciiab4tk09tlhyu5.xuanyuan.run/library/ubuntu:20.04 \ /bin/bash # 进入容器之后是root用户编译SDK会一堆问题故试试新建用户 docker exec -it rk3506_test_sudo /bin/bash #容器内root下执行 apt update apt install -y sudo # 容器root内完整创建命令一次性补齐shell模板文件 groupadd -g 1000 xjf useradd -m -u 1000 -g 1000 -s /bin/bash xjf cp /etc/skel/.* /home/xjf/ chown -R xjf:xjf /home/xjf usermod -aG sudo xjf echo xjf ALL(ALL) NOPASSWD:ALL /etc/sudoers # 每次进入容器 docker exec -it -u 1000 rk3506_test_sudo /bin/bash将压缩包放到Samba共享的文件夹中并解压# 先支持中文显示 # 容器内修复xjf 用户sudo 执行 sudo apt install -y locales # 生成zh_CN.UTF‑8 sudo locale-gen zh_CN.UTF-8 # 永久写入用户环境变量 echo export LANGzh_CN.UTF-8 ~/.bashrc echo export LC_ALLzh_CN.UTF-8 ~/.bashrc source ~/.bashrc # 解压之后先进入文件夹中 ./repo.sh如出现如下问题创建软连接sudo ln -s /usr/bin/python3 /usr/bin/python再 ./repo.sh成功主机安装依赖库和工具sudo apt-get update # 先更新软件源 sudo apt-get install git ssh make gcc libssl-dev \ liblz4-tool expect expect-dev g patchelf chrpath gawk texinfo chrpath \ diffstat binfmt-support qemu-user-static live-build bison flex fakeroot \ cmake gcc-multilib g-multilib unzip device-tree-compiler ncurses-dev \ bzip2 expat gpgv2 cpp-aarch64-linux-gnu libgmp-dev \ libmpc-dev bc python-is-python3 python2选择板级文件 我这里选5./build.sh lunchSDK全编译./build.sh编译成功2、实现 /dev/fbx st7735s现在内核打开驱动内核的配置文件存在SDK /kernel/arch/arm/configs/alientek_rk3506_defconfig里为了保持修改一致性使用打开文件搜索st7735此时 搜索不到./build.sh kernel-config打开配置页面搜索7735我们这里按照上面的要求打开st7735r的驱动可能成功可能要改文件先往下走。这里再看看打开文件搜索7735可以看到配置项打开了。接下来改设备树。对于 dts 用户必须根据选择的板级配置文件使用的 dts 进行修改不同的板级配置文件使用的 dts 可能不一样。打开如图所示文件夹找到对应文件我这里选择的配置文件是5故选择图中该文件这里写了用什么设备树我这里用vscode打开。这里我突然有个问题SDK里有两个文件夹kernel和kernel-6.1 为什么会选择6.1编译因为这里kernel表面上是文件夹实际上是符号链接链接到kernel-6.1。如图这里接着管设备树很容易找到紧接着.dtb的就是。这里我们根据设备树头文件一层层打开所有的设备树头文件参考下图再打开这两个反正就是总体看一遍先有个印象。这里在文件末尾留意一下。编译设备树的时候应该是逐层向上翻并且编译的时候应该是dts的优先级最大越靠近dts的优先级越大。这里回到原理图选择用什么引脚。我选择SPI0A1 A2 A3分别是 RST DC CS CS用软件片选下面回到vscode在SPI0节点下面添加节点先看spi0节点是怎么配置的spi0_csn0_pinsspi0_clk_pins 这里符合原理图用什么引脚下面找到并按照如下说明文档在spi0节点下增加设备节点选用下面的引脚当背光这里背光不管实现之后无法控制亮度仅当提供配置内核后复原的解决思路关掉下面的引脚改过后参考如下单独烧录kernel 开机再ls /dev/fb*这里有问题先解决背光控制问题。可以看到背光被禁用了按照下面的要求修改编译烧录 每次只烧录一项即可这里开始处理SPI_LCD的问题参考STM32的代码将st7735r的代码修改如下// SPDX-License-Identifier: GPL-2.0 /* * FB driver for the ST7735R LCD Controller * * Copyright (C) 2013 Noralf Tronnes */ #include linux/module.h #include linux/kernel.h #include linux/init.h #include video/mipi_display.h #include fbtft.h #define DRVNAME fb_st7735r #define DEFAULT_GAMMA 0F 1A 0F 18 2F 28 20 22 1F 1B 23 37 00 07 02 10\n \ 0F 1B 0F 17 33 2C 29 2E 30 30 39 3F 00 07 03 10 static const s16 default_init_sequence[] { -1, 0x11, -2, 120, -1, 0xB1, 0x01, 0x2C, 0x2D, -1, 0xB2, 0x01, 0x2C, 0x2D, -1, 0xB3, 0x01, 0x2C, 0x2D, 0x01, 0x2C, 0x2D, -1, 0xB4, 0x07, -1, 0xC0, 0xA2, 0x02, 0x84, -1, 0xC1, 0xC5, -1, 0xC2, 0x0A, 0x00, -1, 0xC3, 0x8A, 0x2A, -1, 0xC4, 0x8A, 0xEE, -1, 0xC5, 0x0E, -1, 0xE0, 0x0f,0x1a,0x0f,0x18,0x2f,0x28,0x20,0x22, 0x1f,0x1b,0x23,0x37,0x00,0x07,0x02,0x10, -1, 0xE1, 0x0f,0x1b,0x0f,0x17,0x33,0x2c,0x29,0x2e, 0x30,0x30,0x39,0x3f,0x00,0x07,0x03,0x10, -1, 0xF0, 0x01, -1, 0xF6, 0x00, -1, 0x3A, 0x05, -1, 0x29, -3 }; static void set_addr_win(struct fbtft_par *par, int xs, int ys, int xe, int ye) { /* ST7735R 硬件偏移解决裁切 */ write_reg(par, MIPI_DCS_SET_COLUMN_ADDRESS, (xs 8) 0xFF, xs 0xFF, (xe 8) 0xFF, xe 0xFF); write_reg(par, MIPI_DCS_SET_PAGE_ADDRESS, (ys 8) 0xFF, ys 0xFF, (ye 8) 0xFF, ye 0xFF); write_reg(par, MIPI_DCS_WRITE_MEMORY_START); } #define MY BIT(7) #define MX BIT(6) #define MV BIT(5) static int set_var(struct fbtft_par *par) { switch (par-info-var.rotate) { case 0: write_reg(par, MIPI_DCS_SET_ADDRESS_MODE, MX | MY | (par-bgr 3)); break; case 270: write_reg(par, MIPI_DCS_SET_ADDRESS_MODE, MY | MV | (par-bgr 3)); break; case 180: write_reg(par, MIPI_DCS_SET_ADDRESS_MODE, par-bgr 3); break; case 90: write_reg(par, MIPI_DCS_SET_ADDRESS_MODE, MX | MV | (par-bgr 3)); break; } return 0; } #define CURVE(num, idx) curves[(num) * par-gamma.num_values (idx)] static int set_gamma(struct fbtft_par *par, u32 *curves) { int i, j; for (i 0; i par-gamma.num_curves; i) for (j 0; j par-gamma.num_values; j) CURVE(i, j) 0x3f; for (i 0; i par-gamma.num_curves; i) write_reg(par, 0xE0 i, CURVE(i, 0), CURVE(i, 1), CURVE(i, 2), CURVE(i, 3), CURVE(i, 4), CURVE(i, 5), CURVE(i, 6), CURVE(i, 7), CURVE(i, 8), CURVE(i, 9), CURVE(i, 10), CURVE(i, 11), CURVE(i, 12), CURVE(i, 13), CURVE(i, 14), CURVE(i, 15)); return 0; } #undef CURVE static struct fbtft_display display { .regwidth 8, .width 128, .height 160, .init_sequence default_init_sequence, .gamma_num 2, .gamma_len 16, .gamma DEFAULT_GAMMA, .fbtftops { .set_addr_win set_addr_win, .set_var set_var, .set_gamma set_gamma, }, }; FBTFT_REGISTER_DRIVER(DRVNAME, sitronix,st7735r, display); MODULE_ALIAS(spi: DRVNAME); MODULE_ALIAS(platform: DRVNAME); MODULE_ALIAS(spi:st7735r); MODULE_ALIAS(platform:st7735r); MODULE_DESCRIPTION(FB driver for the ST7735R LCD Controller); MODULE_AUTHOR(Noralf Tronnes); MODULE_LICENSE(GPL);spi0 { status okay; pinctrl-names default; pinctrl-0 spi0_clk_pins; #address-cells 1; #size-cells 0; display1 { compatible sitronix,st7735r; reg 1; spi-max-frequency 8000000; spi-mode 0; cs-gpios gpio1 RK_PA3 GPIO_ACTIVE_LOW; dc-gpios gpio1 RK_PA2 GPIO_ACTIVE_HIGH; reset-gpios gpio1 RK_PA1 GPIO_ACTIVE_LOW; reset-delay-us 15000; // bgr; /* 红蓝颠倒时打开此行BGR模式关闭则RGB模式 */ fps 30; buswidth 8; width 128; height 160; rotation 90; // bl-gpios gpio1 RK_PC7 GPIO_ACTIVE_HIGH; /* 背光引脚 */ }; };显示lvgl./build.sh buildroot-config这里我关闭了QT和weston打开lvgl打开后选择一个demo然后按照文档上要求修改三个文件。这些修改后遇到一个情况编译后依然是原来的音乐demo。还有一个问题怎么在spi lcd上运行demo。先解决demo的问题先取消掉开机自动运行自己在串口终端选择打开先试试是否可行。编译烧录~可行屏幕已经显示了音乐播放器的demo。这里我想运行benchmark执行 ./build.sh bconfig 在界面选择benchmark这里解决两个问题一个是退出界面后会报关于benchmark的warning另一个是会运行lvgl_demo依然是音乐播放器。先解决warning把这个头文件改成可见没有输出warning尝试重新编译rootfs烧录开机之后可以看到自动执行了benchemark。至此第二个问题也解决了。下面如何在spi lcd上显示demo首先找到LVGL_APP的文件夹参考如下接着打开如下文件好像并不支持fbdev下面增加对fbdev的支持写fbdev显示回调修改上述文件需要对下面的文件夹进行删除操作打开这个当输入./build.sh bconfig后这个选项默认变成了y需要关闭。参考如下目录打开如下文件对base.config进行修改参考如下然后对下面这个c文件进行修改/** * file lv_port_disp.c * */ #include stdlib.h #include stdio.h #include lvgl/lvgl.h #include fcntl.h #include unistd.h #include sys/mman.h #include linux/fb.h #include sys/ioctl.h static int fb_fd -1; static uint8_t *fb_mem NULL; static int fb_line_length 0; /* 局部刷新缓冲区每个缓冲区最多容纳 128 个像素 */ #define BUF_WIDTH 128 #define BUF_PIX_CNT (BUF_WIDTH) static lv_color_t buf1[BUF_PIX_CNT]; static lv_color_t buf2[BUF_PIX_CNT]; static lv_disp_draw_buf_t draw_buf; static void disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { int32_t w (area-x2 - area-x1 1); int32_t h (area-y2 - area-y1 1); uint8_t *fb_bytes (uint8_t *)fb_mem; for(int y 0; y h; y) { uint16_t *dst (uint16_t *)(fb_bytes (area-y1 y) * fb_line_length area-x1 * 2); for(int x 0; x w; x) { uint16_t px color_p[y * w x].full; /* fbdev 使用原生 RGB565fbtft 会负责转换为 SPI 大端字节序。 */ *dst px; } } lv_disp_flush_ready(disp); } static int custom_fbdev_open(int width, int height) { struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; fb_fd open(/dev/fb0, O_RDWR); if(fb_fd 0) { perror(open /dev/fb0 failed); return -1; } if(ioctl(fb_fd, FBIOGET_FSCREENINFO, finfo) 0) { perror(FBIOGET_FSCREENINFO); close(fb_fd); fb_fd -1; return -1; } if(ioctl(fb_fd, FBIOGET_VSCREENINFO, vinfo) 0) { perror(FBIOGET_VSCREENINFO); close(fb_fd); fb_fd -1; return -1; } fb_line_length finfo.line_length; // 从系统读取应该是 256 printf(fb line_length%d (stride)\n, fb_line_length); fb_mem mmap(NULL, finfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, 0); if(fb_mem MAP_FAILED) { perror(mmap fb failed); close(fb_fd); fb_fd -1; fb_mem NULL; return -1; } printf(fb_mem %p\n, fb_mem); return 0; } void lv_port_disp_init(lv_coord_t hor_res, lv_coord_t ver_res, int rot) { lv_disp_t *disp; static lv_disp_drv_t disp_drv; if(custom_fbdev_open(hor_res, ver_res) ! 0) { LV_LOG_ERROR(fbdev open fail); return; } /* 使用局部刷新LVGL 会根据缓冲区大小分批调用 flush_cb */ lv_disp_draw_buf_init(draw_buf, buf1, buf2, BUF_PIX_CNT); lv_disp_drv_init(disp_drv); disp_drv.hor_res hor_res; disp_drv.ver_res ver_res; disp_drv.flush_cb disp_flush; disp_drv.draw_buf draw_buf; disp lv_disp_drv_register(disp_drv); (void)rot; }再改一下main.c参考如下/* * Copyright (c) 2021 Rockchip, Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include lvgl/lvgl.h #include lvgl/lv_conf.h #include main.h #include signal.h #include stdio.h // 强制覆盖配置临时调试用 #undef LV_COLOR_SCREEN_TRANSP #define LV_COLOR_SCREEN_TRANSP 0 // 打印配置信息 #if LV_COLOR_SCREEN_TRANSP ! 0 #error LV_COLOR_SCREEN_TRANSP must be 0! #endif static int quit 0; #if USE_DEMO_WIDGETS extern void lv_demo_widgets(void); #elif USE_DEMO_BENCHMARK extern void lv_demo_benchmark(void); #elif USE_DEMO_MUSIC extern void lv_demo_music(void); #endif static void sigterm_handler(int sig) { fprintf(stderr, signal %d\n, sig); quit 1; } void test_rgb_colors(void) { // 清除所有对象 lv_obj_clean(lv_scr_act()); // 1. 纯红色方块 (左上) lv_obj_t *red lv_obj_create(lv_scr_act()); lv_obj_set_size(red, 40, 40); lv_obj_set_pos(red, 4, 4); lv_obj_set_style_bg_color(red, lv_color_hex(0xFF0000), 0); lv_obj_set_style_bg_opa(red, LV_OPA_COVER, 0); lv_obj_set_style_radius(red, 0, 0); // 2. 纯绿色方块 (右上) lv_obj_t *green lv_obj_create(lv_scr_act()); lv_obj_set_size(green, 40, 40); lv_obj_set_pos(green, 84, 4); lv_obj_set_style_bg_color(green, lv_color_hex(0x00FF00), 0); lv_obj_set_style_bg_opa(green, LV_OPA_COVER, 0); lv_obj_set_style_radius(green, 0, 0); // 3. 纯蓝色方块 (左下) lv_obj_t *blue lv_obj_create(lv_scr_act()); lv_obj_set_size(blue, 40, 40); lv_obj_set_pos(blue, 4, 84); lv_obj_set_style_bg_color(blue, lv_color_hex(0x0000FF), 0); lv_obj_set_style_bg_opa(blue, LV_OPA_COVER, 0); lv_obj_set_style_radius(blue, 0, 0); // 4. 白色方块 (右下) lv_obj_t *white lv_obj_create(lv_scr_act()); lv_obj_set_size(white, 40, 40); lv_obj_set_pos(white, 84, 84); lv_obj_set_style_bg_color(white, lv_color_hex(0xFFFFFF), 0); lv_obj_set_style_bg_opa(white, LV_OPA_COVER, 0); lv_obj_set_style_radius(white, 0, 0); } int main(int argc, char **argv) { signal(SIGINT, sigterm_handler); lv_port_init(128,160,0); // 测试颜色顺序 // test_rgb_colors(); lv_demo_benchmark(); while (!quit) { lv_timer_handler(); usleep(1000); } return 0; }注意编译前删掉下图中的两个文件夹这里烧录完应该可以运行了由于踩坑的过程比较长可能忘记记录了某些修改望谅解。烧录完自动执行benchmark之前好像取消掉了自动执行但是由于我把根文件系统clean了所以好像又是自动执行了。性能比mipi跑benchmark强一些。设备树中间好像有修改编译后单独烧录内核即可spi0 { status okay; pinctrl-names default; pinctrl-0 spi0_clk_pins; #address-cells 1; #size-cells 0; display1 { compatible sitronix,st7735r; reg 1; spi-max-frequency 8000000; spi-mode 0; cs-gpios gpio1 RK_PA3 GPIO_ACTIVE_LOW; dc-gpios gpio1 RK_PA2 GPIO_ACTIVE_HIGH; reset-gpios gpio1 RK_PA1 GPIO_ACTIVE_LOW; reset-delay-us 15000; fps 30; buswidth 8; width 128; height 160; rotation 0; // bl-gpios gpio1 RK_PC7 GPIO_ACTIVE_HIGH; /* 背光引脚 */ }; };这里我在刷屏问题上折腾了好久主要是颜色不对笔记如下!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleLVGL ST7735R 颜色显示问题总结/title style :root { --ink: #17202a; --muted: #5f6b76; --paper: #f7f4ee; --panel: #fffdf8; --line: #ded8cc; --accent: #b33a2f; --code: #20262d; --good: #24734a; } * { box-sizing: border-box; } body { margin: 0; color: var(--ink); background: var(--paper); font: 16px/1.75 Noto Sans CJK SC, Microsoft YaHei, sans-serif; } main { width: min(100% - 32px, 960px); margin: 40px auto 72px; } header { padding: 36px 40px; color: white; background: linear-gradient(135deg, #8e2d22, #c45b35); border-radius: 10px; box-shadow: 0 12px 30px rgba(91, 45, 30, .16); } h1, h2, h3 { line-height: 1.3; } h1 { margin: 0 0 10px; font-size: clamp(28px, 5vw, 44px); } h2 { margin-top: 42px; padding-bottom: 8px; border-bottom: 2px solid var(--line); } h3 { margin-top: 26px; } .subtitle { margin: 0; opacity: .9; } section, .note { margin-top: 24px; padding: 24px 28px; background: var(--panel); border: 1px solid var(--line); border-radius: 8px; } .note { border-left: 5px solid var(--accent); } .success { border-left-color: var(--good); } code { padding: 2px 5px; color: #8b2f25; background: #f0e9dc; border-radius: 4px; } pre { overflow-x: auto; padding: 18px; color: #f4f7f9; background: var(--code); border-radius: 7px; font: 14px/1.65 JetBrains Mono, Cascadia Code, monospace; } .color-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin: 18px 0; } .color-item { display: flex; align-items: center; gap: 12px; padding: 12px; border: 1px solid var(--line); border-radius: 6px; } .swatch { width: 34px; aspect-ratio: 1; border: 1px solid rgba(0,0,0,.2); border-radius: 4px; } .red { background: #f00; } .green { background: #0f0; } .blue { background: #00f; } .white { background: #fff; } li { margin: 6px 0; } .small { color: var(--muted); font-size: 14px; } media (max-width: 600px) { main { width: min(100% - 20px, 960px); margin-top: 20px; } header, section, .note { padding: 20px; } .color-grid { grid-template-columns: 1fr; } } /style /head body main header h1LVGL ST7735R 颜色显示问题总结/h1 p classsubtitleRK3506 Linux 6.1 / LVGL 8 / fbtft framebuffer/p /header section h2一、问题现象/h2 p测试界面绘制四个 40×40 方块期望结果是/p div classcolor-grid div classcolor-itemspan classswatch red/span左上红色/div div classcolor-itemspan classswatch green/span右上绿色/div div classcolor-itemspan classswatch blue/span左下蓝色/div div classcolor-itemspan classswatch white/span右下白色/div /div p实际显示曾出现左上、右上、左下颜色错乱例如左上不是纯红甚至多个区域显示成相同颜色。/p /section section h2二、排查思路/h2 ol li先确认方块位置排除坐标或屏幕旋转问题。/li li检查 codelv_color_hex()/code 的参数格式确认测试颜色是否真的代表红、绿、蓝。/li li检查 LVGL 绘制缓冲区大小与 codefull_refresh/code 配置是否匹配。/li li检查 framebuffer 的像素格式区分“内存中的 RGB565 格式”和“SPI 线上发送的字节序”。/li li查看 fbtft 的写屏路径确认应用是否重复执行了字节交换。/li /ol /section section h2三、根因一颜色值格式使用错误/h2 pcodelv_color_hex()/code 接收的是 24 位 RGB 格式 code0xRRGGBB/code不是 RGB565 数值。/p p原来的红色写法是/p precodelv_color_hex(0xF800)/code/pre p这会被解释为 24 位颜色 code0x00F800/code并不是标准意义上的纯红色。RGB565 常量不能直接作为 codelv_color_hex()/code 参数。/p p修正后的测试颜色/p precodelv_color_hex(0xFF0000); // 红色 lv_color_hex(0x00FF00); // 绿色 lv_color_hex(0x0000FF); // 蓝色 lv_color_hex(0xFFFFFF); // 白色/code/pre /section section h2四、根因二全屏刷新与缓冲区大小不匹配/h2 p显示分辨率是 128×160但绘制缓冲区只有 128 个像素/p precode#define BUF_WIDTH 128 #define BUF_PIX_CNT BUF_WIDTH static lv_color_t buf1[BUF_PIX_CNT]; static lv_color_t buf2[BUF_PIX_CNT];/code/pre p如果同时设置/p precodedisp_drv.full_refresh 1;/code/pre pLVGL 可能按整屏 128×160 像素使用绘制缓冲区导致缓冲区越界写入。越界写入会破坏颜色数据和刷新结果。/p p修正方式是移除 codefull_refresh 1/code让 LVGL 根据 128 像素的缓冲区分批执行局部刷新/p precodelv_disp_draw_buf_init(amp;draw_buf, buf1, buf2, BUF_PIX_CNT); lv_disp_drv_init(amp;disp_drv); disp_drv.hor_res hor_res; disp_drv.ver_res ver_res; disp_drv.flush_cb disp_flush; disp_drv.draw_buf amp;draw_buf; /* 不设置 full_refresh使用局部刷新 */ disp lv_disp_drv_register(amp;disp_drv);/code/pre /section section h2五、根因三Framebuffer 与 SPI 字节序不能重复转换/h2 pST7735R 使用 RGB565。应用层通过 code/dev/fb0/code 写入的是 framebuffer 的原生 RGB565 像素应该按 16 位数值写入/p precodeuint16_t *dst (uint16_t *)(fb_bytes (area-gt;y1 y) * fb_line_length area-gt;x1 * 2); dst[x] color_p[y * w x].full;/code/pre pfbtft 的 codefbtft_write_vmem16_bus8()/code 会把 framebuffer 中的 RGB565 数值转换为 SPI 需要的高字节在前格式。/p p因此应用层不能再手动写成/p precode*dst (px gt;gt; 8) amp; 0xFF; *dst px amp; 0xFF;/code/pre p否则应用层和 fbtft 都做一次字节处理最终会产生颜色错误。/p /section section h2六、最终代码修改/h2 h31. codeapp/lvgl_demo/lv_demo/main.c/code/h3 precode// 左上红色 lv_obj_set_pos(red, 4, 4); lv_obj_set_style_bg_color(red, lv_color_hex(0xFF0000), 0); // 右上绿色 lv_obj_set_pos(green, 84, 4); lv_obj_set_style_bg_color(green, lv_color_hex(0x00FF00), 0); // 左下蓝色 lv_obj_set_pos(blue, 4, 84); lv_obj_set_style_bg_color(blue, lv_color_hex(0x0000FF), 0); // 右下白色 lv_obj_set_pos(white, 84, 84); lv_obj_set_style_bg_color(white, lv_color_hex(0xFFFFFF), 0);/code/pre h32. codeapp/lvgl_demo/lvgl8/lv_port_disp.c/code/h3 precodestatic void disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) { int32_t w area-gt;x2 - area-gt;x1 1; int32_t h area-gt;y2 - area-gt;y1 1; uint8_t *fb_bytes (uint8_t *)fb_mem; for(int y 0; y lt; h; y) { uint16_t *dst (uint16_t *)(fb_bytes (area-gt;y1 y) * fb_line_length area-gt;x1 * 2); for(int x 0; x lt; w; x) { *dst color_p[y * w x].full; } } lv_disp_flush_ready(disp); }/code/pre /section section classnote success h2七、最终结果/h2 ul li左上方块显示纯红色。/li li右上方块显示纯绿色。/li li左下方块显示纯蓝色。/li li右下方块显示纯白色。/li liLVGL 使用 128 像素局部刷新缓冲区不再发生全屏刷新越界。/li li应用层只写 framebuffer 原生 RGB565SPI 字节序转换交给 fbtft。/li /ul /section section h2八、验证清单/h2 ol li确认 LVGL 配置为 codeLV_COLOR_DEPTH 16/code。/li li确认 codeLV_COLOR_16_SWAP/code 与当前 framebuffer 写入方式一致不能重复交换。/li li确认 codefb_line_length/code 使用内核返回的实际 stride不要硬编码为屏幕宽度乘 2。/li li确认显示驱动的 BGR 设置与屏幕硬件一致。若红蓝互换而绿色正常应检查 ST7735R 的 MADCTL/BGR 配置。/li li重新编译并在目标板运行颜色测试。/li /ol p classsmall静态错误检查已通过完整目标板编译和硬件显示验证需要在对应的交叉编译环境及设备上执行。/p /section /main /body /html/******************下面是踩坑的过程忽略*****************************/之后再将镜像打包试试烧录之后很遗憾依然是之前的音乐播放器demo。这里先怀疑又被写死了。先看一下上述文件。打开下面的文件可以发现两个demo都被打开了这可能就是为什么报warning提示被覆盖了。下面对这个文件进行分析首先是设置了benchmark后defconfig文件依然没变。还有我明明把QT5给覆盖了为什么这里写的是 is reset to default 这个是什么意思看这里退出配置页面后是这样打印的。从./build.sh bconfig分析日志开始。./build.sh bconfig保存之后只能在defconfig里增加output里.config到时符合。再分析一下头文件
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻