全志科技
直播中

lingxin-yuhe

11年用户 341经验值
擅长:嵌入式技术,处理器/DSP,接口/总线/驱动
私信 关注
[经验]

【全志V853开发板试用】初次使用全志产品V853开发板试用——编译下载调试最新SDK

前言:前一篇将Ubuntu环境搭建完成,下载了V853的SDK代码,因电脑配置太低,Ubuntu上也只能编译了,代码编辑工具安装就比较费劲了,综合考虑我在windows下编辑代码,因此需要配置samba服务,windows下用vscode修改代码,接下来就搭建samba服务挂载,然后根据社区开源项目跑通一下开发板的开发环境。

1. Ubuntu下samba服务配置

如果电脑配置足够好,可以直接所有工作都在Ubuntu下完成,安装VScode或者其他的项目编辑工具即可。

Samba可实现Linux和Windows直接共享文件,接下来就安装步骤简单记录一下。

1. 安装samba

sudo apt install samba //我的安装这个samba-common也就安装了,如果没有安装需要安装一下。

1

2. 设置共享文件夹

共享文件夹就选择下载SDK的文件夹,全路径为如图所示,设置路径的权限,方便共享操作。

sudo chmod 777 /home/forlinx/v853/tina-v853-open -R//-R递归设置属性

2

3. 添加用户名及密码

添加samba的用户名和密码,用户就是Ubuntu登录的用户名,添加密码如下:

sudo smbpasswd -a forlinx

输入两次smb密码设置成功,如图所示。

3

4. 修改配置文件

修改smb.conf文件,文件尾部添加共享文件的属性,如图所示。

sudo vi /etc/samba/smb.conf

4

5. 重启samba

设置好属性后,需要重启samba服务。

sudo service smbd restart

6. 磁盘映射

Ubuntu下查看本机IP地址:ifconfig

5

Windows下的Win+r打开运行界面输入\192.168.231.130,如图所示。

6

点击确定后,则看到了V853Tina_Open文件夹,如图所示。

7

双击文件夹,输入用户名forlinx和刚刚设置的密码,如图所示。

8

点击确定后,进入共享文件夹,如图所示,SDK内容都可以查看了。

9

右击V853Tina_Open文件夹,选择映射网络驱动器,如图所示。

10

出现映射网络驱动器界面,直接点击完成即可,如图所示。

11

虚拟机上的文件夹以虚拟磁盘的样子在电脑中可以看到了,如图所示,后面直接可以跟本地磁盘一样操作了。

12

2. LVGL开源2048小游戏实现

根据全志在线开发者william hill官网 中V853开发板移植基于LVGL的2048小游戏,来实现编译、下载、测试的过程验证。

源文件由百问网提供,开源地址:lv_lib_100ask

1. 准备V853的lvgl编译文件框架

将SDK下的platform/thirdparty/gui/lbgl-8/lv_g2d_test拷贝一份命名为lv_2048,然后将res资源文件夹删除,具体如下:

cd platform/thirdparty/gui/lvgl-8/
cp lv_g2d_test/ lv_2048 -rf
cd lv_2048/
rm res/ -rf

9-0

同样的复制一份索引文件,并编辑lv_2048文件夹下的Makefile文件,具体如下:

cd openwrt/package/thirdparty/gui/lvgl-8/

cp lv_g2d_test/ lv_2048 -rf

9-1

cd lv_2048

vi Makefile

输入/PKG_NAME,按Enter键,再点击i键,修改PKG_NAME:=lv_2048,如图所示。

9-2

具体修改的diff文件如下:

---Makefile	2022-08-20 02:49:21.874348197 -0400
+++ ../lv_g2d_test/Makefile	2022-08-19 00:00:39.779110063 -0400
[url=home.php?mod=space&uid=1999721]@@[/url] -31,7 +31,7 @@
include $(INCLUDE_DIR)/package.mk
include ../sunxifb.mk
-PKG_NAME:=lv_2048
+PKG_NAME:=lv_g2d_test
PKG_VERSION:=8.1.0
PKG_RELEASE:=1
@@ -43,7 +43,7 @@
CATEGORY:=Gui
DEPENDS:=+LVGL8_USE_SUNXIFB_G2D:libuapi +LVGL8_USE_SUNXIFB_G2D:kmod-sunxi-g2d +LVGL8_USE_FREETYPE:libfreetype
-  TITLE:=lvgl 2048
+  TITLE:=lvgl g2d test use lvgl-8.1.0
MAINTAINER:=anruliu 
endef
@@ -60,7 +60,7 @@
endef
define Package/$(PKG_NAME)/description
-  a lvgl 2048 v8.1.0
+  a lvgl monitor v8.1.0
endef
define Build/Prepare
@@ -101,9 +101,9 @@
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/bin/
-	$(INSTALL_DIR) $(1)/usr/share/lv_2048
+	$(INSTALL_DIR) $(1)/usr/share/lv_g2d_test
$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/$(PKG_NAME) $(1)/usr/bin/
-	$(CP) $(PKG_BUILD_DIR)/res/* $(1)/usr/share/lv_2048
+	$(CP) $(PKG_BUILD_DIR)/res/* $(1)/usr/share/lv_g2d_test
endef
$(eval $(call BuildPackage,$(PKG_NAME)))

完成框架搭建后,如果没有编译过SDK,需要配置一下环境。

在SDK目录下执行:source build/envsetup.sh

同样在SDK目录下执行配置:make menuconfig

选中Gui-->Littlevgl-->lv_2048,如图所示,退出保存。

9-3

2. 修改源码

修改代码,我在windows下的vscode中,那就需要在VScode中直接打开文件夹,选择映射的文件夹V853Tina_Open,如图所示。

13

打开platform//thirdparty/gui/lvgl-8/lv_2048/src/main.c,修改文件。与原拷贝文件对比差异文件如下。

--- ../../lv_g2d_test/src/main.c	2022-08-19 00:01:04.497291141 -0400

+++ main.c	2022-08-20 04:20:08.467781580 -0400

@@ -12,198 +12,15 @@

 static lv_obj_t *rect_obj;

 static lv_obj_t *canvas;

 

-static int random_in_range(int low, int high) {

-    return low + random() % (high - low + 1);

-}

-

-static void ofs_x_anim(void *img, int32_t v) {

-    lv_img_set_offset_x(img, v);

-}

-

-static void ofs_y_anim(void *img, int32_t v) {

-    lv_img_set_offset_y(img, v);

-}

-

-static void set_zoom_anim(void *img, int32_t v) {

-    lv_img_set_zoom(img, v);

-}

-

-static void my_timer(lv_timer_t *timer) {

-    if (rect_obj) {

-        lv_obj_set_pos(rect_obj,

-                random_in_range(0,

-                        lv_disp_get_hor_res(lv_disp_get_default())

-                                - lv_obj_get_width(rect_obj)),

-                random_in_range(0,

-                        lv_disp_get_ver_res(lv_disp_get_default())

-                                - lv_obj_get_height(rect_obj)));

-        lv_style_set_bg_color(&rect_style,

-                lv_color_make(random_in_range(0, 255), random_in_range(0, 255),

-                        random_in_range(0, 255)));

-        lv_obj_invalidate(rect_obj);

-    }

-

-    if (canvas) {

-        lv_obj_set_pos(canvas,

-                random_in_range(0,

-                        lv_disp_get_hor_res(lv_disp_get_default())

-                                - lv_obj_get_self_width(canvas)),

-                random_in_range(0,

-                        lv_disp_get_ver_res(lv_disp_get_default())

-                                - lv_obj_get_self_height(canvas)));

-        lv_obj_invalidate(canvas);

-    }

-}

-

-static void lv_g2d_test_gif(char *path) {

-    static lv_obj_t *gif_img;

-    gif_img = lv_gif_create(lv_scr_act());

-    lv_gif_set_src(gif_img, path);

-    lv_obj_center(gif_img);

-}

-

-static void lv_g2d_test_rect(void) {

-    lv_style_init(&rect_style);

-    lv_style_set_bg_color(&rect_style, lv_color_hex(0x000000));

-    lv_style_set_bg_opa(&rect_style, LV_OPA_50);

-    lv_style_set_border_width(&rect_style, 0);

-    lv_style_set_radius(&rect_style, 0);

-

-    rect_obj = lv_obj_create(lv_scr_act());

-    lv_obj_set_size(rect_obj, lv_disp_get_hor_res(lv_disp_get_default()) * 0.4,

-            lv_disp_get_ver_res(lv_disp_get_default()) * 0.4);

-    lv_obj_add_style(rect_obj, &rect_style, 0);

-    lv_obj_align(rect_obj, LV_ALIGN_TOP_LEFT, 0, 0);

-}

-

-static void lv_g2d_test_bmp(char *path) {

-    static lv_obj_t *bmp_img;

-    bmp_img = lv_img_create(lv_scr_act());

-    lv_img_set_src(bmp_img, path);

-    lv_obj_center(bmp_img);

-

-    if (strcmp(lv_img_get_src(bmp_img), "A:/usr/share/lv_g2d_test/no.bmp")

-            != 0) {

-        static lv_anim_t bmp_anim;

-        lv_anim_init(&bmp_anim);

-        lv_anim_set_var(&bmp_anim, bmp_img);

-        lv_anim_set_time(&bmp_anim, 3000);

-        lv_anim_set_playback_time(&bmp_anim, 500);

-        lv_anim_set_repeat_count(&bmp_anim, LV_ANIM_REPEAT_INFINITE);

-

-        lv_anim_set_exec_cb(&bmp_anim, ofs_x_anim);

-        lv_anim_set_values(&bmp_anim, 0, lv_obj_get_self_width(bmp_img));

-        lv_anim_start(&bmp_anim);

-

-        lv_anim_set_exec_cb(&bmp_anim, ofs_y_anim);

-        lv_anim_set_values(&bmp_anim, 0, lv_obj_get_self_height(bmp_img));

-        lv_anim_start(&bmp_anim);

-    }

-}

-

-static void lv_g2d_test_png(char *path) {

-    static lv_obj_t *png_img;

-    png_img = lv_img_create(lv_scr_act());

-    lv_img_set_src(png_img, path);

-    lv_obj_center(png_img);

-

-    if (strcmp(lv_img_get_src(png_img), "A:/usr/share/lv_g2d_test/no.png")

-            != 0) {

-        static lv_anim_t png_anim;

-        lv_anim_init(&png_anim);

-        lv_anim_set_var(&png_anim, png_img);

-        lv_anim_set_time(&png_anim, 3000);

-        lv_anim_set_playback_time(&png_anim, 500);

-        lv_anim_set_repeat_count(&png_anim, LV_ANIM_REPEAT_INFINITE);

-

-        lv_anim_set_exec_cb(&png_anim, set_zoom_anim);

-        lv_anim_set_values(&png_anim, 64, 1024);

-        lv_anim_start(&png_anim);

-    }

-}

-

-static void lv_g2d_test_canvas(void) {

-    static lv_color_t *cbuf;

-    cbuf = (lv_color_t*) sunxifb_alloc(LV_CANVAS_BUF_SIZE_TRUE_COLOR(200, 300),

-            "lv_g2d_test_canvas");

-

-    canvas = lv_canvas_create(lv_scr_act());

-    lv_canvas_set_buffer(canvas, cbuf, 200, 300,

-            LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED);

-    lv_obj_align(canvas, LV_ALIGN_TOP_LEFT, 0, 0);

-

-    lv_draw_img_dsc_t img_dst;

-    lv_draw_img_dsc_init(&img_dst);

-    lv_canvas_draw_img(canvas, 0, 0, "A:/usr/share/lv_g2d_test/200x300.png",

-            &img_dst);

-

-    /*sunxifb_free((void**) &cbuf, "lv_g2d_test_canvas");*/

-

-    /*Test the rotation. It requires an other buffer where the orignal image is stored.

-     *So copy the current image to buffer and rotate it to the canvas*/

-#if 0

-    static lv_color_t *cbuf_tmp;

-    cbuf_tmp = (lv_color_t*) sunxifb_alloc(

-            LV_CANVAS_BUF_SIZE_TRUE_COLOR(200, 300), "lv_g2d_test_canvas");

-    memcpy(cbuf_tmp, cbuf, LV_CANVAS_BUF_SIZE_TRUE_COLOR(200, 300));

-    lv_img_dsc_t img;

-    img.data = (void*) cbuf_tmp;

-    img.header.cf = LV_IMG_CF_TRUE_COLOR;

-    img.header.w = 200;

-    img.header.h = 300;

-

-    lv_canvas_transform(canvas, &img, 0, 512, 0, 0, 0, 0, true);

-#endif

-}

 

 int main(int argc, char *argv[]) {

     lv_disp_drv_t disp_drv;

     lv_disp_draw_buf_t disp_buf;

     lv_indev_drv_t indev_drv;

     uint32_t rotated = LV_DISP_ROT_NONE;

-    uint32_t gif_index = 5, bmp_index = 0, png_index = 1;

-    char *gif_path[] = { "A:/usr/share/lv_g2d_test/240x320.gif",

-            "A:/usr/share/lv_g2d_test/313x235.gif",

-            "A:/usr/share/lv_g2d_test/320x480.gif",

-            "A:/usr/share/lv_g2d_test/409x409.gif",

-            "A:/usr/share/lv_g2d_test/658x494.gif",

-            "A:/usr/share/lv_g2d_test/800x480.gif",

-            "A:/usr/share/lv_g2d_test/800x600.gif",

-            "A:/usr/share/lv_g2d_test/800x1280.gif",

-            "A:/usr/share/lv_g2d_test/1280x720.gif",

-            "A:/usr/share/lv_g2d_test/1280x800.gif",

-            "A:/usr/share/lv_g2d_test/1920x1080.gif",

-            "A:/usr/share/lv_g2d_test/no.gif" };

-    char *bmp_path[] = { "A:/usr/share/lv_g2d_test/512x352.bmp",

-            "A:/usr/share/lv_g2d_test/800x480.bmp",

-            "A:/usr/share/lv_g2d_test/no.bmp" };

-    char *png_path[] = { "A:/usr/share/lv_g2d_test/47x48.png",

-            "A:/usr/share/lv_g2d_test/225x111.png",

-            "A:/usr/share/lv_g2d_test/241x148.png",

-            "A:/usr/share/lv_g2d_test/no.png"};

-

-    printf("lv_g2d_test 0 5 0 1\n");

-    printf("one num is rotate, range is 0~3\n");

-    printf("tow num is gif, range is 0~11, 11 is no show gif\n");

-    printf("three num is bmp, range is 0~2, 2 is no show bmp\n");

-    printf("four num is png, range is 0~3, 3 is no show png\n");

-

+    

     lv_disp_drv_init(&disp_drv);

 

-    if (argc >= 2 && atoi(argv[1]) >= 0 && atoi(argv[1]) <= 4) {

-        rotated = atoi(argv[1]);

-#ifndef USE_SUNXIFB_G2D_ROTATE

-        if (rotated != LV_DISP_ROT_NONE)

-            disp_drv.sw_rotate = 1;

-#endif

-    }

-    if (argc >= 3 && atoi(argv[2]) >= 0 && atoi(argv[2]) <= 11)

-        gif_index = atoi(argv[2]);

-    if (argc >= 4 && atoi(argv[3]) >= 0 && atoi(argv[3]) <= 2)

-        bmp_index = atoi(argv[3]);

-    if (argc >= 5 && atoi(argv[4]) >= 0 && atoi(argv[4]) <= 3)

-        png_index = atoi(argv[4]);

-

     /*LittlevGL init*/

     lv_init();

 

@@ -216,7 +33,7 @@

 

     static lv_color_t *buf;

     buf = (lv_color_t*) sunxifb_alloc(width * height * sizeof(lv_color_t),

-            "lv_g2d_test");

+            "lv_2048");

 

     if (buf == NULL) {

         sunxifb_exit();

@@ -243,18 +60,6 @@

     /*Register the driver in LVGL and save the created input device object*/

     lv_indev_t *evdev_indev = lv_indev_drv_register(&indev_drv);

 

-    lv_g2d_test_gif(gif_path[gif_index]);

-

-    lv_g2d_test_bmp(bmp_path[bmp_index]);

-

-    lv_g2d_test_rect();

-

-    lv_g2d_test_png(png_path[png_index]);

-

-    lv_g2d_test_canvas();

-

-    lv_timer_create(my_timer, 500, NULL);

-

     /*Handle LitlevGL tasks (tickless mode)*/

     while (1) {

         lv_task_handler();

下载好开源2048小游戏代码lv_lib_100ask,将lv_lib_100ask-master文件夹放置到platform/thirdparty/gui/lvgl-8/lv_2048/src文件夹里,复制lv_lib_100ask-master目录下的lv_lib_100ask_conf_template.h到src目录下,修改名字为lv_lib_100ask_conf.h,如图所示。

14

15

修改lv_lib_100ask_conf.h,开启整个库的引用,并配置启用LV_USE_100ASK_2048。其他不需要的配置去掉,如图所示。

16

修改platform/thirdparty/gui/lvgl-8/lv_2048/src/lv_lib_100ask/lv_lib_100ask.h 中的版本号,修改为 (8,1,0)

17

修改lv_2048/src/main.c文件,对接lv_100ask_2048_simple_test,具体如下:

1. 加入头文件

#include <lv_lib_100ask/lv_lib_100ask.h>

2. Main函数调用2048游戏接口,具体在while(1)之前调用。

18

修改lv_2048/src/Makefile,修改目标BIN名称,增加编译格则,具体如图所示两处。

19

3. 对接触摸

根据前辈的文档配置,修改触摸屏绑定的event事件号,如图所示,修改为0。

20

4. 测试编译

我还没编译过SDK,需要编译一遍,具体如下:

source build/envsetup.sh

lunch

make -j16

pack

5. 测试运行

板子自带的系统我实际操作执行lv_2048触摸是没反应的,于是自己尝试重刷系统,根据全志在线开发者社区提供的文档进行刷机操作。

下载文档中提到的两个文件,PhoenixSuit和usb驱动。如果需要其他刷机方式,去到文档中自行查找。

PhoenixSuit下载地址:固件烧写工具PhoenixSuit

同时需安装全志USB驱动,下载链接:全志USB驱动

将4中编译好的镜像文件,如图所示,拷贝到Windows下,按理说网络驱动器挂载一般可以直接进行选择刷机,估计是PhoenixSuit工具不支持,没找到Z盘,于是就拷贝过来了。

21

点击立即升级,等着刷机完成就可以了,前面没显示估计USB在通信,我看没反应就按了RESET按键,也没动就刷机成功了,很快的。

重启后等一会,通过ADB调试登录到板子,直接执行lv_2048,如图所示。

22

1

注意:开始没有刷机,将编译好的lv_2048拷贝到TF卡,直接运行,触摸屏没有反应,后来尝试自己刷机再运行,发现触摸可以了。开发板发过来自带的是一个vio程序,获取一个摄像头图像实时显示到屏幕上。因刚刚接触全志科技产品,不熟悉开发流程,过程比较费劲,但可以在社区帮助下运行出来了开源的例程了。

更多回帖

发帖
×
20
完善资料,
赚取积分