【吃灰开发板复活】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.mzph.cn/news/641927.shtml

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

相关文章

[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

数据库缓存策略

数据库缓存策略 以下是数据库与缓存的五种常见策略。 1缓存旁路 缓存旁路&#xff08;Cache-Aside&#xff09; 在缓存旁路策略中&#xff0c;数据库缓存位于数据库旁边。当应用程序请求数据时&#xff0c;它会首先检查缓存 如果缓存中存在数据&#xff08;缓存命中&#xff…

c++:string相关的oj题(415. 字符串相加、125. 验证回文串、541. 反转字符串 II、557. 反转字符串中的单词 III)

文章目录 1. 415. 字符串相加题目详情代码1思路1代码2思路2 2. 125. 验证回文串题目详情代码1&#xff08;按照要求修改后放到新string里&#xff09;思路1代码2(利用双指针/索引)思路2 3. 541. 反转字符串 II题目详情代码1思路1 4. 557. 反转字符串中的单词 III题目详情代码1&…

逆矩阵举例

考虑一个 22的矩阵A 和其逆矩阵A −1的情况&#xff1a; 要求A的逆矩阵&#xff0c;首先计算A的行列式∣A∣&#xff1a; 如果 ∣A∣≠0, 则 A 可逆&#xff0c;逆矩阵 A −1的计算如下&#xff1a; 举例&#xff0c;考虑矩阵&#xff1a; 计算行列式 ∣A∣(24)−(31)8−35…

精品基于Uniapp+springboot智慧校园管理系统App课程选课成绩

《[含文档PPT源码等]精品基于Uniappspringboot智慧校园管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm …

leaflet学习笔记-带过滤的图例(九)

前言 图例不只能够帮助我们在查看地图的时候更加方便容易地分辨不同颜色代表的要素&#xff0c;本文要介绍的图例组件还可以按需求过滤掉不用显示的要素&#xff0c;使地图的更能清晰的显示我们需要显示的内容 技术核心 说到过滤要素&#xff0c;第一时间想到的就是滑块组件…

一个大的rosbag数据包怎么分割成一个小的数据包?

文章目录 1. 按时间范围分割&#xff1a;2. 按照消息类型分割&#xff1a;3. 使用split命令&#xff1a;4. 使用Python脚本&#xff1a; 在ROS&#xff08;机器人操作系统&#xff09;中&#xff0c; rosbag是一个用于记录和回放ROS主题消息的工具。如果你有一个大的 rosbag数…

[C++] external “C“的作用和使用场景(案例)

C中extern "C"的作用是什么&#xff1f; 在 C 中&#xff0c;extern "C" 的作用是告诉编译器按照 C 语言的规范来处理函数名和变量名。这是因为 C 编译器会对函数名和变量名进行名称修饰(name mangling)&#xff0c;以区分不同的函数和变量。而在 C 语言中…

搭建互联网医疗平台:构建智慧医院APP的开发指南

本文将从技术层面出发&#xff0c;为大家提供构建互联网医疗平台、打造智慧医院APP的详细开发指南。 一、确定需求与功能 在开始开发之前&#xff0c;首先需要明确智慧医院APP的需求与功能。这包括患者预约挂号、在线咨询、病历查看、医疗报告查询等功能。 二、选择合适的开发…

安科瑞ARTM系列-无线测温解决方案

产品简介 温度在线监测主要是针对高低压开关柜内母排搭接点&#xff0c;断路器触头、电缆接头等电气连接点的温度进行监测&#xff0c;防止在运行过程中因氧化、松动、灰尘等因素造成接点接触电阻过大而发热成为隐患&#xff0c;温度在线监测能够提升设备安全保障&#xff0c;及…

宝塔面板优惠券(折扣券)领取入口及使用教程

宝塔面板是一款服务器管理软件&#xff0c;支持Linux与Windows系统&#xff0c;提供了丰富的功能和插件&#xff0c;让服务器管理变得更加简单、安全、高效。为了让更多用户体验到宝塔面板的便利&#xff0c;官方会不定期推出优惠券活动。本文将为大家详细介绍宝塔面板优惠券的…

ROS:rosdep与ROS2的安装记录

鱼香ROS一键安装&#xff1a; 一键安装微信使用指南 | 鱼香ROS rosdep安装&#xff1a; rosdep 是一个在ROS&#xff08;Robot Operating System&#xff09;生态系统中非常重要的工具&#xff0c;它用于安装ROS包的依赖项。rosdep 确保了ROS包所需的系统依赖项能够被正确安装…

MNIST 数据集详析:使用残差网络RESNET识别手写数字(文末送书)

MNIST 数据集已经是一个几乎每个初学者都会接触的数据集, 很多实验、很多模型都会以MNIST 数据集作为训练对象, 不过有些人可能对它还不是很了解, 那么今天我们一起来学习一下MNIST 数据集&#xff0c;同时构建残差网络来识别手写数字。 1.MNIST 介绍 MNIST手写数字数据库具有…

spring-framework6.x版本源码构建

6.x.修改gradle仓库构建 IDEA版本及gradle构建设置 在gradle指定仓库地址/wrapper/dists/找到与gradle wrapper相对应的gradle版本&#xff0c;在gradle的init.d/目录下新建init.gradle文件&#xff0c;内容如下&#xff1a; allprojects{repositories {mavenLocal()maven { …

中仕教育:选调生和考研可以一起准备吗?

研究生入学考试&#xff0c;是本科生们提升学历继续深造的主要途径。而选调生&#xff0c;是指通过考试选拔的优秀应届毕业生&#xff0c;经过锻炼后分配到各级工作。这两者作为大部分人选择的方向&#xff0c;发展前景都是比较好的。 考研和选调生可以一起准备吗? 是可以的…

python+ctypes:ctypes调用so库

之前接到一个任务就是用python调用so库&#xff0c;也就是python调用cso库&#xff0c;也是第一次做这个&#xff0c;而且要的还很急&#xff0c;导致我也很忙碌&#xff0c;很多之前做的事请都丢下了。下面就介绍了ctypes调用so的简单例子。 ctypes 是 Python 的外部函数库。…

[MySQL]关于表的增删改查

目录 1.插入 1.1单行数据全列插入 1.2多行插入&#xff0c;指定列插入 ​编辑2.查询 2.1全列查询 2.2指定列查询 3.3查询字段为表达式 2.4别名 ​编辑2.5去重 2.6排序 2.7条件查询 2.7.1基本查询: 2.7.2 AND 和OR 2.7.3范围查询 2.7.4模糊查询 2.7.5分页查询 limit …

vue3 中组合键实现换行

vue3 中组合键实现换行 需求背景 有一个聊天室功能&#xff0c;采用输入框的形式&#xff0c;输入完毕使用Enter&#xff0c;可以直接进行发送。使用一些组合键 比如 commandEnter / shiftEnter / alt Enter … 可以实现换行操作。但现实的情况是&#xff0c;原生 Enter 天然…

【JavaEE Spring】MyBatis 操作数据库(基础操作)

MyBatis 操作数据库 本节目标前⾔JDBC 操作⽰例回顾1. 什么是MyBatis?2. MyBatis⼊⻔2.1 准备⼯作2.1.1 创建⼯程2.1.2 数据准备 2.2 配置数据库连接字符串2.3 写持久层代码2.4 单元测试 3. MyBatis的基础操作3.1 打印⽇志3.2 参数传递3.3 增(Insert)3.4 删(Delete)3.5 改(Upd…

太赞了!微信自动回复法宝,让沟通更高效!

如今&#xff0c;微信已成为人们生活和工作中不可或缺的一部分。然而&#xff0c;对于一些有多个微信账号的人说&#xff0c;常常会因为微信号太多&#xff0c;消息太多没能及时回复&#xff0c;或是客户咨询的问题很多都差不多&#xff0c;每次都要复制粘贴很是麻烦。 要想一…