作者归档:softsim

用pyOCD和GDB调试micro:bit

安装pyocd apt install openocd python3-pyocd 安装 arm-none-eabi-gdb $ pyocd-gdbserver –persist -t nrf51 -bh -r
0000843:INFO:board:Target type is nrf51
0001221:INFO:dap:DP IDR = 0x0bb11477
0001270:INFO:dap:AP#0 IDR = 0x04770021
0001303:INFO:rom_table:AP#0 ROM table #0 @ 0xf0000000 (designer=244 part=001)
0001329:INFO:rom_table:[0]
0001329:INFO:rom_table: AP#0 ROM table #1 @ 0xe00ff000 (designer=43b part=471)
0001355:INFO:rom_table: [0]
0001373:INFO:rom_table: [1]
0001390:INFO:rom_table: [2]
0001407:INFO:rom_table:[1]
0001424:INFO:cortex_m:CPU core is Cortex-M0 r0p0
0001444:INFO:dwt:2 hardware watchpoints
0001453:INFO:fpb:4 hardware breakpoints, 0 literal comparators
0001480:INFO:semihost:Telnet: server started on port 4444
0001481:INFO:gdbserver:GDB server started at port:3333 https://os.mbed.com/docs/mbed-os/v6.2/debug-test/debug-microbit.html

DAP调试适配器协议

https://microsoft.github.io/debug-adapter-protocol/ 调试适配器协议(DAP)定义了在开发工具(例如IDE或编辑器)和调试器之间使用的抽象协议。

在IDE或编辑器中添加针对新语言的调试器不仅是一项艰巨的工作,而且令人沮丧的是,由于每个工具都使用不同的API来实现相同的功能,因此无法轻易在多个开发工具上分摊此工作。

调试适配器协议(DAP)背后的思想是将开发工具的调试支持与调试器或运行时进行通信的方式抽象为协议。由于假定现有的调试器或运行时在任何时候都采用此协议是不现实的,因此我们假定中介组件(即所谓的调试适配器)使现有的调试器或运行时适应调试适配器协议。

调试适配器协议使为开发工具实现通用调试器成为可能,该工具可以通过调试适配器与不同的调试器进行通信。调试适配器可以在多个开发工具中重复使用,从而大大减少了在不同工具中支持新调试器的工作。

调试适配器协议对调试器提供商和工具提供商而言都是双赢!
CMSIS-DAP是用于将调试端口连接到USB的调试单元的接口固件。 在主机上执行的调试器通过USB连接到调试单元和运行应用程序软件的设备。 调试单元通过JTAG或SW连接到目标设备。 ARM Cortex处理器提供CoreSight调试和跟踪单元。 CMSIS-DAP支持包含一个或多个Cortex处理器的目标设备。 这里,DAP是Debug Access Port的意思 CMSIS-DAP提供了一种通过USB访问ARM Cortex微控制器的Coresight调试访问端口(DAP)的标准化方法。 CMSIS-DAP通常实现为板载接口芯片,通过开发板与一侧运行在主机上的调试器之间通过JTAG(联合测试操作组)或SWD(串行线调试)提供直接USB连接。 目标设备访问另一台上的Coresight DAP。 为什么需要CMSIS-DAP?
有关引入CMSIS-DAP的原因有很多: 在CMSIS-DAP标准之前,许多USB wigglers都实现了自己的协议。使用这种配置,主机调试器必须了解这些不同的协议,并且必须实现所有这些协议,这会产生很多碎片并重新发明轮子。同时,协议通常是在JTAG级别定义的,这意味着它们很慢。 CMSIS-DAP为调试器提供了标准化的接口,该接口在Coresight DAP级别上定义,允许使用标准接口和快速的无驱动程序实现。
借助新的CMSIS-DAP层,主机调试器可以通过SWD或JTAG调试目标,而无需实现这两个协议
USB连接使用HID驱动程序类。由于每个操作系统都内置了HID驱动程序,因此无需在主机上安装特定的驱动程序。 CMSIS-DAP如何集成?
如前所述,CMSIS-DAP必须在接口芯片上实现。该芯片提供了主机计算机(例如,通过USB)和必须调试的目标(通过SWD或JTAG)之间的链接。 CMSIS-DAP标准概述
数据包在主机调试器和接口芯片之间交换。基本上,主机发送命令,调试单元发送命令响应。

主机可以发出不同类型的命令:

通用命令:请求信息并控制调试单元。也用于连接/断开调试单元。
常见的SWD / JTAG命令:例如用于设置时钟速度
SWD特定命令:配置SWD模式的参数
JTAG特定命令:配置JTAG设备链
传输命令:读/写CoreSight寄存器。这些命令与传输方式无关(SWD或JTAG)
示例:通过CMSIS-DAP读取内存
假设调试器需要读取内存中特定位置的值。主机必须发送以下命令:

传输命令:写入CSW寄存器(控制/状态字寄存器)。这将配置传输(32位/ 16位/ 8位传输)
传输命令:使用存储单元的地址写入TAR寄存器(传输地址寄存器)
传输命令:读取DRW寄存器(数据读取/写入寄存器)以读取先前指定位置的值
结论
CMSIS-DAP为调试器提供了标准化的接口。它可能会成为调试器和调试单元将要实现的实际标准。

JTAG/SWD口作为GPIO使用而不能调试

JTAG/SWD口作为GPIO使用 导致无法找到JTAG/W设备, 也就无法下载和调试程序 解决办法: 存储器采用固定的存储器映射,代码区域起始地址为 0x0000 0000(通过 ICode/DCode 总线访问),而 数据区域起始地址为 0x2000 0000(通 过 系 统 总 线 访 问)。Cortex-M4F CPU 始终通过 ICode 总线获取复位向量,这意味着只有代码区域(通常为 Flash)可以提供自举空间。STM32F4xx 微控制器实施一种特殊机制,可以从其它存储器(如内部 SRAM)进行自举。
在 STM32F4xx 中,可通过 BOOT[1:0] 引脚选择三种不同的自举模式 boot0 = 0, 主Flash boot0=1, boot1=0 系统存储器 boot0=1, boot1=1 嵌入式SRAM 复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。复位后,用户可以通过设置BOOT1 和 BOOT0 引脚来选择需要的自举模式。BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应GPIO 引脚即进入空闲状态,可用于其它用途。器件退出待机模式时,还会对 BOOT 引脚重新采样。因此,当器件处于待机模式时,这些引脚必须保持所需的自举模式配置。这样的启动延迟结束后,CPU 将从地址 0x0000 0000 获取栈顶值,然后从始于 0x0000 0004 的自举存储器开始执行代码。 注意:

如果器件从 SRAM 自举,在应用程序初始化代码中,需要使用 NVIC 异常及中断向量表和偏移寄存器来重新分配 SRAM 中的向量表。 64 KB CCM (内核耦合存储器)数据 RAM 不属于总线矩阵, 只能通过 CPU 对其进行访问(CPU D总线) 选择自举引脚后,应用程序软件可以将某些存储器设定为从代码空间进行访问(这样,可通过ICode 总线而非系统总线执行代码)。这样的修改通过在 SYSCFG 控制器中编程 SYSCFG 存储器重映射寄存器 (SYSCFG_MEMRMP) 来实现。
  1. 使用两个位来配置可在地址 0x0000 0000 访问的存储器区域。从而通过软件选择物理重映射,而旁路 BOOT 引脚。
  2. 这两个位的复位值和复位时 BOOT 引脚的设置相同。当 BOOT 引脚设为 10 [(BOOT1,BOOT0)= (1,0)] 从主 Flash 中自举时,寄存器值为 0x00. 也就是boot引脚的值,被忽略,用寄存器的值代替。
灵活的静态存储控制器 (FSMC) 当把 FSMC 重映射到地址 0x0000 0000 时,只有 FSMC 的 Bank1 的前两个区域(NOR/PSRAM 1和 NOR/PSRAM 2)可被重映射到低端地址。在重映射模式下,CPU 可以通过 ICode 总线(而不是 System 总线)访问外部存储器来提高性能。
偏移地址:0x00
复位值:0x0000 000X(X 和 BOOT 引脚的设置相同) STM32F4xx 内核集成了串行 /JTAG 调试端口 (SWJ-DP) 默认调试接口是 JTAG 接口。如果调试工具想要切换到 SW-DP, 它必须在 TMS/TCK(分别映射到 SWDIO 和 SWCLK)
上提供专用的 JTAG 序列, 用于禁止 JTAG-DP 并使能 SW-DP。这样便可仅使用 SWCLK和 SWDIO 引脚来激活 SWDP。
该序列为:
  1. 输出超过 50 个 TCK 周期的 TMS (SWDIO) = 1 信号
  2. 输出 16 个 TMS (SWDIO) 信号 0111100111100111 (MSB)
  3. 输出超过 50 个 TCK 周期的 TMS (SWDIO) = 1 信号
复位(SYSRESETn 或 PORESETn)后,会将用于 SWJ-DP 的全部 5 个引脚指定为专用引
脚,可供调试工具立即使用(请注意,除非由调试工具明确编程,否则不分配跟踪输出)。
但是,STM32F4xx MCU 可以禁止部分或全部 SWJ-DP 端口,进而释放相关引脚以用作通
用 IO (GPIO)。 调试时,主机执行以下操作:
注意:
● 在系统复位状态下,分配所有 SWJ 引脚 (JTAG-DP + SW-DP)。
● 在系统复位状态下,调试主机发送 JTAG 序列,以从 JTAG-DP 切换到 SW-DP。
● 仍然在系统复位状态下,调试主机在复位地址处设置断点。
● 释放复位信号,内核停止在复位地址处。
● 从此所有调试通信均使用 SW-DP 完成。然后通过用户软件将其它 JTAG 引脚重新分配为 GPIO。

SWD调试接口

Jtag 是20PIN接口(非常多的接地PIN),太多的PIN会导致一些小型的PCB板很拥挤,也会增加布线的难度。 使用SWD接口下载调试,只需要要使用2-6个PIN: VCC, GND, RST, SWDIO, SWCLK, SWO 其中, SWDIO, SWCLK是必须的 国内仿制 ULINK2 非常好的支持 SWD 模式, 速度可以达到 10M。 ULINK2 需要的硬件接口为: GND, RST, SWDIO, SWCLK Ulink2将JTAG的1、7、9、20分别与自己的开发板上JTAG的VCC、JTMS/SWDIO、JTCK/SWCLK GND用杜邦线相连即可 JLink按SWD方式来调试,实际需要接1,7,9,15,20脚,某些资料上说的需要6个脚(第13脚SWO也需要连上)是不对的,SWO不需要连接。SWO是调试数据,log可以从这里打印。 SEGGER Embedded Studio can use SWO for printf Output to the Debug Terminal and for code profiling and execution trace. https://wiki.segger.com/Configure_SWO_in_Embedded_Studio 有些开发板,没有引出RST线。那么 不接第15脚,即RESET脚,仅接4条引线,即Vref,SWDIO, SWCLK, GND。 在MDK 中 设置时Reset位选择:AutoDetect,可以正常下载,仿真。 如果Reset位选选择:HW Reset ,则不能正常下载。 这是正常的,硬件reset信号都没连接,自然不能硬件复位。 小程序 都是在RAM中调试的,而且只接三根线GND SWDIO SWCLK (VCC 直接接JTAG内部的),很爽利。不过今天要试IIS 要放一个大的数据进去,于是要烧到FLASH中去, 发现很快进度条走完, 然后显示失败,放狗一搜,说要接RESET,于是接上,果然下进去了。 在MDK仿真器的设置里面不使用硬件复位,而是用system reset或者vect reset,前者适用的范围更广 因为SWD有软件复位协议,不需要硬件RST信号,也可以复位系统。

SEGGER Embedded Studio链接与段布置

Linking and section placement 可执行程序包含很多段(section). 典型地,有代码程序段, 初始化数据段,清0数据段等。通常,在程序中有多个段,并且,必须将它们放在内存的指定地址。 为了描述你的程序的程序段在内存中如何定位,SEGGER Embedded Studio项目系统使用内存映射文件 和 段布置文件。 内存映射文件,指定了 目标内存段(target memory segment)的起始地址和大小。 段布置文件,指定在 目标内存段(segment)的 什么位置防止 程序段(section). 将内存映射 与 段布置方案 分开, 可以让一个硬件描述 在多个项目中共享。也可以让一个项目,用不同的硬件描述来建立。

以AT91SAM7S256为例用Keil MDK创建从RAM启动的简单应用

安装MDK5 和 ARM7/ARM9支持包
https://armkeil.blob.core.windows.net/eval/MDK531.EXE
https://armkeil.blob.core.windows.net/legacy/MDK79525.EXE

准备 RAM.ini

FUNC void Setup (void) {
  PC = 0x00200000;
}

_WDWORD(0xFFFFFD44, 0x00008000);     // WDT_WDMR: Disable Watchdog

// Switching from Slow Clock to Main Oscillator for faster Download
_WDWORD(0xFFFFFC20, 0x00000601);     // PMC_MOR: Enable Main Oscillator
_sleep_(10);                         // Wait for stable Main Oscillator
_WDWORD(0xFFFFFC30, 0x00000001);     // PMC_MCKR: Switch to Main Oscillator

LOAD %L INCREMENTAL       // Download

Setup();                             // Setup for Running

g, main
准备Main.c
此应用是一个MCU的hello world, 用GPIO驱动LED闪烁
#include "AT91SAM7S256.h"
#define LED_A (1U<<0) // PA0, pin 48
#define LED_B (1U<<1) // PA1, pin 47

void sleep_ms(unsigned int msec)
{
  volatile unsigned int i;
  for (i = 0; i < 1000 * msec; i++) {
    __asm ("NOP");
  }
}

int main(void) {
  /* Configure the pins as outputs */
  AT91C_BASE_PIOA->PIO_OER = (LED_A | LED_B);
  /* Enable PIOC control on the pins*/
  AT91C_BASE_PIOA->PIO_PER = (LED_A | LED_B);
  /* Disable pull-ups */
  AT91C_BASE_PIOA->PIO_PPUDR = (LED_A | LED_B);

  while(1)
  {
    /* Turn LED on, high level */
    AT91C_BASE_PIOA->PIO_SODR = LED_A;
    sleep_ms(1);

    /* Turn LED off, low level */
    AT91C_BASE_PIOA->PIO_CODR = LED_A;
    sleep_ms(1);
  }
}

开启MDK,新建Project,选择存储位置
选择设备,从Legacy Device Database里选取AT91SAM7S256
同意复制启动文件SAM7.s到项目中
在 左侧项目管理选择Target1, 右键选取Manage Project Items
双击Target1,将其改名为Flash, 新增加一个RAM的Target. 将Source Group 1改名为Startup, 新增一个Source的Group,并增加一个Main.c的文件
项目左侧,选中RAM这个Target,右键选取Options for RAM Target
切换到Linker这个标签页
取消选中Use Memory Layout from Target Dialog, 在右侧设置R/O Base为0x00200000, R/W Base为0x00202000, 删除Scatter File, 也就是留空
切换到Debug标签
选中 Use ULink2/ME ARM Debugger,   取消 选择 Load Application at Startup,  添加Initilization File, 选择 RAM.ini
切换到Utilities, 取消Update Target before Debugging
点击菜单栏,Project–Build Target, 然后,Debug–Start Debug Session即可开始调试

屏蔽运营商本机号码自动登录

移动
10.0.0.1 config.cmpassport.com
10.0.0.1 www.cmpassport.com
10.0.0.1 wap.cmpassport.com

https://onekey1.cmpassport.com/unisdk/rs/ckRequest

https://config.cmpassport.com/client/uniConfig

https://log1.cmpassport.com:9443/log/logReport

https://onekey1.cmpassport.com/unisdk/

https://smsks1.cmpassport.com/unisdk/

http://www.cmpassport.com/unisdk/

https://config.cmpassport.com/client/uniConfig

verify.cmpassport.com

————-

https://www.cmpassport.com/unisdk/rs/getPrePhonescrip

encrypted
reqdata
securityreinforce

http://wap.cmpassport.com/openapi/wabGetuserInfo?channelId=
expandParams=
message=
msgId=
openType=
sign=
userId=

{“detailErrorCode”:””,
“msgId”:””,
“pcId”:””,
“resultcode”:”121″,
“systemTime”:””
“desc”:”获取移动手机失败”}

独有网关认证及sim卡快捷认证方式可实现免密一键登录
6种认证方式,在不同场景下提供更加安全的认证

https://onekey1.cmpassport.com/unisdk/rs/ckRequest
appid
apppackage
appsign
clienttype
interfacever
keyid
msgid
sdkver
sign
timestamp
ver

https://onekey1.cmpassport.com/client/queryUpgrade

中国移动南方基地–中移互联网有限公司

http://www.cmpassport.com/unisdk/rs/getphonescrip
interfacever
keyid
reqdata
ver

电信
10.0.0.1 id6.me
10.0.0.1 open.e.189.cn

https://open.e.189.cn/openapi/flow/getOpenId=?timestamp
state
clientId
clientType
format=json
version=1.5
sign=

http://id6.me/openapi/networkauth/preGetMobile.do?paramKey=
paramStr
clientId=
clientType=
format=json
version=v1.5
sign=

https://open.e.189.cn/api/logbox/oauth2/getPreMobileUrl.do?appKey=8023528553&clientType=2&format=json&version=v1.0&preUrlCBN=jsonp_gj1n&bussinessType=5&callbackMsg=callbackMsg&sFlag=false&callback=callbackMsg

callbackMsg({ “result”:0, “preUrl”:”http://id6.me/openapi/networkauth/preGetMobile.do?sign=83C635DFA36E9E119C25EE3350CC7E46E4D8F9E9¶mStr=DCE7D0A0714A333877466D264ACFAF95D781BB52204DB909059E13D0F27CED71374E9FD9D8B42C34F4DD2B8FFB52BAF9BF80C41502AEDA5BA05E2B70BE536FBCEBF42FA6C63B79F82FD12E5FF851090FD1DC2A9DE1508B35A4701B4A91AF0B6AF2783BA67BE71BED5CBCF73D6D10BD7B05A5B835E4D4AAC36CA078216C98DE73BF9447006B9E76FF9B050EE4F45DD36B&format=jsonp¶mKey=A5AFB2B7167CC91D9126EF900B16B3A6A183712BF6A1659C56A2B1239B5B85BEB72575085E3E362664602B8E1129BD1183C57739601FC42352C5DAE685F196AAD18B86922B520FDE06CDF09DDD05227EA08730504B7DD338A053E8246FD6D5D487116A3C614DD6C6BD13CFF1D77BEEDAEEE7462BC7BCD7FF5A927A06FC88D69C&clientId=8023528553&version=v1.0&clientType=2″, “msg”:”success”, “aesCacheKey”:”191abc14-4a6c-44b7-966a-559dae683db5″ })

http://id6.me/openapi/networkauth/preGetMobile.do?sign=83C635DFA36E9E119C25EE3350CC7E46E4D8F9E9¶mStr=DCE7D0A0714A333877466D264ACFAF95D781BB52204DB909059E13D0F27CED71374E9FD9D8B42C34F4DD2B8FFB52BAF9BF80C41502AEDA5BA05E2B70BE536FBCEBF42FA6C63B79F82FD12E5FF851090FD1DC2A9DE1508B35A4701B4A91AF0B6AF2783BA67BE71BED5CBCF73D6D10BD7B05A5B835E4D4AAC36CA078216C98DE73BF9447006B9E76FF9B050EE4F45DD36B&format=jsonp¶mKey=A5AFB2B7167CC91D9126EF900B16B3A6A183712BF6A1659C56A2B1239B5B85BEB72575085E3E362664602B8E1129BD1183C57739601FC42352C5DAE685F196AAD18B86922B520FDE06CDF09DDD05227EA08730504B7DD338A053E8246FD6D5D487116A3C614DD6C6BD13CFF1D77BEEDAEEE7462BC7BCD7FF5A927A06FC88D69C&clientId=8023528553&version=v1.0&clientType=2

http://id6.me/openapi/networkauth/preGetMobile.do?sign=83C635DFA36E9E119C25EE3350CC7E46E4D8F9E9¶mStr=DCE7D0A0714A333877466D264ACFAF95D781BB52204DB909059E13D0F27CED71374E9FD9D8B42C34F4DD2B8FFB52BAF9BF80C41502AEDA5BA05E2B70BE536FBCEBF42FA6C63B79F82FD12E5FF851090FD1DC2A9DE1508B35A4701B4A91AF0B6AF2783BA67BE71BED5CBCF73D6D10BD7B05A5B835E4D4AAC36CA078216C98DE73BF9447006B9E76FF9B050EE4F45DD36B&format=jsonp¶mKey=A5AFB2B7167CC91D9126EF900B16B3A6A183712BF6A1659C56A2B1239B5B85BEB72575085E3E362664602B8E1129BD1183C57739601FC42352C5DAE685F196AAD18B86922B520FDE06CDF09DDD05227EA08730504B7DD338A053E8246FD6D5D487116A3C614DD6C6BD13CFF1D77BEEDAEEE7462BC7BCD7FF5A927A06FC88D69C&clientId=8023528553&version=v1.0&clientType=2

请使用电信号在4G网络下使用

联通
10.0.0.1 opencloud.wostore.cn 小沃科技有限公司
10.0.0.1 auth.wosms.cn 联通在线信息科技有限公司
10.0.0.1 id.mail.wo.cn 中国联合网络通信集团有限公司
mdn.open.wo.cn
hmrz.wo.cn

nishub1.10010.com
nisportal.10010.com  (这个可能没关系)

enrichgw.10010.com


联通有多个子公司对外提供这个服务,需要屏蔽的域名最多

https://hmrz.wo.cn/sdk-resource/terms/number_authentication.html

https://auth.wosms.cn/api/netm/v1.0/gmbs?seq=

返回:
{
“code”:1,
“msg”:”公网IP无效”,
“seq”:””
“status”:1101
}

https://auth.wosms.cn/dro/netm/v1.0/qc

apiKey
params
paramsKey
sign
sign_Type

https://nisportal.10010.com:9004/api?appid=&ret_url=

https://id.mail.wo.cn/openapi/auth/accessToken.do?appId=
appType=
version=
paramKey
paramStr
sign

重定向:
http://123.125.99.9:9001/api?
appid=

https://id.mail.wo.cn/openapi/auth/accessToken/callback.do?appId
operatorType
appName
appType
version
aeskey

{ “msg”:网络不能识别
“result”:3002}

——————-
https://mail.wo.cn/wap/noPwdLogin.wo
返回

{
“paramLogin”:
“https://id.mail.wo.cn/openapi/auth/accessToken.do?
appId=D0C910F6135849B1B347BAE6ADC2930D
&appType=17
&version=v1.0
&sign=
¶mKey=
¶mStr=

}

linux控制智能卡读卡器的输出电压

libccid

/usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist -> /etc/libccid_Info.plist

修改 ifdDriverOptions 的值

0 表示输出 5V电压(这也是默认值)
16 也就是0x10, 表示输出3V电压,如果失败,再输出5V
32, 也就是0x20, 表述输出1.8V,如果失败,再分别尝试3V和5V
48, 也就是0x30, 让读卡器自己选择。

某些读卡器不支持驱动对其进行电压设置

比如 深圳神州科技 用Identive/SCM芯片做的
Identiv SCR35xx USB Smart Card Reader [CCID Interface]
Identive CLOUD 2700 R Smart Card Reader [CCID Interface]

始终使用5V电压

而 SSK和Hawk用 Realtek 芯片做的读卡器 就支持驱动设置电压

Generic USB2.0-CRW [Smart Card Reader Interface]
Generic Smart Card Reader Interface [Smart Card Reader Interface]