CoreSight 嵌入式交叉触发器 (CTI & CTM)。¶
- 作者:
Mike Leach <mike.leach@linaro.org>
- 日期:
2019 年 11 月
硬件描述¶
CoreSight 交叉触发接口 (CTI) 是一种硬件设备,它接收和发送被称为触发器的独立输入和输出硬件信号,通过交叉触发矩阵 (CTM) 将这些信号通过编号的通道连接到其他设备,以便在设备之间传播事件。
例如
0000000 in_trigs :::::::
0 C 0----------->: : +======>(other CTI channel IO)
0 P 0<-----------: : v
0 U 0 out_trigs : : Channels ***** :::::::
0000000 : CTI :<=========>*CTM*<====>: CTI :---+
####### in_trigs : : (id 0-3) ***** ::::::: v
# ETM #----------->: : ^ #######
# #<-----------: : +---# ETR #
####### out_trigs ::::::: #######
CTI 驱动程序能够对 CTI 进行编程,以将触发器连接到通道。当一个输入触发器变为活跃时,所连接的通道也会变为活跃。连接到该通道的任何输出触发器也将变为活跃。活跃的通道通过 CTM 传播到其他 CTI,从而激活连接的输出触发器,除非被 CTI 通道门过滤。
也可以通过系统软件直接编程 CTI 中的寄存器来激活通道。
CTI 由系统注册,以与 CPU 和/或追踪数据路径上的其他 CoreSight 设备关联。当这些设备启用时,所连接的 CTI 也会启用。默认情况下/上电时,CTI 没有编程的触发器/通道附件,因此在明确编程之前不会影响系统。
CTI 和设备之间的硬件触发连接是实现定义的,除非 CPU/ETM 组合是 v8 架构,在这种情况下,连接具有架构定义的标准布局。
硬件触发信号也可以连接到非 CoreSight 设备(例如 UART),或者作为硬件 I/O 线在芯片外传播。
所有 CTI 设备都与一个 CTM 相关联。在许多系统中,只有一个有效的 CTM(一个 CTM,或多个 CTM 全部互连),但系统可能存在 CTI+CTM 网络,它们之间没有通过 CTM 互连。在这些系统中,会声明一个 CTM 索引,用于关联通过给定 CTM 互连的 CTI 设备。
Sysfs 文件和目录¶
CTI 设备与 CoreSight 总线上的其他 CoreSight 设备一同显示。
>$ ls /sys/bus/coresight/devices
cti_cpu0 cti_cpu2 cti_sys0 etm0 etm2 funnel0 replicator0 tmc_etr0
cti_cpu1 cti_cpu3 cti_sys1 etm1 etm3 funnel1 tmc_etf0 tpiu0
命名为 cti_cpu<N>
的 CTI 与 CPU 和该核心使用的任何 ETM 相关联。 cti_sys<N>
CTI 是通用的系统基础设施 CTI,可以与其他的 CoreSight 设备或能够生成或使用触发信号的其他系统硬件相关联。
>$ ls /sys/bus/coresight/devices/etm0/cti_cpu0
channels ctmid enable nr_trigger_cons mgmt power powered regs
connections subsystem triggers0 triggers1 uevent
- 关键文件项有:-
enable
:启用/禁用 CTI。读取以确定当前状态。如果此项显示为已启用 (1),但powered
显示未供电 (0),则“启用”表示在设备供电时请求启用。ctmid
:关联的 CTM - 仅在系统具有多个未互连的 CTI+CTM 集群时相关。nr_trigger_cons
:总连接数 - triggers<N> 目录。powered
:读取以确定 CTI 当前是否已供电。
- 子目录:-
triggers<N>
:包含单个连接的触发器列表。channels
:包含通道 API - CTI 主要编程接口。regs
:提供对原始可编程 CTI 寄存器的访问。mgmt
:标准 CoreSight 管理寄存器。connections
:连接到关联的 CoreSight 设备。链接数量可以是 0 到nr_trigger_cons
。实际数量由该目录中的nr_links
给出。
triggers<N> 目录¶
单个触发器连接信息。这描述了 CoreSight 和非 CoreSight 连接的触发信号。
每个触发器目录都有一组描述连接触发器的参数。
name
:连接名称
in_signals
:此连接中使用的输入触发信号索引。
in_types
:输入信号的功能类型。
out_signals
:此连接的输出触发信号。
out_types
:输出信号的功能类型。
例如
>$ ls ./cti_cpu0/triggers0/
in_signals in_types name out_signals out_types
>$ cat ./cti_cpu0/triggers0/name
cpu0
>$ cat ./cti_cpu0/triggers0/out_signals
0-2
>$ cat ./cti_cpu0/triggers0/out_types
pe_edbgreq pe_dbgrestart pe_ctiirq
>$ cat ./cti_cpu0/triggers0/in_signals
0-1
>$ cat ./cti_cpu0/triggers0/in_types
pe_dbgtrigger pe_pmuirq
如果连接的“in”或“out”触发器中信号为零,则这些参数将被省略。
通道 API 目录¶
这提供了一种将触发器连接到通道的简便方法,无需直接操作“regs”子目录元素所需的多次寄存器操作。
许多文件提供了此 API。
>$ ls ./cti_sys0/channels/
chan_clear chan_inuse chan_xtrigs_out trigin_attach
chan_free chan_pulse chan_xtrigs_reset trigin_detach
chan_gate_disable chan_set chan_xtrigs_sel trigout_attach
chan_gate_enable chan_xtrigs_in trig_filter_enable trigout_detach
trigout_filtered
对这些元素的大多数访问采用以下形式:
echo <chan> [<trigger>] > /<device_path>/<operation>
其中可选的 <trigger> 仅在 trigXX_attach | detach 操作中需要。
例如
>$ echo 0 1 > ./cti_sys0/channels/trigout_attach
>$ echo 0 > ./cti_sys0/channels/chan_set
将 trigout(1) 连接到 channel(0),然后激活 channel(0),在 cti_sys0.trigout(1) 上生成一个设置状态。
API 操作
trigin_attach, trigout_attach
:将通道连接到触发信号。
trigin_detach, trigout_detach
:从触发信号中分离通道。
chan_set
:设置通道 - 设置状态将通过 CTM 传播到其他连接的设备。
chan_clear
:清除通道。
chan_pulse
:将通道设置为单个 CoreSight 时钟周期。
chan_gate_enable
:写入操作设置 CTI 门以将通道传播(启用)到其他设备。此操作需要一个通道号。CTI 门默认在上电时为所有通道启用。读取以列出当前在门上启用的通道。
chan_gate_disable
:写入通道号以禁用该通道的门。
chan_inuse
:显示当前连接到任何信号的通道。
chan_free
:显示没有连接信号的通道。
chan_xtrigs_sel
:写入通道号以选择要查看的通道,读取以显示所选通道号。
chan_xtrigs_in
:读取以显示连接到所选视图通道的输入触发器。
chan_xtrigs_out
:读取以显示连接到所选视图通道的输出触发器。
trig_filter_enable
:默认为启用,禁用以允许设置潜在危险的输出信号。
trigout_filtered
:如果启用了过滤trig_filter_enable
,则阻止设置输出触发信号。其中一个用途是防止意外的EDBGREQ
信号停止核心。
chan_xtrigs_reset
:写入 1 以清除所有通道/触发器编程。将设备硬件重置为默认状态。
下面的示例将输入触发器索引 1 连接到通道 2,并将输出触发器索引 6 连接到同一通道。然后使用相应的 sysfs 属性检查通道/触发器连接的状态。
这些设置意味着如果输入触发器 1 或通道 2 变为活跃,则输出触发器 6 将变为活跃。然后我们启用 CTI,并使用软件通道控制来激活通道 2。我们在 choutstatus
寄存器上看到活跃通道,并在 trigoutstatus
寄存器上看到活跃信号。最后,清除通道会移除此状态。
例如
.../cti_sys0/channels# echo 2 1 > trigin_attach
.../cti_sys0/channels# echo 2 6 > trigout_attach
.../cti_sys0/channels# cat chan_free
0-1,3
.../cti_sys0/channels# cat chan_inuse
2
.../cti_sys0/channels# echo 2 > chan_xtrigs_sel
.../cti_sys0/channels# cat chan_xtrigs_trigin
1
.../cti_sys0/channels# cat chan_xtrigs_trigout
6
.../cti_sys0/# echo 1 > enable
.../cti_sys0/channels# echo 2 > chan_set
.../cti_sys0/channels# cat ../regs/choutstatus
0x4
.../cti_sys0/channels# cat ../regs/trigoutstatus
0x40
.../cti_sys0/channels# echo 2 > chan_clear
.../cti_sys0/channels# cat ../regs/trigoutstatus
0x0
.../cti_sys0/channels# cat ../regs/choutstatus
0x0