Энумерация
Выше говорилось, что USB устройство может находиться в процессе конфигурирования (энумерации) и в рабочем режиме. В рабочем режиме хаб «прозрачен» для USB устройства и выполняет функцию «невидимого» посредника. В процессе энумерации хаб перестает быть «невидимым» и активно участвует в энумерации, поэтому кратко затронем работу хаба.
Хост отвечает за обнаружение и конфигурирование всех устройств появляющихся на шине. Посредником между хост-контроллером и USB устройством является хаб или цепочка хабов. Хаб имеет нулевую конечную точку, для приема управляющих запросов от хост-контроллера и конечную точку прерывания типа IN. Имеется специальная система запросов, предназначенная для хаба. Хост-контроллер управляет хабом, посылая запросы и принимая данные. В хабе имеются нисходящие порты и один порт восходящий. К нисходящим портам хаба подключаются сегменты шины для USB устройств. А восходящий всегда подключается к другому хабу, либо к хост-контроллеру. Нисходящие порты хаба могут быть в нескольких состояниях:
- не запитан (Not powered) - на линии VBUS отсутствует напряжение. Такой порт не способен к взаимодействиям с подключаемым сегментом шины. В это состояние порт может перейти по управляющему запросу хоста (команде с хоста), либо при токовой перегрузке линии VBUS;
- не подключен (Disconnected) - в этом состоянии порт хаба способен обнаружить вновь подключаемое USB устройство или хаб. Напряжение на VBUS присутствует;
- запрещен (Disabled) - трафик через этот порт не транслируется. Переходит в это состояние для изоляции ошибочно работающих устройств на сегменте;
- разрешен (Enabled) – рабочее состояние порта;
- приостановлен (Suspended) – в это состояние порт переводится в случае необходимости перевода устройства на сегменте шины в «спящее» состояние, переводится по специальному запросу хоста.
Для обнаружения вновь подключаемого USB устройства к порту хаба, этот порт должен находиться в состоянии Disconnected. Хаб сканирует свои порты, следя за возможным подключением и отключением USB устройств. Когда к порту хаба не подключено USB устройство, проводники линий данных заземлены через резисторы 15 Ком, а на линии VBUS присутствует 5 вольт. Шина находится в состоянии SE0. В свою очередь, USB устройство обнаруживает хаб, по присутствию напряжения на линии VBUS. Выдержав некоторую паузу после появления напряжения, для стабилизации уровня и устранения дребезга, USB устройство заявляет о своем подключении, как устройстве типа FS(Full speed), повышением напряжения на линии D+ на 2 вольта. Микроконтроллер AT90USB162 имеет встроенный резистор, который подключает линию D+ к источнику 3,3 V через управляемый ключ. Об этом резисторе уже говорилось при обсуждении приемопередатчиков. Совместно с резисторами, подключенными на стороне хаба, образуется делитель напряжения, ток через который повышает напряжение на линии D+ , переводит шину в состояние покоя (Idle State).
Теперь должен ответить хост на действия USB устройства. Хост обнаруживает, опрашивая хаб, что к порту подключено USB устройство. Хост-контроллер переводит порт из состояния Disconnected в состояние Enabled, теперь через порт можно передавать управляющие запросы к USB устройству.
После обнаружения, что сегмент шины перешел в состояние Idle state, благодаря подключенному резистору, выждав не мене 100 миллисекунд, хост посылает управляющий запрос хабу, выполнить сброс сегмента шины, к которому подключено USB устройство. Хаб выполняет команду (Bus Reset), от 10 миллисекунд до 20 миллисекунд линии D+ и D- имеют потенциал на уровне 0 вольт. Другими словами, шина приводится в состояние SE0, на 10-20 миллисекунд. По этой команде, подсистема микроконтроллера, отвечающая за коммуникации на шине USB (SIE), должна выполнить сброс своих регистров и флагов. Нужно понимать, что речь идет только о подсистеме USB, а не о микроконтроллере. После команды (Bus Reset), USB устройство должно перейти в «дежурное» состояние (Default state). В этом состоянии USB устройство имеет нулевой адрес и инициализированную нулевую конечную точку. Сейчас USB устройство может потреблять не более 100 миллиампер от шины и способно принимать запросы от хоста. На рисуноке 18 , приведены временные диаграммы.
Рисунок 18 |
Сообщалось, что USB устройству не может быть постоянно назначен нулевой адрес, этот адрес может использоваться в процессе энумерации. Так как USB устройство уже способно принимать управляющие запросы, хост своим стандартным управляющим запросом Get_Device_Descriptor, запрашивает дескриптор USB устройства, точнее его первые 8 байт, для определения максимального размера конечной точки управления. Конечная точка управления может иметь максимальный размер из ряда: 8,16,32,64 байта. Стандартные управляющие запросы уже упоминались ранее. Затем хост посылает стандартный запрос Set_Address, назначает уникальный адрес USB устройству. Теперь USB устройство находится в состоянии «Адресовано» (Adressed state).
Хост вторично выдает запрос Get_Device_Descriptor, теперь запрашивается дескриптор устройства целиком, а не 8 байт. Затем запрашивается дескриптор конфигурации и все подчин.нные дескрипторы: дескриптор интерфейса и дескрипторы конечных точек, если их несколько. Получив дескрипторы от USB устройства, хост подбирает драйвер, на основе имеющейся информации.
Далее хост посылает управляющий запрос Set_Configuration, ставя точку в процессе энумерации, теперь USB устройство в состоянии «Сконфигурировано» (Configured State). Здесь дана несколько упрощ.нная схема, что конфигурация одна и интерфейс один. А вообще-то хост может выбирать между несколькими конфигурациями, информацию о которых он получил с дескрипторами и утвердить одну наиболее подходящую для его возможностей. Но как ранее говорилось, USB устройства с несколькими конфигурациями здесь не рассматриваются.
В процессе работы USB устройство переходит из одного состояния в другое, в стандарте USB имеется граф переходов, по которому наглядно видно как переходит устройство из одного состояния в другое в случае возникновения событий. На рисунке 19 представлен этот график.
Рисунок 19 |
Состояние «приостановлено» - уже рассматривалось ранее. Состояние «подключено» - когда USB устройство физически соединено, но напряжение на VBUS не подано. Такая ситуация редко встречается на практике. А вообще-то, при подключении USB устройства, напряжение уже имеется на VBUS, поэтому USB устройство сразу переходит в состояние «запитано» (Powered). Программное обеспечение USB устройства, должно постоянно вести мониторинг возможных событий, а не только в процессе энумерации. Из состояний: «адресовано», «сконфигурировано», «приостановлено», по сигналу «Bus Reset», USB устройство должна переходить в состояние
«дежурное».
Переход из состояния «сконфигурировано» в состояние «адресовано», может происходить при изменении текущей конфигурации. К примеру, USB устройство имеет несколько конфигураций, одна конфигурация для устройств с собственным источником питания, а другая с питанием от шины. Тогда для переключения текущей конфигурации, необходимо перейти в состояние «адресовано», а затем по управляющему запросу Set_Configuration, выбрать другую конфигурацию. У запроса Set_Configuration имеется числовой параметр wValue – это номер конфигурации, которую требуется установить. Когда этот код равен нулю, USB устройство переходит в состояние «адресовано», чтобы затем перейти в состояние «сконфигурировано», при получении нового управляющего запроса Set_Configuration с нужным номером конфигурации.
.
|