
budboolLV 8
@q1215200171
平平无奇搬运工
Best posts made by q1215200171
-
【FAQ】全志XR806芯片FAQ汇总(你不知道的和你想知道的的这里都有)
01、【FAQ】全志XR806芯片 系统异常重启如何解决?
02、【FAQ】全志XR806芯片 如何更换打印log口?
03、【FAQ】全志XR806芯片 为什么开机时候串口以及部分gpio会有电平跳变?
04、【FAQ】全志XR806芯片 mac地址要如何存放以及如何获取?
05、【FAQ】全志XR806芯片 固件烧录完成后,程序不是预期烧录程序或者甚至无法启动如何解决?
06、【FAQ】全志XR806芯片 如何使用timer命令行命令?
07、【FAQ】全志XR806芯片 如何修改中断优先级?
08、【FAQ】全志XR806芯片 如何设置AP模式默认IP地址、子网掩码、网关?
09、【FAQ】全志XR806芯片 低功耗蓝牙BLE断开连接错误码和分析?
10、【FAQ】全志XR806芯片 select引发崩溃如何解决?
11、【FAQ】全志XR806芯片 如何打开 LwIP 调试信息?
12、【FAQ】全志XR806芯片 执行扫描动作时,偶尔会扫描不到目标的AP如何解决?
13、【FAQ】全志XR806芯片 如何解决编译错误undefined reference to?
14、【FAQ】全志XR806芯片 standby模式下gpio的电平状态是如何变化?
15、【FAQ】全志XR806芯片 如何清除扫描列表缓存?
16、【FAQ】全志XR806芯片 RTC时钟不能跑、有时候时间不准是什么原因?
17、【FAQ】全志XR806芯片 如何使用watchpoint功能?
18、【FAQ】全志XR806芯片getsockopt、setsockopt失败如何解决?
19、【FAQ】全志XR806芯片 串口修改波特率后与目标波特率不匹配如何解决?
20、【FAQ】全志XR806芯片 Xradio Skylark 中的无线网络回调事件含义
21、【FAQ】全志XR806芯片 如何使用phoenixMC软件把应用固件与etf固件合并在一起?
22、【FAQ】全志XR806芯片 RF参数是如何保存的?
23、【FAQ】全志XR806芯片 汇编代码调试技巧
24、【FAQ】全志XR806芯片 如何解决第三方静态库函数符号重复?
25、【FAQ】全志XR806芯片 如何创建自定义状态回调函数?
26、【FAQ】全志XR806芯片 如何获取ap的rssi值?
27、【FAQ】全志XR806芯片 XR806如何添加本地音频到flash?
28、【FAQ】全志XR806芯片 XR MCU的外设驱动为什么修改无效?
29、【FAQ】全志XR系列 XRMCU如何播放xip中的音频?
30、【FAQ】全志XR系列 XRMCU如何修改录音编码器的输入数据?
31、【FAQ】全志XR系列 如何调试wifi频偏问题?
32、【FAQ】全志XR系列 如何统计XRMCU的内存使用情况
33、【FAQ】全志XR系列 设置音频结构体HttpStreamBufferConfig成员有什么意义?
34、【FAQ】全志全系列芯片 APST平台无法下载或者更新工具
35、【FAQ】全志XR806 Freertos+XRMCU+ADC采样频率偏低
36、【FAQ】全志XR806 Freertos + XRMCU +ADC采样数值不准
37、【FAQ】全志系列芯片如何把flash擦成空片?
38、持续更新.... -
开发者成长计划正式上线!一起争做社区”高手“!
相信大家都已经发现社区有了一点小小的变化,头像下方多了个金闪闪的大V,通知栏有积分获取的通知,发帖、评论、点赞所有行为都有了实时的反馈,这其实就是全志在线社区为开发者们全新设立的开发者成长计划。
开发者成长体系是以成长值作为核心衡量指标的激励体系,成长值获取公式为:成长值= 20%活跃 + 80%贡献,成长值是根据开发者在论坛中的行为,结合活跃与贡献进行的综合评价,成长值即决定了开发者在社区的用户等级,积分与成长值一同获取,在不久的将来将会上线积分商城,获取的积分可以兑换包括开发板在内的精美礼品,只要在论坛足够活跃,有足够多的贡献,心爱的板子再也不用花998,用积分兑换也可以把他带回家。
积分细则如下:
积分、等级及积分记录查看方式如下:
-
【优秀毕设分享】基于全志D1-H和XR806的名贵植物监控装置
前言
该毕业设计是使用全志D1-H哪吒开发以及XR806开发板,再辅以外围的各种电路和传感器原件,制作而成的一个名贵植物监控装置。
该装置使用了XR806开发板构成一个网络节点,作为采集端,并且还连接了多个传感器进行环境参数的采集,并使用socket服务将采集到的数据发送到服务端。另一边使用了D1-H哪吒开发板作为服务端,D1-H哪吒开发板连接了摄像头实时采集图像,并使用基于yolov5的方法分析叶片状态,判断叶片的健康度并作为服务器,将传感器传回的数据进行分析与显示。服务器根据分析的结果,能够对XR806发出指令,在缺水的时候能够及时补水,光照不足的时候进行补光。
技术栈运用
D1-H开发板负责完成服务器收发信息、信息显示、光照控制、图像处理,涉及技术内容:
- LVGL图形框架
- Linux下Socket接口
- Linux下多线程技术
- cJSON解析器
- YOLOV5目标检测
- ......
XR806开发板负责完成环境参数采集、光照控制、水泵控制,涉及技术内容:
- LwIP协议栈
- IIC总线
- DHT11单总线
- PWM调制
- ADC采集
- ......
XR806端设计
XR806主控的系统由传感器采集部分、电源部分和控制部分组成。传感器部分负责采集环境信息,电源部分主控供电,控制部分则根据系统的信息对特定的环境参数(LED灯,水泵)进行控制。
充电电路
因为电池的电压会随着点亮的变化会有一定幅度的改变,所以需要将其稳定下来才能使用。电源部分就是使用了一个AMS1117芯片,将锂电池输出的不稳定电压稳定到3.3V,给XR806开发板及传感器供电。AMS1117是一个正向低压降的线性稳压器,压降较小。其内部集成了过热保护功能与限流电路,能有效地保护电路的正常运行,是便携式设备稳压器的理想选择。
光线、温湿度控制
补光控制主要使用了PWM调光技术。控制代码主要是控制PWM输出的占空比来调节光照的强度。在XR806中,首先初始化PWM的硬件,使用的是pwm_cycle_mode_Set(0)和pwm_capture_mode_set()函数。函数里主要配置的是相关的初始化结构体参数、PWM的频率、输出模式和占空比。初始化结束后,只要调用设置占空比的函数,即可设置占空比。结合光照传感器的控制,就可以将局部的光强控制在一定的范围内,也就是植物合适的光照。
补水部分主要配合土壤湿度传感器来进行工作。土壤湿度传感器获取到土壤湿度数据后,XR806中会进行一个判断,如果ADC采集到的电压大于一定的阈值,则启动继电器,驱动水泵进行工作,将水抽到花盆中。而显示屏上,就可以看到土壤上是处于湿润还是干燥的状态。
温湿度、光照、土壤传感器均连接在XR806上,这里取三组传感器的采集数据与标准仪器采集的数据进行比对,由两个测试点作为对照,测量出两组光照强度。对比可以看出,总体误差不大,满足了装置的要求。
D1-H与XR806通信
TCP服务器的设计主要是能够保证D1-H与XR806稳定地进行连接,并在XR806断开后还能够继续等待XR806的重新连接。这边借鉴了github上的一个开源的socket服务器代码,它使用了多线程的技术,并能够承受住较大的服务器压力,非常适合本装置的使用。
调试的基本过程如下,首先使用D1-H开发板连接上一个WiFi,然后用XR806也连接上同一个WiFi,在D1-H上启动服务器的代码,然后,启动XR806作为客户端进行连接。经过多次测试,D1-H开发板这边服务器运行非常稳定,下位机断开后会重新等待连接,在下位机重新启动后能非常迅速的进行重连。并且,在Linux下,可以使用system(wifi_info)函数来调用命令行,只需要将命令作为一个字符数组保持,就可以在程序中使用命令行操作,非常方便。本装置中连接WiFi的部分就是用这个方法,调用命令行来连接WiFi的。
D1-H服务端设计
D1-H主控的服务端软件设计根据项目所需要的功能分为三大部分。第一部分是图形界面的设计,采用的是LVGL,主要用于显示温度、湿度等数据;第二部分是TCP服务器的设计(已于上一部分介绍),用于上下位机之间的数据传输与通信;第三部分是图像处理部分,使用了YOLOV5+NCNN。
数据显示界面
图形界面使用的是LVGL。LVGL的作者是来自匈牙利的Gabor Kiss-Vamosikisvegabor,LVGL用C语言编写,具有很强的兼容性(并且与C++兼容),模拟器可在没有嵌入式硬件的PC上启动嵌入式GUI设计,同时LVGL作为一个图形库,它自带着接近三十多种小工具可以供开发者使用。这些强大的构建块按钮搭配上带有非常丝滑的动画以及可以做到平滑滚动的高级图形,同时兼具着不高的配置要求以及开源属性,成为广大开发者在选择GUI时的第一选择。
根据系统的需求,图形界面需要能够显示下位机传上来的数据,而LVGL中可以使用文本控件进行数据的显示。显示图片可以使用一个图像控件配合PNG解码器进行显示。首先,需要创建两个基本控件对象,一个用于停靠采集处理后图像的图像控件,一个是停靠数据显示子控件的控件。在图像控件上,停靠了一个图像,即采集处理后的图像;在数据显示区上,放置了一系列的控件来展示环境参数信息;上边还有用于控制光照强度和水泵的开关。
图像处理
图像处理部分主要是YOLOV5的使用。使用之前,首先要训练针对特定场景的模型。首先需要创建自己的数据集,数据集分为两个部分,图像文件和标签文件。图像文件就是包含了待检测目标部分的图片和不带待检测目标的图像,分别作为正负样本进行训练。标签文件包含了检测目标的信息,标签文件的形式如下表4.2所示。一行数据代表了图像中的一个目标,若文件中含有多行数据,则表明图像中有多个目标。标签文件需要自己对需要检测的目标做标注。
有一个比较特别的是,YOLOV5的标签格式是txt后缀的,不是我们常见的xml格式后缀的,需要自己编写代码进行转换。准备好了图像和标签后,还需要保证每个标签与图像的名称一致。准备就绪后,就可以调用train.py文件进行训练。在训练的时候,需要指定一些参数,如下图所示
启动训练后,电脑会自动开始训练。训练完成后,我们可以看到目标训练结果保存的位置,有一个pt格式的文件。然后可以用detect.py文件来做一个测试,将加载的权重文件换成刚刚训练结束生成的权重文件。detect程序会使用这个文件进行检测,最后会输出一张结果图。从结果图中就可以看出目标检测的结果。
毕设开题PPT、答辩PPT、论文全文及相关源码将在全志在线开发者社区开源
毕设开题PPT、答辩PPT、论文全文及相关源码将在全志在线开发者社区开源
毕设开题PPT、答辩PPT、论文全文及相关源码将在全志在线开发者社区开源
毕设开题PPT、答辩PPT、论文全文及相关源码将在全志在线开发者社区开源
毕设开题PPT、答辩PPT、论文全文及相关源码将在全志在线开发者社区开源 -
一条命令搞定全志XR806编译环境
本文转自极术社区:https://aijishu.com/a/1060000000311849、
XR806是全志科技旗下子公司广州芯之联研发设计的一款支持Wi-Fi和BLE的高集成度无线MCU芯片,基于安谋科技STAR-MC1架构,支持鸿蒙L0系统。
全志科技同时也发布了一款XR806的开发板,具体长这样:
之前有很多刚接触它的朋友,被编译环境难住了。
最近正好有空,干脆把相关代码和编译工具都做了配置和集成,做了个容器给大家。
系统是Ubuntu 20.04,OpenHarmony代码版本是1.0.1_release。
项目地址:
https://hub.docker.com/r/verdureorange/ubuntu_xr806/具体用法:
装完Docker以后,docker run -it verdureorange/ubuntu_xr806:v1 /bin/bash如果你是Windows或Mac,可以下载Docker桌面版:
https://www.docker.com/products/docker-desktop/主要代码在/root/xr806_openharmony/,大家可以直接在里面编译或调试。
如果有不清楚的地方可以看以下视频,感谢前面很多开发者所做的工作。
-
玄铁杯RISC-V大赛『三等奖』智能帘窗
智能帘窗采用D1-H哪吒开发板为主控,D1-H哪吒与下位机各模块/传感器进行数据通信并进行数据的处理,并在最后依据处理后的数据来对风扇、电机、OLED屏幕等上位机硬件进行控制。
系统硬件架构PART01 方案及硬件
产品实物图模拟平常卧室,其可能存在的场景有:突然下雨、户外湿度过大关窗以及户外天气较好开窗通风等场景。以上相关场景需要获取许多数据从进行准确的判定,其中包括室内外温湿度,当前时间,室外是否下雨,窗户状态,窗帘状态以及户外光照强度等,下图为系统方案。
系统方案图本项目采用器材如下:
- DHT11*2
- 舵机*1
- 普通步进电机*1
- 雨滴传感器模块*1
- PCF8591模块*1
- 光纤传感器模块*1
- OLED12864*1
- 按键*4
- 风扇*1
PART02 功能描述
首先系统上电后会显获取室内温湿度、可燃气体浓度、室外光照强度、温湿度以及是否下雨,自动关窗标识位,风扇标识位等信息(依靠”/project/”目录下的一些文件实现,例如“curtain”、“auto_window_flag”文件等),接着将读取本地存储的舵机以及步进电机的位置信息,四个按键(触控按键)分别对应窗户以及窗帘的开和关程度的控制,最后将室内外温湿度以及室外光照强度以及风扇开关状态和可燃气体浓浓度过高警告展示在OLED屏幕上。若室内可燃气体浓度超过阈值将默认打开风扇,并且此时是无法关闭的(手机APP操作),除非可燃气体浓度降低至阈值方可手动关闭风扇。
OLED屏幕状态显示除此之外本项目还将使用本地WIFI/有线网络通过MQTT协议连接腾讯云物联网服务,用户可以查看本地状态信息并依据光照强度、室内外温湿度、下雨自动关窗户,云端/本地控制窗帘或窗户,此操作于手机APP(腾讯云提供)服务上完成。
APP控制PART03 参赛团队
南通大学“孤勇队” 队员:The_Qiang
-
【XR806开发板试用】系列之二 - I2C外设使用及控制OLED屏显示
前言
XR806硬件上支持SPI,I2C等其他外设接口,且DDR和FLASH,满足常见应用场景的开发,适合开发者进行方案评估、DIY或小规模产品研发使用。本篇文章,将使用到I2C接口,去控制OLED屏幕的显示。OLED屏幕规格: 0.96英寸 主控SSD1306 I2C接口 地址 0x3C XR806外设:I2C1
创建工程
参考device/xradio/xr806/ohosdemo目录下的wlan_demo,拷贝wlan_demo为xr806_oled,并同步修改ohosdemo和xr806_oled目录下的BUILD.gn。
主要修改如下:
1、device/xradio/xr806/ohosdemo/BUILD.gn
group("ohosdemo") { deps = [ #"hello_demo:app_hello", #"iot_peripheral:app_peripheral", #"wlan_demo:app_WlanTest", "xr806_oled:app_oled", #增加app_oled目标编译 ] }
2、device/xradio/xr806/ohosdemo/xr806_oled/BUILD.gn
static_library("app_oled") { configs = [] sources = [ "main.c", ] cflags = board_cflags include_dirs = board_include_dirs include_dirs += [ ".", "thirdparty/ssd1306/ssd1306", "//utils/native/lite/include", "//foundation/communication/wifi_lite/interfaces/wifiservice", ] deps = [ "thirdparty/ssd1306/ssd1306:oled_ssd1306", ] }
注意:
- static_library代表生成静态库(.a)文件,其中包含main.c的静态库必须是app_打头,如app_hello,否则虽然可以编译成功,但无法生效;
- ~~xr806_oled/BUILD.gn中静态库app_oled的命名,需要和ohosdemo/BUILD.gn中的一致;
- thirdparty/ssd1306/ssd1306:oled_ssd1306 为依赖的开源库
工程编译
创建工程后,如果非首次编译,执行以下命令便可以编译:hb build
编译如果遇到以下错误:
[OHOS ERROR] /* [OHOS ERROR] * [OHOS ERROR] * Automatically generated file; DO NOT EDIT. [OHOS ERROR] * XR806 SDK Configuration [OHOS ERROR] * [OHOS ERROR] */ [OHOS ERROR] /* [OHOS ERROR] * [OHOS ERROR] * Automatically generated file; DO NOT EDIT. [OHOS ERROR] * XR806 SDK Configuration [OHOS ERROR] * [OHOS ERROR] */ [OHOS ERROR] { [OHOS ERROR] "magic" : "AWIH", [OHOS ERROR] "version" : "0.5", [OHOS ERROR] "image" : {"max_size": "1532K"}, [OHOS ERROR] "section" :[ [OHOS ERROR] {"id": "0xa5ff5a00", "bin" :"boot_40M.bin", "cert": "null", "flash_offs": "0K", "sram_offs": "0x00230000", "ep": "0x00230101", "attr":"0x1"}, [OHOS ERROR] {"id": "0xa5fe5a01", "bin" :"app.bin", "cert": "null", "flash_offs": "32K", "sram_offs": "0x00201000", "ep": "0x00201101", "attr":"0x1"}, [OHOS ERROR] {"id": "0xa5fd5a02", "bin" :"app_xip.bin", "cert": "null", "flash_offs": "99K", "sram_offs": "0xffffffff", "ep": "0xffffffff", "attr":"0x2"}, [OHOS ERROR] {"id": "0xa5fa5a05", "bin" :"wlan_bl.bin", "cert": "null", "flash_offs": "1170K", "sram_offs": "0xffffffff", "ep": "0xffffffff", "attr":"0x1"}, [OHOS ERROR] {"id": "0xa5f95a06", "bin" :"wlan_fw.bin", "cert": "null", "flash_offs": "1173K", "sram_offs": "0xffffffff", "ep": "0xffffffff", "attr":"0x1"}, [OHOS ERROR] {"id": "0xa5f85a07", "bin" :"sys_sdd_40M.bin", "cert": "null", "flash_offs": "1198K", "sram_offs": "0xffffffff", "ep": "0xffffffff", "attr":"0x1"}, [OHOS ERROR] {} [OHOS ERROR] ] [OHOS ERROR] } [OHOS ERROR] [OHOS ERROR] make[2]: *** [../../../../project/project.mk:520:image] 错误 255 [OHOS ERROR] make[2]: 离开目录“/home/algo/openharmony/xr806/device/xradio/xr806/xr_skylark/project/demo/audio_demo/gcc” [OHOS ERROR] make[1]: *** [../../../../project/project.mk:493:__build] 错误 2 [OHOS ERROR] make[1]: 离开目录“/home/algo/openharmony/xr806/device/xradio/xr806/xr_skylark/project/demo/audio_demo/gcc” [OHOS ERROR] make: *** [Makefile:164:build] 错误 2 [OHOS ERROR] you can check build log in /home/algo/openharmony/xr806/out/xr806/wifi_skylark/build.log [OHOS ERROR] /home/algo/.local/bin/ninja -w dupbuild=warn -C /home/algo/openharmony/xr806/out/xr806/wifi_skylark failed, return code is 1
执行以下命令后,再次编译即可:
cp device/xradio/xr806/xr_skylark/project/demo/audio_demo/image/xr806/image_auto_cal.cfg device/xradio/xr806/xr_skylark/project/demo/audio_demo/image/xr806/image.cfg
编译后生成的镜像,便可以烧录验证。
注:以上基础工程是基于wlan_demo,oled屏幕显示需要使用I2C外设和移植oled库
库移植
其实XR806本身自带了OLED主控为SSD1306的驱动(采用的是SPI接口方式),移植基于I2C接口的库也相对简单,可以参考开源库harmonyos-ssd1306,将其中的I2C相关头文件和API替换为XR806 OpenHarmony中的相关头文件和API,编译通过即可。其中涉及到BUID.gn的修改如下:
static_library("oled_ssd1306") { sources = [ "ssd1306.c", "ssd1306_fonts.c", ] include_dirs = [ ".", "//kernel/liteos_m/kernel/arch/include", "//utils/native/lite/include", "//base/iot_hardware/peripheral/interfaces/kits", ] }
开源库主要修改如下:
#include "iot_i2c.h" #include "iot_errno.h" /** * @brief Defines I2C data transmission attributes. */ typedef struct { /** Pointer to the buffer storing data to send */ unsigned char *sendBuf; /** Length of data to send */ unsigned int sendLen; /** Pointer to the buffer for storing data to receive */ unsigned char *receiveBuf; /** Length of data received */ unsigned int receiveLen; } IotI2cData; static uint32_t ssd1306_SendData(uint8_t* data, size_t size) { uint32_t id = SSD1306_I2C_IDX; IotI2cData i2cData = {0}; i2cData.sendBuf = data; i2cData.sendLen = size; return IoTI2cWrite(id, SSD1306_I2C_ADDR, i2cData.sendBuf, i2cData.sendLen); }
ssd1306.h头文件定义SSD1306_I2C_IDX为1
显示程序
程序部分参考了上面提到的OLED库,完整的测试程序,可以参考harmonyos-ssd1306里的example./* * Copyright (c) 2021-2031, AlgoIdeas * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2020-12-13 AlgoIdeas the first version */ #include <stdio.h> #include "ohos_init.h" #include "kernel/os/os.h" #include "ssd1306.h" #define OLED_I2C_BAUDRATE 100000 static OS_Thread_t g_main_thread; static void DrawChinese(void) { const uint32_t W = 12, H = 12, S = 16; uint8_t fonts[][24] = { { /*-- ID:0,字符:"您",ASCII编码:C4FA,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/ 0x14,0x00,0x24,0x00,0x2F,0xF0,0x71,0x20,0xA5,0x40,0x29,0x20,0x33,0x10,0x20,0x00, 0x54,0x40,0x52,0xA0,0x90,0x90,0x0F,0x80, },{ /*-- ID:1,字符:"好",ASCII编码:BAC3,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/ 0x20,0x00,0x27,0xE0,0x20,0x40,0xF8,0x80,0x48,0x80,0x48,0xA0,0x57,0xF0,0x50,0x80, 0x30,0x80,0x28,0x80,0x4A,0x80,0x81,0x00, },{ /*-- ID:2,字符:"鸿",ASCII编码:BAE8,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/ 0x00,0x40,0x80,0x80,0x5D,0xE0,0x09,0x20,0xC9,0xA0,0x09,0x60,0x29,0x00,0xCD,0xF0, 0x58,0x10,0x43,0xD0,0x40,0x10,0x40,0x60, },{ /*-- ID:3,字符:"蒙",ASCII编码:C3C9,对应字:宽x高=12x12,画布:宽W=16 高H=12,共24字节*/ 0x09,0x00,0x7F,0xE0,0x09,0x00,0x7F,0xF0,0x80,0x10,0x7F,0xE0,0x0C,0x40,0x32,0x80, 0xC7,0x00,0x0A,0x80,0x32,0x70,0xC6,0x20 } }; ssd1306_Fill(Black); for (size_t i = 0; i < sizeof(fonts)/sizeof(fonts[0]); i++) { ssd1306_DrawRegion(i * H + 32, 26, W, H, fonts[i], sizeof(fonts[0]), S); } ssd1306_UpdateScreen(); sleep(1); } static void MainThread(void *arg) { IoTI2cInit(SSD1306_I2C_IDX, OLED_I2C_BAUDRATE); usleep(20*1000); printf("ssd1306_Init.\n"); ssd1306_Init(); ssd1306_Fill(Black); ssd1306_SetCursor(22, 27); ssd1306_DrawString("Hello XR806!", Font_7x10, White); uint32_t start = HAL_GetTick(); ssd1306_UpdateScreen(); uint32_t end = HAL_GetTick(); printf("ssd1306_UpdateScreen, time cost: %d ms.\n", end - start); usleep(2000*1000); while (1) { DrawChinese(); } } void OledMain(void) { if (OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL, OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) { printf("[ERR] Create MainThread Failed\n"); } } SYS_RUN(OledMain);
运行效果
最终OLED显示:您好鸿蒙
参考资料
【XR806开发板试用】系列之一 - Linux环境下Ubuntu完全开发流程
https://xr806.docs.aw-ol.com/
https://aijishu.com/a/1060000000256653本贴转自极术社区:https://aijishu.com/a/1060000000284333
作者:H2O2_H2O2 -
基于全志D1-H芯片的首台64位RISC-V便携式计算机上市
近日,基于D1-H生态开发板的第一款RISC-V便携式计算机也已经宣布上市。
技术开放社区Clockwork公司于近日宣布要推出一个由 RISC-V CPU驱动的DevTerm。这款设备被命名为 DevTerm R-01,售价为 239 美元,其配置主要如下:
- ClockworkPi v3.14 主板
- R-01 核心模块 ,RISC-V 64位单核 RV64IMAFDCVU @ 1.0GHz,1GB DDR3
- Ext.模块
- 6.86英寸 IPS 显示屏
- Clockwork 65%比例的键盘
- 电池模块
- 双扬声器
- 58毫米200dpi 热敏打印机组件
- shell 和 bracket 系统
- 带有 clockworkOS 的32GB 高速 TF 存储卡
这款RISC-V便携式计算机一经推出便受到了RISC-V International CEO Calista Redmond 女士的青睐,“RISC-V生态快速发展,并可为开发者提供低成本且便捷易用的64 bit的RV终端。”
RISC-V作为免费且灵活的开放指令集架构,在单片机和FPGA方面,已经取得了良好的开端。在商业落地方面,也开始应用在物联网安全、工业控制等领域。
2021年4月,全志推出D1-H芯片,其是全球首颗量产的搭载平头哥玄铁906 RISC-V的应用处理器,为万物互联AIoT时代提供了新的智能关键芯片。
D1-H搭载了阿里平头哥64位C906核心,支持RVV,1GHz+主频,可支持Linux、RTOS等系统。同时支持最高4K的H.265/H.264解码,内置一颗HiFi4 DSP,最高可外接2GB DDR3,可以应用于智慧城市、智能汽车、智能商显、智能家电、智能办公和科研教育等多个领域。
2021年5月,全志携手平头哥发布基于玄铁C906处理器的全球首款支持64bit RISC-V指令集的D1-H哪吒开发板,为推动RISC-V生态在国内的发展贡献了厚重的力量。
微信公众号推文:基于全志D1-H芯片的首台64位RISC-V便携式计算机上市
-
【直播预告】全志XR806芯片应用实战分享
活动简介
XR806是全志科技研发设计的一款支持WiFi和BLE的IoT芯片,它采用了安谋科技自主研发的星辰“STAR-MC1”处理器,具有集成度高、硬件设计简单、BOM成本低、安全可靠等优点。可广泛满足智能家居、智慧楼宇、工业互联、儿童玩具、电子竞赛、极客DIY 等领域的无线连接需求。为了方便开发者自由开发和定制化,全志在线释放了包括完整系统源码、硬件原理图、bomlist、硬件位号图在内的全部软硬件资料。
gittee仓库地址:https://gitee.com/awol/open-harmony_-xr806_manifest
硬件资料下载地址:https://www.aw-ol.com/downloads?cat=12
技术问题讨论地址:https://bbs.aw-ol.com
活动报名及直播地址:https://aijishu.com/l/1110000000301384/join
XR806优秀开发例程
-
技术流直播即将开始!“晕哥”带你玩转“玄铁杯”参赛开发板全志哪吒D1-H开发板
- 讲座时间:2022-05-27 14:00 - 15:00
- 报名方式:扫描海报二维码进入钉钉报名直播讲座
- 主讲嘉宾:贺兴哇 -酷网主理人-全志在线开发者社区高级顾问
- 讲座亮点:D1-H哪吒开发板相关介绍
主讲嘉宾 贺兴
哇酷网主理人
全志在线开发者社区高级顾问东莞市哇酷科技有限公司创始人贺兴,人称晕哥,拥有个人管理的开发者社区——Whycan Forum(哇酷开发者社区),主要讨论全志Soc,因此同时也被全志在线开发者社区聘为高级顾问,晕哥十分热爱开源项目的分享,已就全志D1-H/D1s等芯片开源了不少优质项目,吸引了一大批开发者慕名而来。
赛事详情
2022“玄铁杯”RISC-V应用创新大赛正式启动,本次大赛分设“碳中和”、工业控制及机器人、视觉及可穿戴设备、智慧家居4条赛道,免费开放“云上实验室”助理参赛者探索开发不同领域的创新应用,感受RISC-V“算力自由”
本次“玄铁杯”第二届RISC-V应用创新大赛即将于5月31日结束创意方案提交的阶段,目前已有1000+开发者基于全志D1-H哪吒和Sipeed Lichee D1-H DocK Pro两款开发板提交了300+份创意方案,方案从Linux和RTOS两种类型的操作系统出发,衍生出工业机器人、视觉及可穿戴设备、社区养老以及车载设备等时下最火热的赛道方案,赛事火爆程度可见一斑,开发者们赶快抓紧最后几天的上车机会,扫描参赛二维码,提交自己的创意方案。
Latest posts made by q1215200171
-
【开源方案】全志V85x硬件设计大赛作品精选第二期,快来Pick你心目中的最佳方案
01. V851s-显示终端
该参赛作品计划将V851S芯片设计成核心板和底板结构,驱动LCD显示,接收CAN和RS485通信的数据显示在LCD显示屏上。
02.V851s-多媒体开发板
该参赛作品基于全志V851s芯片设计了一个极简版本的双目摄像头开发板,可外接屏幕和以太网。
在开发板设计技巧方面,为了简化电路图采用的内部LDO输出的1.8V;为了方面模块化的特点,采用核心外设独立设计;为了便于开发与调试,采用了LCD;针对V851s自身的特点,采用MIPI高速摄像头进行设计。
03.V853-多功能串口服务器
该参赛作品基于全志V853芯片设计了一个单片机管理设备,通过以太网控制V853设备再对多台单片机进行管理,并设计了配套的上位机软件;原理图主要在官方参考设计上进行修改,通过RS232和TTL控制下位机。
04.V853-音频播放器开发板
该参赛作品基于全志V853芯片设计了一个小音频管理系统,类似于一个个人小声卡,主要用于家里音乐试听,并针对多通道功放进行音效调音,满足室内的音响效果调优,增加diy 调音乐趣。
开发板将实现codec音频驱动以实现基础硬件功能。硬件调试完成后,进行驱动验证、音频链路验证,主要涉及boot 文件系统驱动等调试,alsa 驱动移植等工作。在此基础上实现调音架构,实现delay gain biquad 等模块的功能实现,并整理出调音接口。
开源硬件设计大赛
本次大赛由华秋电子联合全志在线共同举办,感谢合一智联对比赛的赞助。
资料获取
以上参赛方案详细设计资料均可前往电子发烧友论坛-全志科技小组获取:https://bbs.elecfans.com/zhuti_1576_1.html
-
【FAQ】全志V853芯片 tina+v853+audio+dvr如何实现多路mic采集和回声消除?
1.主题
tina+v853+audio+dvr多路mic采集和回声消除方案
2.问题背景
产品:
硬件:主控 + audio +tp9930
软件:tina + audio/ai
其他:客户需要调试6路mic,其中2路为v853内部audio codec mic,四路为tp9930 外部i2s mic,且其中一路audio mic与lineout硬件相连,作为aec回声消除。3.复现步骤
1.搭建客户硬件环境。
2.配置tp9930音频输出,并用示波器查看bclk dout lrck波形。4.问题分析
需要配置好底层音频i2s1,ai中间件声卡插件,并在app层拆分各个声道数据。
5.解决办法
需求分解:
1.根据原理图配置i2s1板级配置;
&daudio1_plat { tdm-num = <1>; tx-pin = <0>; rx-pin = <0>; pinctrl-used; pinctrl-names= “default”,“sleep”; pinctrl-0 = <&daudio1_pins_a>; pinctrl-1 = <&daudio1_pins_b>; tx-hub-en; rx-sync-en; status = “okay”; //打开i2s1声卡 }; &daudio1_mach { soundcard-mach,format = “i2s”; //根据tp9930的输出格式选择dsp模式或者i2s模式 soundcard-mach,frame-master = <&daudio1_codec>; soundcard-mach,bitclock-master = <&daudio1_codec>; /* soundcard-mach,frame-inversion; / / soundcard-mach,bitclock-inversion; / soundcard-mach,slot-num = <16>; //tp9930默认配置16声道slot soundcard-mach,slot-width = <16>; //声道位深16bit status = “okay”; daudio1_cpu: soundcard-mach,cpu { sound-dai = <&daudio1_plat>; //作为从机配置配置为daudio1_plat,主机配置为daudio1_cpu soundcard-mach,pll-fs = <1>; / pll freq = 24.576M or 22.5792M * pll-fs / soundcard-mach,mclk-fs = <0>; / mclk freq = pcm rate * mclk-fs */ //不需要mclk时钟 }; daudio1_codec: soundcard-mach,codec { //mclk时钟源,做从机无需配置。 }; };
2.tp9930驱动配置i2s输出, 16bit 16slot,由于是v853做从机所以无需新增codec驱动,直接在sensor驱动配置。
static struct regval_list reg_audio_init[] = { {0x40, 0x40}, // clear first {0x00, 0x00}, {0x01, 0x00}, {0x02, 0x00}, {0x03, 0x00}, {0x00, 0x01}, {0x01, 0x02}, {0x08, 0x03}, {0x09, 0x04}, {0x17, 0x00 | (DATA_BIT << 2)}, // 16bit {0x1B, 0x01 | (DATA_BIT << 6)}, {0x18, 0x80 | (SAMPLE_RATE)}, {0x19, 0x0F}, {0x1A, 0x15}, {0x37, 0x20}, {0x38, 0x38}, {0x3E, 0x00}, {0x3d, 0x01}, // audio reset {0x40, 0x00}, }; static void tp9930_audio_dataSet(struct v4l2_subdev *sd) { sensor_write_array(sd, reg_audio_init, ARRAY_SIZE(reg_audio_init)); }
3.使用alsa原生工具测试,
arecord -Dplug:Capture1Mic:8000 /tmp/1.wav -f S16_LE -c 16 -r 8000 -d 10 可以录到tp9930四路pcm数据
使用sdk demo 发现无声音,经排查v853公版配置i2s1模式作为aec回录,自动打开回录功能,amixer cset numid=3 0 -c 1 修改控件后可以录到声音。
因此需要关闭sdk config aec开关
4.声卡复合插件的配置
在target/allwinner/v853-perf1/busybox-init-base-files/etc/asound.conf中配置复合插件如下复合声卡插件
pcm.Capture1MicPlusAec { type route slave.pcm { type multi slaves { a {pcm Capture2MicHard channels 2} //主控两路声卡 b {pcm CaptureI2SRX channels 4} //tp9930 4路 } bindings { 0 {slave a channel 0} 1 {slave a channel 1} 2 {slave b channel 0} 3 {slave b channel 1} 4 {slave b channel 2} 5 {slave b channel 3} } } ttable.0.0 1 ttable.1.1 1 ttable.2.2 1 ttable.3.3 1 ttable.4.4 1 ttable.5.5 1 } tp9930四路mic pcm.CaptureI2SRX { type hooks slave.pcm "hw:snddaudio1,0" hooks.0 { type ctl_elems hook_args [ { name "loopback debug" preserve true optional true value 0 } ] } } //主控两路mic pcm.Capture2MicHard { type hooks slave.pcm "hw:0,0" hooks.0 { type ctl_elems hook_args [ { name "MIC1 Switch" preserve true optional true value 1 } { name "MIC2 Switch" preserve true optional true value 1 } ] } } sampe ai conf修改如下 [parameter] pcm_file_path = "/tmp/sample_ai_pcm.wav" pcm_sample_rate = 8000 pcm_channel_cnt = 6 pcm_bit_width = 16 pcm_frame_size = 1024 pcm_cap_duration = 10 pcm_ai_gain = 100
测试后可以录到6路音频
5.aec应用层接口
首先需要拆分audio codec mic0 的数据,位深16bit,交错模式下,一个声道两个字节,参考aec demo mic1作为近端数据,mic1为远端录音
WebRtcAec_BufferFarend(aecmInst, far_frame, NN);//对参考声音(回声)的处理 WebRtcAec_Process(aecmInst, near_frame, NULL, out_frame, NULL, NN,40,0);//回声消除
最后可以录到out frame 回声消除后的pcm数据。
6.aenc编码
将拆分后的声道数据frame送到aenc chn编码输出为aac格式码流,可参考aenc_sample.c
-
【FAQ】全志系列芯片 如何在Tina Linux中使用脚本完成定制化升级?
1.主题
在Tina Linux中,如何使用脚本完成定制化升级
2.问题背景
硬件:全平台
软件:Tina
其他:支持OTA升级的平台,可实现脚本定制化升级3.具体表现
在OTA升级过程中,添加定制化需求,实现控制变量升级。
4.问题分析
利用swupdate升级满足定制化脚本需求
5.解决办法
因为swupdate支持脚本,所以在升级过程中,添加能够实现定制升级的脚本即可,将带有定制升级的脚本编入策略描述文件(sw-descrition)OTA升级配置文件中(sw-subimgs),在打包ota升级包时,将脚本一起打包进ota包中。在进行下面的配置后,输入升级命令时,首先开始执行脚本中的内容,满足升级条件后,再进行升级流程。下面进行详细的步骤介绍:
1.swupdate支持shellscript脚本,需要以下功能配置(默认选中)
执行:make menuconfig/make ota_menuconfig Allwinner ---> <*> swupdate............................. software update for embedded system Swupdate Settings ---> General Configuration ---> [*] enable pre and postinstall scripts Image Handlers ---> [*] shellscript
2.在swupdate文件夹下创建脚本,名字随意,在脚本中写入要实现的功能。例如:目前有一个方案需要升级,但是分为A,B两种产品,对应做了不同的功能,为了防止升级混淆,可以利用脚本去控制变量升级,比如A产品方案中的env,可以添加一个变量project=a,B产品方案中的env添加一个变量project=b,那么脚本中的内容就可以判断project=a或b时,继续完成升级。env中添加内容和脚本内容举例如下:
env中:
脚本内容如下:
3.在描述文件中添加脚本功能,在sw-description中添加以下代码:
4.将脚本打包进ota包中,脚本名字可以任意起,我这里是preinstall_checkAB.sh。
5.重新编译主系统和recovery系统,烧录固件,打包ota包,再进行验证。
6.验证:当校验失败时,返回值为1,会看到如下打印,不能升级。
校验成功时,返回值为0,看到如下打印,升级成功。
-
【FAQ】全志R128芯片 如何在FreeRTOS下对代码源文件进行快速预处理?
1.主题
FreeRTOS_R128_如何对代码源文件进行快速预处理
2.问题背景
硬件:R128
软件:FreeRTOS客户在日常的开发过程中,会碰到源文件中有许多的宏或许多条件编译的代码,有时候需要快速确认多个宏展开后的内容或快速确认条件编译到底编译的是哪一部分代码。
那么如何在现有SDK环境下对代码源文件进行快速的预处理?
3.问题分析
预处理思路:
目前R128的SDK使用了修改后的kbuild构建框架(原始kbuild构建框架来自linux kernel),kbuild构建框架在编译每个源文件时会同时生成一个.xxx.o.cmd文件,
这个文件里包含了编译此源文件时依赖的一些头文件以及编译时使用的编译命令,通过修改编译命令将编译时的-c参数修改为-E参数即可完成对源文件的预处理。
4.解决办法
可以手动从.xxx.o.cmd文件中拿到编译命令并修改,但这适用于要预处理的文件比较少的情况,且各个源文件的编译命令的修改过程基本相同,
因此可以使用shell脚本自动预处理来代替人工手动预处理。
这里提供一个generate_preprocess_file.sh脚本(脚本文件见附件),脚本使用方法为:./generate_preprocess_file.sh <source file path>
脚本输出的日志中最后2行会有生成的预处理文件的路径。
注意:脚本中调用了astyle工具将生成的预处理文件进行代码格式化,请在使用前安装astyle工具,否则脚本输出日志的最后一行将会报错。下面具体描述下对各个核心的代码源文件进行自动预处理的步骤。
M33核和C906核代码源文件自动预处理步骤
- 拷贝generate_preprocess_file.sh脚本到lichee/rtos目录,并执行命令chmod +x ./generate_preprocess_file.sh确保脚本文件有可执行权限
- 执行lunch_rtos选择对应方案的M33核或者C906核
- 执行./generate_preprocess_file.sh xxx.c命令对某个源文件进行预处理
DSP核代码源文件自动预处理步骤
- 拷贝generate_preprocess_file.sh脚本到lichee/dsp目录,并执行命令chmod +x ./generate_preprocess_file.sh确保脚本文件有可执行权限
- 执行./generate_preprocess_file.sh xxx.c命令对某个源文件进行预处理
脚本使用示例
下面是对M33核代码源文件arch/arm/armv8m/sun20iw2p1/sun20i.c进行预处理的结果
可以看到最终生成的预处理文件有如下2个:
build/r128s2_pro_m33/arch/arm/armv8m/sun20iw2p1/sun20i.i build/r128s2_pro_m33/arch/arm/armv8m/sun20iw2p1/sun20i.i.orig
其中xxx.i.orig表示最原始的由编译器生成的预处理文件,xxx.i表示进行代码格式化后的预处理文件。
用vi打开对应的预处理文件后可以看到代码中的宏以及条件编译已全部展开:
-
【FAQ】全志R128芯片 如何在FreeRTOS中调整系统运行在hspsram上?
1.主题
FreeRTOS_R128_调整系统运行在hspsram上
2.问题背景
硬件:R128
软件:FreeRTOS背景:R128的m33和c906两个核运行的系统都是默认运行在lspsram上的(低速psram,默认频率为192MHz),hspsram默认是分给dsp核使用的。如果方案不使用dsp,那么hspsram就可以留给m33或者是c906进行使用了。这里将讲述如何将hspsram的地址空间分配给m33或者c906使用。(hspsram的默认工作频率为800MHz)
3.解决办法
一、讲述如何取消启动dsp
首先,选择好m33的方案,因为dsp是由m33来启动的。这里以r128 pro方案来作为演示。
source envsetup.sh lunch_rtos r128s2_pro_m33
然后运行mrtos_menuconfig来取消选中启动dsp。
找到该项,然后取消选中,编译r128_pro_m33方案即可。
二、将m33和c906设置成在hspsram运行
首先选择m33的方案
source envsetup.sh lunch_rtos r128s2_pro_m33
接着运行mrtos_menuconfig修改启动地址,所需要修改的配置如下图所示:
lspsram地址空间为0x8000000~0x87fffff,hspsram地址空间为0xc000000~0xc7fffff。
这里将所需要的修改的核的地址,将8改成c即可。如修改m33的起始地址,将0x08004000,修改成0x0c004000即可,如下图。
修改完成后,重新编译m33方案。
三、如果需要修改c906的起始地址为hspsram,还需要重新配置c906方案
首先选择c906的方案
source envsetup.sh lunch_rtos r128s2_pro_c906
接着运行mrtos_menuconfig修改c906启动地址,修改方式如下图:
然后保存配置,重新编译c906方案。
四、最后修改配置文件
首先,确认自己方案使用的image_header文件,运行一次打包的命令pack,从打包的log中能看出方案所选的文件,如下图:
然后通过命令
cconfigs
即可跳转到image_header的路径下:${root_dir}/board/r128s2/pro/configs
如果需要修改m33的地址,则只修改m33的即可,c906同理。如果取消启动dsp,则直接注销掉dsp的配置代码。
最后,修改m33和c906在hspsram运行,并且取消运行dsp的image_header文件修改可如下所示:
diff --git a/r128s2/pro/configs/image_header_xip.cfg b/r128s2/pro/configs/image_header_xip.cfg index 5c83ac1..fc87d06 100755 --- a/r128s2/pro/configs/image_header_xip.cfg +++ b/r128s2/pro/configs/image_header_xip.cfg @@ -30,9 +30,9 @@ {"id": "0xa5e05a00", "bin": "boot0_spinor.fex", "attr": "0x01", "sram_offs": "0x40b0000", "ep": "0x40b0080"}, {"id": "0xa5e05a00", "bin": "boot0_sdcard.fex", "attr": "0x01", "sram_offs": "0x40b0000", "ep": "0x40b0080"}, {"id": "0xa5e15a01", "bin": "freertos-gz.fex", "attr": "0x01"}, - {"id": "0xa5e05a01", "bin": "rtos_arm.fex", "attr": "0x01", "sram_offs": "0x8004000", "ep": "0x8004000"}, - {"id": "0xa5e05a01", "bin": "rtos_riscv.fex", "attr": "0x01", "sram_offs": "0x8200000", "ep": "0x8200000"}, - {"id": "0xa5e05a01", "bin": "rtos_dsp.fex", "attr": "0x01", "sram_offs": "0xc000000", "ep": "0xc000660"}, + {"id": "0xa5e05a01", "bin": "rtos_arm.fex", "attr": "0x01", "sram_offs": "0xc004000", "ep": "0xc004000"}, + {"id": "0xa5e05a01", "bin": "rtos_riscv.fex", "attr": "0x01", "sram_offs": "0xc200000", "ep": "0xc200000"}, + // {"id": "0xa5e05a01", "bin": "rtos_dsp.fex", "attr": "0x01", "sram_offs": "0xc000000", "ep": "0xc000660"}, {"id": "0xa5e05a01", "bin": "etf.fex", "attr": "0x01", "sram_offs": "0x4000000", "ep": "0x4000000"}, {"id": "0xa5e05a01", "bin": "rtos_xip_rv.fex", "attr": "0x02"}, {}
-
全志V85x硬件设计大赛作品精选第一期,快来Pick你心目中的最佳方案
1、V853-智能交互摄像头开发板
该参赛作品基于全志V853开发板制作的一款类似眼镜外挂的小产品,可以对场景进行辅助识别,并通过云端交互实现物联网控制,进一步实现物联网与人机交互的融合。
开发板配置了摄像头和小屏幕接口,并外挂DDR3和EMMC,充分发挥了主控的编解码能力和边缘计算能力(NPU),是一个很有创意的边缘计算设计。
2、V853-DouPi方案设计
该参赛作品基于全志V853芯片设计了SCB 单板,使用了V853的音视频接口和丰富的外设接口,并外接AXP电源管理芯片。
在SCB单板上包含了一路千兆网口、一路UART、一路MIPI CSI、一路MIPI DSI、一路USB OTG、板载WiFi/蓝牙以及15个GPIO管脚输出。
3、V853-服务器管理及协处理卡
该参赛作品基于全志V853芯片设计了一个服务器的管理设备,实现服务器管理及协处理卡功能,对服务器进行管理和检测,实时反馈信息,通过物联网接入网络,可以远程在线管理。
开发板集成了1路百兆管理网口,1路UART调试功能,1路VGA显示功能,1路音频输出,1路USB功能,主板电压检测功能,1路视频检测功能,WIFI功能。
4、V853-全功能BTB学习开发板
该参赛作品基于全志V853芯片设计了一块开发板,分为核心板和底板两个部分,引用了V853所支持的大部分功能引脚,是名副其实的“全功能”开发板。
核心板采用BTB设计,并板载了eMMC、DDR、AXP电源芯片,最大支持 1G DDR3 32GB eMMC存储;核心板背面采用了3x60pin排针设计,支持自贴NAND FLASH。
底板上引出了绝大部分资源,具体包括两个百兆网口、RGB888及MIPI DSI显示接口、USB OTG、MIPI CSI摄像头、MIC、TF卡接口等其它接口。
目前开发板功能还在验证中,验证没有问题后,会公开底板配套的原理图、尺寸图、使用文档,配套的视频以及嵌入式AI开发等所有资源。
5、V853-全功能BTB学习开发板
该参赛作品基于全志V853芯片设计了一款开发板,引出console调试串口和端子外接4G+GPS模块,并集成SD CARD,千兆以太网,百兆以太网,WiFi,音频输入输出,MIPI CSI ,MIPI DSI ,按键,LED,G-SENSOR,USB及USB HUB,引出console调试串口,ADC引脚引出,2.54端子引出一路串口,两路PWM及GPIO。
开源硬件设计大赛
本次大赛由华秋电子联合全志在线共同举办,感谢合一智联对比赛的赞助。
资料获取
以上参赛方案详细设计资料均可前往电子发烧友论坛-全志科技小组获取:https://bbs.elecfans.com/zhuti_1576_1.html
-
【FAQ】全志R128芯片 在FreeRTOS下如何查看并更改各CPU核的默认运行频率?
1.主题
FreeRTOS_R128_如何查看并更改各CPU核的默认运行频率
2.问题背景
硬件:R128
软件:FreeRTOS客户在日常开发过程中,需要评估各CPU核的默认运行频率,有时候需要降低默认运行频率来降低功耗,有时候又需要提升默认运行频率来增加算力。
那么如何从查看并更改R128上各CPU核的默认运行频率?3.解决办法
查看各CPU核默认运行频率
默认启动各个CPU核时会打印对应CPU核的运行频率,如下图所示:
更改各CPU核默认运行频率方法
由于R128中各CPU核的默认运行频率是M33核上的代码配置的,因此只需修改M33核的代码即可。
具体步骤为:- 首先通过执行crtos命令切换到rtos代码目录,rtos代码目录路径为:lichee/rtos
- 然后修改文件arch/arm/armv8m/sun20iw2p1/sun20i.c里设置相关时钟频率的地方
M33核
M33核相关时钟硬件如下图:
目前SDK中M33核时钟ar200a_hclk的来源为:DPLL1输出时钟经过第一个分频器输出ck1_m33时钟,然后通过第二个分频器输出sysclk钟,最后通过一个多路选择器输出ar200a_hclk。
DPLL1输出时钟的频率已经确定为1920M,因此要修改M33核的时钟,则只需要修改这2个分频器的分频值即可。
由于SDK中默认将第一个分频器的分频值定为5(此分频器的分频值取值范围为4-8),也即ck1_m33时钟频率为1920/5=384M,而第二个分频器的分频值取值范围为1-16,因此如果要修改的M33核时钟频率在24M到384M之间且可以被384M整除,则只需要修改第2个分频器的分频值,例如将M33核默认运行频率修改为128M,则只需修改宏AR200A_FREQ即可,如下所示:
diff --git a/arch/arm/armv8m/sun20iw2p1/sun20i.c b/arch/arm/armv8m/sun20iw2p1/sun20i.c index 9b8c1cb1..c09444fc 100755 --- a/arch/arm/armv8m/sun20iw2p1/sun20i.c +++ b/arch/arm/armv8m/sun20iw2p1/sun20i.c @@ -445,7 +445,7 @@ static void rcosc_init(void) #define DPLL1_FREQ (1920000000) #define DPLL2_FREQ (1920000000) #define DPLL3_FREQ (1600000000) -#define AR200A_FREQ ( 192000000) +#define AR200A_FREQ ( 128000000) #define DEVICE_FREQ ( 192000000) static int sys_clk_init(void) {
若要修改的M33核时钟频率不满足上述条件,则需要同时修改函数ar200a_clk_set里设置ck1_m33时钟频率的地方,例如修改ck1_m33时钟为240M(1920/8=240M):
diff --git a/arch/arm/armv8m/sun20iw2p1/sun20i.c b/arch/arm/armv8m/sun20iw2p1/sun20i.c index 9b8c1cb1..29b71137 100755 --- a/arch/arm/armv8m/sun20iw2p1/sun20i.c +++ b/arch/arm/armv8m/sun20iw2p1/sun20i.c @@ -190,7 +190,7 @@ static int ar200a_clk_set(u32 freq) /*fixed 384M*/ //sr32(CCMU_AON_BASE+0xa4, 0, 3, 0x3); //0x4004c4a4: 0x8080000b - ret = hal_clk_set_rate(clk_ck1_m33, 384000000); + ret = hal_clk_set_rate(clk_ck1_m33, 240000000); if (HAL_CLK_STATUS_OK != ret) { ret = -1; goto err2;
C906核
C906核相关时钟硬件如下图:
目前SDK中C906核时钟rv_sys_clk的来源为:DPLL1输出时钟经过第一个分频器输出ck1_906时钟,然后通过第二个分频器输出rv_sys_clk时钟。
DPLL1输出时钟的频率已经确定为1920M,因此要修改C906核的时钟,则只需要修改这2个分频器的分频值即可,第一个分频器的分频值可取2、2.5、3、4、7,第二个分频器的分频值可取1、2、4、8。
例如将C906核默认运行频率修改为320M,需要修改sun20i_boot_c906函数中2处设置频率的地方,:
diff --git a/arch/arm/armv8m/sun20iw2p1/sun20i.c b/arch/arm/armv8m/sun20iw2p1/sun20i.c index 9b8c1cb1..5798657b 100755 --- a/arch/arm/armv8m/sun20iw2p1/sun20i.c +++ b/arch/arm/armv8m/sun20iw2p1/sun20i.c @@ -596,7 +596,7 @@ int sun20i_boot_c906(void) //set clk_ck1_c906 clk to 480M //sr32(CCMU_AON_BASE+0xa4, 4, 3, 0x1); - ret = hal_clk_set_rate(clk_ck1_c906, 480000000); + ret = hal_clk_set_rate(clk_ck1_c906, 640000000); if (HAL_CLK_STATUS_OK != ret) { ret = -1; goto err2; @@ -632,7 +632,7 @@ int sun20i_boot_c906(void) //set clk_ck_c906_div to 480000000; //sr32(CCMU_BASE+0x064, 0, 2, 0x0); clk_c906_div = hal_clock_get(HAL_SUNXI_CCU, CLK_RISCV_DIV); - ret = hal_clk_set_rate(clk_c906_div, 480000000); + ret = hal_clk_set_rate(clk_c906_div, 320000000); if (HAL_CLK_STATUS_OK != ret) { ret = -1; goto err6;
PS:由于第一个分频器无法输出320M时钟,故先配置第一个分频器输出640M的ck1_c906时钟,然后由第二个分频器再进行2分频,从而得到320M的C906核时钟。
DSP核
DSP核相关时钟硬件如下图:
目前SDK中DSP核时钟dsp_sys_clk的来源为:DPLL3输出时钟经过第一个分频器输出ck3_hifi5时钟,然后通过第二个分频器输出dsp_sys_clk时钟。
DPLL3输出时钟的频率已经确定为1600M,因此要修改DSP核的时钟,则只需要修改这2个分频器的分频值即可,第一个分频器的分频值可取3、4、5、6、7,第二个分频器的分频值可取1、2、4、8。
例如将DSP核默认运行频率修改为320M,只需修改宏DSP_CORE_CLOCK_FREQ即可,:
diff --git a/arch/arm/armv8m/sun20iw2p1/sun20i.c b/arch/arm/armv8m/sun20iw2p1/sun20i.c index 9b8c1cb1..97d03ad7 100755 --- a/arch/arm/armv8m/sun20iw2p1/sun20i.c +++ b/arch/arm/armv8m/sun20iw2p1/sun20i.c @@ -703,7 +703,7 @@ err1: #if defined(CONFIG_ARCH_ARMV8M_DEFAULT_BOOT_DSP) || defined(CONFIG_COMMAND_BOOT_DSP) \ || defined(CONFIG_PM_SUBSYS_DSP_SUPPORT) -#define DSP_CORE_CLOCK_FREQ (400000000) +#define DSP_CORE_CLOCK_FREQ (320000000) #define DSP_LDO_WORK_VOLT (1200) //400M@1.2V, 274M@1.1V int __sun20i_boot_dsp_with_start_addr(uint32_t dsp_start_addr) {
另外目前SDK代码中第一个分频器和第二个分频都配置成了相同的频率,若第一个分频器无法直接输出想要设置的频率,则需要分别将2个分频器配置成不同的输出频率。例如将DSP核默认运行频率修改为200M,第一个分频器最低输出时钟频率为1600/7=228.57M,无法直接输出200M,因此需要先配置第一个分频器输出400M的ck3_hifi5时钟,然后由第二个分频器进行2分频从而得到200M的dsp_sys_clk时钟,主要修改如下所示:
diff --git a/arch/arm/armv8m/sun20iw2p1/sun20i.c b/arch/arm/armv8m/sun20iw2p1/sun20i.c index 9b8c1cb1..53f6828a 100755 --- a/arch/arm/armv8m/sun20iw2p1/sun20i.c +++ b/arch/arm/armv8m/sun20iw2p1/sun20i.c @@ -703,7 +703,7 @@ err1: #if defined(CONFIG_ARCH_ARMV8M_DEFAULT_BOOT_DSP) || defined(CONFIG_COMMAND_BOOT_DSP) \ || defined(CONFIG_PM_SUBSYS_DSP_SUPPORT) -#define DSP_CORE_CLOCK_FREQ (400000000) +#define DSP_CORE_CLOCK_FREQ (200000000) #define DSP_LDO_WORK_VOLT (1200) //400M@1.2V, 274M@1.1V int __sun20i_boot_dsp_with_start_addr(uint32_t dsp_start_addr) { @@ -752,7 +752,7 @@ int __sun20i_boot_dsp_with_start_addr(uint32_t dsp_start_addr) //set clk_ck3_hifi5 clk to 400M //sr32(CCMU_AON_BASE+0xa8, 8, 3, 0x3); - ret = hal_clk_set_rate(clk_ck3_hifi5, DSP_CORE_CLOCK_FREQ); + ret = hal_clk_set_rate(clk_ck3_hifi5, 400000000); if (HAL_CLK_STATUS_OK != ret) { ret = -1; goto err2;
修改完成后重新编译M33核固件,因为R128中各CPU核的默认运行频率是M33核上的代码配置的。
可先执行lunch_rtos选择对应方案的M33核,然后再执行mrtos编译以及执行pack命令打包固件。下图是修改M33核频率为128M、C906核频率为320M、DSP核频率为320M后的效果:
-
【FAQ】全志V85x芯片 如何使用tiger lcd时lti锐化功能时程序abort?
1.主题
使用tiger lcd时lti锐化功能时程序abort
2.问题背景
产品:T113
软件:tina5.0
其他:使用tiger lcd调试lti参数3.问题描述
3.1复现步骤
- m kerne_menuconfig选中按照如下方式选中pq驱动
Device Drivers ---> Graphics support ---> Frame buffer Devices ---> Video support for sunxi ---> [*] Support PQ driver
- m menuconfig按照如下方式勾选下位机软件
Allwinner ---> Display ---> <*> pqd.................................................................. pqd
- 编译烧录后进入控制台,输入usbdevice命令打开切换usb role后,再输入pqd运行上位机软件。
- 电脑端打开tiger lcd,点击open后切换到lti调试界面,调节参数后点write写入
3.2具体表现
下位机程序abort退出,结果如图所示。
4.问题分析
- unsorted double linked list corrupted表明malloc时链表的被破坏,找不到下一个节点,该问题可能是越界写内存导致。
- 可以选择使用libasan进行调试,需要在Makefile中加入如下选项,
并且在menuconfig按照如下方式配置
Base system ---> [*] Use external toolchain ---> -*- libc........................................................... C library Configuration ---> (./lib/ld{-*.so,-linux*.so.*} ./lib/lib{anl,c,gomp,cidn,crypt,dl,m,nsl,nss_dns,nss_files,resolv,util,ssp,asan}{-*.so,.so.*}) libc shared library files (use wildcards)
-
重新编译并将未strip过的可执行文件用adb推至/usr/bin下,重新复现问题,得到如下信息。
-
可以看出问题在platform/allwinner/display/pqd/hardwares/de20x/de20x.c文件中的de20x_set_lti里。实际上这里malloc的数组是用来存储lti 11个寄存器的值
再通过ioctl写入物理寄存器,但是malloc的长度PEAK_REG_NUM只有6,因此这里会发生写越界。同时如下代码处也要改过来
5.根本原因
寄存器数量配置错误,导致写内存越界,破坏了链表结构LTI_REG_NUM
6.解决办法
修改platform/allwinner/display/pqd/hardwares/de20x/de20x.c中de20x_set_lti和de20x_get_lti函数malloc的大小为LTI_REG_NUM,具体方式可参考如下补丁。
diff --git a/hardwares/de20x/de20x.c b/hardwares/de20x/de20x.c index c8a1084..7aa66be 100644 --- a/hardwares/de20x/de20x.c +++ b/hardwares/de20x/de20x.c @@ -328,7 +328,7 @@ int de20x_set_lti(const char* data, int size) int ret; UNUSED(size); struct lti_sharp *lti = (struct lti_sharp *)data; - struct register_data* rdata = malloc(sizeof(struct register_data) * PEAK_REG_NUM); + struct register_data* rdata = malloc(sizeof(struct register_data) * LTI_REG_NUM); get_lti_register_offset(rdata); ret = de20x_get_registers(rdata, LTI_REG_NUM); if (ret) { @@ -371,7 +371,7 @@ int de20x_get_lti(char* data, int size) int ret; UNUSED(size); struct lti_sharp *lti = (struct lti_sharp *)data; - struct register_data* rdata = malloc(sizeof(struct register_data) * PEAK_REG_NUM); + struct register_data* rdata = malloc(sizeof(struct register_data) * LTI_REG_NUM); get_lti_register_offset(rdata); ret = de20x_get_registers(rdata, LTI_REG_NUM); if (ret) {
-
【FAQ】全志V85x芯片 OTA升级失败出现"Found installer for stream recovery ubivol"以及"cannot write 16384 bytes: Operation not permitted"报错如何解决?
1.主题
OTA升级失败出现"Found installer for stream recovery ubivol"以及"cannot write 16384 bytes: Operation not permitted"报错
2.问题背景
软件:Tina
3.问题描述
3.1复现步骤
- 在服务器生成OTA升级包。
- 将OTA升级包推入小机端,执行升级命令。
- 升级失败。
3.2具体表现
OTA升级失败,通过命令 cat /mnt/UDISK/swupdate.log查看升级失败log,出现 “cannot write 16384 bytes: Operation not permitted” 或 “Found installer for stream recovery ubivol” 错误。
4.问题分析
通过两条报错可以猜测,不允许操作,不能写入,以及报ubivol等问题。
可以在设备端确认当前介质,执行ll dev/by-name确认(例:当前为emmc介质,为mmc*,如果为nand ubi介质为ubi* 或 nand*)
5.根本原因
升级包的中文件的介质与当前板子的介质不对应,不能操作分区。
6.解决办法
- 对于非ubi方案,无需选中 CONFIG_SWUPDATE_CONFIG_UBIVOL选项,在打包OTA包时,命令无需使用ubi后缀。
- 对于ubi方案,需要选中MTD:SWUPDATE_CONFIG_MTD选项,再选中 CONFIG_SWUPDATE_CONFIG_UBIVOL 选项,在打包OTA包时,使用ubi后缀,例如:swupdate_pack_swu -ubi 或 swupdate_pack_swu -ab-ubi。
- 以上操作在recovery升级中,在menuconfig和ota_menuconfig中都要执行,而AB升级,在menuconfig中执行即可。
-
【FAQ】全志V85x芯片 如何放开快启方案的打印?
1.主题
如何放开快启方案的打印
2.问题背景
产品:v851系列快启方案
软件:tina
其他:特有版本信息添加自由描述 (如固件版本,复现概率,特定环境)
为什么在boot0增加打印启动过程无法看到?3.复现步骤
在brandy/brandy-2.0/spl/的代码流程中可以发现很多使用printf方式的打印未被打印出来
4.问题分析
快起方案为了缩短启动时间,将printf函数的打印关闭,使用printf函数无法在启动时打印,可使用以下三种方式的任意一种都可以放开打印。
- 编写代码时将printf替换为pr_emerg。
- 打包时,修改sys_config.fex文件中的debug_mode,置为1。
- 启动时,在键盘中输入D,只有一瞬间的捕获键盘输入的时间,可能需要重复几次才可成功。