XN规范说明
XMOS硬件平台利用XN文件来描述其功能特性。每一个XN文件都向XMOS编译工具链提供了关于目标硬件的详细信息,这包括XMOS设备、端口、闪存以及振荡器等内容。
XTC工具链会根据XN文件中的数据生成针对特定平台的头文件——<platform.h>,并将其用于多节点程序的编译、启动和调试过程。
网络组件
以下是网络定义的详细规定:
<?xml version="1.0" encoding="UTF-8"?>
<Network xmlns="http://www.xmos.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.xmos.com http://www.xmos.com">
XN 元素的层次结构如下:
**节点** **数量** **描述**
Network 1 xCORE 网络
├── Declarations 0+
│ └── Declaration 1+ xCORE Tile 声明
├── Packages 1+
│ └── Package 1+ 芯片封装
│ ├── Nodes 1
│ │ └── Node 1+ 节点的声明
│ │ ├── Tile 1+ 一个 xCORE Tile
│ │ │ └── Port 0+ 一个 xCORE 符号端口名称
│ │ ├── Boot 0 or 1 启动方式
│ │ │ ├── Source 1 二进制文件位置
│ │ │ └── Bootee 0+ 启动的节点
│ │ ├── Extmem 0 or 1 外部存储器配置
│ │ │ ├── Lpddr 1 LPDDR 设备输出的 PAD 控制
│ │ │ └── Padctrl 1 xcore.ai 输出的 PAD 控制
│ │ ├── RoutingTable 0 or 1
│ │ │ ├── Bits 1
│ │ │ │ └── Bit 1+ bit 的方向
│ │ │ └── Links 1
│ │ │ └── Link 1+ link 的方向
│ │ └── Service 0+ 服务的声明
│ │ └── Chanend 1+ Chanend 参数
│ └── Links 0 or 1
│ ├── Link 1+ xCONNECT 链接声明
│ └── LinkEndpoint 2 xCONNECT 链接端点
├── ExternalDevices 0 or 1
│ └── Device 1+ 外部设备
│ └── Attribute 0+ 设备属性
└── JTAGChain 0 or 1
└── JTAGDevice 1+ JTAG 链上的设备
Declaration
Declaration元素为一个或多个 xCORE Tiles 提供符号名称。支持单个名称或名称数组格式:
tileref标识符tileref` * 标识符* `[` *常量表达式* `]
相对应的声明会被导出到头文件 <platform.h> ,以在 XC 程序中使用。tileref 声明通过 Tile 元素 的引用属性与物理 xCORE tiles 关联。
示例
<Declaration>tileref master</Declaration>
<Declaration>tileref tile[8]</Declaration>
Package
Package元素引用一个封装文件,该文件描述了从 xCORE 端口和链接到封装引脚的映射关系。
| 属性 | 是否必填 | 类型 | 描述 |
|---|---|---|---|
| Id | 是 | 字符串 | 封装的名称。在网络中所有的封装名称都必须是唯一的。 |
| Type | 是 | 字符串 | XML封装的名称。XTC工具链会在 XCC_DEVICE_PATH 指定的路径中搜索 <type>.pkg 文件。 |
示例
<Package id="L2" Type="XS1-L2A-QF124">
名为 L2 的封装在 XS1-L2A-QF124.xml 文件中有详细描述。
Node
Node 元素定义了网络中一组连接到xCONNECT的 xCORE Tiles。XMOS 的 xcore.ai 设备 XU316-1024-FB265 就是一个节点的例子。
| 属性 | 是否必填 | 类型 | 描述 |
|---|---|---|---|
| Id | 否 | 字符串 | 节点的名称。网络中所有节点的名称必须唯一。 |
| Type | 是 | 字符串 | 如果类型是 periph:XS1-SU,这个节点就是一个 XS1-SU 外围节点。否则,这个类型指定了描述节点的 XML 文件名。XTC工具链会在由 XCC_DEVICE_PATH 指定的路径中搜索文件 config_<type>.xml。 |
| Reference | 是 | 字符串 | 将节点与在 Declaration 中指定的 xCORE Tile 标识关联。此属性仅对 periph:XS1-SU 类型的节点有效。 |
| RoutingId | 否 | 整数 | 在 xCONNECT Link 网络上的路由标识符。 |
| InPackageId | 是 | 字符串 | 将节点映射到封装文件中的某个元素。 |
| Oscillator | 否 | 字符串 | PLL 振荡器输入频率,需要以数字后接 MHz、KHz 或 Hz 的格式指明。 |
| OscillatorSrc | 否 | 字符串 | 供应 PLL 振荡器输入的节点名称。 |
| SystemFrequency | 否 | 字符串 | 系统频率,需要以数字后接 MHz、KHz 或 Hz 的格式指明。默认值为 400MHz,如果没有设置的话。 |
| PllFeedbackDivMin | 否 | 整数 | 允许的最小 PLL 反馈分隔。默认值为 1,如果没有设置的话。 |
| ReferenceFrequency | 否 | 字符串 | 参考时钟频率,需要以数字后接 MHz、KHz 或 Hz 的格式指明。默认值为 100MHz,如果没有设置的话。 |
| PllDividerStageOneReg | 否 | 整数 | PLL 分频器一级寄存器的值。 |
| PllMultiplierStageReg | 否 | 整数 | PLL 乘法器阶段寄存器的值。 |
| PllDividerStageTwoReg | 否 | 整数 | PLL 分频器二级寄存器的值。 |
| SecondaryPllInputDiv | 否 | 整数 | 次级 PLL 输入除法器寄存器的值。 |
| SecondaryPllOutputDiv | 否 | 整数 | 次级 PLL 输出除法器寄存器的值。 |
| SecondaryPllFeedbackDiv | 否 | 整数 | 次级 PLL 反馈分频器寄存器值 |
| RefDiv | 否 | 整数 | SystemFrequency / RefDiv = ReferenceFrequency |
PLL寄存器能够通过属性SystemFrequency、PllFeedbackDivMin和ReferenceFrequency进行自动配置,或者利用属性PllDividerStageOneReg、PllMultiplierStageReg、PllDividerStageTwoReg以及RefDiv进行手动配置。如果提供了前三个属性中的任何一个,就不能提供后四个属性,反之亦然。
PLL振荡器输入频率可以通过属性Oscillator或OscillatorSrc指定。如果提供了Oscillator属性,那么就不能再提供OscillatorSrc属性,反之亦然。
在手动配置下,必须提供属性PllDividerStageOneReg、PllMultiplierStageReg、PllDividerStageTwoReg以及RefDiv,同时也必须明确指定PLL振荡器的输入频率。XTC工具链会使用这些值来设定PLL寄存器和参考时钟分频器。关于PLL分频器的更多信息,请参考xCORE频率控制文档 XS1 L Clock Frequency Control。
如果指定 了振荡器频率,并且没有提供手动 PLL 属性,则将使用自动配置。工具尝试编程 PLL 寄存器,以实现目标系统频率、PLL 反馈分频器大于或等于最小值以及目标参考时钟频率。如果无法满足这些约束条件,工具会发出警告并报告实际使用的值。
如果没有指定振荡器频率,则工具不会尝试配置 PLL。PLL 寄存器保持其由模式引脚确定的初始值。
辅助 PLL 只能通过提供 SecondaryPllInputDiv、SecondaryPllOutputDiv 和 SecondaryPllFeedbackDiv 进行手动配置。
示例
<Node Id="0" InPackageId="0" Type="XS3-L16A-1024" Oscillator="24MHz" SystemFrequency="600MHz" ReferenceFrequency=”100MHz”>
Tile
Tile 元素描述了单个 xCORE Tile 的属性。
| 属性 | 是否必需 | 类型 | 描述 |
|---|---|---|---|
| Number | 是 | 整数 | Tile 在节点中的唯一编号。取值范围为 0 到 n-1,其中 n 是节点 XML 文件中定义的 Tile 数量。 |
| Reference | 否 | 字符串 | 将 Tile 与在 Declaration 中以 tile[n] 形式的标识符关联起来。一个 Tile 最多可以关联一个标识符。 |
示例
<Tile Number="0" Reference="tile[0]">
Port
Port 元素为端口提供了一个符号名称。
| 属性 | 必需 | 类型 | 描述 |
|---|---|---|---|
| Location | 是 | 字符串 | 在标准头文件<xs1.h>中定义的端口标识符。端口的描述可以在XC编程指南中找到。 |
| Name | 是 | 字符串 | 有效的C预处理器标识符。在网络中声明的所有端口名称都必须是唯一的。 |
示例
<Port Location="XS1_PORT_1I" Name="PORT_UART_TX"/>
<Port Location="XS1_PORT_1J" Name="PORT_UART_RX"/>
Boot
Boot 元素定义了节点的启动方式。它包含一个Source 元素和零个或多个通过xCONNECT链接进行引导的Bootee 元素。如果源指定了一个xCONNECT链接,则不允许指定Bootee元素。在XS1-L设备线中,从SPI引导的设备与被引导设备必须是连续的。
XMOS XTC工具链需要一个 Boot 元素才能够从闪存中启动程序。
Source
Source元素指定了节点启动的位置。它具有以下属性。
| 属性 | 是否必需 | 类型 | 描述 |
|---|---|---|---|
| Location | 是 | 字符串 | 形式为SPI:或LINK。 device-name必须在Device元素集合中声明。 |
XMOS XS1-G设备无法配置为通过xCONNECT链接启动。
示例
<Source Location="SPI:bootFlash"/>
Bootee
Bootee元素指定了此节点通过xCONNECT链接启动的系统中的另一个节点。如果在此节点和其引导设备之间配置了多个 xCONNECT 链接(参见Link和LinkEndpoint),XTC工具链会选择其中一个用于引导启动。
| 属性 | 是否必需 | 类型 | 描述 |
|---|---|---|---|
| NodeId | 是 | 字符串 | 另一个节点的有效标识符。 |
示例
<Bootee NodeId="Slave">
Bit
Bit元素用于指定当消息中与特定位数(number属性)相对应的位出现差异时,应该如何决定消息的传输方向
| 属性 | 必需 | 类型 | 描述 |
|---|---|---|---|
| number | 是 | 整数 | bit的数量,从最低有效位开始编号。 |
| direction | 是 | 整数 | 路由消息的方向。 |
示例
<Bit number="1" direction="0"/>
Link
当在RoutingTable元素内出现时,Link元素指定了xCONNECT链接的方向。
| 属性 | 是否必需 | 类型 | 描述 |
|---|---|---|---|
| name | 是 | 字符串 | 形式为X<n>L<m>的链接标识符,其中<n>表示tile编号,<m>表示链接字母。可用的链接针脚布局可以参见相应的封装数据表。 |
| direction | 是 | 整数 | 链接的方向。 |
示例
<Link number="XLA" direction="2"/>
Service
Service元素指定了一个节点所提供的XC服务功能。
| 属性 | 是否必须 | 类型 | 描述 |
|---|---|---|---|
| Proto | 是 | 字符串 | 服务函数的原型,不包括service关键字。此原型会被导出到头文件<platform.h>中,供XC程序使用。 |
示例
<Service Proto="service_function(chanend c1, chanend c2)">
XSCOPE 示例
以下文本是使得调试时支持XSCOPE所必需的,并且必须位于<Network>元素下(与<Links>同级):
<Nodes>
<Node Id="2" Type="device:" RoutingId="0x8000">
<Service Id="0" Proto="xscope_host_data(chanend c);">
<Chanend Identifier="c" end="3"/>
</Service>
</Node>
</Nodes>
Chanend
Chanend元素描述了一个用于XC服务函数的通道端参数。
| 属性 | 是否必须 | 类型 | 描述 |
|---|---|---|---|
| Identifier | 是 | 字符串 | 在服务函数原型中的chanend参数的标识符。 |
| end | 是 | 整数 | 当前节点上通道端的编号。 |
| remote | 是 | 整数 | 连接到当前节点上的通道端的远程通道端的编号。 |
示例
<Chanend Identifier="c" end="23" remote="5"/>
Link
xCONNECT链路在系统规格文档(XS1 L 系统规格)和链路性能文档(XS1 L 链路性能/设计指南)中有描述。
Link元素描述了一个xCONNECT链路的特性。它必须包含两个LinkEndpoint子元素。
| 属性 | 是否必需 | 类型 | 描述 |
|---|---|---|---|
| Encoding | 是 | 字符串 | 必须是2wire或5wire之一。 |
| Delays | 是 | 字符串 | 形如<x>clk,<y>clk的格式,其中<x>指定了端点 的 inter-token 延迟值,<y>指定了端点的 intra-token 延迟值。<x>和<y>被指定为一定数量的SystemFrequency周期。如果省略了,<y>clk,则使用<x>clk的值作为 intra-token 延迟值。 |
| Flags | 否 | 字符串 | 指定链接的附加属性。使用XSCOPE值来指定用于发送xSCOPE跟踪信息的链接。 |
示例
<Link Encoding="2wire" Delays="4clk,4clk">
LinkEndpoint
LinkEndpoint描述了一个xCONNECT链路的一端,具体细节可在系统规格文档(XS1 L 系统规格)中找到。每个端点将节点标识符关联到一个物理xCONNECT链路。
| 属性 | 是否必需 | 类型 | 描述 |
|---|---|---|---|
| NodeID | 否 | 字符串 | 有效的节点标识符。 |
| Link | 否 | 字符串 | 形如X<n>L<m>的链路标识符,其中<n>表示tile编号,<m>表示链路字母。查看相应的封装数据表以获取可用的链路引脚布局。 |
| RoutingId | 否 | 整数 | xCONNECT链路网络上的路由标识符。 |
| Chanend | 否 | 整数 | 一个通道端。 |
| BootRomEnabled | 否 | 整数 | 链路在启动时被激活,因此可以考虑在广域网络中使用(多个XMOS节点)。 |
端点通常被描述为节点标识符和链路标识符的组合。对于流式调试链路,其中一个端点必须被描述为路由标识符和通道端的组合。例如:
<LinkEndpoint NodeId="0" Link="X0LD"/>
<LinkEndpoint RoutingId="0x8000" Chanend="1">
下表突出显示了在LinkEndpoint元素中用于Link属性的正确链路名称。
| xConnect 链路编号 | xCORE “L” 系列链路名称 | xCORE-200 链路名称 |
|---|---|---|
| 0 | XLC | XL0 |
| 1 | XLD | XL1 |
| 2 | XLA | XL2 |
| 3 | XLB | XL3 |
| 4 | XLG | XL4 |
| 5 | XLH | XL5 |
| 6 | XLE | XL6 |
| 7 | XLF | XL7 |
| 8 | N/A | XL8 |
在xCORE-200 XN规格中不能使用xCORE “L” 系列的链路名称。
在xCORE “L” 系列XN规格中不能使用xCORE-200的链路名称。
以下示例演示了在xCORE “L” 系列XN规格中,如何连接节点0的链路编号4和节点1的链路编号7:
<Links>
<Link Encoding="5wire" Delays="0,1">
<LinkEndpoint NodeId="0" Link="XLG"/>
<LinkEndpoint NodeId="1" Link="XLF"/>
</Link>
</Links>
下面的示例演示了一个 xCORE-200系列XN规格中,如何连接节点0的链路编号4和节点1的链路编号7:
<Links>
<Link Encoding="5wire" Delays="4,4">
<LinkEndpoint NodeId="0" Link="XL4"/>
<LinkEndpoint NodeId="1" Link="XL7"/>
</Link>
</Links>
Device
Device元素描述了一个连接到xCORE Tile的设备,该设备并未直接连接到xCONNECT链路。
| 属性 | 是否必需 | 类型 | 描述 |
|---|---|---|---|
| Name | 是 | 字符串 | 命名设备的标识符 |
| NodeId | 是 | 字符串 | 设备所连接节点的标识符 |
| Tile | 是 | 整数 | 设备所连接的节点内的tile |
| Class | 是 | 字符串 | 设备的类别 |
| Type | 否 | 字符串 | 设备的类型(取决于类别) |
| PageSize | 是 | 整数 | 设备的程序页大小 |
| SectorSize | 是 | 整数 | 设备的擦除扇区大小 |
| NumPages | 是 | 整数 | 设备中的程序页数量 |
对于属性名Class,目前可选的值为以下几种:
-
SPIFlash设备为SPI闪存
-
SQIFlash设备为QuadSPI闪存
使用Type属性来识别闪存设备的型号。
Attribute
Attribute元素描述了设备的一项特性,与Flash的配置选项相关。
| 属性 | 是否必需 | 类型 | 描述 |
|---|---|---|---|
| Name | 是 | 字符串 | 指明设备的某一属性。 |
| Value | 是 | 字符串 | 指定与属性相关联的值。 |
以下是设备(通常是flash)支持的属性名称,属于SPIFlash类:
-
PORT_SPI_MISOSPI主设备输入,从设备输出信号。
-
PORT_SPI_SSSPI从设备选择信号。
-
PORT_SPI_CLKSPI时钟信号。
-
PORT_SPI_MOSISPI主设备输出,从设备输入信号。
示例
<Attribute Name="PORT_SPI_MISO" Value="PORT_SPI_MISO"/>
以下是设备支持的属性名称,属于SQIFlash类:
-
PORT_SQI_CSQuadSPI芯片选择信号。
-
PORT_SQI_SCLKQuadSPI时钟信号。
-
PORT_SQI_SIOQuadSPI输入/输出信号。
-
QE_REGISTER此项为可选,仅对不支持JEDEC SFDP的设备需要。有效值包括
flash_qe_location_status_reg_0和flash_qe_location_status_reg_1。 -
QE_BIT此项为可选,仅对不支持JEDEC SFDP的设备需要。有效值范围从
flash_qe_bit_0到flash_qe_bit_7。
示例
<Attribute Name="PORT_SQI_SIO" Value="PORT_SQI_SIO"/>
闪存设备示例
下述示例展示了一个闪存设备的完整描述信息。
<ExternalDevices>
<Device NodeId="0" Tile="0" Class="SQIFlash" Name="bootFlash" Type="S25FL116K" PageSize="256" SectorSize="4096" NumPages="16384">
<Attribute Name="PORT_SQI_CS" Value="PORT_SQI_CS"/>
<Attribute Name="PORT_SQI_SCLK" Value="PORT_SQI_SCLK"/>
<Attribute Name="PORT_SQI_SIO" Value="PORT_SQI_SIO"/>
<Attribute Name="QE_REGISTER" Value="flash_qe_location_status_reg_0"/>
<Attribute Name="QE_BIT" Value="flash_qe_bit_6"/>
</Device>
</ExternalDevices>
JTAGChain
JTAGChain元素用于描述JTAG链中的一个设备。这些元素的排列顺序决定了它们在JTAG链中的位置。
| 属性 | 是否必需 | 类型 | 描述 |
|---|---|---|---|
| JTAGSpeed | 否 | 字符串 | 设置JTAG的时钟速度。 |
JTAGDevice
| 属性 | 是否必需 | 类型 | 描述 |
|---|---|---|---|
| NodeID | 是 | 字符串 | 有效的节点标识符。 |
示例
<!-- N1 comes before N2 in the JTAG chain -->
<JTAGDevice NodeId="N1">
<JTAGDevice NodeId="N2">