Информационные технологииStfw.Ru 🔍
🕛

Мы собираемся кратко описать назначение основных регистров.

Устройства, использующие изохронную передачу обязаны иметь эти регистры. Содержимое регисттров обновляется с частотой 24.576МГц, отчитывая 125 микросекундные интервалы (тайм слоты).BUSTIME и
BUSTIME и CYCLETIME
Устройства, использующие изохронную передачу обязаны иметь эти регистры. Содержимое регисттров обновляется с частотой 24.576МГц, отчитывая 125 микросекундные интервалы (тайм слоты).
CYCLE TFME
7 бит secondcount 13 бит cycle count 12 бит cycle offset
BUS TIME
25 бит second count 7 бит secondcountlo
cycleoffset отсчитывает 125 микросекундные интервалы по модулю 3071
cyclecount отсчитывает по модулю 7999 и по обнулению переносит 1 в регистр secondcount , который в свою очередь отсчитывает односекундные интервалы.
secondcount в свою очередь считает до 127 и увеличивает secondcounthi при этом secondcount всегда совпадает с secondcountlo.
POWERFAILIMMENENT и POWER SOURCE
Регистр POWERFAILIMMEENT является опциональным, но если он реализован в устройстве, то должен быть обязательно реализован и POWERSOURCE. В случае если некоторое устройство, подающее питание в шину обнаруживает, что ему придется прекратить подачу напряжения, оно может произвести запись в регистр POWERFAILIMMENENT других устройств на шине при помощи broadcast адреса 0x3F. Получившие такой сигнал устройства могут сравнить адрес устройства пославшего оповещение с адресом, содержащимся в POWERSOURCE и если они совпадают, то принять возможные меры, связанные с отключением питания.
При записи в POWERFAILIMMENENT используется следующий формат: установленный первый 6nT(pri_flag) говорит о валидности пакета, следующие 15 бит (pridelay) определяет время в сотнях миллисекунд до наступления возможного отключения питания, последние 16 бит (prisource) содержат полный адрес устройства источника оповещения (10 бит номер шины и 6 бит адрес устройства). Последние 16 бит регистра POWERSOURCE так же содержат адрес источника питания.
MAINT CONTROL MAINTUTILITY
Если реализованы, то служат для диагностических целей, например позволяют проверку правильности передачи пакета или заставить устройство вернуть тот или иной статус ошибки для следующей транзации.
BUSMANAGERID
Этот регистр всегда реализован в устройствах, которые способны выполнять роль менеджера шины (bus manager). Устройства могут пытаться присвоить себе роль bus manager и для этого таким устройствам потребуется модифицировать содержимое регистров BUSMANAGERID, для достижения транзакционности для этой цели используются транзакции дипа lock. Младшие (из 32) 6 бит этого регистра могут содержать идентификатор (адрес) текущего менеджера шины. Изначально эти биты инициализируются значением 0x3F, что является broadcast адресом. При посылке пакета по адресу 0x3F, пакет будет получен всеми устройствами.
BANDWIDTH AVAILABLE и CHANNELS AVAILABLE
Регистр CHANNELSAVAILABLE состоит из двух октетов (всего 64 бтита), каждый установленный бит отвечает за свободный изохронный канал.
Регистр BANDWIDTH_AVAILABLE имеет следующую структуру:
19 бит (зарезервировано) 13 бит (значения от 0 до 4915) свободная полоса пропускания
Поскольку несколько устройств могут одновременно захотеть выделить изохронный канал для своих целей необходим механизм, обеспечивающий транзакционность при конкурировании за ресурсы каналов и полосы пропускания. Для реализации такой транзакционности служит асинхроная команда записи Lock. В своем варианте Lock compare эта команда позволяет произвести запись в область памяти как атомарное действие при условии, что текущее состояние области памяти соответствует некоторому состоянию, которое используется в качестве параметра для команды. Команда Lock завершается успешно в случае совпадения значений и ошибочно в случае несовпадения.
Для того, чтобы создать изохронный канал устройство должно найти менеджер изохронных ресурсов, прочитать его регистры CHANNELSAVAILABLE ,
BANDWIDTHAVAILABLE, вычислить какие изменения нужно внести в эти регистры с тем, чтобы получить канал нужной скорости передачи и попытаться изменить эти значения при помощи Lock (если, конечно, будет обнаружено что для этого свободно достаточно ресурсов). В случае если один регистр был успешно изменен, а при изменении второг возникла ошибка, следует произвести в первом регистре обратные изменения. В случае успеха - следует уведомить другое устройство о необходимости начать передавать данные и сообщить ему номер изохронного канала. Последнее делается способом, специфическим для каждого конкретного устройства.
Устройство, выделившее изохронный канал отвечает за повторное выделение этого же канала в случае перезагрузки шины (bus reset) вызванной подключением нового устройства (когда содержимое CSR регистров теряется). Для того, чтобы все, существовавшие до перезагрузки каналы могли восстановиться и устройства смогли продолжить передачу, устройства не имевшие ранее ч выделенных изохронных каналов (но желающие их зарезервировать) должны выждать после перезагрузки некоторое время прежде чем резервировать новые каналы.
Асинхронная посылка данных происходит при помощивызова команд read/write/lock соответствующего API. Получение же данных возможно при помощи loop-back интерфейса, когда приложение регистрирует в нижележащих драйверах специальную функцию, которая будет автоматически вызываться драйвером каждый раз когда другое устройство захочет произвести асинхронную запись по виртуальным адресам, находящимся в нашем устройстве (в роли которого в данном случае выступает компьютер). В эту функцию драйвер передает всю необходимую информацию, касающуюся запроса, касающуюся запроса от другого устройства, включая адрес и длину записываемых или считывающих данных.
Для асинхронной передачи имеет место такая же в точности ситуация, за исключением того, что вместо адреса там используется номер логического изохронного канала. При изохронной передаче программа должна своевременно принять все пришедшие данные а так же своевременно отослать данные в устройство. Для этого существуют интерфейсы для оповещения программы о том, что данный изохронный канал в зависимости от напраления передачи по нему либо требует добавления данных для отправки либо наоборот данные получил и необходимо срочно эти данные прочитать стем чтобы освободить внутренний буфер драйвера, связанный с этим каналом.
Что произойдет если программа не успеет вовремя принять или послать блок изохронных данных зависит от конкретной реализации внешнего устройства, некоторые устройства могут "относиться спокойно" к подобной ситуации, совершенно не обязательно что устройство перейдет в состояние ошибки, вовремя недополучив например кадр видеоизображения! Возможно просто изображение будет воспроизведено с некоторыми
дефектами. Фактически изохронный канал гарантирует, что шина в каждом таймслоте выделит достаточно времени для передачи данных со скоростью заявленной для этого канала, однако устройства могут использовать предоставленную им полос пропускания и не полностью. Из описанмя схемы арбитража шины, которое приведено ранее, понятно что при этом неиспользованное время может быть использовано асинхронными транзакциями.

Также по теме:
Новые программы для Windows, Linux и Android.