编写设备驱动程序

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