JavaScript is required to for searching.
跳过导航链接
退出打印视图
编写设备驱动程序     Oracle Solaris 11.1 Information Library (简体中文)
为本文档评分
search filter icon
search icon

文档信息

前言

第 1 部分针对 Oracle Solaris 平台设计设备驱动程序

1.  Oracle Solaris 设备驱动程序概述

2.  Oracle Solaris 内核和设备树

3.  多线程

4.  属性

5.  管理事件和排队任务

6.  驱动程序自动配置

7.  设备访问:程控 I/O

8.  中断处理程序

9.  直接内存访问 (Direct Memory Access, DMA)

10.  映射设备和内核内存

11.  设备上下文管理

12.  电源管理

13.  强化 Oracle Solaris 驱动程序

14.  分层驱动程序接口 (Layered Driver Interface, LDI)

第 2 部分设计特定种类的设备驱动程序

15.  字符设备驱动程序

16.  块设备驱动程序

17.  SCSI 目标驱动程序

18.  SCSI 主机总线适配器驱动程序

19.  网络设备驱动程序

20.  USB 驱动程序

21.  SR-IOV 驱动程序

第 3 部分生成设备驱动程序

22.  编译、装入、打包和测试驱动程序

23.  调试、测试和调优设备驱动程序

24.  推荐的编码方法

第 4 部分附录

A.  硬件概述

SPARC 处理器问题

SPARC 数据对齐

SPARC 结构中的成员对齐

SPARC 字节排序

SPARC 寄存器窗口

SPARC 乘法和除法指令

x86 处理器问题

x86 字节排序

x86 体系结构手册

字节存储顺序

存储缓冲区

系统内存模型

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

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

总线体系结构

设备标识

支持的中断类型

总线特定信息

PCI 局部总线

PCI 地址域

PCI 配置地址空间

PCI 配置基址寄存器

PCI 内存地址空间

PCI I/O 地址空间

PCI 硬件配置文件

PCI Express

S 总线

S 总线物理地址空间

物理 S 总线地址

S 总线硬件配置文件

设备问题

时间关键型部分

延迟

内部顺序逻辑

中断问题

SPARC 计算机上的 PROM

Open Boot PROM 3

Forth 命令

遍历 PROM 设备树

映射设备

读取和写入

B.  Oracle Solaris DDI/DKI 服务汇总

C.  使设备驱动程序支持 64 位

D.  控制台帧缓存器驱动程序

E.  pci.conf 文件

索引

请告诉我们如何提高我们的文档:
过于简略
不易阅读或难以理解
重要信息缺失
错误的内容
需要翻译的版本
其他
Your rating has been updated
感谢您的反馈!

您的反馈将非常有助于我们提供更好的文档。 您是否愿意参与我们的内容改进并提供进一步的意见?

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