OpenOCD的文档东西比较多,还有很多可能与DAPLink无关,所以改为分析stm32f0x.cfg文件,逐步学习每个的含义。
1. source [find target/swj-dp.tcl]
source and find commands,命令格式:
source [find FILENAME]
使用的规则:
2.打开swj-dp.tcl文件,tcl命令可以到以下网址查看命令的说明
http://jim.tcl.tk/fossil/doc/trunk/Tcl_shipped.html#_eval
可以查找关键字“BUILT-IN COMMANDS”,有所有命令字的链接。
if [catch {transport select}] {
echo "Error: unable to select a session transport. Can't continue."
shutdown
}
这句是tcl命令,不是OpenOcd的命令,所以文档openocd.pdf没有这个命令。
catch是一个错误捕捉器。有1到2个参数
第一个参数是“要执行的代码”
第二个(可选)是错误消息的放置位置。
CATCH成功时返回0,失败时返回1。
这段命令的含义是判断transport select是否正确,如果不正确则输出错误信息。
proc swj_newdap {chip tag args} {
if [using_hla] {
eval hla newtap $chip $tag $args
} elseif [using_jtag] {
eval jtag newtap $chip $tag $args
} elseif [using_swd] {
eval swd newdap $chip $tag $args
}
}
proc实际上是一个带3个参数(函数名,参数,函数体)的命令。用于创建新的Tcl命令过程。
eval是将多个参数共同组成一个Tcl命令,比如eval swd newdap $chip $tag $args就是把newdap $chip $tag $args组合成swd命令。
3. 打开mem_helper.tcl文件
定义了4个函数,分别是mrw(memory读字),mrh(memory读半字),mrb(memory读字节),mmw(memory读改写)。
读函数都调用了mem2array,找不到mem2array的说明,估计是OpenOCD的API函数,网上看资料还有一个array2mem。以mrw说明一下mem2array的含义(不一定正确)
proc mrw {reg} {
set value ""
mem2array value 32 $reg 1
return $value(0)
}
从寄存器reg(精确到1字节)读32bit数据到value。
mem2array arrayname width address count
array2mem arrayname width address count
另外,mmw中调用了mww,看字面意思是memory write word,但是没有找这个函数在哪里定义的。
4. if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME stm32f0x
}
exists:检查变量/过程(proc)/命令/别名是否存在,存在返回1,否则返回0.
info:向Tcl解释器提供各种内部信息,而info exists则表示该变量是否存在于当前上下文中。
5. set _ENDIAN little
设置大小端模式
6. if { [info exists WORKAREASIZE] } {
set _WORKAREASIZE $WORKAREASIZE
} else {
set _WORKAREASIZE 0x1000
}
WORKAREASIZE是设置flash烧录用到的ram空间,默认是4KB。
7. if { [info exists FLASH_SIZE] } {
set _FLASH_SIZE $FLASH_SIZE
} else {
# autodetect size
set _FLASH_SIZE 0
}
设置运行覆盖的flash宽度大小,以字节为单位;大多数微控制器忽略。
8. if { [info exists CPUTAPID] } {
set _CPUTAPID $CPUTAPID
} else {
# See STM Document RM0091
# Section 29.5.3
set _CPUTAPID 0x0bb11477
}
设置TAPID,在下面newtap命令中详细介绍。
这个ID一般情况是芯片厂家提供,不过也可以在MDK的工具看到9. swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
swj_newdap就是前面介绍的文件swj-dp.tcl中的一个过程。在openocd.pdf中可以看10.3 TAP Declaration Commands中的jtag newtap的介绍。
具体的命令格式:
jtag newtap chipname tapname configparams...
定义一个新的TAP,configparams是对应tap的参数列表。
chipname是芯片的符号名。一般使用$芯片名,默认为芯片供应商提供的名字。
tapname 反映了TAP的作用,有固定的关键字:
参数不是固定的,但是每种TAP都会有参数-irlen,
指令寄存器的位长度,如4或5位。
其他参数:
使用-disable来标记一个TAP在TRST或JTAG 处在RESET状态复位后不链接到扫描链。-enable则表示链接。
非0,32bit,表示扫描链的ID。可以有多个ID(比如表示不同的版本)。
指定此选项可忽略-expected id选项中的JTAG version字段。IDCODE的28-31bit是JTAG的version字段。
在进入ircapture状态时,由TAP加载到JTAG移位寄存器的位模式,如0x01。JTAG要求此值的最低2个位为01。默认情况下,-ircapture和-irmask设置为验证两位值。如果可以提供已知的额外的位,或者指示TAP不符合JTAG规范。
与-ircapture一起使用的掩码,用于验证指令扫描是否正常工作。OpenOCD不使用此类扫描,除非验证JTAG扫描链操作是不是没有问题。
设置这个参数用于忽略ARM DAP DP CTRL/STAT寄存器的CSYSPWRUPACK位。
10. dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cpu
命令原型:dap create dap name -chain-position dotted.name configparams...
申明一个名为dap name的DAP实例并链接到名为dotted.name的JTAG tap上。这条命令也创建了一个同名(dap name)的命令以方便用于额外的配置。一个JTAG tap只能由一个DAP实例。
11. set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME cortex_m -endian $_ENDIAN -dap $_CHIPNAME.dap
命令原型:target create target_name type configparams...
此命令创建一个GDB调试目标,该目标用于特定的JTAG tap。它将该目标输入到一个列表中,并创建一个用于各种目的(包括附加配置)的新命令(目标名称)。
调试目标的名称,按照惯例,这应该与与此目标关联的TAP的dotted.name相同。
指定目标类型,
$target_name配置接受的所有参数都是按次提交的。如果目标是big-endian,请在此处设置-endian big。必须在此处设置-chain position dotted.name或-dap dap_name。
12. $_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0
命令原型:$target_name configure configparams...
命名用于访问此目标的TAP。
命名用于访问此目标的DAP.
指定CPU使用大端还是小端。
后面再解释event
指示是否备份工作区;默认情况下,不备份。如果可能,请使用不需要备份的工作区,因为执行备份会减慢操作速度。
指定工作大小(字节)。无论使用的是物理地址还是虚拟地址,都应用相同的大小。
设置MMU不处于活动状态时要使用的工作区基址
设置MMU处于活动状态时要使用的工作区基址。除了在带有MMU的目标上,不要配置这个值。该值通常应与当前操作系统设置的-work area-phys地址的静态映射相对应。
对目标启用rtos支持,rtos类型可以是auto,eCos, ThreadX, FreeRTOS, linux, ChibiOS, embKernel, mqx, uCOS-III, nuttx
在初始JTAG链扫描和重置后跳过目标检查。需要手动调用arp examine才能访问目标进行调试。
为目标设置DAP访问端口,ap_number是目标连接到的DAP AP的数字索引。对于多个独立核心连接到同一DAP的单独访问端口的系统,请使用此选项。
设置与目标连接的交叉触发接口(CTI)。目前,只有aarch64目标使用此选项,它是目标运行控件的强制配置。
13. adapter_nsrst_delay 100
命令原型:adapter_nsrst_delay milliseconds
OpenOCD在撤销nSRST(系统复位低有效)后应等待多长时间(以毫秒为单位),然后才能启动新的JTAG操作。当电路有一个复位按钮连接到SRST线,它可能会有硬件去抖动,这意味着你应该使用这个。
14. reset_config srst_nogate
命令原型:reset_config mode_flag
此命令在目标配置脚本中显示或修改JTAG板和目标组合的复位配置。
mode_flag选项可以按任意顺序指定,但一次只能指定每种类型中的一种- signals, combination, gates, trst type, srst type和connect type。
signals可以指定连接了哪些复位信号。可能的值有:none (默认), trst_only, srst_only and trst_and_srst.
combination是一个可选值,用于指定中断的重置信号实现。如果没有指定选项,则默认separate,表示所有内容都正常工作。srst_pulls_trst表示测试逻辑与系统复位一起复位,trst_pulls_srst表示系统与测试逻辑一起复位。Combined则等于srst_pulls_trst和trst_pulls_srst都设置。
gates令牌控制标志用于描述在复位期间JTAG可能不可用的一些情况。srst_gates_jtag(默认)表示执行srst将进入jtag时钟。这意味着在执行SRST时,JTAG上不会发生通信。相反的是srst-nogate,这表明在srst处于活动状态时可以安全地发出JTAG命令。
connect type令牌控制标志用于描述在连接到目标时执行SRST的某些情况。使用此选项需要srst_nogate。connect_deassert_srst(默认)表示在连接到目标时不会执行srst。相反的是connect_assert_srst,表示srst将在任何目标连接之前被执行只有一些目标支持此功能,例如STM32和STR9。如果由于选项字节配置不正确或程序执行非法而无法连接到目标,则此功能非常有用。
测试复位信号(trst)可能的trst类型驱动模式是默认的trst_push_pull和trst_open_drain。
系统复位信号(srst)的可能srst类型驱动程序模式是默认srst_open_drain和srst_push_pull
15. $_TARGETNAME configure -event examine-end { stm32f0x_default_examine_end }
$_TARGETNAME configure -event reset-start { stm32f0x_default_reset_start }
$_TARGETNAME configure -event reset-init { stm32f0x_default_reset_init }
在不同的时间,某些事情会发生,或者你希望它们发生。这些事情可以由目标event处理程序寻址。Event有固定的事件,具体参考文档openocd.pfd的11.5 Target Events中的定义。