Поделиться через


Транзакции PIO-Receive SerCx2

Для SerCx2 требуется, чтобы все драйверы последовательных контроллеров реализовали поддержку транзакций получения, использующих запрограммированные операции ввода-вывода (PIO). Чтобы запустить транзакцию получения piO, SerCx2 вызывает функцию обратного вызова события EvtSerCx2PioReceiveReadBuffer драйвера и предоставляет буфер чтения в качестве параметра.

Во время этого вызова функция EvtSerCx2PioReceiveReadBuffer передает данные в буфер чтения из приемного FIFO на оборудовании последовательного контроллера. Эта передача данных продолжается до тех пор, пока буфер чтения не заполнится или пока не будет немедленного доступа к данным из приемного FIFO. После завершения передачи функция возвращает количество байтов, которые были успешно переданы в буфер чтения из FIFO. Эта функция никогда не ожидает получения дополнительных данных.

Создание объекта получения piO

Прежде чем SerCx2 сможет вызвать любую из функций EvtSerCx2PioReceiveXxx** драйвера последовательного контроллера, драйвер должен вызвать метод SerCx2PioReceiveCreate , чтобы зарегистрировать эти функции в SerCx2. Этот метод принимает в качестве входного параметра указатель на структуру SERCX2_PIO_RECEIVE_CONFIG , содержащую указатели на функции EvtSerCx2PioReceiveXxx** драйвера.

Драйвер необходим для реализации всех трех следующих функций:

В качестве варианта драйвер может реализовать одну или обе из следующих функций:

Метод SerCx2PioReceiveCreate создает объект получения PIO и предоставляет вызывающму драйверу дескриптор SERCX2PIORECEIVE для этого объекта. Функции EvtSerCx2PioReceiveXxx** драйвера принимают этот дескриптор в качестве первого параметра. Следующие методы SerCx2 принимают этот дескриптор в качестве первого параметра:

Инициализация и очистка оборудования

Некоторым драйверам последовательного контроллера может потребоваться инициализировать оборудование последовательного контроллера в начале транзакции получения личных сведений или очистить состояние оборудования последовательного контроллера в конце транзакции.

Если драйвер реализует функцию обратного вызова события EvtSerCx2PioReceiveInitializeTransaction , SerCx2 вызывает эту функцию для инициализации последовательного контроллера перед вызовом EvtSerCx2PioReceiveReadBuffer , который запускает транзакцию. При реализации функция EvtSerCx2PioReceiveInitializeTransaction должна вызвать метод SerCx2PioReceiveInitializeTransactionComplete , чтобы сообщить SerCx2, когда драйвер завершит инициализацию последовательного контроллера.

Если драйвер реализует функцию обратного вызова события EvtSerCx2PioReceiveCleanupTransaction , SerCx2 вызывает эту функцию для очистки состояния оборудования после последнего вызова EvtSerCx2PioReceiveReadBuffer в транзакции. При реализации функция EvtSerCx2PioReceiveInitializeTransaction должна вызвать метод SerCx2PioReceiveCleanupTransactionComplete , чтобы сообщить SerCx2, когда драйвер завершит очистку последовательного контроллера.

Готовые уведомления

Когда вызов EvtSerCx2PioReceiveReadBuffer завершается из-за отсутствия дополнительных данных для чтения из получающего FIFO, SerCx2 не может завершить транзакцию получения PIO, пока позже последовательный контроллер не получит больше данных. В этом случае SerCx2 вызывает функцию обратного вызова события EvtSerCx2PioReceiveEnableReadyNotification , чтобы включить уведомление о готовности. Эта функция обычно позволяет активировать прерывание, когда один или несколько байтов данных доступны для чтения из получающего FIFO. Если и только если это уведомление включено, драйвер последовательного контроллера вызывает метод SerCx2PioReceiveReady , чтобы уведомить SerCx2, когда драйвер обнаруживает, что fifo получения больше не является пустым. В ответ на это уведомление SerCx2 вызывает функцию EvtSerCx2PioReceiveReadBuffer для чтения вновь полученных данных.

SerCx2 также использует готовые уведомления для эффективного управления временем ожидания во время обработки запросов на чтение, которые обрабатываются как транзакции получения личных сведений. Дополнительные сведения об этих тайм-аутах см. в разделе SERIAL_TIMEOUTS.

Если уведомление о готовности включено, когда время ожидания запроса на чтение истекает или отменено, SerCx2 вызывает функцию обратного вызова события EvtSerCx2PioReceiveCancelReadyNotification для отмены ожидающего уведомления. Если эта функция успешно отменяет ожидающее уведомление, она возвращает значение TRUE. Возвращаемое значение TRUE гарантирует, что драйвер последовательного контроллера не будет вызывать SerCx2PioReceiveReady. Возвращаемое значение FALSE указывает, что драйвер контроллера уже вызвал или скоро вызовет SerCx2PioReceiveReady.