编写设备驱动程序

VIS_CONSDISPLAY

VIS_CONSDISPLAY ioctl 命令可在指定的位置显示像素矩形区。这种显示方式又称为以位块传输 (blitting) 矩形。vis_consdisplay 结构包含以驱动程序和 tem 使用的视频深度呈现矩形所必需的信息。以下代码中显示了 vis_consdisplay 结构。

struct vis_consdisplay {
      screen_pos_t    row;      /* Row (in pixels) to display data at */
      screen_pos_t    col;      /* Col (in pixels) to display data at */
      screen_size_t   width;    /* Width of data (in pixels) */
      screen_size_t   height;   /* Height of data (in pixels) */
      unsigned char   *data;    /* Address of pixels to display */
      unsigned char   fg_color; /* Foreground color */
      unsigned char   bg_color; /* Background color */
};

要在控制台帧缓存器驱动程序中实现 VIS_CONSDISPLAY ioctl 命令,请按照以下通用步骤操作:

  1. 复制 vis_consdisplay 结构。

  2. 验证显示参数。如果任一显示参数超出范围,则会返回错误。

  3. 计算要以位块传输到视频内存的矩形的大小。根据执行 VIS_DEVINIT 期间创建的位块传输 (blit) 缓冲区大小验证此大小。如果需要,为位块传输 (blit) 缓冲区分配额外的内存。

  4. 检索位块传输 (blit) 数据。内核终端仿真器已在议定的像素深度准备了此数据。该深度与执行 VIS_DEVINIT 期间 tem 传递的像素深度相同。每当设备驱动程序通过 tem 的回调更改视频模式时,都会更新像素深度。典型的像素深度为 8 位索引色彩表和 32 位真彩 (TrueColor)。

  5. 使所有用户上下文无效,以使用户应用程序不能通过用户内存映射同时访问帧缓存器硬件。在轮询式 I/O 模式下,既不允许也没有必要执行此步骤,因为用户应用程序并没有运行。请务必持有锁,以便在完成 VIS_CONSDISPLAY ioctl 之前,用户无法通过缺页恢复映射。

  6. 建立特定于驱动程序的控制台呈现上下文。

  7. 如果帧缓存器在 8 位索引色彩模式下运行,请恢复 tem 以前通过 VIS_PUTCMAP ioctl 设置的内核控制台色彩表。建议使用延迟 ( lazy) 色彩表装入方案,以优化性能。在延迟 (lazy) 方案中,控制台帧缓存器只恢复自发出 VIS_DEVINIT ioctl 以来实际使用的色彩。

  8. tem 发送的像素坐标上显示 tem 传出的数据。您可能需要转换 RGB 像素数据字节顺序。