3. Bölüm - USBX Cihaz Yığınının İşlevsel Bileşenleri

Bu bölüm, yüksek performanslı USBX tümleşik USB cihaz yığınının işlevsel bir perspektiften açıklamasını içerir.

Yürütmeye Genel Bakış

Cihaz için USBX birkaç bileşenden oluşur.

  • Başlatma
  • Uygulama arabirimi çağrıları
  • USB Cihaz Sınıfları
  • USB Cihaz Yığını
  • Cihaz denetleyicisi
  • VBUS yöneticisi

Aşağıdaki diyagramda USBX Cihaz yığını gösterilmektedir.

USBX Cihaz Yığını

Başlatma

USBX'i etkinleştirmek için ux_system_initialize işlevi çağrılmalıdır. Bu işlev USBX'in bellek kaynaklarını başlatır.

USBX cihaz tesislerini etkinleştirmek için işlev ux_device_stack_initialize çağrılmalıdır. Bu işlev de ThreadX iş parçacıkları, mutex'ler ve semaforlar gibi USBX cihaz yığını tarafından kullanılan tüm kaynakları başlatır.

USB cihaz denetleyicisini ve bir veya daha fazla USB sınıfını etkinleştirmek uygulamanın başlatılmasına bağlı. USB ana bilgisayar tarafının aksine, cihaz tarafında herhangi bir zamanda yalnızca bir USB denetleyicisi sürücüsü kullanılabilir. Sınıflar yığına kaydedildiğinde ve cihaz denetleyicileri başlatma işlevi çağrıldığında, veri yolu etkindir ve yığın veri yolu sıfırlama ve konak numaralandırma komutlarını yanıtlar.

Uygulama Arabirimi Çağrıları

USBX'te iki api düzeyi vardır.

  • USB Cihaz Yığını API'leri
  • USB Cihaz Sınıfı API'leri

Normalde, bir USBX uygulamasının USB cihaz yığını API'lerinden herhangi birini çağırması gerekmez. Çoğu uygulama yalnızca USB Sınıfı API'lerine erişecektir.

USB Cihaz Sınıfları

Sınıf API'leri her USB sınıfına çok özeldir. USB sınıflarına yönelik yaygın API'lerin çoğu, bir cihazı açma/kapatma ve cihazdan okuma veya cihaza yazma gibi hizmetler sağlar.

Depolama Sınıfı

Depolama sınıfı, depolama sınıfına özgü denetim isteklerini yanıtlamaktan ve depolama sınıfı protokol komutlarını işlemekle görevlidir. Daha fazla bilgi için 5. Bölüm'deki USB Cihaz Depolama Sınıfı'na bakın.

CDC Sınıfı

CDC sınıfı, CDC sınıfına özgü denetim isteklerini yanıtlamaktan ve veri kanalları aracılığıyla konakla iletişim kurmanın yollarını sunmakla görevlidir. Aşağıdaki işlevler şu anda desteklenmektedir:

  • CDC-ACM: Ana bilgisayarla seri cihaz olarak iletişim kurma
  • CDC-ECM: Ana bilgisayarla ethernet cihazı olarak iletişim kurma Daha fazla bilgi için 5. Bölüm'deki USB Cihazı CDC-ACM Sınıfı ve USB Cihazı CDC-ECM Sınıfı'na bakın.

HID Sınıfı

HID sınıfı, HID sınıfına özgü denetim isteklerini yanıtlamaktan ve HID sınıfına özgü raporlarla konakla iletişim kurmanın yollarını sunmakla görevlidir. Daha fazla bilgi için 5. Bölüm'deki USB Cihazı HID Sınıfı'na bakın.

Özel Sınıf

Gelişmiş geliştiriciler için, özelleştirilmiş denetim isteklerini yanıtlamak ve veri kanallarındaki özelleştirilmiş protokolü işlemek için daha özelleştirilmiş bir sınıf oluşturmak mümkündür. Bu tür bir sınıfın konak tarafında da belirli özelleştirmeler gerektirebileceğini unutmayın.

USB Cihaz Yığını

Cihaz yığını API'leri, sınıflar ve cihaz çerçevesi gibi USBX cihaz bileşenlerinin kaydından sorumludur.

Cihaz Çerçevesi

Usb cihaz tarafı, cihaz çerçevesinin tanımından sorumludur. Cihaz çerçevesi, aşağıdaki bölümlerde açıklandığı gibi üç kategoriye ayrılmıştır.

Cihaz Çerçevesi Bileşenlerinin Tanımı

Cihaz çerçevesinin her bileşeninin tanımı, cihazın doğası ve cihaz tarafından kullanılan kaynaklar ile ilgilidir. Ana kategoriler aşağıdadır.

  • Cihaz Tanımlayıcısı
  • Yapılandırma Tanımlayıcısı
  • Arabirim Tanımlayıcısı
  • Uç Nokta Tanımlayıcısı

USBX, hem yüksek hem de tam hız için cihaz bileşeni tanımını destekler (düşük hız, tam hız ile aynı şekilde ele alınır). Bu, cihazın yüksek hızlı veya tam hızlı bir konağa bağlandığında farklı çalışmasına olanak tanır. Tipik farklar, her uç noktanın boyutu ve cihaz tarafından tüketilen güçlerdir.

Cihaz bileşeninin tanımı, USB belirtimini izleyen bir bayt dizesi biçimindedir. Tanım bitişiktir ve çerçevenin bellekte temsil edilme sırası, numaralandırma sırasında konağa döndürülenle aynı olacaktır.

Aşağıda yüksek hızlı USB Flash Disk için bir cihaz çerçevesi örneği verilmiştir.

#define DEVICE_FRAMEWORK_LENGTH_HIGH_SPEED 60
UCHAR device_framework_high_speed[] = {
    /* Device descriptor */
    0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x0a, 0x07, 0x25, 0x40, 0x01, 0x00, 0x01, 0x02, 0x03, 0x01,

    /* Device qualifier descriptor */
    0x0a, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00,

    /* Configuration descriptor */
    0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0xc0, 0x32,

    /* Interface descriptor */
    0x09, 0x04, 0x00, 0x00, 0x02, 0x08, 0x06, 0x50, 0x00,

    /* Endpoint descriptor (Bulk Out) */
    0x07, 0x05, 0x01, 0x02, 0x00, 0x02, 0x00,

    /* Endpoint descriptor (Bulk In) */
    0x07, 0x05, 0x82, 0x02, 0x00, 0x02, 0x00
};

Device Framework Dizelerinin Tanımı

Dizeler bir cihazda isteğe bağlıdır. Bunların amacı, USB konağına cihazın üreticisi, ürün adı ve düzeltme numarası hakkında Unicode dizeler aracılığıyla bilgi vermektir.

Ana dizeler, cihaz tanımlayıcılarına eklenmiş dizinlerdir. Ek dize dizinleri tek tek arabirimlere eklenebilir.

Yukarıdaki cihaz çerçevesinin cihaz tanımlayıcısına eklenmiş üç dize dizini olduğunu varsayarsak, dize çerçevesi tanımı bu örnek kod gibi görünebilir.

/* String Device Framework:
    Byte 0 and 1: Word containing the language ID: 0x0904 for US
    Byte 2 : Byte containing the index of the descriptor
    Byte 3 : Byte containing the length of the descriptor string
*/

#define STRING_FRAMEWORK_LENGTH 38
UCHAR string_framework[] = {
    /* Manufacturer string descriptor: Index 1 */
    0x09, 0x04, 0x01, 0x0c,
    0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x20, 0x4c,
    0x6f, 0x67, 0x69, 0x63,

    /* Product string descriptor: Index 2 */
    0x09, 0x04, 0x02, 0x0c,
    0x4D, 0x4C, 0x36, 0x39, 0x36, 0x35, 0x30, 0x30,
    0x20, 0x53, 0x44, 0x4B,

    /* Serial Number string descriptor: Index 3 */
    0x09, 0x04, 0x03, 0x04,
    0x30, 0x30, 0x30, 0x31
};

Her hız için farklı dizelerin kullanılması gerekiyorsa, dizinler hızdan bağımsız olduğundan farklı dizinler kullanılmalıdır.

Dizenin kodlaması UNICODE tabanlıdır. UNICODE kodlama standardı hakkında daha fazla bilgi için aşağıdaki yayına bakın:

Unicode Standart, Dünya Çapında Karakter Kodlaması, Sürüm 1., Birimler 1 ve 2, Unicode Konsorsiyumu, Addison-Wesley Yayımlama Şirketi, Okuma MA.

Her Dize için Cihaz Tarafından Desteklenen Dillerin Tanımı

USBX, varsayılan olarak İngilizce olsa da birden çok dili destekleyebilme özelliğine sahiptir. Dize tanımlayıcıları için her dilin tanımı, aşağıdaki gibi tanımlanan bir dil dizisi tanımı biçimindedir.

#define LANGUAGE_ID_FRAMEWORK_LENGTH 2
UCHAR language_id_framework[] = {
    /* English. */
    0x09, 0x04
};

Ek dilleri desteklemek için varsayılan İngilizce kodundan sonra çift baytlık dil kodu tanımını eklemeniz yeterlidir. Dil kodu belgede Microsoft tarafından tanımlanmıştır.

Windows 95 ve Windows NT için Uluslararası Yazılım Geliştirme, Nadine Kano, Microsoft Press, Redmond WA

Cihaz denetleyicisi

Cihaz denetleyicisi sürücüsü (DCD), USB Cihaz Yığını işlemlerini donanım eylemleriyle birlikte çalıştırır. Normalde, bir USBX uygulamasının başlatma işlevi dışında cihaz denetleyicisi API'lerini çağırması gerekmez. Cihaz denetleyicisi başlatma işlevi çağrıldığında veri yolu etkindir ve yığın, cihaz denetleyicisi sürücüsü aracılığıyla veri yolu sıfırlama ve konak numaralandırma komutlarını yanıtlar.

USB Cihaz Yığını'nın üzerinde çalışabileceği bazı olası donanımlar şunlardır:

  • USB cihaz denetleyicisi ile STMicroelectronics yongası
  • USB cihaz denetleyicisi ile mikroçip yongası
  • USB cihaz denetleyicisi ile NXP yongası
  • USB cihaz denetleyicisi ile artık yonga
  • USB cihaz denetleyicisi ile diğer yonga, vb.

VBUS Yöneticisi

ÇOĞU USB cihaz tasarımında VBUS, USB Cihaz çekirdeğinin bir parçası değildir, hat sinyalini izleyen harici bir GPIO'ya bağlıdır.

Sonuç olarak, VBUS'nin cihaz denetleyicisi sürücüsünden ayrı olarak yönetilmesi gerekir.

Cihaz denetleyicisine VBUS GÇ adresini sağlamak uygulamaya bağlı. VBUS, cihaz denetleyicisi başlatılmadan önce başlatılmalıdır.

VBUS'yi izlemeye yönelik platform belirtimine bağlı olarak, VBUS GÇ başlatıldıktan sonra denetleyici sürücüsünün VBUS sinyallerini işlemesine izin vermek mümkündür veya bu mümkün değilse, uygulamanın VBUS işleme kodunu sağlaması gerekir.

Uygulama VBUS'yi tek başına işlemek istiyorsa tek gereksinimi, bir cihazın ayıklandığını algıladığında işlevi ux_device_stack_disconnect çağırmaktır. BuS RESET onay/deassert sinyali algılandığında denetleyici uyanacağından, bir cihaz takıldığında denetleyiciyi bilgilendirmek gerekmez.