- 2022-06-24
-
发表了主题帖:
【创龙TL570x-EVM】使用新版Prossessor SDK 并创建工作环境
本帖最后由 北方 于 2022-6-24 11:17 编辑
1、新版的sdk提供的是启动uboot,linux kenal,rootfs的全套工具,而且提供了官方包括beaglebone的sd影像文件wic,但是如何采用新的系统,看来和04版本的变化很多,根据移植介绍,启动也不再从sd卡,而是完全从板载内存了,所以,尝试的过程比较久。其实,只要设备树配置好了,这个工作其实并不复杂,同时,rootfs的实现是使用了ti的agora项目,或者直接用ycoto也可以。
2、首先,重新制作启动盘,这次的mkroot的命令的结果完全不同了,只生成了2个挂载点,boot和rootfs
3. 然后启动setup.sh命令,首先需要安装以下组件xinetd tftpd nfs-kernel-server minicom build-essential libncurses5-dev autoconf automake dos2unix screen lrzsz lzop flex libssl-dev u-boot-tools,执行
sudo apt install xinetd tftpd nfs-kernel-server minicom build-essential libncurses5-dev autoconf automake dos2unix screen lrzsz lzop flex libssl-dev u-boot-tools
然后启动setup.sh
在完成基本安装后,就可以自动进入配置安装的过程,需要选择串口,网口,读取串口的编号等工作。
搜索串口编号,
2、这个过程在板卡的识别过程中没有继续进行下去,对于新版的sdk还是需要更加熟悉才能进一步调试,如果继续进行,就需要把现在提供的板卡设备树,编译到新的uboot,和linux内核,然后下载arogo工程,逐步定制rootfs和文件系统,并进行裁减,避免过大的系统,把最后生成的rootfs,加载到启动文件中,就可以利用setup.sh完成完整的文件和开发环境配置,最新的开发环境有两种模式,一个是完全下载到sd卡上,原生开发,另一个是用网线连接,构建tftp服务器,远程构建交叉编译环境,进行开发。这个过程是一个比较需要投入时间的工作。
-
发表了主题帖:
【创龙TL570x-EVM】安装Prossessor SDK 并创建开发环境
本帖最后由 北方 于 2022-6-24 10:35 编辑
1、为了安装这个SDK,只好备份之后重新降级ubuntu到18版本,这样果然可以安装SDK,没有再提示版本过高,
安装一路顺利,
然后设定$PATH新路径
然后 source /ect/profile,就可以实现这个功能,可以开始创建系统了。
2 制作SD启动卡
首先解压并安装mkboot工具
显示目录结构
插入SD 卡后用fdisk -l 命令确定磁盘号
开始启动制作启动卡
其实,很快就完成了,没有10分钟那么久,应该是在原生ubuntu环境下的原因,在虚拟机中就是比较慢。
这样在ubuntu18下亲测成功,随时可以拥有自定义的启动盘。
- 2022-06-22
-
发表了主题帖:
【创龙TL570x-EVM】自定义制作SD卡及人工智能框架引入
本帖最后由 北方 于 2022-6-22 11:33 编辑
自定义制作SD卡及人工智能框架引入
1、因为各种软件和工具更新速度非常快,所以非常有必要采用最新的工具探索自制启动卡。现在TI Prossessor SDK 08.02.00.04是最新版,
参见 https://software-dl.ti.com/processor-sdk-linux/esd/AM57X/08_02_00_04/exports/docs/linux/Overview_Getting_Started_Guide.html#overview-getting-started
2. 安装过程
2.1 配置主机 Configure a Linux Host
这里采用最新的ubuntu20
2.2 安装SDK,
下载TI prossessor SDK, https://www.ti.com/tool/PROCESSOR-SDK-AM57X?keyMatch=AM57#downloads
然后安装
2.3 创建SD卡
2.4 配置开发环境
2.5 用SD卡启动开发板
2.6 可以自行build SDK深度定制
3 在定制的过程中,提示只支持ubuntu18.04,ubuntu20被嫌弃了。
- 2022-06-14
-
发表了主题帖:
【创龙TL570x-EVM】移植人工智能框架及实现
本帖最后由 北方 于 2022-6-21 16:57 编辑
移植人工智能框架及实现
1 移植人工智能框架及实现可以有多种方式。如下三种,其中ARM提供的CMSIS-NN没有合适的库,而且在其他芯片上测试不那么好用,对于这个系列就直接跳过了。
GitHub - TexasInstruments/tvm: Open deep learning compiler stack for cpu, gpu and specialized accelerators
3.14. TI Deep Learning (TIDL) — Processor SDK Linux Documentation
TensorFlow Lite | TensorFlow中文官网 (google.cn)
2 可以根据说明,更改启动的logo,就是编辑一个自定义的80x80的bmp文件,直接替换boot目录下的logo.bmp则可
3 首先测试一下视频捕捉,采用usb摄像头和hdmi来显示。
3.1 已经切换到hdmi显示模式。如果没有,执行一下命令,
setenv optargs omapdrm.displays=1,0
saveenv
reset
3.2 然后需要关闭默认的启动图形程序
/etc/init.d/matrix-gui-2.0 stop //关闭 Matrix 界面
/etc/init.d/weston stop //关闭 Weston 窗口系统
3.3 测试GStreamer命令
gst-launch-1.0 videotestsrc ! 'video/x-raw, width=1920, height=1080' ! kmssink
显示正常
3.4 读取摄像头
gst-launch-1.0 v4l2src device=/dev/video1 io-mode=4 ! 'video/x-raw,format=(string)YUY2,width=640,height=480' ! kmssink
读取后写入h264文件如下
gst-launch-1.0 v4l2src device=/dev/video1 io-mode=4 ! 'video/x-raw,format=(string)YUY2,width=640,height=480' ! vpe num-input-buffers=8 ! 'video/x-raw, format=NV12, width=640, height=480' ! queue ! ducatih264enc level=51 ! filesink location=test.h264
后台的cpu资源测试如下
4 经过测试,GSstream已经整合到系统中,可以正常工作。
5. 关于第一条提到的各种人工智能引擎加载都不成功。其中最采用谷歌tensorfowlite的模型在嵌入式运行是成功的,而且也提供了使用与python3.5的安装wheel,但是这个系统中没有配置pip,还是需要联网安装。相对而言,这个模型只能使用cpu,不能充分采用TLX570x的各种加速模块,就没有必要继续深入测试。虽然花了很多时间,没有成功,但是排除这些选项也是值得的。
对于TIDL这个模型,已经在prosessorSDK的8.0版本内置,如果能升级成功,才是最好的使用方法。后续,使用ubuntu20最新版来试一下新的开发环境升级。
-
发表了主题帖:
【创龙TL570x-EVM】范例项目运行
本帖最后由 北方 于 2022-6-14 12:44 编辑
范例项目运行
1 参考资料和依据
本部分评测的参考资料主要是《评估板测试手册 2021/09/30 V1.1》
随机的SD卡上已经flash了出厂img文件,具体过程可以参见《Linux 系统启动卡制作及系统固化》这个文件,有完整的操作过程。虽然过程和步骤比较多,但是这个过程和制作linux启动盘和定制系统的过程是一致的,也没有特别需要说明的部分,就是其中的系统兼容性有可能会带来问题。最佳方法就是完全按照说明版本号来安装系统,这样就没有问题的。
2 首先需要自动或者手动安装usb串口驱动CH340,然后才能配置putty在115200bps-N-8-1下通讯,见下图
3 然后就可以直接上电了,注意启动选择开关定位在00011,
上电后依次扫描并以root进入home目录
4 关于启动选项的配置,从sd卡启动后,可以很轻易写入板载emmc内存,可以选择从mmc内存启动,对应新的拨码开关选择
等一段时间后就完成了写入emmc的步骤。
5 基本硬件资源测试,关于系统资源都是可以访问的,通过对应的命令在cli执行则可
包括按键button,以及led的点亮和熄灭
把以下shell命令逐个录入console就可以了
执行写入点亮用echo,读取按键位置用cat
6 更换显示输出
本测试可以使用串口控制,对应与显示缺省配置是lcd,
这时对应显示器是如下显示,
可以在启动提示时按下空格,进入uboot控制台,执行如下步骤就可以启动hdmi输出
这是就显示标准的TI控制台范例演示,
连接鼠标就可以逐个用GUI化测试硬件资源,这里显示以下使用QT的演示范例
7 代码开发
逐个bin文件夹淘金不得,没有gcc等工具,这个也是压缩资源的一种办法,只能用linux系统下实现交叉编译的办法的。
不过,还是有惊喜,python2.7和python3.5可以用,也就是在加载合适的驱动和模块后,可以方便的使用python工具
8 初测完毕,安全关机,使用shutdown now
小结,测试系统资源丰富,足够完成各种中小型项目的部署,其中最硬核的就是PCIe 的支持,虽然只有一个端口(芯片支持2个PCIe),但是可以扩展大容量外存,甚至显卡,计算加速器这样的性能提升工具。
不过,这样还是需要基本的嵌入式开发能力,使用交叉编译的方式。这个系统应该是TI自主做的系统,其实yocto对应于嵌入式开发更模块化,应该可以可以用在这个板子上。
- 2022-05-07
-
发表了主题帖:
【创龙TL570x-EVM】开箱和资料学习体会分享
开箱和资料学习体会分享
1、感谢EEWORLD提供的评测机会,能够近距离接触最新的TI产品,
测评入围名单: 创龙TL570x-EVM,TI AM5708工业板 - EEWORLD颁奖专区 - 电子工程世界-论坛‘’
【创龙TL570x-EVM来啦,TI AM5708工业板】测评|【创龙TL570x-EVM来啦,TI AM5708工业板】免费试用_电子工程世界 (eeworld.com.cn)
2、创龙提供了一个完整的开发平台,在官方版本上提供了硬件和软件适配,这个过程可以独立开发,TI也提供了很多开发工具,不过这样的第三方服务可以提高成功率,加快上市速度,对应工业应用还是比较适合的。
创龙科技TL570x-EVM是一款基于TI Sitara系列AM5708 ARM Cortex-A15 + 浮点DSP C66x处理器设计的异构多核SoC评估板,具备接口资源丰富、存储容量大等优点,广泛应用于运动控制、工业PC、机器视觉、智能电力、视频监测等领域,这个在工控领域的运用对于TI是超级强大的存在,事实上可以适用的环境不止于此,只要可以基于定制用途,都可以用,开发一个像PSP这样的游戏机也没有问题,这款实现了视频上的加速和GPU提供,可以提供比较好的游戏玩法。
核心板的功能图可以转看到需要的模块和功能,连PCIe接口都提供,基本上台式机的资源都可以用上,提供了丰富的扩展平台。
模块和连接硬件
具体对应参数如下
3、核心板和参数
所有的参数都是核心板支持的,这个也是快速开发可以复用的硬件,软件开发都是围绕这个进行的
实际尺寸非常精巧,
配套的电源接口是非常重要的
需要配套适当的过流过压保护
开发板上的PMIC提供了如下2组独立的电源
按照出厂模式设置启动顺序,这个是由芯片的置位关系确定的,这里引出拨码开关更容易使用
4、整个评估板把所有芯片的内部资源全部引出,提供丰富的选项,可以完全实现用户定制开发。从硬件上,直接跳过打板设计的过程。后面的过程就是使用软件开发的过程,变成纯软件开发的过程,可以实现linux,linux-RT,PRU实时操作系统,以及芯片间通信等IPC复杂功能。完全评测的时间2个月也是不够,后面重点结合视频和显示提供开发过程,争取实现 CNN的模型加载功能。
- 2022-04-28
-
回复了主题帖:
测评入围名单: 创龙TL570x-EVM,TI AM5708工业板
个人信息确认无误 已提交试用合同
- 2022-04-26
-
发表了主题帖:
【DIY冰墩墩】+迟到运放的冰墩墩
1. 最近一直小忙,这个有趣的DIY活动就迟一点参加,过程还是很有意思滴。做一个运放评估板,原来是要把墩墩的造型作为GND铺铜来用,做了几版对于功能影响比较大,就最终一个简化的。
2、首先电路设计,选择MCP6032作为运放芯片,使用mindi来模拟
用阶跃波模拟一下,调整参数,
放大倍数等都还保持线性。
3. 开始设计PCB,先用元件设计电路图,
快速转换成PCB版,调节一下布线,铺铜,然后把墩墩小朋友给加上去,
4. 因为最近物流太慢,最初是用热转印纸做了一版,打算自己制版,,结果温度偏高,而且没想到加热台不够平,
效果不太理想,
还是去薅羊毛吧,
其实工业化成本一定比自己搞便宜很多,质量还好。自己弄就是稍微快一些,而且可以改错。这次就有些问题,VCC的线没有连通,需要再处理一下。
然后就是焊上并测试了。
- 2022-03-29
-
回复了主题帖:
【EEWorld邀你来玩拆解】—— 倍思氮化镓充电器45W/65W套餐
后面又做了测试,烧了一个功率芯片。
- 2022-02-16
-
回复了主题帖:
员工离职倾向尽在公司掌握,监控系统研发商悄悄下架相关服务
从攻城狮的角度看这个事情是这样的,
“整个计算机信息系统对于主机和节点路由的管理者权限是无限大的,无限大的,”
“这样的架构就是有利于系统管理员的, 本质安全的计算机系统对于系统管理员来说是灾难。”
1、包括比特币的加密算法都是可以被追踪和破解的,FBI已经轻松追回了不少比特币了,国内这些IT企业只是学了个皮毛,犯不上被喷这么凶。
2、包括windows10的一次次系统更新,哪一次征求你的意见了,
3、还有chrome保存的各种登录密码都象征性征求一下你的意见,其实密码一定是先保存好的,只要更新插件就可以把这些密码全部上传。
- 2022-02-07
-
回复了主题帖:
2022开工大吉,立flag抢楼有礼啦~打破“立了就倒”魔法
2022.抽空DIY一个微型激光雕刻机。
- 2022-01-21
-
回复了主题帖:
【Silicon Labs BG22-EK4108A 蓝牙开发评测】三、蓝牙协议测试之APP点灯和按键检测
Jacktang 发表于 2022-1-21 07:20
测试步骤写的很细
想问一下方提供的Demo总是在仿真的时候跑飞,是怎么个情况
范例代码运行很稳定,如果代码运行不稳定是信道的问题。
- 2022-01-17
-
发表了主题帖:
【Silicon Labs BG22-EK4108A 蓝牙开发评测】+从零开始创建一个蓝牙程序
本帖最后由 北方 于 2022-1-17 15:14 编辑
1. 创建程序有一步步的导则,参见《AN1260: Integrating v3.x Silicon Labs Bluetooth® Applications with Real-Time Operating Systems》
首先需要理解基于RTOS蓝牙的逻辑和函数,
在核心的host task,具体如下
详细蓝牙的协议就是在这个逻辑中实现的。
2. 首先基于soc_empty创建一个工程
然后选择GATT 配置工具
直接进入配置工具,就可以快速开始蓝牙开发
3. 需要进入component 配置工具,首先安装蓝牙core
安装成后配置蓝牙的参数,
还要选择freeRTOS或者Micromium OS作为RTOS驱动下载,
现在,已经是一个完整的工程,可以编译并下载到芯片。
- 2022-01-14
-
发表了主题帖:
【Silicon Labs BG22-EK4108A 蓝牙开发评测】+升级FW后的bootloader
本帖最后由 北方 于 2022-1-14 10:55 编辑
1. 升级FW之后,整个板子就清净了,清净到下载的应用程序都不执行了。blinky这样的应用程序下载之后就不再有console的输出。这个是肿么了?
大致是这个逻辑,通常的应用开发,在reset之后就跳转到代码启动地址。这个也是原生代码开发,如应用keil等开发通常会遇到的。但是在simplityStudio这样的独立生态开发,采用了另外的模式,就是首先搞一个bootloader,再由bootloader启动应用程序。这个就是本帖所遇到的问题。
先说解决方法,再demo中找到bootloader程序,然后选择一个适合自己的下载,这次选择的是bootloader UART,编译下载,
顺利解决问题,前面下载的blink可以正确运行的。
2. Bootloader是不是没有用?
基本上可以很确定的给出这个问题的答案,那就是非常有必要。
除非是使用8位机,只有8k的flash,执行简单玩具级别的功能,事实上现在的玩具逻辑也复杂起来了,那么用bootloader没什么效果。
一个良好的bootloader,就像计算机的bios一样,起到自检,硬件定义,简单内存管理等功能,通过开放的接口,在没有复杂代码和外部工具的情况下,执行设备和系统的调试和管理,通常还有自动升级软件的功能。
即使不是大的系统,也要用c语言搞一个自己的bootloader,这样在跨平台,在不同的芯片上开发的时候,都可以先弄bootloader,然后再加载其他应用程序。
如果,是开发一个需要升级的产品,那么,bootloader是绝对的需要。
3. Bootloader的实现。
Boot loader需要选择起始引导位置,本代码用的是uart,
如simplicity可以看到,用spi,i2c都可以,在有外部flash的情况下,还需要访问spi。推荐采用uart就足够的。
进入bootloader需要使用GPIO的button按键,定义函数如下,
bool gpio_enterBootloader(void)
{
bool pressed;
#if defined(CMU_HFBUSCLKEN0_GPIO)
// Enable GPIO clock
CMU->HFBUSCLKEN0 |= CMU_HFBUSCLKEN0_GPIO;
#endif
#if defined(_CMU_CLKEN0_MASK)
// Enable GPIO clock
CMU->CLKEN0_SET = CMU_CLKEN0_GPIO;
#endif
// Since the button may have decoupling caps, they may not be charged
// after a power-on and could give a false positive result. To avoid
// this issue, drive the output as an output for a short time to charge
// them up as quickly as possible.
GPIO_PinModeSet(BSP_BTL_BUTTON_PORT,
BSP_BTL_BUTTON_PIN,
gpioModePushPull,
BTL_GPIO_ACTIVATION_POLARITY);
for (volatile int i = 0; i < 100; i++) {
// Do nothing
}
// Reconfigure as an input with pull(up|down) to read the button state
GPIO_PinModeSet(BSP_BTL_BUTTON_PORT,
BSP_BTL_BUTTON_PIN,
gpioModeInputPull,
BTL_GPIO_ACTIVATION_POLARITY);
// We have to delay again here so that if the button is depressed the
// cap has time to discharge again after being charged up by the above delay
for (volatile int i = 0; i < 500; i++) {
// Do nothing
}
pressed = GPIO_PinInGet(BSP_BTL_BUTTON_PORT, BSP_BTL_BUTTON_PIN)
!= BTL_GPIO_ACTIVATION_POLARITY;
// Disable GPIO pin
GPIO_PinModeSet(BSP_BTL_BUTTON_PORT,
BSP_BTL_BUTTON_PIN,
gpioModeDisabled,
BTL_GPIO_ACTIVATION_POLARITY);
#if defined(CMU_HFBUSCLKEN0_GPIO)
// Disable GPIO clock
CMU->HFBUSCLKEN0 &= ~CMU_HFBUSCLKEN0_GPIO;
#endif
return pressed;
}
4. 应用的起始地址,在不同的产品系列如下,启动后访问0x0h,如果没有bootloader,那么在0x6000h的应用代码就无法访问到。
启动顺序如下,
进入页面,先按下btn0,然后rst就进入bootloader页面,这里啥也没显示,然后按照手册访问uart_dft.exe 就可以完成对应的功能,
整个过程比较完整,而且也在不停升级优化,更详细资料需要认真读代码。整个编译效率很高,小于2k。
5 整个代码包括uart初始化,gpio初始化,dft,crc和sha256加密等过程。完整核心代码供参考。
#include "config/btl_config.h"
#include "api/btl_interface.h"
#include "core/btl_core.h"
#include "core/btl_reset.h"
#include "core/btl_parse.h"
#include "core/btl_bootload.h"
#include "core/btl_upgrade.h"
#include "plugin/debug/btl_debug.h"
#ifdef BTL_PLUGIN_GPIO_ACTIVATION
#include "plugin/gpio/gpio-activation/btl_gpio_activation.h"
#endif
#ifdef BTL_PLUGIN_EZSP_GPIO_ACTIVATION
#include "plugin/gpio/ezsp-gpio-activation/btl_ezsp_gpio_activation.h"
#endif
#ifdef BOOTLOADER_SUPPORT_STORAGE
#include "plugin/storage/btl_storage.h"
#include "plugin/storage/bootloadinfo/btl_storage_bootloadinfo.h"
#endif
#ifdef BOOTLOADER_SUPPORT_COMMUNICATION
#include "plugin/communication/btl_communication.h"
#endif
#include "em_device.h"
#include "em_cmu.h"
#include "em_gpio.h"
#include "em_chip.h"
#if defined(__GNUC__)
#define ROM_END_SIZE 0
extern const size_t __rom_end__;
#elif defined(__ICCARM__)
#define ROM_END_SIZE 4
const size_t __rom_end__ @ "ROM_SIZE";
#endif
// --------------------------------
// Local function declarations
__STATIC_INLINE bool enterBootloader(void);
SL_NORETURN static void bootToApp(uint32_t);
#if defined(BOOTLOADER_WRITE_DISABLE)
__STATIC_INLINE void lockBootloaderArea(void)
{
// Disable write access to bootloader.
// Prevents application from touching the bootloader.
#if defined(_MSC_PAGELOCK0_MASK)
#if defined(CRYPTOACC_PRESENT)
CMU->CLKEN1_SET = CMU_CLKEN1_MSC;
#endif
for (uint32_t i = (BTL_FIRST_STAGE_BASE / FLASH_PAGE_SIZE);
i < ((BTL_MAIN_STAGE_MAX_SIZE + BTL_FIRST_STAGE_SIZE) / FLASH_PAGE_SIZE);
i++) {
MSC->PAGELOCK0_SET = (0x1 << i);
}
#if defined(CRYPTOACC_PRESENT)
CMU->CLKEN1_CLR = CMU_CLKEN1_MSC;
#endif
#elif defined(MSC_BOOTLOADERCTRL_BLWDIS)
MSC->BOOTLOADERCTRL |= MSC_BOOTLOADERCTRL_BLWDIS;
#else
// Do nothing
#endif
}
#endif
void HardFault_Handler(void)
{
BTL_DEBUG_PRINTLN("Fault ");
reset_resetWithReason(BOOTLOADER_RESET_REASON_FATAL);
}
// Main Bootloader implementation
int main(void)
{
int32_t ret = BOOTLOADER_ERROR_STORAGE_BOOTLOAD;
CHIP_Init();
// Enabling HFXO will add a hefty code size penalty (~1k)
// CMU_HFXOInit_TypeDef hfxoInit = CMU_HFXOINIT_DEFAULT;
// CMU_HFXOInit(&hfxoInit);
// CMU_ClockSelectSet(cmuClock_HF, cmuSelect_HFXO);
// CMU_OscillatorEnable(cmuOsc_HFRCO, false, false);
BTL_DEBUG_PRINTLN("BTL entry");
#if defined(EMU_CMD_EM01VSCALE2) && defined(EMU_STATUS_VSCALEBUSY)
// Device supports voltage scaling, and the bootloader may have been entered
// with a downscaled voltage. Scale voltage up to allow flash programming.
EMU->CMD = EMU_CMD_EM01VSCALE2;
while (EMU->STATUS & EMU_STATUS_VSCALEBUSY) {
// Do nothing
}
#endif
btl_init();
#ifdef BOOTLOADER_SUPPORT_STORAGE
if (!reset_resetCounterEnabled()) {
// Storage bootloaders might use part of the reason signature as a counter,
// so only invalidate the signature when the counter is not in use.
reset_invalidateResetReason();
}
#else
reset_invalidateResetReason();
#endif
#ifdef BOOTLOADER_SUPPORT_STORAGE
// If the bootloader supports storage, first attempt to apply an existing
// image from storage.
ret = storage_main();
if (ret == BOOTLOADER_OK) {
// Firmware upgrade from storage successful. Disable the reset counter
// and return to application
if (reset_resetCounterEnabled()) {
reset_disableResetCounter();
}
reset_resetWithReason(BOOTLOADER_RESET_REASON_GO);
} else {
if (!reset_resetCounterEnabled()) {
// Start counting the number of consecutive resets after the first reset
reset_enableResetCounter();
}
// Stop after three consecutive resets (the first one counts as 0)
if (reset_getResetCounter() >= 2) {
// If the system is not able to recover from a fault like BADAPP or
// BADIMAGE, wait in a busy loop to ease reflashing and debugging.
BTL_DEBUG_PRINTLN("Reset loop detected. Stopping...");
reset_disableResetCounter();
while (1) {
// Wait...
}
} else {
reset_incrementResetCounter();
}
// Wait a short while (approx. 500 ms) before continuing.
// This allows other operations to complete before the reset.
for (volatile int i = 800000; i > 0; i--) {
// Do nothing
}
}
#endif
#ifdef BOOTLOADER_SUPPORT_COMMUNICATION
communication_init();
ret = communication_start();
if (ret != BOOTLOADER_OK) {
reset_resetWithReason(BOOTLOADER_RESET_REASON_FATAL);
}
ret = communication_main();
BTL_DEBUG_PRINT("Protocol returned ");
BTL_DEBUG_PRINT_WORD_HEX(ret);
BTL_DEBUG_PRINT_LF();
communication_shutdown();
if ((ret == BOOTLOADER_OK)
|| (ret == BOOTLOADER_ERROR_COMMUNICATION_DONE)) {
reset_resetWithReason(BOOTLOADER_RESET_REASON_GO);
}
#endif // BOOTLOADER_SUPPORT_COMMUNICATION
// An error occurred in storage or communication, and a firmware upgrade
// was not performed
if (0
#ifdef BOOTLOADER_SUPPORT_COMMUNICATION
|| (ret == BOOTLOADER_ERROR_COMMUNICATION_IMAGE_ERROR)
|| (ret == BOOTLOADER_ERROR_COMMUNICATION_TIMEOUT)
#endif
#ifdef BOOTLOADER_SUPPORT_STORAGE
|| (ret == BOOTLOADER_ERROR_STORAGE_BOOTLOAD)
#endif
) {
reset_resetWithReason(BOOTLOADER_RESET_REASON_BADIMAGE);
} else {
reset_resetWithReason(BOOTLOADER_RESET_REASON_FATAL);
}
return 0;
}
#ifdef BOOTLOADER_SUPPORT_STORAGE
extern const BootloaderStorageFunctions_t storageFunctions;
#endif
const MainBootloaderTable_t mainStageTable = {
{
.type = BOOTLOADER_MAGIC_MAIN,
.layout = BOOTLOADER_HEADER_VERSION_MAIN,
.version = BOOTLOADER_VERSION_MAIN
},
// Bootloader size is the relative address of the end variable plus 4 for the
// CRC
.size = ((uint32_t)&__rom_end__) - BTL_MAIN_STAGE_BASE + ROM_END_SIZE + 4,
.startOfAppSpace = (BareBootTable_t *)(BTL_APPLICATION_BASE),
.endOfAppSpace = (void *)(BTL_APPLICATION_BASE + BTL_APP_SPACE_SIZE),
.capabilities = (0
#ifdef BOOTLOADER_ENFORCE_SIGNED_UPGRADE
| BOOTLOADER_CAPABILITY_ENFORCE_UPGRADE_SIGNATURE
#endif
#ifdef BOOTLOADER_ENFORCE_ENCRYPTED_UPGRADE
| BOOTLOADER_CAPABILITY_ENFORCE_UPGRADE_ENCRYPTION
#endif
#ifdef BOOTLOADER_ENFORCE_SECURE_BOOT
| BOOTLOADER_CAPABILITY_ENFORCE_SECURE_BOOT
#endif
#ifdef BOOTLOADER_SUPPORT_CERTIFICATES
| BOOTLOADER_CAPABILITY_ENFORCE_CERTIFICATE_SECURE_BOOT
#endif
#ifdef BOOTLOADER_ROLLBACK_PROTECTION
| BOOTLOADER_CAPABILITY_ROLLBACK_PROTECTION
#endif
| BOOTLOADER_CAPABILITY_BOOTLOADER_UPGRADE
| BOOTLOADER_CAPABILITY_EBL
| BOOTLOADER_CAPABILITY_EBL_SIGNATURE
#if !defined(BTL_PARSER_NO_SUPPORT_ENCRYPTION)
| BOOTLOADER_CAPABILITY_EBL_ENCRYPTION
#endif
#ifdef BOOTLOADER_SUPPORT_STORAGE
| BOOTLOADER_CAPABILITY_STORAGE
#endif
#ifdef BOOTLOADER_SUPPORT_COMMUNICATION
| BOOTLOADER_CAPABILITY_COMMUNICATION
#endif
),
.init = &btl_init,
.deinit = &btl_deinit,
.verifyApplication = &bootload_verifyApplication,
.initParser = &core_initParser,
.parseBuffer = &core_parseBuffer,
#ifdef BOOTLOADER_SUPPORT_STORAGE
.storage = &storageFunctions,
#else
.storage = NULL,
#endif
.parseImageInfo = core_parseImageInfo,
.parserContextSize = core_parserContextSize,
#ifdef BOOTLOADER_ROLLBACK_PROTECTION
.remainingApplicationUpgrades = &bootload_remainingApplicationUpgrades
#else
.remainingApplicationUpgrades = NULL
#endif
};
#if defined(BOOTLOADER_SUPPORT_CERTIFICATES)
const ApplicationCertificate_t sl_app_certificate = {
.structVersion = APPLICATION_CERTIFICATE_VERSION,
.flags = { 0U },
.key = { 0U },
.version = 0,
.signature = { 0U },
};
#endif
const ApplicationProperties_t sl_app_properties = {
.magic = APPLICATION_PROPERTIES_MAGIC,
.structVersion = APPLICATION_PROPERTIES_VERSION,
.signatureType = APPLICATION_SIGNATURE_NONE,
.signatureLocation = ((uint32_t)&__rom_end__) - BTL_MAIN_STAGE_BASE + ROM_END_SIZE,
.app = {
.type = APPLICATION_TYPE_BOOTLOADER,
.version = BOOTLOADER_VERSION_MAIN,
.capabilities = 0UL,
.productId = { 0U },
},
#if defined(BOOTLOADER_SUPPORT_CERTIFICATES)
// If certificate based boot chain is enabled, the bootloader binary will be provided with
// a certificate that does not contain any key.
// A valid certificate needs to be injected to the bootloader images using Simplicity Commander.
// Simplicity Commander will replace this certificate.
.cert = (ApplicationCertificate_t *)&sl_app_certificate,
#else
.cert = NULL,
#endif
.longTokenSectionAddress = NULL,
};
/**
* This function gets executed before ANYTHING got initialized.
* So, no using global variables here!
*/
void SystemInit2(void)
{
// Initialize debug before first debug print
BTL_DEBUG_INIT();
// Assumption: We should enter the app
volatile bool enterApp = true;
// Assumption: The app should be verified
volatile bool verifyApp = true;
// Check if we came from EM4. If any other bit than the EM4 bit it set, we
// can't know whether this was really an EM4 reset, and we need to do further
// checking.
#if defined(RMU_RSTCAUSE_EM4RST) && defined(APPLICATION_VERIFICATION_SKIP_EM4_RST)
if (RMU->RSTCAUSE == RMU_RSTCAUSE_EM4RST) {
// We came from EM4, app doesn't need to be verified
verifyApp = false;
} else if (enterBootloader()) {
// We want to enter the bootloader, app doesn't need to be verified
enterApp = false;
verifyApp = false;
}
#else
if (enterBootloader()) {
// We want to enter the bootloader, app doesn't need to be verified
enterApp = false;
verifyApp = false;
}
#endif
uint32_t startOfAppSpace = (uint32_t)mainStageTable.startOfAppSpace;
// Sanity check application program counter
uint32_t pc = *(uint32_t *)(startOfAppSpace + 4);
if (pc == 0xFFFFFFFF) {
// Sanity check failed; enter the bootloader
reset_setResetReason(BOOTLOADER_RESET_REASON_BADAPP);
enterApp = false;
verifyApp = false;
}
// App should be verified
if (verifyApp) {
// If app verification fails, enter bootloader instead
enterApp = bootload_verifyApplication(startOfAppSpace);
if (!enterApp) {
reset_setResetReason(BOOTLOADER_RESET_REASON_BADAPP);
}
}
#if defined(BOOTLOADER_ROLLBACK_PROTECTION)
// Clean the stored application versions if requested with a magic.
// The magic is only written when a bootloader upgrade is triggered.
bootload_removeStoredApplicationVersions();
if (enterApp) {
enterApp = bootload_storeApplicationVersion(startOfAppSpace);
}
#endif
if (enterApp) {
BTL_DEBUG_PRINTLN("Enter app");
BTL_DEBUG_PRINT_LF();
#if defined(BOOTLOADER_SUPPORT_STORAGE)
// Disable the reset counter if we're booting (back) into the application
if (reset_resetCounterEnabled()) {
reset_disableResetCounter();
}
#endif
#if defined(BOOTLOADER_WRITE_DISABLE)
lockBootloaderArea();
#endif
#if defined(BOOTLOADER_ENFORCE_SECURE_BOOT) && defined(APPLICATION_WRITE_DISABLE)
// The neccessary check of valid signature pointer for application at startOfAppSpace
// is already done in bootload_verifyApplication.
bootload_lockApplicationArea(startOfAppSpace, 0);
#endif
// Set vector table to application's table
SCB->VTOR = startOfAppSpace;
bootToApp(startOfAppSpace);
}
// Enter bootloader
}
/**
* Jump to app
*/
SL_NORETURN static void bootToApp(uint32_t startOfAppSpace)
{
(void)startOfAppSpace;
// Load SP and PC of application
__ASM("mov r0, %0 \n" // Load address of SP into R0
"ldr r1, [r0] \n" // Load SP into R1
"msr msp, r1 \n" // Set MSP
"msr psp, r1 \n" // Set PSP
"ldr r0, [r0, #4] \n" // Load PC into R0
"mov pc, r0 \n" // Set PC
:: "r" (startOfAppSpace) : "r0", "r1");
while (1) {
// Do nothing
}
}
/**
* Check whether we should enter the bootloader
*
* @return True if the bootloader should be entered
*/
__STATIC_INLINE bool enterBootloader(void)
{
// *INDENT-OFF*
#if defined(EMU_RSTCAUSE_SYSREQ)
if (EMU->RSTCAUSE & EMU_RSTCAUSE_SYSREQ) {
#else
if (RMU->RSTCAUSE & RMU_RSTCAUSE_SYSREQRST) {
#endif
// Check if we were asked to run the bootloader...
switch (reset_classifyReset()) {
case BOOTLOADER_RESET_REASON_BOOTLOAD:
case BOOTLOADER_RESET_REASON_FORCE:
case BOOTLOADER_RESET_REASON_UPGRADE:
case BOOTLOADER_RESET_REASON_BADAPP:
// Asked to go into bootload mode
return true;
default:
break;
}
}
// *INDENT-ON*
#ifdef BTL_PLUGIN_GPIO_ACTIVATION
if (gpio_enterBootloader()) {
// GPIO pin state signals bootloader entry
return true;
}
#endif
#ifdef BTL_PLUGIN_EZSP_GPIO_ACTIVATION
if (ezsp_gpio_enterBootloader()) {
// GPIO pin state signals bootloader entry
return true;
}
#endif
return false;
}
bool bootloader_enforceSecureBoot(void)
{
#ifdef BOOTLOADER_ENFORCE_SECURE_BOOT
return true;
#else
return false;
#endif
}
4. bootloader的主要作用,就是加载应用程序。本例中使用的gecko bootloader1.2版本相当的完整。
- 2022-01-13
-
回复了主题帖:
【Silicon Labs BG22-EK4108A 蓝牙开发评测】+开发板的firmware升级
annysky2012 发表于 2022-1-13 12:09
关于安全可控的bootload,这个厂家有咩有公开的资料,是如何具体实现的?
没有
-
发表了主题帖:
【Silicon Labs BG22-EK4108A 蓝牙开发评测】+开发板的firmware升级
本帖最后由 北方 于 2022-1-13 12:20 编辑
开发板的firmware升级
1. 因为多次出现firmware的升级提示,干脆还是找机会升级吧。进入launch启动页面,点击显示安全FW,显示当前版本和即将升级的版本
点击upgrade
开始升级,这时候会发现安全升级有两个选项,一个是没有加密的初始状态,如下
另一个是使用加密技术的,
点击确认,就升级成功,版本号隐藏。
2.顺手升级调试的fw
但是显示不兼容
这个是用于jlink的,从jlink的配置选择也一样升级不了
这个不影响,可以直接跳过。
3. 测试代码下载,这次,没有提示升级FW的小对话框了
4. 小结
这个Silabs的开发板,提供了安全可控的bootload和固件,提供丰富的管理和安全选项。当下的开发是基于这个底层服务开始的,和采用CMSIS的开发完全不同的。
这个过程中,原厂的丰富手册就非常重要,需要认真查阅学习,不过用起来就是在是简单方便。
- 2022-01-12
-
发表了主题帖:
【Silicon Labs BG22-EK4108A 蓝牙开发评测】+使用Android APP连接测试
1. 在正确搭建开发后,就可以测试代码是否可以正确运行。比较方便的就是下载EFR Connect的安卓应用。
启动后进入demo页面,有标准范例程序的配合,选择blink电灯开始最基本。
进入blink,没有找到对应的蓝牙服务
2. 从范例程序中找到SoC blinky,创建程序,并编译,
下载后,BG22的程序就正常启动了,这时可以从手机搜索到blinky
点击后进入页面,触摸就可以控制BG22开发板上的led对应on/off。
3. 连接串口putty,
就显示了后台输出,
程序运行正常。
4. 小小的修改。上面的输出,总是没有换行到最开始,成了阶梯状显示,所以从IDE工程中找到app.c程序并对应的代码段,
把LED On 后面增加\r,就可以换行正确的。然后关掉安卓应用,显示连接断开。
这个完整的过程运行正确。
- 2022-01-08
-
回复了主题帖:
【改装】升压板和净化器都是在电压上搞事情
Jacktang 发表于 2022-1-8 21:22
给鱼缸的水杀菌净化这个想法不错,可以介绍一下
搞不成的,电流会先去导电性好的水,而不会去击穿空气。结果变成电鱼,有种捕鱼方式就是这样,一池子鱼都被电晕浮在水面
-
发表了主题帖:
【改装】升压板和净化器都是在电压上搞事情
本帖最后由 北方 于 2022-1-8 20:58 编辑
1. 首先感谢有机会参与活动,创意改装大比拼,主要想了解一下到底这个东东是如何实现功能的。结果发现,无论升压板和净化器都是在电压上搞事情。
2. 首先是升压板,这里采用的是B628芯片,最初按照8628查芯片资料,啥也没搞到。然后度娘提示,应该是B628,如下图的意思。
PW5328B(B628芯片)是一颗DC-DC异步升压转换器IC,常使用于锂电池输入,升压输出5V,6V,7V,8V,9V,12V不等,或者是5V输入,输出6V,7V,9V,12V不等。这个就是这次使用的升压板。
按照上面的电路图,是固定电压输出的,但是根据文档中的数据手册,通过设置反馈电阻,可以实现电压变换,
R1 和R2是反馈电阻,这两个反馈电阻的作用就是来调和设置输出电压的值的。电阻精度要1%。输出电压和R1,R2的关系公式是:
(1+R1/R2)*0.6=输出电压(V)
输入电压在2-24V,输出电压最高到28V,这个是逻辑图如下,
这个就是一个利用电感的续流效果,不断叠加正电压到额定输出电压,并用反向占空区的续流向负荷供电的原理,芯片是一个根据反馈电阻调节MOSFET的占空比来调节电压的过程,其中有内置额定频率的晶振,提供PWM的周期,按照资料是1.2MHz。所以,这个尺寸可以限制得比较小,而且不需要变压器来实现电压变换。虽然标称效率可达97%,这个应该只是在输入输出电压差距不大的情况下取得的数值。不过,通过旋转电阻变换就可以实现调压,这个是一个非常好的解决方法。
3. 负离子发生器,就是这个净化器的真正名称。负离子发生器,其实就是一个微型空气电离装置,给大家印象更深刻的应该是特斯拉线圈,可以拉出几米长的闪亮电弧。这个也是一样,只是用一个更微小的空气间隙,来主动持续放电,行成电离效果,次要的结果就是生成负氧离子。那么按照化学反应,首先是生成了O3,然后空气中不稳定,被氧化而生成更多的负离子,这个也是雷电后的雨天空气清新的原因。负离子,主要是通过氧化产生。
这么看来,这个是一个危险的产品,高压,强氧化性。
用一个手电筒就可以产生点击枪的效果,那么这个是如何实现的呢。下面是拆开的电路板,正面,
反面,
这个是双面板,分立元件,可以直接抄板。不过,因为不希望破坏完整性,不拆开,有些元件的型号就看不清楚。
首先,可以看到放电尖端电极上有一个大电阻,显然,是为了限制放电电流的。电压一定时,加大电阻限制放电电流的效果非常明显,这个也解释了为什么这个火花不能点着甲烷气体,如果把这个电阻拆了,应该时一个非常大的火花,而且电池也要接受过热的考验。
整体分为两部分,一部分是升压变换部分。
核心是一个变压器,还有一对三极管,以及电阻阵列。那么,使用电池的直流电是如何实现变压器的正常工作呢。
其实,使用三极管可以很容易起振,因为没有拆开,很多电路,可以参考下面的这个RC多谐振荡电路,
产生的频率不需要很高,也不需要控制波形,只要重点是实现振荡电流就可以的,提升电压,不能简单靠变压器实现,因为完成空气击穿,需要上千伏的电压,如下图,
中间还有一个白色的挡位选择开关,决定放电强度,这个应该也是并接不同电阻限制电流的,这个是限制能量的简单办法。
另一部分是储能放电功能板,中间尽可能实现物理隔离,也是提高安全性的表示。
这个部分设计比较精巧,通常,一组串联的电容就可以实现功能的,但是中间使用了比较复杂的二极管循环连接级联,这样使用了两组高耐压电容串。具体原因还没有分析清楚,大致应该是起到了均压的作用,保证在大电流之下,在各组电容上电压分配尽可能均匀,避免被破坏,延长设备的寿命。
在变压器原边提供5V左右振荡交流电的情况下,副边如何实现提高1000倍左右的电压呢。这个就需要串联谐振来实现的,这个是很多高压试验装置的原理。副边是一个串联的电感和电容来作为交流负荷,这样在匹配实现振荡的时候,就可以实现串联谐振,在电容侧取得大的电压。
4. 放电回路。
放电回路很简单,就是并联在电容两侧的针状放电极和一个平面网孔板作为接受极,在串联谐振的过程中,起振后的电容器两端电压随着每一次振荡,电压逐步升高,当升高到空气的耐压水平时,就放电,相当于电容短路泄能。然后,电容再次在振荡中储能,等待下一次放电。
空气的耐压水平和空气密度,湿度,大气压不同,都在不断波动。好的情况,数量级在每厘米30kV的水平,实际上应该更低一些,这样就明白为什么电池短路也会有火花,那是因为距离足够近,就能够击穿空气。
这个净化器设置在1厘米左右,可以理解这个电压应该有10kV左右,没有冲击电压计,所以无法测量这个冲击电压,不过,这个还是有些小危险的。
放电极的形状也有关系,针尖要足够尖,那么放电电压就会减低很多。
5. 小结
这个活动主要计划就是拆解,因为最初设想,如果是空气净化功能,希望能简单引入臭氧杀菌,给鱼缸的水杀菌净化。拆开以后发现,这个做不了,估计这个电压,调整到放电的水平,能直接把小鱼给电晕了,所以就不好拿这个尝试了。
不过,这个装置,可以做一个超高压发生器,替换谐振电抗器就可以改变谐振频率,调整能实现的最高电压,做一些简单的高压实验是可以的,不过,真不建议大家拆开以后用,还是要在绝缘壳内放电,这样避免误伤小鱼小虾。
简单分析,供商榷。
- 2022-01-07
-
发表了主题帖:
【Silicon Labs BG22-EK4108A 蓝牙开发评测】+上电和范例程序测试
本帖最后由 北方 于 2022-1-11 09:39 编辑
上电和范例程序测试
1. 收到Silicon Labs BG22-EK4108A开发板,包装足够精简,不过还是以前的标准包装更舒适一些。和老包装一起合个影,同时配套的usb线可以直接略过,原来没有配套,当下usb线成灾的情况下,着实不应该配套的。
2. 启动simplicityStudio5,选择连接的板卡,创建新的代码,
3. 进入范例程序页面,创建温度检测的程序,
创建代码
成功创建,并新增GATT配置器,修改可以直接导入配置代码的。
4. 编译程序
5. 点击下载,跳出提示新建的sdk需要升级板载的firmware。忽略后仍然可以进行下载,版本差别不大,应该不会影响运行,
这个代码的创建过程非常快捷,不过,整个过程非常需要网络通畅,整个简单的步骤花了好多天,反复测试才通过。如果没有在国内的镜像服务器,估计这样的问题会一直困扰的。