SerCx2 PIO-Receive 事务
SerCx2 要求所有串行控制器驱动程序实现对使用编程 I/O (PIO) 的接收事务的支持。 为了启动 PIO 接收事务,SerCx2 调用驱动程序的 EvtSerCx2PioReceiveReadBuffer 事件回调函数,并提供读取缓冲区作为参数。
在此调用期间, EvtSerCx2PioReceiveReadBuffer 函数将数据从串行控制器硬件中的接收 FIFO 传输到读取缓冲区。 此数据传输会一直持续到读取缓冲区已满或不再从接收 FIFO 立即获取更多数据为止。 传输结束时,函数返回从 FIFO 成功传输到读取缓冲区的字节数。 此函数从不等待接收更多数据。
创建 PIO-receive 对象
在 SerCx2 可以调用任何串行控制器驱动程序的 EvtSerCx2PioReceiveXxx** 函数之前,驱动程序必须调用 SerCx2PioReceiveCreate 方法以将这些函数注册到 SerCx2。 此方法接受指向 SERCX2_PIO_RECEIVE_CONFIG 结构的指针作为输入参数,该结构包含指向驱动程序的 EvtSerCx2PioReceiveXxx** 函数的指针。
驱动程序需要实现以下所有三个函数:
- EvtSerCx2PioReceiveReadBuffer
- EvtSerCx2PioReceiveEnableReadyNotification
- EvtSerCx2PioReceiveCancelReadyNotification
作为选项,驱动程序可以实现以下一个或两个函数:
SerCx2PioReceiveCreate 方法创建 PIO-receive 对象,并为调用驱动程序提供此对象的 SERCX2PIORECEIVE 句柄。 驱动程序的 EvtSerCx2PioReceiveXxx** 函数都将此句柄作为其第一个参数。 以下 SerCx2 方法将此句柄作为其第一个参数:
- SerCx2PioReceiveReady
- SerCx2PioReceiveInitializeTransactionComplete
- SerCx2PioReceiveCleanupTransactionComplete
硬件初始化和清理
某些串行控制器驱动程序可能需要在 PIO 接收事务开始时初始化串行控制器硬件,或在事务结束时清理串行控制器的硬件状态。
如果驱动程序实现 EvtSerCx2PioReceiveInitializeTransaction 事件回调函数,SerCx2 将调用此函数以在启动事务的 EvtSerCx2PioReceiveReadBuffer 调用之前初始化串行控制器。 如果实现, EvtSerCx2PioReceiveInitializeTransaction 函数必须调用 SerCx2PioReceiveInitializeTransactionComplete 方法,以在驱动程序完成串行控制器初始化时通知 SerCx2。
如果驱动程序实现 EvtSerCx2PioReceiveCleanupTransaction 事件回调函数,则 SerCx2 调用此函数以清理事务中最终 EvtSerCx2PioReceiveReadBuffer 调用后的硬件状态。 如果实现, EvtSerCx2PioReceiveInitializeTransaction 函数必须调用 SerCx2PioReceiveCleanupTransactionComplete 方法,以在驱动程序完成串行控制器清理时通知 SerCx2。
就绪通知
当 EvtSerCx2PioReceiveReadBuffer 调用结束时,由于没有更多数据可立即从接收 FIFO 读取,SerCx2 将无法完成 PIO 接收事务,直到串行控制器稍后收到更多数据。 在这种情况下,SerCx2 调用 EvtSerCx2PioReceiveEnableReadyNotification 事件回调函数来启用就绪通知。 此函数通常允许在可从接收 FIFO 读取一个或多个字节数据时触发中断。 如果且仅当启用此通知时,串行控制器驱动程序会调用 SerCx2PioReceiveReady 方法,以便在驱动程序检测到接收 FIFO 不再为空时通知 SerCx2。 为了响应此通知,SerCx2 调用 EvtSerCx2PioReceiveReadBuffer 函数来读取新接收的数据。
SerCx2 还使用就绪通知在处理作为 PIO 接收事务处理的读取请求期间有效地管理超时。 有关这些超时的详细信息,请参阅 SERIAL_TIMEOUTS。
如果在读取请求超时或取消时启用就绪通知,SerCx2 将调用 EvtSerCx2PioReceiveCancelReadyNotification 事件回调函数来取消挂起的通知。 如果此函数成功取消挂起的通知,则返回 TRUE。 返回值为 TRUE 可保证串行控制器驱动程序不会调用 SerCx2PioReceiveReady。 返回值为 FALSE 表示控制器驱动程序已调用或即将调用 SerCx2PioReceiveReady。