北方

  • 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。忽略后仍然可以进行下载,版本差别不大,应该不会影响运行,   这个代码的创建过程非常快捷,不过,整个过程非常需要网络通畅,整个简单的步骤花了好多天,反复测试才通过。如果没有在国内的镜像服务器,估计这样的问题会一直困扰的。  

统计信息

已有294人来访过

  • 芯积分:903
  • 好友:1
  • 主题:141
  • 回复:179
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言