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

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

《梦回2004!我用全志V3s做了个成本100元,功能媲美MP4的随身终端》:梦回2004!我用全志V3s做了个成本100元,功能媲美MP4的随身终端 | 全志在线开发者论坛

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

微信图片_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>; // PE9reset-gpios = <&pio 4 8 0>; // PE8rotation = <0>;};
};

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


panel_backlight: panel-backlight {compatible = "gpio-backlight";gpios = <&pio 4 7 GPIO_ACTIVE_HIGH>; // PE7default-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字符串中的LOCATIONxxx,并根据天气API的要求进行必要的参数配置和授权等操作。

音频播放

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

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

微信图片_20240108133147.png

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


[root@buildroot ~]# mpv 2.flac --no-videoVideo --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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/424498.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

i18n多国语言Internationalization的动态实现

一、数据动态的更新 在上一篇i18n多国语言Internationalization的实现-CSDN博客&#xff0c;可能会遇到一个问题&#xff0c;我们在进行英文或中文切换时&#xff0c;并没有办法对当前的数据进行动态的更新。指的是什么意思呢&#xff1f;当前app.js当中一个组件内容&#xff…

AI对比:ChatGPT和文心一言的区别和差异

目录 一、ChatGPT和文心一言大模型的对比分析 1.1 二者训练的数据情况分析 1.2 训练大模型数据规模和参数对比 1.3 二者3.5版本大模型对比总结 二、ChatGPT和文心一言功能对比分析 2.1 二者产品提供的功能情况分析 2.2 测试一下各种功能的特性 2.2.1 文本创作能力 2.2…

webssh 通过web使用终端命令

简介&#xff1a;通过web就能使用终端命令 一、安装环境 # 安装webssh pip3 install webssh # 找到程序 find ~/anaconda3/envs/py37 -name webssh # 进入找到的目录 cd ~/anaconda3/envs/py37/lib/python3.7/site-packages/webssh/ # 开启服务 python main.py

架构篇08:架构设计三原则

文章目录 合适原则简单原则演化原则小结 成为架构师是每个程序员的梦想&#xff0c;但并不意味着把编程做好就能够自然而然地成为一个架构师&#xff0c;优秀程序员和架构师之间还有一个明显的鸿沟需要跨越&#xff0c;这个鸿沟就是“不确定性”。 对于编程来说&#xff0c;本…

FluoroQuest PLUS-抗淬灭封片剂,可以保护和增强荧光信号

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;FluoroQues tPLUS Antifade Mounting Medium&#xff0c;FluoroQues tPLUS-Antifade Mounting Medium&#xff0c;FluoroQuest PLUS 抗淬灭封片剂&#xff0c;FluoroQuest PLUS-抗淬灭封片剂 一、基本信息 产品简介…

架构篇10:架构设计流程-识别复杂度

文章目录 架构设计第 1 步&#xff1a;识别复杂度识别复杂度实战识别复杂度心得小结 从今天开始&#xff0c;我们分4期&#xff0c;结合复杂度来源和架构设计原则&#xff0c;通过一个模拟的设计场景“前浪微博”&#xff0c;一起看看在实践中究竟如何进行架构设计。今天先来看…

精益生产咨询背后的秘密:企业如何实现价值最大化

精益生产&#xff0c;起源于丰田生产系统&#xff0c;是一种集中于削减浪费、优化流程、提升顾客价值的生产方法。它的核心在于确保每一步生产过程都能为顾客创造价值。以下是实现精益生产咨询的详细步骤&#xff1a; 1.确定客户价值 一切从顾客需求出发。企业需深入理解顾客…

宝塔FTP文件传输服务结合cpolar内网穿透实现远程连接本地服务

⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 文章目录 ⛳️ 推荐1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固…

复合机器人颠覆传统上下料,实现高效精准生产

在追求高效、精准生产的现代制造业中&#xff0c;传统的上下料方式已经无法满足企业的需求。复合机器人的出现&#xff0c;为制造业带来了革命性的变革。它不仅提高了生产效率&#xff0c;降低了生产成本&#xff0c;还为企业创造了更大的竞争优势。复合机器人的广泛应用&#…

web系统服务器监控检查

一、检查操作系统是否存在增减文件&#xff0c;是否有shell被上传 要检查操作系统是否存在增减文件或是否有shell被上传&#xff0c;您可以按照以下步骤进行操作&#xff1a; 文件完整性检查&#xff1a; 使用文件系统的完整性检查工具&#xff0c;例如fsck&#xff08;对于ext…

js 粘贴功能

需求 项目中需要使用粘贴功能&#xff0c;将已复制的内容粘贴到输入框中。&#xff08;vue项目使用elementUI&#xff0c;该粘贴功能是浏览器自带功能&#xff0c;属于通用功能&#xff09; 效果 代码 html <template><div class"box"><el-input …

Python如何叠加两张图片

我这里有如下两张图片&#xff0c;需要把他们叠加在一起&#xff0c;进行查看。这两张图片的大小都是300 300。不拼接在一起就不方便查看。需要把左边的小图&#xff0c;放到右边大图的中间。 一、拼接两个图片的代码 要解决这个问题&#xff0c;你可以使用fromarray()方法将…