d_map_slave 内核服务

用途

接受虚拟地址和大小的列表,并设置工作程序 DMA 控制器。

语法

#include <sys/dma.h>
int d_map_slave (*handle, flags, minxfer, *vlist, chan_flag)
struct d_handle *handle;
int flags;
int minxfer;
struct dio *vlist;
uint chan_flag;

参数

描述
句柄 (handle) 指示 映射初始化 内核服务所返回的唯一句柄。
标志 指定下列其中一个标志:
DMA_READ
从设备到内存的传输。
繁忙 DMA
从一个设备到另一个设备的传输。
DMA_BYPASS
请勿检查页面访问权。
明克斯费尔 指定该设备的最小传输大小。
Vlist 指定缓冲区地址和长度的列表。
chan_flag 指定传输的特定于设备和总线的标志。

描述

映射从属项 内核服务接受虚拟缓冲区地址和大小的列表,并为所请求的 DMA 传输设置工作程序 DMA 控制器。 这包括为特定工作程序通道设置系统地址生成硬件,以指示指定的数据缓冲区,以及启用特定硬件通道。 映射从属项 内核服务不是已导出的内核服务,而是由 映射初始化 内核服务确定并通过 句柄 结构提供给调用者的特定于总线的实用程序例程。

此服务支持工作程序 DMA 控制器的散射/收集功能,并且还允许设备驱动程序结合多个与设备相关的连续请求。 该列表是使用 迪奥 结构传递的。 如果 映射从属项 内核服务由于资源而无法完成映射,那么会返回错误 DMA_NORES ,并且 迪奥 列表的 Bytes_done 字段将设置为已成功映射的字节数。 保证此字节计数是提供给 映射从属项的设备的 明克斯费尔 参数大小的倍数。 此外, 雷西季奥夫 字段也设置为无法映射的剩余 伊奥韦茨 的索引。 除非设置了 DMA_BYPASS 标志,否则此服务将验证每个页面的访问许可权。 如果在列表中的某个页面上迂到访问违例,那么会返回错误 DMA_NOACC ,并且不会执行任何映射。 虚拟列表的 Bytes_done 字段设置为在发生故障 伊奥韦茨之前的字节数。 此外,在此情况下, 雷西季奥夫 字段设置为迂到访问违例的 伊奥韦茨 条目的索引。

Vlist 参数中提供的虚拟地址可以在多个地址空间内,通过针对 迪奥 列表的每个元素所指向的跨内存结构进行区分。 对于同一地址空间中的多个缓冲区,每个跨内存指针都可以指向同一个跨内存描述符,对于全局空间缓冲区,可以将指针设置为导出的全局跨内存描述符 xmem_global的地址。

明克斯费尔 参数指定设备所支持的绝对最小数据传输量 (设备分块因子)。 如果设备支持最少 512 个字节 (例如软盘和磁盘) 的传输,那么 明克斯费尔 参数将设置为 512。 这使底层服务能够将部分传输映射到设备块大小的正确倍数。

注意:
  1. 映射从属项 内核服务不支持每个通道有多个未完成的 DMA 传输。 尝试在单个通道上执行多个工作程序映射将损坏先前的映射。
  2. 可以使用 /usr/include/sys/dma.h 文件中提供的 D_MAP_从属 宏对 d_map_clear 内核服务的调用进行编码。
  3. 可以在 /usr/include/sys/dma.h中找到 chan_flag 参数的可能标志值。 这些标志可以一起进行逻辑 OR 运算,以反映设备和通道的期望特征。
  4. 如果使用了 CH_AUTOINIT 标志,那么由 Vlist 指针描述的传输将限制为长度不超过 4K 个字节的单个缓冲区地址。

返回值

描述
DMA_NORES 指示在映射期间资源已耗尽。
DMA_NOACC 指示对列表中的页面没有访问许可权。
DMA_BAD_MODE 指示由 chan_flag 参数指定的方式不受支持。