文章目录
- 1.1 ROM Table
- 1.1.1 Entry 寄存器
- 1.2 ROM Table 例子
1.1 ROM Table
在一个SoC中,有多个Coresight 组件,但是软件怎么去识别这些 Coresight 组件,去获取这些Coresight 组件的信息了?这个时候,就需要靠 Coresight 组件中,一个重要的组件,这个组件就是 ROM Table
。
ARM规定,在一个SoC中,必须要实现至少 1 个 ROM Table,该 ROM Table,保存了SoC中各个Coresight 组件的信息,包括组件格式以及组件的基地址。
ROM Table 只会占用一个 4K
空间大小,也就是PIDR4
寄存器的SIZE为0
。
1.1.1 Entry 寄存器
对于 ROM Table,从 0x000-0xefc
,是 Entry 寄存器。每个 Entry 保存了一个Coresight 组件的信息。
[31:12]
是Coresight 组件,基于 ROM Table 基地址的偏移地址。例如 ROM table 的基地址为 0x2000_0000
,而[31:12]
为1
, 那么这个 Coresight 组件的基地址就是 0x2000_1000
。
[8:4]
和[2]
是用来说明该Coresight 组件所处的 power domain
。因为一个 SoC中,有多个power domain,而每个组件可能会处于不同的 power domain中。就依靠这两个位域说明。
[1]
,表示 Coresight 的寄存器的数据有效是8bit
,还是32bit
。
[0]
,表示这个 Entry 代表的组件是否有有效的。
一个 ROM Table 中,最多有 960
个 Entry ,也就是一个 ROM Table中,可以最多保存 960
个 Coresight 组件的信息,但是在一个 Entry 中,可以指向下一个rom table,这样,就扩展了保存Coresight 组件信息的个数。
如果rom table的 Entry 没有用完,那最后一个有效的 Entry 后的下一个 Entry , Entry 值为全0。
rom table的基地址,保存在 DAP 的AP的 base addr 寄存器中,这样 Debugger 通过访问 DAP的 AP,就可以获取到 Rom Table 的基地址,然后在访问 Rom Table,从而获取到整个SoC 中所有的 Coresight 组件的信息。
ROM Table的 Entry 指向,可以理解是一个链表,但是链表中,不能有环。如以下的 Entry 指向是错误的。
如果一个Coresight 组件,占用的空间,超过了4K
,但 Coresight 有规定,Coresight的寄存器,要实现在最后一个4K
的最后1K
位置,因此 ROM Table 中的该 Coresight 组件的基地址,为最后一个 4K
空间的基地址。
1.2 ROM Table 例子
例如,如下的 Coresight 系统,共4
个组件,假设第一个组件是ROM Table。假设 ROM Table 的基地址是 0x8000_0000
。
那么:
ROM Table 的基地址,存在 DAP 的 AP 的 base addr
寄存器中,外部通过访问 DAP 的这个寄存器,获取到 ROM Table 的基地址,然后就可以访问 ROM Table 各个 Entry 寄存器的值。
组件1,组件2,组件3的基地址信息,存放在 ROM Table
的 entry0,entry1,entry2 中。
-
对于组件1,
entry0
的[31:12]
为1
,表示组件1的基地址是0x8000_1000
,外部根据这个地址,就可以访问这个组件的 Coresight寄存器,从而获取到这个组件的信息。 -
对于组件2,因为这个组件,占用了
4
个4K
空间大小,ROM Table 中存放占用最后 1 个4K
空间的基地址,因此entry0
的[31:12]
为5
,表示 组件1 的基地址是0x8000_5000
,外部根据这个地址,就可以访问这个组件的 Coresight 寄存器,从而获取到这个组件的信息。通过读取PIDR4
寄存器的SIZE
信息,获取到该组件占用4
个4K
空间,从而反推,可以得到该组件的基地址是0x8000_2000
。 -
对于组件3,
entry0
的[31:12]
为6
,表示组件1 的基地址是0x8000_6000
,外部根据这个地址,就可以访问这个组件的 Coresight 寄存器,从而获取到这个组件的信息。
这样,外部就通 过 ROM Table,就可以获取到 SoC 中,所有 Coresight 组件的基地址。有了基地址,就可以对其进行访问。
推荐阅读: