编写设备驱动程序

开发、测试和调试控制台帧缓存器驱动程序

在活动的系统上调试控制台帧缓存器驱动程序可能会遇到问题。

本节提供了一些建议,可帮助您开发、测试和调试控制台帧缓存器驱动程序。

测试 I/O 控制接口

要测试 ioctl 命令,请额外创建一些可通过用户应用程序调用的 ioctl 入口点。确保正确地复制参数。使用 ddi_copyin(9F)ddi_copyout(9F) 例程在用户地址空间来回传输数据。然后编写一个应用程序,以验证呈现、滚动和光标行为。这样,在您开发和测试这些 ioctl 命令时,它们就不会影响您的控制台。

为确保 ioctl 命令正常工作,请引导系统,然后登录。检查在执行 prstat(1M)、ls(1)、 vi(1) 和 man(1) 等命令时,是否能够得到预期的行为。

执行以下脚本以验证 ANSI 颜色是否正常工作:

#!/bin/bash
printf "\n\n\n\e[37;40m             Color List       \e[m\n\n"
printf "\e[30m Color 30 black\e[m\n"
printf "\e[31m Color 31 red\e[m\n"
printf "\e[32m Color 32 green\e[m\n"
printf "\e[33m Color 33 yellow\e[m\n"
printf "\e[34m Color 34 blue\e[m\n"
printf "\e[35m Color 35 purple\e[m\n"
printf "\e[36m Color 36 cyan\e[m\n"
printf "\e[37m Color 37 white\e[m\n\n"
printf "\e[40m Backlight 40 black \e[m\n"
printf "\e[41m Backlight 41 red   \e[m\n"
printf "\e[34;42m Backlight 42 green \e[m\n"
printf "\e[43m Backlight 43 yellow\e[m\n"
printf "\e[37;44m Backlight 44 blue  \e[m\n"
printf "\e[45m Backlight 45 purple\e[m\n"
printf "\e[30;46m Backlight 46 cyan  \e[m\n"
printf "\e[30;47m Backlight 47 white \e[m\n\n"

测试轮询式 I/O 接口

轮询式 I/O 接口仅在以下情况下可用:

轮询式 I/O 接口仅在引导过程的特定点可用。运行系统之前从 OpenBoot PROM 发出的轮询式 I/O 请求不会呈现。同样,配置控制台之前发出的 kmdb 提示也不会呈现。

要测试轮询式 I/O 接口,请使用 L1+A 击键序列进入 OpenBoot PROM。要验证是否正在使用轮询式 I/O 接口,请在 OpenBoot PROM ok 提示符下键入以下命令:


ok 1b emit ." [32m This is a test" 1b emit ." [m"

如果以下叙述属实,则表明轮询式 I/O 接口工作正常:

测试视频模式更改回调函数

要确定视频模式更改回调函数是否正常工作,请登录系统,然后使用 fbconfig(1M) 多次更改帧缓存器的分辨率和深度。如果控制台能够继续正常显示文本,则表明视频模式更改回调函数工作正常。内核终端仿真器可能会调整字体大小以适合不同的屏幕大小,但这并不会对控制台帧缓存器驱动程序有重大影响。

要确定 X 窗口系统和控制台帧缓存器驱动程序是否正常交互,请在 X 窗口系统与命令行之间进行多次切换,同时,以不同的方式修改 X 窗口系统的视频分辨率和命令行分辨率。如果 X 窗口系统退出,并且控制台字符不能正常显示,则要么是 X 窗口系统未将视频模式已更改的情况通知给驱动程序控制台代码,要么是驱动程序未调用内核终端仿真器的视频模式更改回调函数。

有关测试控制台帧缓存器驱动程序的其他建议

在引导过程中,如果系统找不到或者无法成功装入与内核终端仿真器兼容的帧缓存器驱动程序,系统将向 /var/adm/messages 发送消息。要监视这些消息,请在单独的窗口中键入以下命令:


% tail -f /var/adm/messages

为避免调试驱动程序时 USB 发生问题,请更改 EEPROM input-device NVRAM 配置参数,以使用串行端口来代替键盘。有关此参数的更多信息,请参见 eeprom(1M) 手册页。