驱动程序结合使用 ddi_get8(9F) 和 ddi_put8(9F) 系列例程以及 ddi_regs_map_setup(9F) 返回的句柄,以与设备相互传送数据。DDI 框架自动处理为满足主机或设备的字节序格式所需的任何字节交换,并强制实施设备可能具有的任何存储排序约束。
DDI 提供了用于传送 8 位、16 位、32 位和 64 位数据的接口,以及用于重复传送多个值的接口。有关这些接口的完整列表和说明,请参见 ddi_get8(9F)、ddi_put8(9F)、ddi_rep_get8(9F) 和 ddi_rep_put8(9F) 系列例程的手册页。
以下示例建立在Example 7–1 的基础上,其中,驱动程序映射了设备的 CSR 寄存器和数据寄存器。在本示例中,调用驱动程序的 write(9E) 入口点时,会将数据缓冲区写入(每次一个字节)设备。
示例 7-2 映射设置:缓冲区static int pio_write(dev_t dev, struct uio *uiop, cred_t *credp) { int retval; int error = OK; Pio *pio_p = ddi_get_soft_state(pio_softstate, getminor(dev)); if (pio_p == NULL) return (ENXIO); mutex_enter(&pio_p->mutex); /* * enable interrupts from the device by setting the Interrupt * Enable bit in the devices CSR register */ ddi_put8(pio_p->csr_handle, pio_p->csr, (ddi_get8(pio_p->csr_handle, pio_p->csr) | PIO_INTR_ENABLE)); while (uiop->uio_resid > 0) { /* * This device issues an IDLE interrupt when it is ready * to accept a character; the interrupt can be cleared * by setting PIO_INTR_CLEAR. The interrupt is reasserted * after the next character is written or the next time * PIO_INTR_ENABLE is toggled on. * * wait for interrupt (see pio_intr) */ cv_wait(&pio_p->cv, &pio_p->mutex); /* * get a character from the user's write request * fail the write request if any errors are encountered */ if ((retval = uwritec(uiop)) == -1) { error = retval; break; } /* * pass the character to the device by writing it to * the device's data register */ ddi_put8(pio_p->data_handle, pio_p->data, (uchar_t)retval); } /* * disable interrupts by clearing the Interrupt Enable bit * in the CSR */ ddi_put8(pio_p->csr_handle, pio_p->csr, (ddi_get8(pio_p->csr_handle, pio_p->csr) & ~PIO_INTR_ENABLE)); mutex_exit(&pio_p->mutex); return (error); }