导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    【吃灰开发板复活】DIY全志V3s随身终端屏幕适配,LVGL以及各种外设驱动移植教程

    爱搞机专区
    1
    1
    1337
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • q1215200171
      budbool LV 9 最后由 q1215200171 编辑

      在上周的文章中介绍了一款因作者想要学习Linux而动手DIY的终端设备V3S-PI,

      《梦回2004!我用全志V3s做了个成本100元,功能媲美MP4的随身终端》:https://bbs.aw-ol.com/topic/4940/

      并详细解析了项目的硬件设计部分,本文将着重介绍项目的软件适配部分,并挑选其中几个普适性较强的外设功能来进行介绍。

      微信图片_20240108132611.jpg
      微信图片_20240108132629.jpg

      V3S-PI是基于全志V3s设计的开发板,V3s芯片包含专用视频引擎以提供高级多媒体应用程序和服务,开发板设计之初就预留了屏幕、音频等接口,作者本人给这块开发板增加适配的外设以及功能有将近10个:获取天气、连耳机播放音乐、10M/100M以太网接口、连wifi、接入SD卡、调整屏幕亮度、按键控制、外接其他设备、1转4USB HUB......

      而在适配了屏幕,移植了LVGL以及各种外设驱动后,开发板摇身一变成为功能可以媲美MP4的随身终端。

      640.gif

      640 (1).gif

      640 (2).gif

      640 (3).gif

      2.4寸LCD彩屏适配

      LCD彩屏使用SPI接口与主控连接,由于各家屏幕初始化代码不同,所以st7735r.c文件在原来的基础上,我们只需修改st7735r_pipe_enable这个函数中的代码即可。

      • 软件部分采用TinyDRM,与传统的fbtft相比,不再是固定帧率刷新。
      • 采用DRM架构,可以与新架构程序更快集成。

      修改完成的代码参考下方文件,设备树配置参考:

      
      &spi0 {
             status = "okay";
             pinctrl-names = "default";
             pinctrl-0 = <&spi0_pins>;
      
      
             display@0 {
              compatible = "jianda,jd-t18003-t01";
              reg = <0>;
                 spi-max-frequency = <95000000>;
      
      
              backlight = <&panel_backlight>;
              dc-gpios = <&pio 4 9 0>; // PE9
              reset-gpios = <&pio 4 8 0>; // PE8
              rotation = <0>;
          };
      };
      

      除spi外,需要添加一个背光节点,这样就可以在用户层操作背光:

      
      panel_backlight: panel-backlight {
                    compatible = "gpio-backlight";
              gpios = <&pio 4 7 GPIO_ACTIVE_HIGH>; // PE7
                    default-on;
                    status = "okay";
             };
      

      顺利适配好屏幕后移植上LVGL,可以在刷FB的图层刷出来700帧的高刷。
      640.gif 640 (4).gif

      libcurl获取天气信息方式

      为了丰富功能,作者还通过libcurl库实现了获取天气信息的功能,通过回调函数处理获取到的JSON数据,并使用lvgl库显示天气信息。

      这里需要用到一个回调函数,用于解析获取到的JSON格式的天气信息。它首先使用cJSON库对获取到的数据进行解析,并找到对应的天气信息字段。

      // 解析json数据
          cJSON * json = cJSON_ParseWithLength(ptr, size * nmemb);
          if(!json) {
              goto end;
          }
          json = cJSON_GetObjectItem(json, "now");
          if(!json) {
              goto end;
          }
          cJSON * temp     = cJSON_GetObjectItem(json, "temp");
          cJSON * humidity = cJSON_GetObjectItem(json, "humidity");
          cJSON * text     = cJSON_GetObjectItem(json, "text");
          cJSON * pressure = cJSON_GetObjectItem(json, "pressure");
      

      然后使用其它函数进行线程锁定,以防止多线程冲突,接着利用LVGL库的相关函数将天气信息设置到对应的标签上。

      pthread_mutex_lock(&mutex);
          if(cJSON_IsString(text)) {
              lv_label_set_text_fmt(label1, "当前天气\n%s", text->valuestring);
          }
          if(cJSON_IsString(pressure)) {
              lv_label_set_text_fmt(label2, "气压\n%s hPa", pressure->valuestring);
          }
          if(cJSON_IsString(temp)) {
              lv_label_set_text_fmt(label3, "室外温度\n%s ℃", temp->valuestring);
          }
          if(cJSON_IsString(humidity)) {
              lv_label_set_text_fmt(label4, "湿度\n%s %%", humidity->valuestring);
          }
          pthread_mutex_unlock(&mutex);
      
          cJSON_Delete(json);
      
      end:
          return size * nmemb;
      

      微信图片_20240108132625.jpg

      get_now_weather函数首先定义一个URL字符串,其中包含了获取天气信息所需的地址和参数。然后通过curl_easy_init创建一个CURL对象,并配置相应的选项,如设置URL、禁止进度信息、忽略SSL证书校验、设置回调函数等。接着使用curl_easy_perform执行请求,并检查返回的结果。最后使用curl_easy_cleanup清理CURL对象。

      char * url =
              "https://devapi.qweather.com/v7/weather/now?location=" LOCATION "&key=xxx";
          CURL * curl = curl_easy_init();
      
          curl_easy_setopt(curl, CURLOPT_URL, url);
          curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
          //    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
          curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
          curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, now_weather_cb);
          curl_easy_setopt(curl, CURLOPT_ENCODING, "gzip");
      

      需要根据实际情况修改URL字符串中的LOCATION和xxx,并根据天气API的要求进行必要的参数配置和授权等操作。

      音频播放

      Buildroot中集成了alsa,默认声卡会静音状态,打开终端,输入alsamixer,首先解除静音。

      在当前界面,选中Headphone,然后按下M键 解除静音,然后使用键盘↑,调整音量到合适大小即可,界面可参考:

      微信图片_20240108133147.png

      调整完成后,输入mpv 文件名 --no-video,插入耳机,即可实现音乐播放:

      
      [root@buildroot ~]# mpv 2.flac --no-video
           Video --vid=1 [P] (mjpeg 500x500 1.000fps)
       (+) Audio --aid=1 (flac 2ch 48000Hz)
      File tags:
       Album: 西厢寻他
       Title: 西厢寻他
       Track: 1
      AO: [alsa] 48000Hz stereo 2ch s32
      A: 00:00:04 / 00:03:43 (2%)
      
      
      Exiting... (Quit)
      

      命令提示符显示当前目录,编辑/etc/profile文件,添加一行,然后export /etc/profile重新加载配置即可:

      export PS1='[\u@\h \w]\$ '
      

      640 (1).gif

      开源资料获取

      在目前网上资料的基础上,作者自行移植了主线内核Uboot以及root。目前仅支持SD卡以及SPI Nor启动。本文所有内容均转载自原作者本人的B站视频账号及开源文章。

      作者B站主页链接:https://space.bilibili.com/66212170

      本项目所有资料均已开源,软硬件都开源了,其中软件开源了:UBoot、Kernel、Buildroot:测试镜像下载地址等……想获取资料自己DIY学习的伙伴,请点击下方图片跳转阅读或戳文末的“阅读原文”获取。

      640 (5).gif

      1 条回复 最后回复 回复 引用 分享 0
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策