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.
Uyarı
Bu makale, cihaz sürücüsü geliştiricilerine yöneliktir. USB cihazıyla ilgili sorun yaşıyorsanız, Windows 'de USB-C sorunlarını düzeltmek için bakın.
Bu makalede, USB kanalına veri aktarımı başarısız olduğunda deneyebileceğiniz adımlar hakkında bilgi sağlanır. Bu makalede açıklanan mekanizmalar, toplu, kesme ve eşzamanlı olmayan hatlarda iptal, sıfırlama ve döngüsel port işlemlerini kapsar.
USB istemci sürücüsü, varsayılan uç noktaya denetim aktarımları göndererek cihazıyla iletişim kurar, toplu, kesme ve cihazın eşzamanlı uç noktalarına veri aktarımları. Bazen bu aktarımlar, uç noktada bir duraklama durumu gibi çeşitli nedenlerden dolayı başarısız olabilir. Aktarım başarısız olursa, hata koşulu temizlenene kadar ilişkili kanal istekleri işleyemez.
Denetim aktarımları için USB sürücü yığını hata koşullarını otomatik olarak temizler. Veri aktarımları için istemcinin hata koşulundan kurtarmak için uygun adımları atması gerekir. Bir veri aktarımı başarısız olduğunda, USB sürücü yığını başarısız USBD durum kodları aracılığıyla hatayı istemci sürücüsüne bildirir. Sürücü, durum koduna bağlı olarak bir hata kurtarma mekanizması sağlayabilir.
Bu makalede, bu işlemler aracılığıyla hata kurtarma hakkında yönergeler sağlanır.
- USB kanalını sıfırlama
- Cihazın bağlı olduğu USB bağlantı noktasını sıfırlama
- İstemci sürücüsünün cihaz yığınını yeniden listelemek için USB bağlantı noktasını döngüye alın
Bir hata durumunu temizlemek için, reset-pipe işlemiyle başlayın ve ancak gerekliyse reset-port ve cycle-port gibi daha karmaşık işlemleri gerçekleştirin.
Çeşitli kurtarma mekanizmalarını koordine etme hakkında:
İstemci sürücüsünün kurtarma için farklı işlemleri koordine etmesi ve belirli bir zamanda yalnızca bir yöntemin kullanıldığından emin olması gerekir. Örneğin, toplu ve kesme olmak üzere iki uç noktası olan bir cihazı düşünün. Sürücü, cihaza birkaç veri aktarım isteği gönderdikten sonra isteklerin toplu kanalda başarısız olduğunu fark eder. Bu hatalardan kurtarmak için sürücü toplu boruyu sıfırlar. Ancak bu işlem aktarım hatalarını çözmez ve toplu aktarımlar başarısız olur. Bu nedenle, sürücü USB bağlantı noktasını sıfırlama isteğinde bulunur. Bu arada, aktarımlar kesme kanalında başarısız olmaya başlar ve ardından bir cihazı sıfırlama isteği gelir. Kesme aktarımı hatalarından kurtarmak için sürücü kesme kanalında bir sıfırlama kanalı isteği gönderir. Bu iki işlem eşgüdümlü değilse, sürücü her iki borudaki hatalar nedeniyle iki sıfırlama cihazı işlemini aynı anda başlatabilir. Bu eşzamanlı işlemler sorunlu olabilir.
İstemci sürücüsünün belirli bir zamanda yalnızca bir sıfırlama-bağlantı noktası veya döngü bağlantı noktası işlemi gerçekleştirdiğini garanti etmesi gerekir. Bu işlemler sırasında, herhangi bir kanalda bir sıfırlama kanalı işlemi devam etmemelidir ve sürücü yeni bir sıfırlama kanalı isteği göndermemelidir.
Bilmeniz gerekenler
Bu makalede Kernel-Mode Driver Framework (KMDF)kullanılır.
Önkoşullar
İstemci sürücüsü çerçeve USB hedef cihaz nesnesini oluşturmuş olmalıdır.
Microsoft Visual Studio Professional 2012 ile sağlanan USB şablonlarını kullanıyorsanız, şablon kodu bu görevleri gerçekleştirir. Şablon kodu hedef cihaz nesnesinin tutamacını alır ve cihaz bağlamında depolar.
KMDF istemci sürücüsünün WdfUsbTargetDeviceCreateWithParameters yöntemini çağırarak bir WDFUSBDEVICE tanıtıcısı alması gerekir. Daha fazla bilgi için bkz. USB istemci sürücü kodu yapısını anlama (KMDF)"Cihaz kaynak kodu".
İstemci sürücüsünün çerçeve hedef kanal nesnesi için bir tanıtıcısı olmalıdır. Daha fazla bilgi için bkz. USB kanallarınumaralandırma.
1. Adım: Hata koşulunun nedenini belirleme
İstemci sürücüsü BIR USB İstek Bloğu (URB) kullanarak bir veri aktarımı başlatır. İstek tamamlandıktan sonra, USB sürücü yığını aktarımın başarılı mı yoksa başarısız mı olduğunu gösteren bir USBD durum kodu döndürür. Bir hatada USBD kodu hatanın nedenini belirtir.
- WdfUsbTargetDeviceSendUrbSynchronously yöntemini çağırarak URB gönderdiyseniz, yöntem döndürdükten sonra URB yapısının Hdr.Status üyesini denetleyin.
- WdfRequestSend yöntemini çağırarak URB'yi zaman uyumsuz olarak gönderdiyseniz, EVT_WDF_REQUEST_COMPLETION_ROUTINEiçindeki URB durumunu denetleyin. Params parametresi WDF_REQUEST_COMPLETION_PARAMS bir yapıya işaret eder. USBD durum kodunu denetlemek için Usb->UsbdStatus üyesini inceleyin. Kod hakkında bilgi için bkz. USBD_STATUS.
Aktarım hataları, USBD_STATUS_STALL_PID veya USBD_STATUS_BABBLE_DETECTED gibi bir cihaz hatasından kaynaklanabilir. Ana bilgisayar denetleyicisi tarafından, örneğin USBD_STATUS_XACT_ERROR gibi bir hata rapor edildiğinde de sonuçlanabilir.
2. Adım: Cihazın bağlantı noktasına bağlı olup olmadığını belirleme
Kanalı veya cihazı sıfırlayan bir istek göndermeden önce cihazın bağlı olduğundan emin olun. WdfUsbTargetDeviceIsConnectedSynchronous yöntemini çağırarak cihazın bağlı durumunu belirleyebilirsiniz.
3. Adım: Boruya bekleyen tüm aktarımları iptal et.
Boruyu veya bağlantı noktasını sıfırlayan istekleri göndermeden önce, USB sürücü yığınının henüz tamamlanmamış olan kanala bekleyen tüm aktarım isteklerini iptal edin. İstekleri şu yollardan biriyle iptal edebilirsiniz:
WdfIoTargetStop yöntemini çağırarak G/Ç hedefini durdurun.
G/Ç hedefini durdurmak için önce WdfUsbTargetPipeGetIoTarget yöntemini çağırarak çerçeve kanalı nesnesiyle ilişkili WDFIOTARGET tanıtıcısını alın. tutamacını kullanarak WdfIoTargetStopçağırın. Çağrıda, eylemi WdfIoTargetCancelSentIo olarak ayarlayın (bkz. WDF_IO_TARGET_SENT_IO_ACTION); çerçevenin USB sürücü yığını tarafından tamamlanmamış tüm istekleri iptal etmesini sağlamak için. Tamamlanan istekler için istemci sürücüsünün, çerçevenin tamamlama geri çağırmasını beklemesi gerekir.
Abort-pipe isteği gönderin. şu yöntemlerden birini çağırarak isteği gönderebilirsiniz:
WdfUsbTargetPipeAbortSynchronously yöntemini çağırın.
Çağrı senkron çalışır ve yalnızca bekleyen tüm istekler iptal edildikten sonra geri döner. WdfUsbTargetPipeAbortSynchronously isteğe bağlı bir İstek parametresi alır. Önceden ayrılmış bir çerçeve istek nesnesine bir WDFREQUEST tanıtıcısı geçirmenizi öneririz. parametresi, sürücünün erişemediği bir iç istek nesnesi yerine belirtilen istek nesnesini kullanma çerçevesini etkinleştirir. Bu parametre değeri, WdfUsbTargetPipeAbortSynchronously işleminin, yetersiz bellek nedeniyle başarısız olmamasını sağlar.
Bir abort-pipe isteğinin istek nesnesini biçimlendirmek için WdfUsbTargetPipeFormatRequestForAbort yöntemini çağırın ve ardından WdfRequestSend yöntemini çağırarak isteği gönderin.
Eğer sürücü isteği eşzamansız olarak gönderirse, sürücünün uyguladığı EVT_WDF_REQUEST_COMPLETION_ROUTINE için bir işaretçi belirtmesi gerekir. İşaretçiyi belirtmek için WdfRequestSetCompletionRoutine yöntemini çağırın.
Sürücü, WdfRequestSendiçindeki istek seçeneklerinden biri olarak WDF_REQUEST_SEND_OPTION_SYNCHRONOUS belirterek isteği zaman uyumlu olarak gönderebilir. İsteği eşzamanlı olarak gönderirseniz, bunun yerine WdfUsbTargetPipeAbortSynchronously çağırın.
4. Adım: USB boruyu sıfırlama
Boruyu sıfırlayarak hata kurtarmayı başlatın. Bu yöntemlerden birini arayarak bir reset-pipe isteği gönderebilirsiniz:
Eşzamanlı bir şekilde sıfırlama kanalı isteği göndermek için WdfUsbTargetPipeResetSynchronously çağırın.
Bir reset-pipe isteğinin istek nesnesini biçimlendirmek için WdfUsbTargetPipeFormatRequestForReset yöntemini çağırın ve ardından WdfRequestSend yöntemini çağırarak isteği gönderin. Bu çağrılar, 3. adımda açıklandığı gibi abort-pipe isteğine yönelik çağrılara benzer.
Uyarı
Sıfırlama boru işlemi tamamlanana kadar yeni aktarım istekleri göndermeyin.
Reset-pipe isteği, cihazdaki ve ana bilgisayar denetleyicisi donanımındaki hata durumunu temizler. Cihaz hatasını temizlemek için USB sürücü yığını, ENDPOINT_HALT özellik seçicisini kullanarak cihaza bir CLEAR_FEATURE denetim isteği gönderir. İsteğin alıcısı, kanalla ilişkili uç noktadır. Hata koşulu zaman uyumsuz bir kanalda oluştuysa, hata durumunda, zaman uyumsuz uç noktalar otomatik olarak temizlendiğinden sürücü yığını cihazı temizlemek için hiçbir işlem gerçekleştirmez.
Ana bilgisayar denetleyicisi hatasını temizlemek için sürücü yığını kanalın DURMA durumunu temizler ve kanalın veri geçişini 0 olarak sıfırlar.
5. Adım: USB bağlantı noktasını sıfırlama
Eğer bir reset-pipe işlemi hata koşulunu temizlemezse ve veri aktarımları başarısız olmaya devam ederse, bir reset-port isteği gönderin.
Cihaza yapılan tüm aktarımları iptal edin. Bunu yapmak için geçerli yapılandırmadaki tüm kanalları numaralandırın ve her kanal için zamanlanan bekleyen istekleri iptal edin.
Cihazın G/Ç hedefini durdurun.
Çerçeve hedef cihaz nesnesiyle ilişkilendirilmiş bir WDFIOTARGET tutamacını almak için WdfUsbTargetDeviceGetIoTarget yöntemini çağırın. Ardından WdfIoTargetStop çağırın ve WDFIOTARGET tutamacını belirtin. Çağrıda, eylemi WdfIoTargetCancelSentIo (WDF_IO_TARGET_SENT_IO_ACTION) olarak ayarlayın.
WdfUsbTargetDeviceResetPortSynchronously yöntemini çağırarak reset-port isteği gönderin.
Bir sıfırlama bağlantı noktası işlemi, cihazın USB veri yolu üzerinde yeniden numaralandırılmış olmasına neden olur. USB sürücü yığını, numaralandırmadan sonra cihaz yapılandırmasını korur. Sürücü yığını mevcut kanal tutamaçlarının geçerli kalmasını sağladığından istemci sürücüsü daha önce elde edilen kanal tanıtıcılarını kullanabilir.
Bileşik cihazın tek bir işlevini sıfırlayamazsınız. Bileşik bir cihaz için, belirli bir işlevin istemci sürücüsü bir reset-port isteği gönderdiğinde, tüm cihaz sıfırlanır. USB cihazı durumu korursa, bu sıfırlama bağlantı noktası isteği diğer işlevlerin istemci sürücülerini etkileyebilir. Bu nedenle, istemci sürücüsünün bağlantı noktasını sıfırlamadan önce boruyu sıfırlamayı denemesi önemlidir.
6. Adım: USB bağlantı noktasını yeniden başlatın
Döngü-bağlantı noktası işlemi, cihazın elektrik bağlantısı kesilmemiş olması dışında, bağlantı noktasından çıkarılıp yeniden takılan bir cihaza benzer. Cihazın bağlantısı kesilir ve yazılımda yeniden bağlanır. Bu işlem cihaz sıfırlama ve numaralandırmaya yol açar. Sonuç olarak, PnP Yöneticisi cihaz düğümünü yeniden oluşturur.
Bir port sıfırlama işlemi hata durumunu temizlemezse ve veri aktarımları başarısız olmaya devam ederse, bir port döngü isteği gönderin.
Cihaza yapılan tüm aktarımları iptal edin. Geçerli yapılandırmadaki her kanal için zamanlanmış bekleyen isteği iptal ettiğinizden emin olun (bkz. 3. adım).
Cihazın G/Ç hedefini durdurun.
Çerçeve hedef cihaz nesnesiyle ilişkilendirilmiş bir WDFIOTARGET tutamacını almak için WdfUsbTargetDeviceGetIoTarget yöntemini çağırın. Ardından WdfIoTargetStop çağırın ve WDFIOTARGET tutamacını belirtin. Çağrıda, eylemi WdfIoTargetCancelSentIo (WDF_IO_TARGET_SENT_IO_ACTION) olarak ayarlayın.
Şu yöntemlerden birini çağırarak bir cycle-port isteği gönderin:
- Eş zamanlı olarak bir cycle-port isteği göndermek için WdfUsbTargetDeviceCyclePortSynchronously çağırın.
- WdfUsbTargetDeviceFormatRequestForCyclePort yöntemini çağırarak bir döngü bağlantı noktası isteğinin istek nesnesini biçimlendirin ve ardından WdfRequestSend yöntemini çağırarak isteği gönderin. Bu çağrılar, 3. adımda açıklandığı gibi abort-pipe isteğine yönelik çağrılara benzer.
İstemci sürücüsü, yalnızca döngü bağlantı noktası isteği tamamlandıktan sonra cihaza aktarım istekleri gönderebilir. Bunun nedeni, USB sürücü yığını döngü bağlantı noktası isteğini işlerken cihaz düğümünün kaldırılmasıdır.
Döngü bağlantı noktası isteği, cihazın yeniden numaralandırılmış hale çıkmasına neden olur. USB sürücü yığını, PnP Yöneticisi'ne cihazın bağlantısının kesildiğini bildirir. PnP Yöneticisi, istemci sürücüsüyle ilişkili cihaz yığınını ayırır. Sürücü yığını cihazı sıfırlar, USB veri yolu üzerinde yeniden numaralandırır ve PnP Yöneticisi'ne bir cihazın bağlandığını bildirir. Ardından PnP Yöneticisi, USB cihazı için cihaz yığınını yeniden oluşturur.
Döngü portu işlemi sonucunda, cihaza tanıtıcısı açık olan tüm uygulamalar bir cihaz kaldırma bildirimi alır (eğer uygulama böyle bir bildirim için kaydolduysa). Yanıt olarak, uygulama cihaza bağlı olmayan bir iletiyi kullanıcıya bildirebilir. Kullanıcı deneyimini etkilediğinden, istemci sürücüsü yalnızca diğer kurtarma mekanizmaları hata koşulunu çözmezse bir döngü bağlantı noktası isteği seçmelidir.
Bileşik bir cihaz için reset-port işlemine (6. adımda açıklanmıştır) benzer şekilde, döngü-bağlantı noktası işlemi cihazın tek tek işlevlerini değil, tüm cihazı etkiler.