IAR ARM 9.30 破解

由于突如其来的疫情,被迫在宅工作。

匆忙中从公司拿了IAR的功能安全版本的加密狗回家,但是有的同事拿的是普通版本的IAR,为了确保大家环境都OK,所以只能无奈破解下以便确认工程正常。简单来说,和之前破解IAR CCRH的逻辑类似。

只记录破解方法,不提供破解结果。

使用雷锋破解器激活

这一步直接跳过吧,遍地都能搜索到。

然后新建工程,编译得到错误:The generation feature is not of version 18.

                 
  test - Debug
  Reading project nodes...
 
  main.c
  Fatal Error[LMS001]: License check failed. Use the IAR License Manager to resolve the problem.
  The generation feature is not of version 18.
 
  Total number of errors: 1
  Total number of warnings: 0
 
  Build failed
 ​

使用IDA打开iccarm.exe

  • strings窗口搜索The generation feature is not of version 18
  • 双击进入反汇编
  • X跳转至调用处

修改jgejl

  • 保存exe,重新编译,写个小错误也被成功识别

License窗口和调试

之前在RH850编译器破解时候有修改LicenseInfo.exerh850sim.dll

估计IAR ARM也是一样逻辑,不过这两个模块我暂时用不到,能试着编译成功就行了。

FPGA 原理和结构 「天野英晴」 读书笔记

复习下基础知识

基础知识

逻辑电路基础

  • 布尔代数
  • 逻辑表达式
    • 乘积的和
    • 和的乘积
  • 真值表 -> LUT
  • 组合逻辑电路
    • 当前的输出取决于当前输入,不包含记忆元件
    • 异或 Exclusive-OR (第一次直到单词这么写,惭愧啊)
      • 简写XOR,EOR,EXOR(后面这俩还真是第一次见)
  • 时序逻辑电路
    • 含有记忆元件的逻辑电路
    • 同步时序逻辑电路
      • 状态变化由时钟信号控制
      • 有限状态机模型
        • Mealy 输出=输入+状态 (输入直接影响输出)
          • 通常状态少,电路规模小
          • 输入立刻反映到输出,导致逻辑元件不等长布线,容易冒险
        • Moore 输出=状态 (输入影响状态)
          • 状态数量多,电路规模大
          • 不易冒险
        • todo:书上的图挺好,后续贴过来
    • 异步时序逻辑电路(FPGA一般不使用)
      • 这本书没讲,后面有机会补上

同步电路设计

  • 触发器(Flip Flop,FF)
    • FPGA 一般采用DFF
    • CMOS工艺电路
      • todo:抄图
    • 建立时间(setup time),保持时间(hold time)
    • 亚稳态(metastable)
    • 时序分析
      • 评估是否满足时序约束(需求)
      • 动态时序分析
        • 过于耗时,很少采用
        • todo:需要了解下
      • 静态时序分析(static time analysis, STA)
        • 只需要电路网表,遍历一次电路拓补,分析速度快
      • 资源充足时,编译容易,时间短
  • 单向时钟同步电路
    • 时钟偏移(skew):时钟信号到达时间错位
    • 时钟抖动(jitter)
    • FPGA通过驱动能力强的专用总线(global buffer)将多层时钟树的时钟低偏移连接在所有FF上。

FPGA 定位和历史

  • 逻辑器件分类
    • 标准器件
      • 标准逻辑
        • 怀疑书中指与或非门等标准器件
      • 固定用途定制芯片(Application Specific Standard Parts,ASSP)
      • 可编程逻辑器件(Programmable Logic Device,PLD)
        • FPGA是一种设计自由度高的PLD。
        • 半导体厂商可以量产,用户无需开模即可定制电路
    • 定制芯片
      • 全定制芯片
        • 优势:性能(速度),集成度(门数),设计自由度
        • 劣势:NRE,TAT高(费用和时间)
      • 半定制芯片(缩短NRE和TAT)
        • 门阵列(gate array)
        • 嵌入式阵列(embedded array)
        • 标准单元ASIC
        • 结构化ASIC
  • FPGA历史
    • 1970s
      • FPLA – NXP
        • AND-OR阵列
      • PAL – Lattice
        • 改进版FPLA
        • 耗电量大无法普及
    • 1980s
      • GAL – Lattice
        • 固定OR阵列结构
        • CMOS EEPROM进行编程
      • FPGA – Xilinx
        • LUT+FF
        • CMOS SRAM
        • 可重配置
      • CPLD – Altera,AMD,Lattice
      • 反熔丝FPGA – Actel,QLuickogic(这俩公司没听过…)
    • 1990s
      • 日本厂商尝试加入,没有成功
      • FPGA(SRAM)- Altera,AT&T,AMD,Atmel
      • FPGA(FLASH)-GateField
      • FPGA(BCiMOS)-DynaChip
    • 2000s
      • FPGA,SoPD – Altera,Xilinx
    • 2010s
      • 高端 FPGA – AMD(Xilinx),Intel(Altera)
        • 动态可重配置
        • 车载FPGA
        • 光FPGA
        • SoPD (Zynq,DE1SOC等带有处理器的FPGA)
      • 中低端:Lattice,GOWIN

FPGA 概要

todo:9/4

FPGA结构

todo:9/4

设计流程和工具

todo:9/5

设计原理

todo:9/6

硬件算法

todo:9/7

PLD、FPGA应用案例

todo:9/8

新器件,新架构

todo:9/9

WIFI+USBIP+MCU=无线USB设备

请注意,本文提供方法基于zephyr OS制作,由于目前zephyr项目的USB子系统处于大规模重构状态,所以本方案不受zephyr正式支持。详细请参考:

https://github.com/zephyrproject-rtos/zephyr/pull/46862

背景

目前,我们有许多MCU项目利用USB协议与PC进行通信,绝大多数使用USB从机协议,随着Wifi协议的广泛使用以及速度的提升,我认为绝大多数的USB设备都可以经由网络协议而渐渐变得无线化。

但是,如果完全将协议栈转换为网络,会导致一系列兼容软件或驱动需要再次适配,较大的开发量和不明显的收益使得各大厂商在这方面进展缓慢。

本文介绍一种基于USBIP的USB设备无线化方法,希望能够推进设备线束的无线化进程。

USB with WIFI

灵感来源(废话部分,技术无关,可以跳过😄)

前段时间有幸从artery公司木一川先生处得到一片at32 demo板,正巧促使我简单的学习了一下openocd和cmsisdap。发现cmsis-dap协议很容易就可以在zephyr中引用,以获得大量开发板支持。

但是如果只是制作一个普通的dap仿真器,比较缺少挑战性,因此我决定尝试制作无线的仿真器。

最初的目标是通过TCP转发cmsis-dap协议,修改openocd以支援网络设备,但是后面我意识到这会导致windows的KEIL和IAR等IDE环境难以运用。

因此,我将目标转向USB设备的网络访问,因此了解了USBIP协议,并且偶然发现zephyr OS中对USBIP是有部分实现的,我只需要简单的将他扩展到其他设备即可,因此便有了本文。

方案介绍

再次提示,本方案虽然基于zephyr OS制作,但是由于zephyr OS的USB subsystem处于大规模重构状态,所以不受zephyr主线支持!

实现代码请参考:https://github.com/zephyrproject-rtos/zephyr/pull/46862

实际在下面设备中运行通过:

传统USB程序结构

这里指的传统zephyr USB 设备程序(因为zephyr系统目前没有host设备,这也是大规模重构的原因)。

如果您的程序目前采用其他方式架构(可能大部分程序都是吧),您首先需要将其移植到zephyr OS。(目前USB subsystem处于不稳定状态,商业用户需要谨慎考虑)

zephyr OS USB DEVICE

USBIP 网络USB设备

本方案工作在UDD层,通过注册zephyr USB device驱动,并将其转换为USBIP协议。因此没有虽然没有USB硬件,但是在操作系统看来和有USB驱动是一样的。

示意图

注意:

  • 这不是标准USBIP Server的实现,但是我认为对于绝大多数的USB设备已经足够实现功能

使用

MCU程序

建议创建如下application

  • 启动后的wifi配置:帐号,密码,功耗等(有线网络可忽略)
  • 静态IP或DHCP服务

简单使用教程

  • 使用usbip客户端,确认基本通信
usbip list -r FEILONG-CMSIS-DAP
  • 挂载usbip设备
sudo usbip attach -r FEILONG-CMSIS-DAP -b 1-1
  • 调试可以使用wireshark,内置有USBIP协议。

windows

请参考

https://github.com/cezanne/usbip-win

有些功能可能需要使用zadig安装驱动:

https://zadig.akeo.ie/

linux

linux用户应该不需要多说,参考archlinux wiki即可使用。

https://wiki.archlinux.org/title/USB/IP

注意:

在linux上使用时,如果在使用过程中,没有detach直接复位、断电等,会造成linux内核出现异常,重启后即可解决。(windows没有发现此类问题)

参考链接

CMOS芯片结构与制造技术

CMOS学习中…

LSI、VLSI制造基本技术

  • 基础工艺技术
  • 晶圆吸杂去除被金属刀片切割的单晶硅片上沾染的金属
    • 外部吸杂离子注入
    • 内部吸杂氢气中退火处理
  • 氧化氧气中加热形成二氧化硅薄膜
    • 依据氧化气氛分类
    常用干氧、湿氧、干痒相结合的方式混合含氯气体(氯气、氯酸等)捕获Na离子,改善SiO2表面稳定性。
    • 干氧氧化
      • 可以使用氮气和氩气稀释氧气,减慢氧化速度 形成超薄氧化膜
    • 水汽氧化
    • 湿气氧化
    • 依据集成电路制造工艺区分
    • 初始氧化
    • 基地氧化
    • 预氧化
    • 场区氧化
    • 栅氧化
    • 多晶氧化
    • 源漏氧化
  • 光刻通过光照将光掩模版的电路打印在光刻胶上
    • 工序
    • 硅片处理
    • 涂黏附剂
    • 涂胶
    • 前烘
    • 曝光
    • 显影
    • 后烘
    • 光源
    • 0.8um 高压水银灯 436nm
    • 0.35um i线 365nm
    • 0.13um UV光KrF 248nm
    • 0.10um ArF 193nm
    • 更窄 F2 157nm
  • 腐蚀或刻蚀
    • 湿法腐蚀腐蚀剂浸泡光刻后硅片
    • 精度不高
    • 干法刻蚀
    • 等离子刻蚀依靠气体辉光放电刻蚀
    • 反应离子刻蚀纵向刻蚀,精度较高
  • 去胶
  • 离子注入对Si衬底掺杂,改变电特性
    • 高能离子注入
    • 低能离子注入0.13um以下
  • 扩散退火氮气约1000度加热
  • 薄膜沉淀CVD工艺

假装做一个电子单词卡

背景

最近总能在淘宝刷到各个厂家的电子单词卡(如下图所示),作为一名电子工程师,感觉这个小玩意作为平时的产品设计练习会是个不错的话题。

从购买上来说,个人不是很推荐,理由如下:

  • 如果是购买给孩子使用,屏幕太小了,像素密度低,从商品照片里面看字体都很模糊。虽然是墨水屏,但是孩子们可能要贴近看屏幕,我认为不利于孩子们的视力。
  • 低成本墨水屏,没有背光,和在过亮或过暗的地方看书一样,不合适的光线依旧会导致视疲劳。

题外话 – 我目前在用的单词背诵组合

正式开始前,分享下我在使用的背单词组合:

  • Anki(Desktop+AnkiDroid)
  • 墨水屏安卓手机(海信A5Pro CC, 彩色墨水屏技术离实用化还有太远的距离,建议现阶段还是使用黑白屏)
  • 懒人支架,放在床头上夹住手机,保持平躺保护脊椎😄
  • 迷你手柄(如下图,按键还挺舒服)
    • 个人使用ABXY四个按键,竖过来可以握在手里

方案

淘宝的那种我也没有买实物,下面方案没有实际做出来,只从理论上判断可行性,现阶段没有实际制作的计划。

全体结构

Android APP

  • 每次同步时,同步当天单词表及字模(Flash寿命?)
  • 蓝牙升级
    • 固件来自服务器
  • 设置锁屏壁纸(个性化+蓝牙丢失后显示的联系方式设置)

固件

  • 功能一览
    • 蓝牙升级
      • WCH貌似有现成的解决方案(没用过😄)
    • 字库
      • 应该和OLED的字模用法是一致的
      • 需要区分语言,以便减小体积
    • E-INK驱动
    • 电源管理
      • 电量显示
      • 电量矫正
      • 充电指示
      • 低功耗设置
      • 按键唤醒
    • 壁纸(低功耗+蓝牙出发)
    • 单词同步
      • 压缩?
      • 增量?
      • 小数据库能跑动不?

硬件设计

我一般认为商品的价格,成本约60%,也就是说淘宝成品成本价格在70元上下。

猜测屏幕约40元,芯片+PCB+电池+外壳+按键30元

  • EINK屏幕
    • 最开始那个图的2.6寸屏幕其实不大,296×152像素的屏幕,在计算字模大小时候发现字真的很小。虽然是墨水屏,但是很担心小孩子们长时间使用这样的设备是否会对视力产生影响。个人还是更推荐黑白的墨水屏安卓手机或电子阅读器,一般几百元就可以搞定,并没有贵多少。
    • 题外话:我选择手机的一个理由一方面是当时没有这种设备,另一方面确实是因为字体比较大。
  • 锂电池容量和尺寸很难凭空想出来,不过可以参考目前在卖的方案尝试下
    • 充电电路网上遍地都是😄
  • USB串口
    • 烧录程序用
    • CH340N最小,应该够用
  • MCU – CH571F因为没有计划实际做,所以Flash容量不太好判断但是这个系列从datasheet上来看,很适合做这个。嘉立创商城价格约等于一瓶饮料
  • 接口
    • USB-C
  • 存储
    • 不太确定是否需要外挂存储芯片
  • 电阻电容MOS等
  • 按键
    • 开模的话可能要大批量才行
    • 遥感的十字按键看起来不错

windows 下webdav连接方法

1. 启用http网络连接

如果是https的连接,可以直接跳到第二步。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters]
"BasicAuthLevel"=dword:00000002

把上面文件保存为 xxx.reg,导入注册表,或

手动修改 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters

BasicAuthLevel 值改成 2(支持 http & https)

https://blog.csdn.net/kh766200466/article/details/91951568

2. 添加网络位置

在「我的电脑」画面中右键「添加一个网络位置」,「下一步」,「选择自定义网络位置」,网络地址输入为 WebDAV 的地址,比如坚果云就是 https://dav.jianguoyun.com/dav/,再点「下一步」,给该位置输入名称。

完成后可以在「我的电脑」画面看到新建的这个 WebDAV 地址的快捷方式了。第一次进入的时候需要输入用户名和密码。

https://www.jianshu.com/p/7ba5f0756efc

或者RaiDrive一步到位

直接图形化:

参考:https://sspai.com/post/47830

我的图书管理系统

最近发现家里的书越来越多,电子书也在kindle,boox,电脑和NAS里面堆得四处都是,因此下定决心对图书进行整理。

实体图书

  • 微信小程序:优优书柜

介绍可参考: https://www.appinn.com/youyoushugui-wechat-miniapp/

计划使用这个软件把图书和小伙伴分享,但是暂时还没有实施。

小说、漫画等快餐类图书

  • calibre管理

calibre是一个自由开源电子书软件套装,可以用来组织、存放、以及管理电子书,支持大多数的电子书格式。同时也支持与许多流行的电子书阅读器进行同步,并可能在DRM的限制下转换电子书的格式。

https://zh.wikipedia.org/zh-cn/Calibre

为了便于与E-INK设备共同使用,依旧使用calibre进行管理。

看和下载漫画用软件,19年左右参与过一段时间开发,不过后来没有坚持下去。

新的节目比当年的界面要好看一些。

阅读3.0, 阅读是一款可以自定义来源阅读网络内容的工具,为广大网络文学爱好者提供一种方便、快捷舒适的试读体验。

https://github.com/gedoor/legado

一般用这个看看爽文小说啥的,不过实际使用的时候,我比较喜欢导出epub之后给calibre导入到kindle或者使用静读天下来打开阅读。

PDF图书

  • 旧:Nas+Samba+Syncthing

这套环境我使用了大概两年左右,但是随着书籍的增多,简单的多设备同步会造成EINK平板的容量浪费。同时,因为Nas可能存在单点故障,因此数据还是存在一定风险。

  • 新:zotero

偶然的机会发现了zetero这个专门管理文献的软件,使用后感觉很满意,特别是强化了文献的搜索功能。以前有很多次想从某本书里面借几句话出来,但是只记得几个模糊的词,因此搜索了很久才找到,或者无功而返。

简单列举下我认为比较好用的功能:

  • 文献的关系管理:可以设置文件关系,比如在某个芯片的手册可以关联它的封装和设计样例;外语课程可以关联听力或者其他补充资料
  • 文献模糊搜索:上面说过了 🙂
  • PDF标注:不知道为什么,很少能够看到同时支持windows、linux的带有笔记和标注功能的PDF阅读器。不同平台使用不同软件,脑子有时候还是反映不太过来。
  • 网页存储:配合插件可以存储原始网页,避免浏览器书签里面的网站丢失导致资料缺失(目前我主力使用trilium,把网页作为笔记管理这部分内容,在评估是否应该迁移)

多设备同步或备份可以选择官方或支持webdav的网盘。

  • 同步策略(以下方案均测试可用,请根据使用场景选择)
    • zotero官方(免费版本300m)
    • 坚果云(免费版每月1G上传流量,速度很快)
    • koofr(免费版共2G空间,可以连接onedrive、google drive等网盘,连接的网盘每天限制1T的流量传输,速度适中,连接onedrive较慢)
    • TeraCloud(免费版共15G,速度适中)

我的方案(onedrive+rclone+Termux+Android Phone+koofr)

虽然上面列举了很多种方案,但是我的图书容量已经远远超越15G,使用公有云同步的方案成本实在有些大,因此,我特别定制了一套符合我自己使用方式的方案。

我的使用环境满足下面条件:

  • 图书体积大:
    • 有一些生物学相关的书籍里面图像较多,每本300m上下
    • 有些图书只有图像版本,体积大
    • 芯片手册虽然体积很小,但是品类繁多
    • 外语能力差,部分书籍保留了英中日三种语言
    • 有些图书会赠送光盘或音视频资料
  • 网盘速度不敏感:
    • 书是用来看得,不是用来屯的
    • 虽然有时候会批量增加一些书籍,但是跨公网的同步时间没有什么强烈的要求
  • 同步用数据无隐私内容,泄露无危害
    • 都是能买到和网上公开的内容
    • 一些图书笔记
    • 基于RCLONE,可以实现全数据加密,隐私问题完美解决
  • 同步数据丢失后,本地依旧有多个副本存储在下面设备中
    • NAS(完整图书库)(现有方案暂未实现,计划syncthing同步台式机和NAS)
    • 家中台式机(完整图书库)
    • 笔记本电脑(完整图书库)
    • EINK平板(部分在读图书)
  • 可以接受使用手机作为中继
    • 手机随身携带
    • 使用电脑时,一般我在电脑边上 o.o
  • 为什么不直接在电脑上运行rclone
    • 买的onedrive不稳定,可能要经常维护
    • 终端较多,每次维护重复作业多,手机只要维护一个设备,其他设备可以一同使用
  • koofr在干什么
    • 平时,没有大文件变动时候,使用koofr管理即可,减少手机操作。

环境一览

  • Onedrive 5T+office365 淘宝40元(需要购买支持API的onedrive)

不推荐店铺,因为这种店随时跑路,帐号也随时会没,空间虽大但是很不稳定,而且管理权限不在手中,存储文件可能会被他人看到。

我选择这个网盘作为同步方案的原因是我有Nas,Onedrive的价值是同步和灾难备份,而不是作为所有文件的保存地。同时zotero这个软件对于文件的传输都是乱码格式的压缩文件,虽然没有密码,但是即便泄露,也不过是网上各种能够找到的网页和电子书再加上少许笔记而已,没有任何隐私资料。 配合rclone全数据库加密。

同时还有office 365可用,比拼家庭车划算。

可以参考koofr手册:https://koofr.eu/help/connect-other-cloud-services/how-can-i-connect-onedrive-to-koofr/

onedrive网盘的一大缺点是不支持webdav,或者说是只支持一种很特殊的webdav方案,zotera不支持。

rclone是本方案的核心,可以将onedrive网盘转换为webdav服务。

但是,这是一个GO语言编写的程序,不能直接在Android手机运行,但是借助Termux就可以了。

这是一个Android系统中的linux环境,在Android中使用Linux程序时经常会用到。

使用方法

Onedrive

一般老板会给注册好或者给出网页自助注册,不明的话可以询问店家。

Termux

Android程序, 安装即可。

第一次打开会执行一个自动安装,没有什么需要操作的。

rclone
pkg update
pkg install rclone

使用上面命令,直接安装即可。

配置

首先,rclone登录onedrive:参考https://rclone.org/onedrive/ 即可。

参考这个页面添加加密层

启动webdav服务器(remote:/是上一步的服务器名字):

rclone serve webdav --addr 0.0.0.0:端口 --user 用户名 --pass 密码 remote:/

参考资料

本方案制定过程中参考了以下资料

IIC 通讯

写这篇文章的原因是本来我觉得IIC,SPI这种级别的协议早已了然于胸,直到今天在github被别人提醒,我才明白以前对着代码和各种中文资料知道的只是能凑合通讯,实际的规范中还有亿点点细节o.o

有点懒,基本协议内容就不再描述了(如果不了解可以看下下面规范原文),下面部分说明直接机翻

规范位置

比较重要的协议一览

  • 除了与高速模式相关的一种特殊情况外,不允许 I2C 设备驱动总线,即通过在总线上施加电压来发送 1。
    • 总线终止于高电平
  • Clock Stretching(不是所有从机都有这个功能,没有的话可以不实现)
    • 任何IIC总线设备(各个从机或主机)都可以要求延长SCL低电平时间甚至暂停通讯。
    • 规范中不包含等待超时(但是驱动中可能会有)
    • 一些从设备在超时一段时间之后会认为总线空闲
    • 这个功能对总线带宽有影响,使用时应当充分评估
    • 仅在 ACK 位之后(并且在下一个字节的第一个位之前)才允许在高速模式下进行时钟延长。位 2-9 之间的拉伸是非法的,因为这些位的边缘通过额外的电流源被提升。
  • i2c level shifting
  • Arbitration(单主机模式可以不实现)
    • 虽然看到协议想起来确实有这么回事,但是一般凑合用的时候就没实现过 😄
    • 能够遵循仲裁逻辑。如果两个设备同时开始通信,则向总线(或速度较慢的设备)写入更多零的设备赢得仲裁,而另一个设备立即停止总线上的任何操作。(这个没用过)
    • 总线繁忙检测。每个设备都必须检测正在进行的总线通信并且不得中断它。这是通过识别总线通信并在开始通信之前等待停止条件出现来实现的。(这个比较常见)
    • 如果使用多主机,那么所有主设备都应支持multimaster功能。
  • I2C标准定义了0.3 Vcc的低电平阈值,0.7 Vcc的高电平阈值。
  • 广播呼叫使用I2C 地址 0寻址总线上的所有设备。
  • 为了兼容淘汰的C-Bus协议,保留地址(’0000001X’)。I2C 设备必须忽略发往该地址的消息。
  • 地址“0000010X”旨在将 I2C 设备与在同一总线上使用不同协议的设备互连。只有能够使用这些协议运行的 I2C 设备才能回复消息。 (这个不太懂)
  • 10-bit-addressing
    • 为了防止地址冲突,由于 7 位地址的范围有限,引入了新的 10 位地址方案。此增强功能可以与 7 位寻址混合使用,并将可用地址范围增加约十倍。在开始条件之后,前导“11110”引入 10 位寻址方案。第一个字节的最后两个地址位与八位连接整个 10 位地址的第二个字节。仅使用 7 位寻址的设备只会忽略带有前导“11110”的消息。
  • auto-increment
    • eeprom什么的地址自动递增是协议的一部分
  • 速度(精度不重要)
    • 100k – 龟速(我起的名字) standard-mode
    • 400k – 快速 Fast Mode
    • 1 M – Fast Mode Plus (大部分都能在此频率工作,不过建议以各个设备datasheet为准)
    • 3.4M – high speed mode
    • 5M 超快速模式 ultra-fast-mode
      • 单向通信,从机不再发送ack
      • 可以多主机,但是没有仲裁机制
      • 推挽驱动
      • 多个设备可以通过共享 I2C UfM 总线进行寻址。112 个节点可用。
      • 超快速模式总线主要集中在 LED 设备。
高速模式
  • PC debug
  • Repeated Start Condition
    • 在发送地址字节(地址和读/写位)后,主机可以发送任意数量的字节,然后是停止条件。除了发送停止条件之外,还允许再次发送另一个开始条件,后跟地址(当然包括读/写位)和更多数据。这是递归定义的,允许发送任意数量的开始条件。这样做的目的是允许在不释放总线的情况下对一个或多个设备进行组合的写/读操作,从而保证操作不会中断。
    • 无论在一次传输期间发送了多少个开始条件,传输都必须恰好由一个停止条件结束。

移植zephyr到GD32E103_EVAL板子

背景

终于考完日语了,虽然够呛能过 o.o 105分飘过了o.o

不过也算是有点空闲时间能随便玩玩了.迫于近年来半导体价格飞涨, 国产MCU的应用也越来越广(大部分是替代STM32的样子)

整个移植过程可以看出GD32和STM32高度相似.

具体代码参考: https://github.com/zephyrproject-rtos/zephyr/pull/36833 PR的使用方法请参考后面

本次移植大概花费三四天,本文不会记录详细的移植过程(因为代码在上一行)只会记载几个移植中的小问题.

主要参考资料:https://docs.zephyrproject.org/latest/guides/porting/index.html

基础知识

为了能够移植zephyr系统,下面知识是我认为必须要先了解的,可能会有些不全,仅供参考,如有不足欢迎补充

  • 最低限度的计算机组成原理以及单片机构成常识(一般来说MCU由内核(arm,risk-v等,执行指令,提供中断系统)存储(flash, ram等)外设(gpio,uart,can,ethernet等),一般芯片是要放在电路板上才能工作,综上zephyr的硬件驱动划分为arch, soc, board)
  • cmake(虽然使用west命令进行编译,但是实际的构建环境是cmake,因此在移植前,我建议了解最低限度的cmake知识)
  • kconfig(官方仓库https://github.com/ulfalizer/Kconfiglib,用于配置内核宏, 会影响构建过程以及C程序)
  • dts(devicetree 设备树)(zephyr系统通过设备树对arch,soc,board进行抽象,类似linux设备树,但是系统调用方式不同,zephyr通过将dts编译为宏,在程序和构建过程中调用)
  • linux(虽然据说windows也可以使用,但是我建议如无特殊原因,请尽量养成在linux或mac中开发程序,避免各种麻烦)
  • openocd(MCU调试工具) 这个东西的使用的话相对简单,但是编写tcl脚本需要对jtag/swd的底层原理比较熟悉.一般的MCU openocd中都包含了支持文件, 但是不巧的是GD32E103_eval的这款板子和芯片均不在支持范围内.
  • yaml(一种配置文件格式,类似json/xml)简单了解即可
  • git(zephyr版本通过git管理)
  • C Marco (C语言宏)
    • 虽然因为zephyr项目使用C语言编写,为了移植掌握C语言是必要的无需多做说明,但是在处理设备树的过程中,会用到极其复杂的宏调用,数十层的宏包装人脑展开已经极为困难,有些时候只能根据编译器预编译结果来检查问题. 所以如果您是C语言新手或关于预编译器工作原理不是很清楚的话,强烈建议您补全此处知识,包括但不限于宏拼接(##运算),可变参数列表宏(__VA_ARGS__)
  • vscode调试和编译的配置方法(可能经常使用keil,iar等IDE环境的朋友会比较陌生)

相关文件

zephyr的移植主要设计下面文件(module需要单独建立仓库,可以参考https://github.com/feilongfl/hal_gd32, 仓库内GD32E1的支持包来自gigadevice官网)

  • boards(板级外设)
  • socs(芯片外设)
  • drivers(驱动)
  • west.yml(module)

绝大多数都可以参考STM32F1x的芯片进行移植,其实从手册来看,驱动也可以共用, 但是为了避免STM32的驱动应用在其他厂家的芯片上所产生的法律和道德问题, 我主要使用GD32官方提供的代码.

主要问题

  • arm mpu可能在移植初期带来一些问题,所以在初期最好关闭
  • zephyr使用systick定时器运行,所以在开始配置时,我们可以不用从时钟系统开始.我认为从gpio led灯开始会比较容易.
  • 我的移植顺序(目前只做了这些,至此芯片基本功能已经完成,但是我适配的串口只能支持基本的收发,如果要应用console或其他subsys可能还要支持中断和DMA):
    • 已实现
      • led灯(GPIO的输出)
      • RCU时钟树
      • 按键(GPIO输入)
      • 串口(GPIO pinmux, uart外设)
    • 计划中
      • 串口(runtime config)
      • 串口(中断驱动)
      • 串口(DMA)
      • CAN
      • USB
  • openocd 这个是移植过程中比较头痛的,因为虽然会使用openocd调试一些芯片,但是编写tcl脚本适配芯片debug系统确实没怎么研究过.只了解一些边界扫描之类的理论知识.这个位置氛围两个部分,一个是debugger,另一部分是debugger和MCU间的通讯支持
    • debugger
      • GD32开发板接入pc,执行 lsusb,可以得到Bus 001 Device 006: ID 28e9:058f GDMicroelectronics CMSIS-DAP,因此debugger是CMSIS-DAP,这部分驱动openocd内提供.
    • debugger和MCU间的通讯支持
      • 因为GD32基本与STM32相似, 仔细调查发现是与STM32F1x系列相似(新系列例如G4等不兼容), 于是常识STM32F1的openocd配置,发现jtag和swd的ID芯片信息需要修改,修改后即可工作.
  • west.yaml 这个和android的repo命令所使用的manifest原理很相似,看来大家都觉得git submodule不好用
  • 感觉GD32的EVAL板质量一般
    • 目前手中的板子信号振铃极其严重,串口波特率115200就已经开始乱码了,有点怀疑是不良品
      • 也可能是usb串口不良,因为我没想到只有两个DB9的串口接口可以使用,用的淘宝8元包邮的那种,后续可能会更换usb串口测试下
      • 印象里CMSIS DAP是自带虚拟串口的,不清楚为啥GD的这个调试器没有接串口.像ST-link一样调试串口可能更友好一些.
    • 吐嘈下,好多年没用锉刀打磨PCB板子边角了o.o
    • 从手册来看,芯片支持CANFD协议,但是PHY芯片手册标识最高速率1M,不是CANfd应该使用的PHY芯片.
      • 后续不稳定可能要自己更换
      • 不过确实是第一次见国产CAN phy,以前只用过NXP的产品,不知道国产芯片是否能有超越数据手册的性能 o.o
      • 我猜GD是不想管理太多芯片,整个eval系列物料共用了
  • 移植过程中发现STM32的官方支持确实很到位, GD32就没有找到太多的支持.

写完之后再看感觉会移植的人也不需要看了,不会的可能看完还是看不会 o.o

PR用法

动图如下(顺便发现了termtosvgasciinema这几个好玩的工具):

https://asciinema.org/a/443449