编写设备驱动程序

附录 A 硬件概述

本附录介绍有关可以支持 Solaris OS 的硬件的一般问题。其中包括 Solaris OS 支持的处理器、总线体系结构以及内存模型。另外,还介绍了各种设备问题以及 Sun 平台中使用的 PROM。


注 –

本附录中的材料仅用于提供信息。此信息在调试驱动程序的过程中可能会有用。但是,Solaris DDI/DKI 接口会对设备驱动程序隐藏其中的许多实现详细信息。


本附录提供有关以下主题的信息:

SPARC 处理器问题

本节介绍了许多特定于 SPARC 处理器的主题,如数据对齐、字节排序、寄存器窗口以及浮点指令的可用性 。有关特定于 x86 处理器主题的信息,请参见x86 处理器问题


注 –

驱动程序决不能执行浮点操作,因为内核中不支持这些操作。


SPARC 数据对齐

所有数量均必须使用标准 C 数据类型与其自然边界对齐:

通常,编译器会处理所有对齐问题。但是,驱动程序编写者可能更关心对齐,因为只有使用正确的数据类型才能访问设备。由于设备寄存器通常是通过指针引用来访问的,因此驱动程序必须确保在访问设备时正确对齐指针。

SPARC 结构中的成员对齐

由于 SPARC 处理器强加的数据对齐限制,因此,C 结构也具有对齐要求。结构对齐要求是由最严格对齐的结构组件强加的。例如,仅包含字符的结构没有对齐限制,而对于包含 long long 成员的结构,则必须对其结构进行设置,保证此成员在 64 位边界上对齐。

SPARC 字节排序

SPARC 处理器使用大端字节序进行字节排序。整数的最高有效字节 (most significant byte, MSB) 存储在该整数的最低地址上。最低有效字节存储在此处理器中字的最高地址上。例如,字节 63 是 64 位处理器的最低有效字节。

图中显示如何在大端字节序体系结构中对字节进行排序,即字节 0 是最高有效字节。

SPARC 寄存器窗口

SPARC 处理器使用寄存器窗口。每个寄存器窗口包含八个输入寄存器、八个局部寄存器、八个输出寄存器以及八个全局寄存器。输出寄存器是下一个窗口的输入寄存器。寄存器窗口的数量范围从 2 到 32,具体取决于处理器实现。

由于驱动程序通常是使用 C 语言编写的,因此编译器通常不会指明使用了寄存器窗口。但是,当调试驱动程序时,可能必须使用寄存器窗口。

SPARC 乘法和除法指令

版本 7 SPARC 处理器没有乘法或除法指令。 乘法和除法指令是在软件中模拟实现的。由于驱动程序可能在版本 7、版本 8 或者版本 9 处理器中运行,因此请避免进行大量整数乘除。相反,请使用按位向左和向右移位来以 2 的幂进行相乘和相除。

SPARC Architecture Manual, Version 9》介绍了有关 SPARC CPU 的更具体信息。《SPARC Compliance Definition》(版本 2.4)介绍了 SPARC V9 的应用程序二进制接口 (application binary interface, ABI) 的详细信息。本手册介绍了 32 位 SPARC V8 ABI 和 64 位 SPARC V9 ABI。可以从 SPARC International 的网站 http://www.sparc.com 上获取本文档。

x86 处理器问题

数据类型没有对齐限制。但是,x86 处理器可能需要额外的存储周期来正确处理未对齐的数据传送。


注 –

驱动程序不应执行浮点操作,因为内核中不支持这些操作。


x86 字节排序

x86 处理器使用小端字节序进行字节排序。整数的最低有效字节 (least significant byte, LSB) 存储在该整数的最低地址上。最高有效字节存储在此处理器中数据项的最高地址上。例如,字节 7 是 64 位处理器的最高有效字节。

图中显示如何在小端字节序体系结构中对字节进行排序,即字节 0 是最低有效字节。

x86 体系结构手册

Intel Corporation 和 AMD 都发布了大量有关 x86 系列处理器的书籍。请参见 http://www.intel.comhttp://www.amd.com

字节存储顺序

为了实现多平台、多指令集体系结构可移植性的目标,驱动程序中删除了主机总线的相关组件。要解决的第一个相关性问题是处理器的字节存储顺序,即字节排序。例如, x86 处理器系列采用小端字节序,而 SPARC 体系结构采用大端字节序。

总线体系结构显示了与处理器相同类型的字节存储顺序。例如,PCI 局部总线采用小端字节序,S 总线采用大端字节序,ISA 总线采用小端字节序等。

要维持处理器与总线之间的可移植性, DDI 兼容驱动程序必须不采用任何端字节序。虽然驱动程序可以通过运行时检查或源代码中的预处理程序指令(如 #ifdef _LITTLE_ENDIAN) 管理其字节存储顺序,但是长期维护可能会很麻烦。在某些情况下,DDI 框架会使用软件方法来执行字节交换。在另外一些情况下,可以像内存管理单元 (memory management unit, MMU) 中那样通过硬件页级交换来执行字节交换,也可通过特殊计算机指令来执行字节交换。DDI 框架可以利用这些硬件功能来提高性能。

图 A–1 主机总线相关性所需的字节排序

图中显示反向字节存储顺序的字节交换。

除了不采用任何端字节排序之外,可移植驱动程序还必须独立于处理器的数据排序。在大多数情况下,必须按照驱动程序指示的顺序进行数据传送。但是,有时可以通过合并、批处理或者重新排列数据来简化数据传送,如下图中所示。例如,可以将数据合并应用于加速帧缓存器上的图形显示。驱动程序可以选择建议 DDI 框架在数据传送过程中使用其他最优传送机制。

图 A–2 数据排序主机总线相关性

图中显示通过 CPU 重新排列字节。

存储缓冲区

为提高性能,CPU 会使用内部存储缓冲区临时存储数据。使用内部缓冲区可能会对设备 I/O 操作的同步造成影响。因此,驱动程序需要执行明确的步骤来确保在适当的时间完成对寄存器的写入。

例如,假设通过锁来同步对设备空间(如寄存器或帧缓存器)的访问。驱动程序需要检查在释放锁之前是否实际完成了向设备空间中的数据存储。释放锁时并不一定会刷新 I/O 缓冲区。

另一个示例是,确认中断时,驱动程序通常会在设备控制寄存器中设置或清除一位。驱动程序必须确保在中断程序返回之前,已开始在设备上对控制寄存器进行写入。同样,在向控制寄存器写入了某一命令之后,设备可能要求延迟,即驱动程序繁忙,需要等待。在这种情况下,驱动程序必须确保在设备延迟之前已开始在该设备上进行写入。

当读取设备寄存器不会产生不良负面影响时,只需在写入之后立即读取就可以对写入进行验证了。如果无法在不产生不良负面影响的情况下读取该特定寄存器,则可以使用同一寄存器集中的其他设备寄存器。

系统内存模型

系统内存模型用于定义内存操作(如装入存储)的语义,并指定处理器执行这些操作的顺序与操作到达内存的顺序之间的关系。内存模型可同时适用于单处理器和共享内存多处理器。支持两种内存模型: 全存储排序 (total store ordering, TSO) 和部分存储排序 (partial store ordering, PSO)。

全存储排序 (Total Store Ordering, TSO)

TSO 可保证存储、FLUSH 以及原子装入存储指令出现在给定处理器的内存中的顺序与该处理器发出这些指令的顺序相同。

x86 和 SPARC 处理器均支持 TSO。

部分存储排序 (Partial Store Ordering, PSO)

PSO 无法保证存储、FLUSH 以及原子装入存储指令出现在给定处理器的内存中的顺序与该处理器发出这些指令的顺序相同。处理器可以对存储的指令重新排序,以使内存的存储指令顺序与 CPU 发出的存储指令顺序不同。

SPARC 处理器支持 PSO;x86 处理器则不支持。

对于 SPARC 处理器,指令的发出顺序和内存顺序之间的一致性是由系统框架使用 STBAR 指令实现的。如果以上指令中的两条指令按处理器的发出顺序由 STBAR 指令分隔,或者指令引用同一位置,则这两条指令的内存存储顺序与发出顺序相同。使用 ddi_regs_map_setup(9F) 接口可强制执行兼容 DDI 的驱动程序中的强数据排序。兼容的驱动程序不能直接使用 STBAR 指令。

有关 SPARC 内存模型的更多详细信息,请参见《SPARC Architecture Manual, Version 9》。

总线体系结构

本节介绍了设备标识、设备寻址和中断。

设备标识

设备标识是确定系统中存在哪些设备的过程。某些设备是自标识设备,意味着设备本身向系统提供信息,以便系统可以标识需要使用的设备驱动程序。S 总线和 PCI 局部总线设备是自标识设备的示例。在 S 总线上,信息通常是从设备上 FCode PROM 中存储的小 Forth 程序派生而来。大多数 PCI 设备都会提供包含设备配置信息的配置空间。有关更多信息,请参见 sbus(4)pci(4) 手册页。

所有现代总线体系结构都要求设备进行自标识。

支持的中断类型

Solaris 平台支持轮询中断和向量化中断。对于这两种中断类型,Solaris DDI/DKI 中断模型均相同。有关中断处理的更多信息,请参见第 8 章

总线特定信息

本节介绍特定于 Solaris 平台支持的总线的寻址问题和设备配置问题。

PCI 局部总线

PCI 局部总线是旨在实现高速数据传送的高性能总线。PCI 总线驻留在系统板上。此总线通常用作高度集成的外围组件、外围附件板以及主机处理器或内存系统之间的互连机制。主机处理器、主内存和 PCI 总线本身都通过 PCI 主桥 (host bridge) 连接,如图 A–3 中所示。

互连的 I/O 总线树结构通过一系列 PCI 总线网桥进行支持。可以在 PCI 主桥 (host bridge) 下扩展从属 PCI 总线网桥,以使单总线系统扩展为带有多条辅助总线的复杂系统。PCI 设备可以连接到其中的一条或多条辅助总线。此外,还可以连接其他总线网桥,如 SCSI 或 USB。

每个 PCI 设备都具有唯一的供应商 ID 和设备 ID。相同种类的多台设备会通过其驻留的总线上的唯一设备号进一步标识。

图 A–3 计算机结构图

图中显示 PCI 主桥 (host bridge) 如何将 CPU 和主内存连接到 PCI 总线。

PCI 主桥 (host bridge) 用于提供处理器和外围组件之间的互连。通过 PCI 主桥 (host bridge),处理器可以直接访问独立于其他 PCI 总线主控器的主内存。例如,当 CPU 正在从主桥 (host bridge) 中的高速缓存控制器中提取数据时,其他 PCI 设备也可以通过该主桥 (host bridge) 访问系统内存。这种体系结构的优点在于其分隔了 I/O 总线与处理器的主机总线。

PCI 主桥 (host bridge) 还可提供 CPU 和外围 I/O 设备之间的数据访问映射。该桥会将每个外围设备映射到主机地址域,以便处理器可以通过程控 I/O 访问此设备。在局部总线端,PCI 主桥 (host bridge) 会将系统内存映射到 PCI 地址域,以便 PCI 设备可以作为总线主控器访问主机内存。图 A–3 显示了两种地址域。

PCI 地址域

PCI 地址域包含三种不同的地址空间: 配置、内存以及 I/O 空间。

PCI 配置地址空间

配置空间按地理位置定义。外围设备的位置通过它在互连的 PCI 总线网桥树中的物理位置确定。设备按其总线编号设备插槽编号进行定位。每个外围设备在其 PCI 配置空间中都包含一组明确定义的配置寄存器。这些寄存器不仅用于标识设备,还用于为配置框架提供设备配置信息。例如,必须首先映射设备配置空间中的基址寄存器,然后设备才能响应数据访问。

生成配置周期的方法取决于主机。x86 计算机中使用的是特殊的 I/O 端口。在其他平台上,可以将 PCI 配置空间内存映射到对应于主机地址域中 PCI 主桥 (host bridge) 的某些地址位置。处理器访问设备配置寄存器时,会将请求路由到 PCI 主桥 (host bridge)。然后,该桥会在总线上将访问转换为正确的配置周期。

PCI 配置基址寄存器

PCI 配置空间针对每台设备最多包含六个 32 位基址寄存器。这些寄存器可同时提供大小和数据类型信息。系统固件会将 PCI 地址域中的基本地址分配给这些寄存器。

每个可寻址区域既可以是内存空间,也可以是 I/O 空间。基址寄存器的位 0 包含的值用于标识类型。位 0 中的值为 0 表示内存空间,值为 1 表示 I/O 空间。下图显示了两种基址寄存器: 一种表示内存类型,另一种表示 I/O 类型。

图 A–4 内存和 I/O 的基址寄存器

图中显示了基本地址中的位 0 如何表示内存或 I/O 空间。

PCI 内存地址空间

PCI 同时支持 32 位和 64 位的内存空间地址。系统固件会将 PCI 地址域中的内存空间区域分配给 PCI 外围设备。区域的基本地址存储在设备的 PCI 配置空间的基址寄存器中。每个区域的大小必须是 2 的幂,并且所分配的基本地址必须在与区域大小相等的边界上对齐。内存空间中的设备地址会内存映射到主机地址域中,以便处理器的本机装入指令或存储指令可以对任何设备执行数据访问。

PCI I/O 地址空间

PCI 支持 32 位 I/O 空间。可以在不同的平台上以不同方式访问 I/O 空间。带有特殊 I/O 指令的处理器(如 Intel 处理器系列)使用 inout 指令访问 I/O 空间。没有特殊 I/O 指令的计算机将映射到对应于主机地址域中 PCI 主桥 (host bridge) 的地址位置。处理器访问内存映射的地址时,会向 PCI 主桥 (host bridge) 发送一个 I/O 请求,该主桥 (host bridge) 随后会将地址转换为 I/O 周期并将其放置在 PCI 总线上。内存映射的 I/O 通过处理器的本机装入/存储指令执行。

PCI 硬件配置文件

对于 PCI 局部总线设备,硬件配置文件应是不必要的。但是在某些情况下,PCI 设备的驱动程序需要使用硬件配置文件来增加驱动程序的专用信息。有关更多详细信息,请参见 driver.conf(4)pci(4) 手册页。

PCI Express

标准 PCI 总线已发展为 PCI Express。PCI Express 是下一代高性能 I/O 总线,用于连接桌面、移动设备、工作站、服务器以及嵌入式计算和通信平台之类的应用程序中的外围设备。

PCI Express 可提高总线性能,减少整体系统支出,并可利用计算机设计中新的发展成果。PCI Express 使用串行的点对点类型互连在两台设备之间实现通信。通过交换机,用户可以在某个系统中将大量设备连接在一起。串行互连意味着每台设备软件包的管脚更少,这可降低成本并使性能具有高度可伸缩性。

PCI Express 总线具有内置功能,可以适应以下技术:

将两台设备连接在一起的 PCI Express 互连称为链路。链路可以是 x1、x2、x4、x8、x12、x16 或 x32 双向的信号对。这些信号称为。双工模式中每条道的带宽 (x1) 为 500 MB/秒。虽然 PCI-X 和 PCI Express 具有不同的硬件连接,但是对驱动程序编写者来说,两种总线是相同的。PCI-X 是共享总线。例如,总线上的所有设备都共享单独的一组数据线和信号线。PCI-Express 是交换总线,通过它可以更有效地使用设备和系统总线之间的带宽。

有关 PCI Express 的更多信息,请参阅以下 Web 站点:http://www.pcisig.com/home

S 总线

典型的 S 总线系统由主板(包含 CPU 和 S 总线接口逻辑)、主板本身上的大量 S 总线设备以及大量 S 总线扩展插槽组成。另外,还可以通过相应的总线网桥将 S 总线连接到其他类型的总线。

S 总线按地理位置进行寻址。每个 S 总线插槽位于系统中固定的物理地址上。S 总线卡具有不同的地址,具体取决于其插入的插槽。将 S 总线设备移动到新插槽会导致系统将此设备视为新设备。

S 总线使用轮询中断。S 总线设备中断时,系统仅知道若干设备中的哪些设备可能发出该中断。系统中断处理程序必须询问每台设备的驱动程序此设备是否负责中断。

S 总线物理地址空间

下表显示了 Sun UltraSPARC 2 计算机的物理地址空间布局。UltraSPARC 2 模型上的物理地址包含 41 位。该 41 位的物理地址空间会进一步分为多个通过 PA(40:33) 标识的 33 位地址空间。

表 A–1 Ultra 2 中的设备物理空间

PA(40:33) 

33 位空间 

使用情况 

0x0 

0x000000000 - 0x07FFFFFFF

2 GB 主内存 

0x80 – 0xDF 

Reserved on Ultra 2

在 Ultra 2 上保留 

0xE0 

Processor 0

处理器 0 

0xE1 

Processor 1

处理器 1 

0xE2 – 0xFD 

Reserved on Ultra 2

在 Ultra 2 上保留 

0xFE 

0x000000000 - 0x1FFFFFFFF

从属 UPA (FFB) 

0xFF 

0x000000000 - 0x0FFFFFFFF

系统 I/O 空间 

 

0x100000000 - 0x10FFFFFFF

S 总线插槽 0 

 

0x110000000 - 0x11FFFFFFF

S 总线插槽 1 

 

0x120000000 - 0x12FFFFFFF

S 总线插槽 2 

 

0x130000000 - 0x13FFFFFFF

S 总线插槽 3 

 

0x1D0000000 - 0x1DFFFFFFF

S 总线插槽 D 

 

0x1E0000000 - 0x1EFFFFFFF

S 总线插槽 E 

 

0x1F0000000 - 0x1FFFFFFFF

S 总线插槽 F 

物理 S 总线地址

S 总线具有 32 个地址位,如 SBus Specification(S 总线规范)中所述。下表介绍 Ultra 2 如何使用地址位。

表 A–2 Ultra 2 S 总线地址位

位 

说明 

0 - 27 

这些位是 S 总线卡用于寻址该卡的内容的 S 总线地址行。 

28 - 31 

供 CPU 用于选择其中一个 S 总线插槽。这些位会生成 SlaveSelect 行。 

此寻址方案将生成表 A–1 中显示的 Ultra 2 地址。其他实现可能会使用不同数量的地址位。

Ultra 2 具有七个 S 总线插槽,其中四个是物理插槽。插槽 0 到 3 可供 S 总线卡使用。插槽 4-12 为保留插槽。插槽的使用情况如下:

S 总线硬件配置文件

通常,S 总线设备不需要硬件配置文件。但是在某些情况下,S 总线设备的驱动程序需要使用硬件配置文件来增加 S 总线卡所提供的信息。有关更多详细信息,请参见 driver.conf(4)sbus(4) 手册页。

设备问题

本节介绍特殊设备的问题。

时间关键型部分

虽然在有了锁定原语所提供的同步和保护机制的情况下可以执行大多数驱动程序操作,但是对于某些设备而言,必须在没有中断的情况下按顺序发生一系列事件。函数 ddi_enter_critical(9F) 与锁定原语一起将请求系统尽可能保证不会抢占或中断当前线程。在进行对 ddi_exit_critical(9F) 的关闭调用之前,此保证将一直有效。有关详细信息,请参见 ddi_enter_critical(9F) 手册页。

延迟

许多芯片指定只能在指定间隔对其进行访问。例如, Zilog Z8530 SCC 具有 1.6 微秒的“写入恢复时间”。此规范意味着通过 8530 写入字符时,必须使用 drv_usecwait(9F) 强制延迟。在某些情况下,规范不会明确指示所需的延迟,因此必须根据经验来确定延迟。

请注意不要组合可能大量存在的设备部件的延迟,例如数以千计的 SCSI 磁盘驱动器。

内部顺序逻辑

具有内部顺序逻辑的设备会将多个内部寄存器映射到同一外部地址。各种内部顺序逻辑包括以下类型:

中断问题

请注意以下常见的与中断相关的问题:

SPARC 计算机上的 PROM

某些平台具有PROM 监视器,支持在没有操作系统的情况下调试设备。本节介绍如何使用 SPARC 计算机上的 PROM 来映射设备寄存器,以便可对其进行访问。通常,可以使用 PROM 命令对设备进行充分测试,以确定设备是否正常工作。

有关 x86 引导子系统的说明,请参见 boot(1M) 手册页。

PROM 具有多种用途,包括:

Open Boot PROM 3

有关 Open Boot PROM 的完整文档,请参见《Open Boot PROM Toolkit User's Guide》和 monitor(1M) 手册页。本节中的示例引用的是 Sun4U 体系结构。其他体系结构可能要求不同的命令来执行操作。


注 –

Open Boot PROM 当前在具有 S 总线或 UPA/PCI 的 Sun 计算机上使用。Open Boot PROM 使用 "ok" 提示符。在早期计算机上,可能必须键入 `n' 才能获取 "ok" 提示符。


如果 PROM 处于安全模式security-mode 参数并未设置为),则可能需要 PROM 口令(在 security-password 参数中设置)。

printenv 命令用于显示所有参数及其值。

使用 help 命令可以获取帮助信息。

可以使用 EMACS 样式的命令行历史记录。使用 Ctrl-N (下一步)和 Ctrl-P (上一步)可以遍历历史记录列表。

Forth 命令

Open Boot PROM 使用 Forth 编程语言。Forth 是一种基于栈的语言。必须将参数推送到栈上,然后再运行正确的命令(称为),并且结果将留在栈上。

要对栈进行编号,请键入其值。


ok 57
ok 68

要在栈上添加两个顶部值,请使用 + 运算符。


ok +

结果会保留在栈上。栈使用 .s 来进行显示。


ok .s
bf

缺省基值为十六进制。可以使用 hexdecimal 来切换基值。


ok decimal
ok .s
191

有关更多信息,请参见《Forth User's Guide》。

遍历 PROM 设备树

pwdcdls 命令将遍历 PROM 设备树以查找设备。必须首先使用 cd 命令在树中建立一个位置,然后pwd 才能运行。本示例为在 S 总线上带有 cgsix 帧缓存器的 Ultra 1 工作站。


ok cd /

要在树中查看连接到当前节点的设备,请使用 ls 命令。


ok ls
f006a064 SUNW,UltraSPARC@0,0
f00598b0 sbus@1f,0
f00592dc counter-timer@1f,3c00
f004eec8 virtual-memory
f004e8e8 memory@0,0
f002ca28 aliases
f002c9b8 options
f002c880 openprom
f002c814 chosen
f002c7a4 packages

可以使用全节点名称:


ok cd sbus@1f,0
ok ls
f006a4e4 cgsix@2,0
f0068194 SUNW,bpp@e,c800000
f0065370 ledma@e,8400010
f006120c espdma@e,8400000
f005a448 SUNW,pll@f,1304000
f005a394 sc@f,1300000
f005a24c zs@f,1000000
f005a174 zs@f,1100000
f005a0c0 eeprom@f,1200000
f0059f8c SUNW,fdtwo@f,1400000
f0059ec4 flashprom@f,0
f0059e34 auxio@f,1900000
f0059d28 SUNW,CS4231@d,c000000

如果不使用前一个示例中的全节点名称,则还可以使用缩写。缩写命令行项类似于以下示例:


ok cd sbus

对于 S 总线设备,名称实际为 device@slot,offsetcgsix 设备位于插槽 2 中,并在偏移 0 处开始。如果该树中显示了 S 总线设备,则表明 PROM 已经识别了此设备。

.properties 命令用于显示设备的 PROM 属性。通过检查这些属性可以确定设备导出的属性。以后可以使用此信息来确保驱动程序查找的是正确的硬件属性。这些属性与可以使用 ddi_getprop(9F) 检索的属性相同。


ok cd cgsix
ok .properties
character-set            ISO8859-1
intr                     00000005 00000000
interrupts               00000005
reg                      00000002 00000000 01000000
dblbuf                   00 00 00 00
vmsize                   00 00 00 01
...

reg 属性用于定义包含以下字段的寄存器说明结构的数组:


uint_t        bustype;       /* cookie for related bus type*/
uint_t        addr;          /* address of reg relative to bus */
uint_t        size;          /* size of this register set */

对于 cgsix 示例,地址为 0。

映射设备

必须将设备映射到内存中才能进行测试。然后,可以使用 PROM 来验证设备是否正确操作,方法是使用数据传送命令来传送字节、字以及长字。如果可以通过 PROM 操作设备(即使使用受限的方法),则驱动程序也应该可以操作设备。

要设置设备以进行初始测试,请执行以下步骤:

  1. 确定设备所在的 S 总线插槽编号。

    在本示例中,cgsix 设备位于插槽 2 中。

  2. 确定设备使用的物理地址空间中的偏移。

    所使用的偏移特定于设备。在 cgsix 示例中,视频内存恰好在偏移 0x800000 开始。

  3. 使用 select-dev 可选择 S 总线设备以及在其中映射此设备的 map-in

    select-dev 采用设备路径的字符串作为其参数。map-in 采用偏移插槽编号以及大小作为映射的参数。与偏移一样,字节传送的大小也特定于设备。在 cgsix 示例中,大小设置为 0x100000 字节。

    在以下代码示例中,S 总线路径显示为字 select-dev 的参数,帧缓存器的偏移、插槽编号以及大小值显示为字 map-in 的参数。请注意 select-dev 参数中起始引号和 / 之间的空格。要使用的虚拟地址保留在栈的顶部。栈通过使用字 .s 进行显示。通过 constant 操作可为该栈分配一个名称。


    ok " sbus@1f,0" select-dev
    ok 800000 2 100000 map-in
    ok .s
    ffe98000
    ok constant fb
    

读取和写入

PROM 提供了许多 8 位、16 位以及 32 位操作。通常,c(字符)前缀表示 8 位(一字节)操作;w(字)前缀表示 16 位(二字节)操作;L(长字)前缀表示 32 位(四字节)操作。

后缀 ! 表示写入操作。写入操作用于从栈中取出前两项。第一项是地址,第二项是值。


ok 55 ffe98000 c!

后缀 @ 表示读取操作。读取操作用于从栈中取出地址。


ok ffe98000 c@
ok .s
55

后缀 ? 用于显示值,并且不会影响栈。


ok ffe98000 c?
55

尝试查询设备时,请务必谨慎。如果未正确设置映射,则尝试读取或写入可能会导致错误。为处理这些情况,提供了特殊字。例如,cprobewprobelprobe 会从给定地址进行读取,但是如果此位置不响应,则会返回零;如果此位置响应,则返回非零值。


ok fffa4000 c@
Data Access Error

ok fffa4000 cprobe
ok .s0

ok ffe98000 cprobe
ok .s
0 ffffffffffffffff

使用字 dump 可以显示内存的区域。这会采用 addresslength,并以字节为单位显示内存区域的内容。

在以下示例中,字 fill 用于使用某种模式填充视频内存。fill 会采用地址、要填充的字节数以及要使用的字节。对于字和长字,请分别使用 wfillLfill。此填充示例会导致 cgsix 基于传递的字节显示简单模式。


ok " /sbus" select-dev
ok 800000 2 100000 map-in
ok constant fb
ok fb 10000 ff fill
ok fb 20000 0 fill
ok fb 18000 55 fill
ok fb 15000 3 fill
ok fb 10000 5 fillok fb 5000 f9 fill