正在做4.3寸的开发板,以最低的价格给各位。
https://whycan.com/files/members/13307/微信图片_20231114214515.png
这个活动已经结束啦?:o
@达子666
1、这个报错信息可以通过下面的命令安装 SDL 来解决
sudo apt install libsdl2-dev
2、如果实际的板子是运行发行版的 Linux,比如 Ubuntu Server,可以直接使用这个模拟器。
3、如果是自己通过 busybox + kernel + rootfs 构建的 Linux,那么就可以在服务器上通过交叉编译生成目标文件,再将目标文件放到板子上运行。
大概的过程是:
1)提供 /dev/fb0
2)修改 lvgl_linux_simulator/include/lv_drv_conf.h 文件
#ifndef USE_SDL
# define USE_SDL 0
#endif
...
#ifndef USE_FBDEV
# define USE_FBDEV 1
#endif
#if USE_FBDEV
# define FBDEV_PATH "/dev/fb0"
#endif
3)修改 src/lv_port.c 文件
void lv_port_disp_init(void)
{
/* 分配显示缓冲区 */
int buf_size = sizeof(lv_color_t) * SDL_HOR_RES * SDL_VER_RES;
buf_1 = malloc(buf_size);
buf_2 = malloc(buf_size);
if ((NULL != buf_1) && (NULL != buf_2))
lv_disp_draw_buf_init(&disp_buf, buf_1, buf_2, buf_size);
/* 默认初始化 */
lv_disp_drv_init(&disp_drv);
/* 缓冲区 */
disp_drv.draw_buf = &disp_buf;
/* 回调函数,需开发者提供,用于将缓冲区的内容复制到显示器的特定区域 */
disp_drv.flush_cb = ;
/* 显示器的水平分辨率,单位是像素 */
disp_drv.hor_res = ;
/* 显示器的垂直分辨率,单位是像素 */
disp_drv.ver_res = ;
/* 注册显示设备 */
disp = lv_disp_drv_register(&disp_drv);
}
4)修改 CMakeLists.txt 文件
/* 这里改为交叉编译工具链 */
set(CMAKE_C_COMPILER "/usr/bin/gcc")
...
/* 把下面的 SDL2 去掉 */
可参考下 https://gitee.com/zeepunt/lvgl_linux_simulator.git 的 commit log:[port] support freetype
为 framebuffer 分配空间,但是失败了,所用的函数是 dma_alloc_wc 。
device 是设备树解析 i2c 节点生成的 platform device,即 client->dev。
info->screen_base = (char __iomem *)dma_alloc_wc(&(client->dev), info->fix.smem_len, &phy_addr, GFP_KERNEL);
报错的信息:
[ 78.640247] dma alloc failure, device may be missing a call to arch_setup_dma_ops
[ 78.640265] WARNING: CPU: 3 PID: 1094 at arch/arm64/mm/dma-mapping.c:490 __dummy_alloc+0x1c/0x2c
内核的版本:(ubuntu server)
rock@rock-3a:~/share$ uname -a
Linux rock-3a 4.19.193-44-rockchip-g5a07852a55cf #rockchip SMP Tue Jun 14 12:35:45 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
报错的函数:
static void *__dummy_alloc(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t flags,
unsigned long attrs)
{
WARN(1, "dma alloc failure, device may be missing a call to arch_setup_dma_ops");
return NULL;
}
根据报错的内容,是需要调用 arch_setup_dma_ops 这个函数,找了一下,发现在 platform_dma_configure 会调用这个函数,那么是不需要修改设备树呢?还是别的原因?