USB - достаточно сложная система, в двух словах ее не объяснишь и с наскоку не освоишь. Именно поэтому книги и описания кажутся маловразумительными. Однако несколько слов скажу на тему, которая как правило мало акцентирована в описаниях и потому ускользает от восприятия начинающими.
Все обмены в USB организованы в фреймы. Для Full Speed длительность фрейма равна 1 мс. В течении этого периода хост контроллер производит обмены со всеми (или почти всеми) устройствами. Это значит, что у хоста есть список устройств, в этом списке обозначен и тип устройства, и его текущее состояние, и надо/не надо с ним сейчас общаться (в зависимости от запросов драйверов), и т.п.
Внутри фрейма хост ведет обмен в определенном порядке: сначала идет обмен по Control Pipes, потом - по изохронным пайпам и пайпам прерывания, в конце, "по остаточному принципу" - по Bulk Pipes. Это задает и приоритет пайпов: Control Pipes - самые важные, Bulk Pipes - самые неважные, если нет времени общаться в текущем фрейме, обмен по Bulk Pipes может подождать до какого-то из следующих фреймов, когда траффик будет поменьше.
Все периферийные устройства обязаны уметь разговаривать по Control Pipe 0. Все остальные пайпы - факультативные, необязательные. При подключении устройства оно докладывает хосту о себе через Control Pipe 0: что за тип устройства, кто изготовитель, сколько тока питания от USB ему требуется, какие у устройства есть пайпы помимо Control Pipe 0, и т.п. Хост ищет драйвер для вновь подключенного устройства, выделяет ему бюджет питания (если есть достаточно тока), планирует обмены по заявленным устройством пайпам (если есть такая возможность), и т.п.
Так что USB радикально отличается от простых интерфейсов, таких как RS232 и пр. И хотя USB может до какой-то степени имитировать функциональность RS232, в реальности обмен по USB сильно отличается, и не все протоколы RS232 хорошо ложатся поверх "эмулированного RS232". Важная особенность - наличие в USB фреймов.
|