Устройства могут использовать прерывания для сигнализации всех видов событий. Фактически, любое изменение состояния устройства или контроллера устройства может быть передано в центральный процессор через прерывание. Все зависит от разработчиков аппаратного обеспечения и прошивки устройства.
(И, можно надеяться, они, по крайней мере, спросят мнение бедного чмока, которому придется написать водителю. Слишком много устройств было разработано без такого ввода, что требует неудобных, неэффективных конструкций драйверов. Фактически были случаи, когда некоторые возможности устройства не могли быть использованы в полной мере, потому что хост-интерфейс устройства - который включает, но не ограничивается структурой прерываний - был разработан без понимания того, что может и не может быть сделано в драйвере. Но я отвлекся.)
Материал, который вы процитировали, является верным, но мне кажется, что он очень упрощенный.
Я не уверен, чем "вывод готов" отличается от "вывод завершен". (Готовы забрать из выходного лотка принтера?) Точно так же "входные данные доступны" и "вход завершен" звучат для меня довольно близко к одному и тому же. Однако они, вероятно, подразумевали бы различную требуемую работу со стороны водителя. Для меня "ввод завершен" будет означать, что входящие данные находятся в памяти хоста, и операция ввода-вывода локального потока может быть завершена, в то время как "входные данные доступны", вероятно, будет означать, что драйверу все равно потребуется переместить его из устройства интерфейс к буферу в памяти.
Но это только семантика. Как писатель драйвера, вы должны внимательно прочитать спецификации интерфейса хоста устройства, чтобы выяснить, что на самом деле означает любое данное прерывание, и что вы должны с этим делать. Иногда вам даже нужно прочитать код прошивки или изучить логическую схему. (Это триггер, запускаемый по краю или по уровню? Инженеры устройства иногда имеют самые странные представления! Но я снова отвлекся ...)
Для более сложного примера рассмотрим интерфейс связи с FIFO. Как правило, мы хотим избежать чрезмерных прерываний для хоста; например, прерывание на пакет, вероятно, слишком много. Таким образом, наше устройство может позволить нам сообщить ему о серии буферов, которые должны быть переданы через интерфейс "FIFO" (первым пришел - первым обслужен), и устройство позаботится о перемещении их всех по проводам.
Но мы не обязательно хотим прерывания только тогда, когда все буферы готовы! Было бы лучше, если бы мы получили уведомление, когда, скажем, буфер был заполнен до 20% или 10%. Когда мы получим такое прерывание, мы добавим больше буферов в FIFO (конечно, остановимся, когда оно заполнится). Если бы мы получили прерывание только тогда, когда FIFO был пуст, у нас была бы небольшая задержка, прежде чем мы могли бы получить следующий буфер для передачи, таким образом уменьшая пропускную способность. Давая нам прерывание, когда FIFO "собирается быть" пустым, мы можем устранить эту задержку.