Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, bir işlev denetleyicisi istemci sürücüsünün USB işlev denetleyicisi uzantısı (UFX) ile etkileşim kurarken gerçekleştirdiği çeşitli görevler açıklanmaktadır.
Önemli API'ler
BIR işlev denetleyicisi istemci sürücüsünün USB işlev denetleyicisi uzantısı (UFX) ile etkileşim kurarken gerçekleştirdiği çeşitli görevleri açıklar. UFX ve istemci sürücüsü dışarı aktarma yöntemlerini ve olay geri çağırma işlevlerini kullanarak birbirleriyle iletişim kurar. Dışarı aktarma yöntemleri (UfxDeviceXxx veya UfxEndpointXxx) UFX tarafından dışarı aktarılır ve istemci sürücüsü tarafından çağrılır. Geri çağırma işlevleri (EVT_UFX_Xxxadlı) istemci sürücüsünde uygulanır ve UFX tarafından çağrılır.
UFX, tüm istemci sürücülerinin geri çağırma fonksiyonlarını eşzamansız olarak, nesne başına bir kerede bir geri çağırmayı olmak üzere çağırır. Örneğin, bir USB cihaz nesnesi ve üç uç nokta nesnesi vardır. Aynı anda en fazla dört geri çağırma işlevi (cihaz için bir ve her uç nokta için bir geri çağırma işlevi) çağrılabilir. Her geri çağırma yöntemi için UFX, istemci sürücüsü UfxDeviceEventComplete çağırarak sürücünün isteği tamamladığını belirtene kadar bekler. UFX'in bu dışarı aktarmaları beklerken dinlediği tek başka dışarı aktarma yöntemi, UfxDeviceNotifyHardwareFailure. Birçok istemci geri çağırma işlevi isteğe bağlıdır. Gerekli işlevler şunlardır:
- EVT_UFX_DEVICE_DEFAULT_ENDPOINT_ADD
- EVT_UFX_DEVICE_ENDPOINT_ADD
- EVT_UFX_DEVICE_HOST_CONNECT
- EVT_UFX_DEVICE_HOST_DISCONNECT
- EVT_UFX_DEVICE_ADDRESSED
Başlatma İşlemi
- İşlev denetleyicisi istemci sürücüsü, Windows Driver Foundation (WDF) istemci sürücüsünün EVT_WDF_DRIVER_DEVICE_ADD geri çağırma uygulamasını çağırdığında başlatma işlemini başlatır. Bu uygulamada istemci sürücüsünün UfxFdoInit çağırması ve ardından WdfDeviceCreateçağırarak cihaz nesnesini oluşturması beklenir.
- İstemci sürücüsü UfxDeviceCreate çağırarak USB cihaz nesnesini oluşturur ve UFXDEVICE tanıtıcısını alır.
- İstemci sürücüsü, UFX'e artık istemci sürücüsünün geri çağırma işlevlerini çağırabileceğini belirtmek için UfxDeviceNotifyHardwareReady çağrısını yapar.
- UFX aşağıdakiler gibi başlatma görevleri gerçekleştirir:
- UFX, varsayılan uç noktayı oluşturmak için istemci sürücüsünün EVT_UFX_DEVICE_DEFAULT_ENDPOINT_ADD uygulamasını çağırır.
- UFX, cihaz tarafından desteklenen arabirimler için çocuk fiziksel cihaz nesneleri (PPO'lar) oluşturur.
- UFX, IOCTL_INTERNAL_USBFN_ACTIVATE_USB_BUS isteğini gönderirken aygıt sınıfı sürücünün etkinleştirilmesini bekler. Ayrıca istemci sürücüsünün cihazın eklendiğini belirten UfxDeviceNotifyAttach çağırmasını bekler.
Sınıf sürücüsü bildirisi
Kurulum paketlerinin ve veri yolunun durumunun bildirilmesi için sınıf sürücüsünün IOCTL_INTERNAL_USBFN_ACTIVATE_USB_BUS istekleri göndermesi gerekir. UFX, bu istekleri sınıf sürücüsüne özgü bildirim kuyruklarında kuyruğa alır. İstemci sürücüsünden bir otobüs olayı hakkında bildirim alındığında, UFX her uygun kuyruktan çıkar ve isteği tamamlar. Sınıf sürücülerinin bildirimlerin eksik olmasını önlemek için UFX, sınıf sürücüsü için sabit boyutlu bir bildirim kuyruğu tutar.
Cihaz ekleme ve ayırma olayları
UFX, işlev denetleyicisi istemci sürücüsü UfxDeviceNotifyAttachçağırana kadar cihazın bağlı olmadığını varsayar.
Bu çağrıdan sonra UFX, cihaz durumunu USB belirtiminde tanımlandığı şekilde Güçlendirilmiş olarak ayarlar. UFX, istemci sürücüsüne durum değişikliğini bildirmek için istemci sürücüsünün EVT_UFX_DEVICE_USB_STATE_CHANGE uygulamasını çağırır.
UFX, cihazı şarj etmeye yardımcı olması için şarj cihazı sürücüsüne (Cad.sys) bildirir. UFX ayrıca daha önce sınıf sürücüleri tarafından gönderilen IOCTL_INTERNAL_USBFN_BUS_EVENT_NOTIFICATION isteklerini tamamlayarak sınıf sürücülerine de bildirir.
İstemci sürücüsü, veri yolu ayrılırken UfxDeviceNotifyDetach çağırmalıdır. İstemcinin her UfxDeviceNotifyAttachçağrısından sonra ayırmayı yalnızca bir kez çağırması gerekir. UfxDeviceNotifyDetach çağrısından sonra, UFX EVT_UFX_DEVICE_HOST_DISCONNECT çağırır (eğer bu bir arabirim değişikliği değilse). UFX daha sonra tüm uç nokta kuyruklarını temizleme ve varsayılan uç nokta kuyruğunun başlatılması gibi tüm temizleme görevleriyle devam eder. UFX EVT_UFX_DEVICE_USB_STATE_CHANGE çağırır ve IOCTL_INTERNAL_USBFN_BUS_EVENT_NOTIFICATION isteklerini tamamlayarak sınıf sürücülerini bilgilendirir.
Donanım hatası
Donanım hatası oluşursa, istemci sürücüsünün UfxDeviceNotifyHardwareFailureçağrısı beklenir. Yanıt olarak, UFX cihaz yığınını söker ve istemci sürücüsünü EVT_UFX_DEVICE_CONTROLLER_RESETçağırarak bu durumdan kurtulmaya çalışabilir. İstemci, denetleyiciyi ilk durumuna sıfırlamalıdır. Başka bir donanım hatası oluşursa istemcinin UfxDeviceNotifyHardwareFailure'ı yeniden çağırması gerekir. İkinci çağrıda UFX, durumunu ve hata denetimini kaydeder.
Bağlantı noktası algılama
Bağlantı noktası algılama UFX tarafından gerçekleştirilir. Cihazın bağlı olduğu bağlantı noktasının türünü belirlemek için işlev denetleyicisi istemci sürücüsünün EVT_UFX_DEVICE_PORT_DETECT geri çağırma işlevini çağırır. İstemci, UfxDevicePortDetectComplete veya UfxDevicePortDetectCompleteExUSBFN_PORT_TYPEiçinde tanımlanan bağlantı noktası türlerinden biriyle çağırarak yanıt verir.
İstemci bağlantı noktasının türünü belirleyemezse, istemci usbfnUnknownPort bildirmelidir. Bağlantı noktası bilinmiyorsa veya aşağı akış bağlantı noktasıysa, UFX istemci sürücüsünün EVT_UFX_DEVICE_HOST_CONNECT işlevini çağırır. UFX bir süre otobüsü dinler. Bağlantı noktası bilinmiyorsa ancak kurulum paketi gibi bir trafik varsa, UFX usbfnStandardDownstreamPort varsayacaktır. Aksi takdirde, UFX bağlantı noktasını UsbfnInvalidDedicatedChargingPortolarak atar. Bir bağlantı noktası türü belirlendikten sonra UFX, Cad.sys bildirir ve istemci sürücüsünün EVT_UFX_DEVICE_PORT_CHANGE işlevini çağırır. İşlevde istemci sürücüsünün donanım durumunu UFX bağlantı noktası türüyle eşleşecek şekilde değiştirmesi beklenmiştir.
Uç nokta oluşturma
UFX, ana bilgisayar tarafından gönderilen kurulum paketlerini işleyebilmesi için istemci sürücüsünün EVT_UFX_DEVICE_DEFAULT_ENDPOINT_ADD çağırarak varsayılan uç noktayı (uç nokta 0) oluşturur. UFX, EVT_UFX_DEVICE_ENDPOINT_ADDçağırarak başka uç noktalar oluşturur. UFX yalnızca istemci sürücüsü UfxDeviceNotifyHardwareReadyçağırdıktan sonra uç noktalar oluşturur. Bu geri çağırma işlevlerinde istemci sürücüsünün uç nokta nesnesine UfxEndpointCreate çağırması ve UFXENDPOINT tanıtıcısını alması beklenir. UFX, üst öğeyi, uç noktanın ait olduğu arabirimle ilişkili sınıf sürücüsü PDO'suna ayarlar. Varsayılan uç noktanın üst öğesi USB cihaz nesnesidir. Uç nokta iki çerçeve kuyruğu nesnesi içerir: aktarım kuyruğu ve komut Kuyruğu; her ikisi de yalnızca cihaz Yapılandırılmış durumda olduğunda erişilebilir (UFX EVT_UFX_DEVICE_HOST_CONNECTçağrısından sonra erişilebilen Uç Nokta 0 hariç).
- Komut kuyruğu istekleri
- IOCTL_INTERNAL_USBFN_GET_PIPE_STATE
- IOCTL_INTERNAL_USBFN_SET_PIPE_STATE
- IOCTL_INTERNAL_USBFN_DESCRIPTOR_UPDATE
- Kuyruk isteklerini aktarma
- IOCTL_INTERNAL_USBFN_TRANSFER_IN
- IOCTL_INTERNAL_USBFN_TRANSFER_IN_APPEND_ZERO_PKT
- IOCTL_INTERNAL_USBFN_TRANSFER_OUT
- IOCTL_INTERNAL_USBFN_CONTROL_STATUS_HANDSHAKE_IN
- IOCTL_INTERNAL_USBFN_CONTROL_STATUS_HANDSHAKE_OUT
Cihaz numaralandırması
İstemci sürücüsü, UFX sürücünün EVT_UFX_DEVICE_HOST_CONNECTçağırmadan önce bir konakla bağlantılara izin vermemelidir. cihaz numaralandırması, istemci sürücüsü UfxDeviceNotifyResetçağırdığında başlar. Varsayılan durumunda, UFX standart kurulum paketlerini işler.
Sıfırla
UFX tüm uç nokta kuyruklarını temizler ve istemci sürücüsüne bir IOCTL_INTERNAL_USBFN_DESCRIPTOR_UPDATE isteği göndererek uç nokta 0'ın wMaxPacketSize güncelleştirir. UFX, varsayılan uç noktanın kuyruğuna başlar ve durumu varsayılan olarak ayarlar.
Varsayılan
UFX, istemci sürücüsünün EVT_UFX_DEVICE_USB_STATE_CHANGE işlevini çağırır. Ayrıca, durumu sınıf sürücülerine bildirir. UFX standart SET_ADDRESS kurulum paketini aldıktan sonra, UFX durumu Adreslendiolarak ayarlar.
Ele alındı
UFX, istemciye hangi adresi kullanması gerektiğini belirtmek için istemci sürücüsünün EVT_UFX_DEVICE_ADDRESSED işlevini çağırır. - Adres 0 ise, UFX durumu Varsayılan olarak ayarlar ve EVT_UFX_DEVICE_USB_STATE_CHANGE çağırır ve sınıf sürücülerini bildirir. UFX, SET_CONFIGURATION standart kurulum paketini alırken durumu Yapılandırılmışolarak ayarlar.
yapılandırılmış
Seçilen yapılandırma 0 ise, UFX arabirim uç noktalarını temizler ve durumu Adreslendiolarak ayarlar. UFX, arabirim uç noktalarının wMaxPacketSize güncelleştirmek için istemci sürücüsüne bir IOCTL_INTERNAL_USBFN_DESCRIPTOR_UPDATE isteği gönderir. UFX, tüm arabirim uç noktası kuyruklarının temizlemeyi tamamlayıp arabirim uç noktası kuyruklarını başlatmasını sağlar. Bağlantı noktası türü UsbfnStandardDownstreamPort veya UsbfnChargingDownstreamPortdeğilse, UFX bağlantı noktası türünü UsbfnStandardDownstreamPort olarak değiştirir ve Cad.sys; istemci sürücüsünü, durumu güncelleştirmek için EVT_UFX_DEVICE_PORT_CHANGE ve EVT_UFX_DEVICE_USB_STATE_CHANGE çağırarak bilgilendirir; yapılandırılan durumun sınıf sürücüleri hakkında.
Standart denetim aktarımları
UFX, istemci sürücüsünün kullanarak varsayılan uç noktayı oluşturduğu EVT_UFX_DEVICE_DEFAULT_ENDPOINT_ADDçağırdıktan sonra varsayılan uç noktadaki denetim aktarımlarını işleyebilir. Tüm denetim aktarımları 8 baytlık bir kurulum paketiyle başlar. Ana bilgisayara bir kurulum paketi göndermek için istemci sürücüsünün UfxEndpointNotifySetupçağrısı yapması gerekir. Standart denetim aktarımları UFX tarafından tamamlanır. Denetim aktarımıyla ilişkili veriler varsa, UFX varsayılan denetim uç noktasından uygun şekilde okur ve yazar.
Standart Olmayan denetim aktarımları
UFX bir denetim transferini gerçekleştiremezse, bu transfer, bir IOCTL_INTERNAL_USBFN_BUS_EVENT_NOTIFICATION isteği tamamlanarak uygun sınıf sürücüsüne yönlendirilir. Denetim aktarımları, uç nokta tanımlayıcısında denetim uç noktası olarak tanımlanan herhangi bir uç noktada gerçekleşebilir. Varsayılan denetim uç noktası dışındaki uç noktalarda denetim aktarımları her zaman standart olmayan denetim aktarımlarıdır. Denetim uç noktası varsayılan denetim uç noktasıysa, UFX bu sınıf sürücüsü için sınıf istekleri olarak işaretlenmiş kurulum paketlerini sınıf sürücülerine bildirir. Denetim uç noktası bir arabirime aitse, UFX bu arabirimle ilişkili sınıf sürücüsünü bildirir. Gerekirse, sınıf sürücülerinin denetim uç noktasından okuması ve yazması beklenir.
Veri aktarımları
Veri aktarımları sınıf sürücüleri tarafından IOCTL_INTERNAL_USBFN_TRANSFER_IN, IOCTL_INTERNAL_USBFN_TRANSFER_IN_APPEND_ZERO_PKTveya IOCTL_INTERNAL_USBFN_TRANSFER_OUT istekleri gönderilerek başlatılır. UFX, bu isteklerin her birini doğruladıktan sonra istemci sürücüsü tarafından işlenecek uygun uç nokta kuyruğuna iletir. İstemci sürücüsünün ek doğrulama gerçekleştirmesi beklenir. İstemci sürücüsü uç nokta kuyruklarında aktarım istekleri alır. İstemci sürücüsü bu kuyruktan veri yolu kullanımını en üst düzeye çıkarmak için gereken sayıda istek alabilir. İstemci sürücüsü STATUS_SUCCESS ile başarılı istekleri tamamlamalıdır. Sürücü istekleri iptal etmek için en iyi çabayı göstermelidir ve iptal edilirse STATUS_CANCELLED ile iptal edilen istekleri tamamlamalıdır. Geçersiz parametreler geçirilirse, istemci sürücüsü isteği STATUS_INVALID_PARAMETER ile tamamlar.
Aktarımları denetleme
Denetim aktarımları 8 baytlık kurulum paketiyle başlar. Ana bilgisayara bir kurulum paketi göndermek için istemci sürücüsünün UfxEndpointNotifySetupçağrısı yapması gerekir. UFX, standart olmayan denetim aktarımlarını bildirmek için bildirim isteklerini tamamlayarak sınıf sürücülerini uyarır. Hem istemciler hem de UFX, varsayılan denetim uç noktasından okumak ve bu uç noktaya yazmak için IOCTL_INTERNAL_USBFN_TRANSFER_IN, IOCTL_INTERNAL_USBFN_TRANSFER_IN_APPEND_ZERO_PKTveya IOCTL_INTERNAL_USBFN_TRANSFER_OUT kullanır. Ancak bir arabirim, yalnızca ilgili sınıf sürücüsünün kullanabileceği diğer denetim uç noktalarını tanımlayabilir. Denetim uç noktaları bir kurulum paketine yanıt olarak durdurulabilir. Sınıf sürücüleri uç noktayı geciktirmek için IOCTL_INTERNAL_USBFN_SET_PIPE_STATE isteği gönderir. Donanım veya istemci sürücüsünün, uç noktadaki trafik durdurulduktan sonra trafiği hemen yeniden başlatması beklenir. Denetim uç noktaları ayrıca, önceki veriler olmadan sıfır uzunluklu paketler (ZLP) gönderebilir ve alabilir. İstemci sürücüsü ve UFX bunu IOCTL_INTERNAL_USBFN_CONTROL_STATUS_HANDSHAKE_IN ve IOCTL_INTERNAL_USBFN_CONTROL_STATUS_HANDSHAKE_OUTkullanarak yapabilir.
Toplu ve kesme aktarımları
Toplu aktarımlar veri teslimini garanti eder ve büyük miktarlarda veri göndermek için kullanılır. Aktarımlar IOCTL_INTERNAL_USBFN_TRANSFER_IN, IOCTL_INTERNAL_USBFN_TRANSFER_IN_APPEND_ZERO_PKTveya IOCTL_INTERNAL_USBFN_TRANSFER_OUTkullanılarak toplu uç noktaya gönderilebilir. Toplu uç noktalar, IOCTL_INTERNAL_USBFN_SET_PIPE_STATEkullanarak kontrol uç noktalarına benzer şekilde durdurulabilir. İstemci sürücüsünün tüm konak isteklerine yanıt olarak bir STALL paketi göndermesi ve IOCTL isteklerini tutması beklenir. Denetim uç noktalarının aksine, durdurulan bir toplu uç nokta, bekleme durumu açıkça temizlenene kadar durdurulmuş durumda kalır.
Kesme Aktarımları Kesme aktarımları toplu aktarımlar gibidir, ancak garantili bir gecikme süresine sahiptir. Kesme aktarımları toplu aktarımlarla aynı arabirime sahiptir, ancak akış özelliklerine sahip değildir.
Zaman uyumsuz aktarımlar
İstemci sürücüsünün bu sürümde zaman uyumsuz aktarımları desteklemesi beklenmiyor.
Güç yönetimi
İstemci sürücüsü, güç yönetiminin tüm yönlerine sahip olur. Geri çağırma işlevleri zaman uyumsuz olduğundan, istemci sürücüsünün uygun bir güç durumuna geri dönmesi ve UfxDeviceEventCompletegibi uygun olay tamamlama dışarı aktarma işlevini çağırmadan önce isteği tamamlaması beklenir.
Cihaz durumu (USBFN_DEVICE_STATE'de tanımlanır) UsbfnDeviceStateSuspended ve UsbfnDeviceStateAttached ise ve bir bağlantı noktası türü bildirmediyse UFX çalışma durumundadır. "Alternatif olarak, UFX, bağlantı noktası türünü ('USBFN_PORT_TYPE' içinde tanımlanır) UsbfnStandardDownstreamPort veya UsbfnChargingDownstreamPortolarak bildirmiştir."
UFX, EVT_UFX_DEVICE_USB_STATE_CHANGE veya EVT_UFX_DEVICE_PORT_CHANGE uygulamalarını çağırarak Çalışma durumuna girer ve bu durumdan çıkar. İstemci sürücüsü UfxDeviceEventCompleteçağırdığında çalışma durumuna geçiş veya çalışma durumundan çıkış tamamlanır.
Çalışma durumunda, UFX herhangi bir geri çağırma çağırabilir. Çalışma durumunda değilken, UFX yalnızca çalışma durumuna girmek için EVT_UFX_DEVICE_USB_STATE_CHANGE çağırır; askıya alma sırasında (destekleniyorsa) uzaktan uyandırma sinyalini vermek için EVT_UFX_DEVICE_REMOTE_WAKEUP_SIGNAL çağırır.
Cihaz askıya al
3 milisaniye boyunca otobüste trafik olmadığında cihaz askıya alınır. Bu durumda, istemci sürücüsünün askıya alma ve sürdürme algıladığında, UFX'i bilgilendirmek için UfxDeviceNotifySuspend ve UfxDeviceNotifyResumeyöntemlerini çağırması gerekir. UFX, bu çağrıları aldığında EVT_UFX_DEVICE_USB_STATE_CHANGE çağırır ve IOCTL_INTERNAL_USBFN_BUS_EVENT_NOTIFICATION isteklerini tamamlayarak sınıf sürücülerini bildirir. Uzaktan uyandırma cihaz tarafından destekleniyorsa ve ana bilgisayar tarafından etkinleştiriliyorsa, UFX, uzaktan uyandırma sinyali vermek için askıya alınırken EVT_UFX_DEVICE_USB_STATE_CHANGE çağrılarını çalıştırabilir.