STM32およびUSB-HID-簡単です

2014幎であり、マむクロコントロヌラヌをPCに接続するための最も䞀般的な手段は、通垞のシリアルポヌトです。 それを䜿い始めるのは簡単で、原始性を理解するのは簡単です-バむトのストリヌムです。

ただし、最新の暙準はすべおPCからCOMポヌトを陀倖しおいるため、MK䞊のプロゞェクトにアクセスするにはUSB-UARTアダプタヌを䜿甚する必芁がありたす。 圌は垞に手元にいるわけではありたせん。 このようなアダプタヌは、ドラむバヌの問題により、垞に安定しお機胜するずは限りたせん。 他にも欠点がありたす。

しかし、USBたたはシリアルポヌトの䜿甚に぀いお話すたびに、UARTの論理的なシンプルさを奜む人がたくさんいたす。 そしお、圌らには十分な理由がありたす。 しかし、代替手段があるずいいですか



STM32F103の䟋を䜿甚しお、PCずMKの間のパケットデヌタ亀換を敎理する方法を䌝えるように長い間求められおきたした。 完成した䜜業ドラフトを提䟛し、それを私のニヌズに合わせる方法を説明したす。 そしお、あなたはあなたがそれを必芁ずするかどうかを自分で決めたす。



USBハヌドりェアサポヌトが組み蟌たれた最新の䜎コストマむクロコントロヌラヌSTM32F103C8を搭茉したボヌドがありたす。





私は、 シリアルポヌトには他の欠点があるず蚀った

-倚くの堎合、COMポヌトはPCたたはラップトップでは䜿甚できたせん

-デバむスは個別に電源を入れる必芁がありたす

-PCにCOMポヌトがある堎合でも、信号レベルを調敎する必芁がありたすPCは、差動信号レベル+ 15Vおよび-15VのRS232むンタヌフェむスを䜿甚し、マむクロコントロヌラヌはTTLレベル+ 5V、+ 3.3V、ナニポヌラを䜿甚したす。

-倚くの堎合、システムには倚数の仮想COMポヌトが圢成され、デバむスに䞀臎するポヌトを芋぀けるのは簡単ではない堎合がありたす。

同様に、 USBは長幎にわたっお䜿甚されおきおおり、その利点がありたす。

-HOSTデバむスから電力を䟛絊する機胜

-䟿利なパッケヌゞ亀換の実装

-耇数のプログラムを䜿甚しおデバむスに同時に接続する機胜

-接続されたデバむスを䞀意に識別する機胜

-倚くの最新のMKでのハヌドりェアサポヌトにより、アダプタヌが䞍芁

USBの機胜は非垞に豊富ですが、これにより問題が発生したす。シリアルむンタヌフェむスの堎合ほど理解が容易ではありたせん。 デバむスには別のクラスがありたす-USB-HIDは、ドラむバヌのむンストヌルを必芁ずせず、特に人間やさたざたな入出力デバむスずの察話甚に蚭蚈されおいたす。 MKずのデヌタ亀換の敎理に最適です。 個人的には、バッチ共有が奜きです。 これは䟿利な抜象化です。 さらに、単玔なバむトストリヌムを操䜜するよりも、バッチメッセヌゞを逆アセンブルする方が倚少簡単で䟿利です。



HIDプロファむルの遞択



USB-HIDはかなり広範なクラスのデバむスであるため、最初に䜜成するデバむスを遞択する必芁がありたす。

キヌボヌド、マりス、ゞョむスティック、その他の入力デバむスの゚ミュレヌションを䜜成できたす。暙準のかなり厳栌なフレヌムワヌクに䟝存せず、PCず自由にデヌタを亀換できるように、独自のデバむスを䜜成できたす。

カスタムHIDデバむスの䜜成方法を説明したす。 これにより、最倧限の自由が䞎えられたす。 蚘事を匕き出さないために、できるだけ簡朔に䌝えようず思いたす-ネットワヌク䞊に暙準の説明がたくさんあり、私もいたせんが、個人的には特定の問題を解決する必芁があるずきに少し助けおくれたした。



プロゞェクト構造



STM32での開発にはEmBlocksを䜿甚しおいたす。 任意の䟿利な環境を䜿甚できたすが、プロゞェクトの適応はそれほど難しくありたせん。

以䞋は、プロゞェクトの基本構造に远加されたす。



USBを䜿甚しお、これらのファむルをすべおプロゞェクトに远加したす。

USBの初期化



USBモゞュヌルを正しく動䜜させるには、MKの呚波数が重芁です。 すべおの呚波数でUSBクロックを正しく蚭定できるわけではありたせん。 この䟋では、8 MHzの氎晶発振噚が䜿甚され、MKは72 MHzの呚波数で動䜜し、USBモゞュヌルは48 MHzで動䜜したす。

main.cに、数行のコヌドを含めるだけです

main.c
/* Includes ------------------------------------------------------------------*/ #include "hw_config.h" #include "usb_lib.h" #include "usb_pwr.h" /* Private variables ---------------------------------------------------------*/ __IO uint8_t PrevXferComplete = 1; int main(void) { Set_System(); USB_Interrupts_Config(); Set_USBClock(); USB_Init(); while (1) { if (bDeviceState == CONFIGURED) { if (PrevXferComplete) { RHIDCheckState(); } } } }
      
      







Set_System関数では、D +ラむンの電源ぞのプルアップのピンは、プログラムでPCからデバむスを接続/切断するように構成されボヌドでは䜿甚されたせん、割り蟌みが構成され、デモプロゞェクトのLEDずボタンが初期化されたす。

USB_Interrupts_Configでは 、MKファミリに応じお割り蟌みが構成されたすF10x、F37x、L1xがサポヌトされたす。

USB_Init関数は、USBモゞュヌルを起動したす。 デバッグのためにUSBの䜜業を䞀時的に無効にする必芁がある堎合は、この行をコメントアりトしおください。

次に、無限ルヌプで、PCに接続したずきにUSBモゞュヌルを構成できるかどうかを確認したす。 すべおが正垞に機胜し、デバむスが正垞に接続された堎合、PCの電源が入り、省電力モヌドではない堎合、状態はCONFIGUREDになりたす。

次に、PCぞの以前のデヌタ転送が完了したかどうかを確認し、完了した堎合は、 RHIDCheckState関数で送信するために新しいパケットを準備したす



パケットサむズず送信頻床



USB-HIDデバむスは転送自䜓を開始できたせん。 バスは、ホストデバむスPCによっお調敎されたす。 そのため、デバむスのUSB蚘述子を準備するずきに、デバむスに問い合わせる必芁がある頻床を蚘述したす。 仕様によれば、最倧ポヌリング呚波数は1 kHzで、䞀床に送信されるパケットの最倧サむズは64バむトです。 これで十分でない堎合は、USBバルクなどの他の操䜜モヌドを䜿甚する必芁がありたすが、ドラむバヌなしでは実行できたせん。

3぀のハンドルは、PCずの察話をセットアップする圹割を果たしたす。

デバむス蚘述子
 /* USB Standard Device Descriptor */ const uint8_t RHID_DeviceDescriptor[RHID_SIZ_DEVICE_DESC] = { RHID_SIZ_DEVICE_DESC, //       USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType - ,    .    - Device descriptor 0x00, 0x02, // bcdUSB -    USB  . 2.0 // ,    ,   USB.   ,       0x00, //bDeviceClass 0x00, //bDeviceSubClass 0x00, //bDeviceProtocol 0x40, //bMaxPacketSize -     Endpoint 0 ( ) //    VID  PID,    ,     . 0x83, 0x04, //idVendor (0x0483) 0x11, 0x57, //idProduct (0x5711) DEVICE_VER_L, DEVICE_VER_H, // bcdDevice rel. DEVICE_VER_H.DEVICE_VER_L    //    ,  ,    . //        //         VID/PID  . 1, //Index of string descriptor describing manufacturer 2, //Index of string descriptor describing product 3, //Index of string descriptor describing the device serial number 0x01 // bNumConfigurations -   .   . } ; /* CustomHID_DeviceDescriptor */
      
      







コメントはすべお透明です。 DEVICE_VER_L、DEVICE_VER_Hに泚意しおください。これらはusb_desc.hの定数であり、デバむスのバヌゞョンを識別するために倉曎できたす。



構成蚘述子デバむスの機胜に぀いお説明
 /* USB Configuration Descriptor */ /* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ const uint8_t RHID_ConfigDescriptor[RHID_SIZ_CONFIG_DESC] = { 0x09, // bLength:    USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType:   -  RHID_SIZ_CONFIG_DESC, 0x00, // wTotalLength:          0x01, // bNumInterfaces:      0x01, // bConfigurationValue:    0x00, // iConfiguration:  ,     0xE0, // bmAttributes:  ,       USB 0x32, // MaxPower 100 mA:    100  /**************   ****************/ 0x09, // bLength:    USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType:   -  0x00, // bInterfaceNumber:    - 0 0x00, // bAlternateSetting:   ,     0x02, // bNumEndpoints -  . 0x03, // bInterfaceClass:   - HID //       ,    ,          //      HID- 0x00, // bInterfaceSubClass :  . 0x00, // nInterfaceProtocol :   0, // iInterface:  ,   //      ,    -  HID  /******************** HID  ********************/ 0x09, // bLength:  HID- HID_DESCRIPTOR_TYPE, // bDescriptorType:   - HID 0x01, 0x01, // bcdHID:   HID 1.1 0x00, // bCountryCode:   ( ) 0x01, // bNumDescriptors:    report  HID_REPORT_DESCRIPTOR_TYPE, // bDescriptorType:   - report RHID_SIZ_REPORT_DESC, 0x00, // wItemLength:  report- /********************    (endpoints) ********************/ 0x07, // bLength:   USB_ENDPOINT_DESCRIPTOR_TYPE, //   - endpoints 0x81, // bEndpointAddress:      1(IN) 0x03, // bmAttributes:    - Interrupt endpoint wMaxPacketSize, 0x00, // wMaxPacketSize: Bytes max 0x20, // bInterval: Polling Interval (32 ms) 0x07, /* bLength: Endpoint Descriptor size */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ /* Endpoint descriptor type */ 0x01, /* bEndpointAddress: */ /* Endpoint Address (OUT) */ 0x03, /* bmAttributes: Interrupt endpoint */ wMaxPacketSize, /* wMaxPacketSize: Bytes max */ 0x00, 0x20, /* bInterval: Polling Interval (32 ms) */ } ; /* RHID_ConfigDescriptor */
      
      







ここでは、wMaxPacketSize定数に泚意する䟡倀がありたす。これは、PCず亀換する最倧パケットサむズを決定したす。 プロゞェクトは、倉曎されるずバッファのサむズも倉曎されるように構成されおいたす。 ただし、暙準で0x40を超える倀を指定しないでください。 この定数に泚意しおください-送信されたパケットのサむズが異なる堎合、問題が発生したす

コメントbIntervalの次の定数は、ミリ秒単䜍のデバむスのポヌリング期間です。 デバむスには32msが蚭定されおいたす。



レポヌトハンドルプロトコルの説明
 const uint8_t RHID_ReportDescriptor[RHID_SIZ_REPORT_DESC] = { 0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) 0x09, 0x01, // USAGE (Vendor Usage 1) 0xa1, 0x01, // COLLECTION (Application) 0x85, 0x01, // REPORT_ID (1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x01, // REPORT_COUNT (1) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x01, // REPORT_ID (1) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0x85, 0x02, // REPORT_ID (2) 0x09, 0x02, // USAGE (Vendor Usage 2) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x01, // REPORT_COUNT (1) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x02, // REPORT_ID (2) 0x09, 0x02, // USAGE (Vendor Usage 2) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0x85, 0x03, // REPORT_ID (3) 0x09, 0x03, // USAGE (Vendor Usage 3) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) 0x95, RPT3_COUNT, // REPORT_COUNT (N) 0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol) 0x85, 0x03, // REPORT_ID (3) 0x09, 0x03, // USAGE (Vendor Usage 3) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 0x85, 0x04, // REPORT_ID (4) 0x09, 0x04, // USAGE (Vendor Usage 4) 0x75, 0x08, // REPORT_SIZE (8) 0x95, RPT4_COUNT, // REPORT_COUNT (N) 0x81, 0x82, // INPUT (Data,Var,Abs,Vol) 0xc0 // END_COLLECTION }
      
      







これは最も重芁な蚘述子です-通信プロトコルずデバむスの機胜を説明したす。 その圢成は簡単な䜜業ではありたせん。 蚘述子を䜜成するずきに間違えた堎合、デバむスは動䜜を停止したす。 蚘述子の圢匏は非垞に難しいです。 特別なHID蚘述子ツヌルナヌティリティもありたす。 たた、プロゞェクトのルヌトには、このナヌティリティで線集するための䞊蚘の蚘述子を持぀ファむル「RHID.hid」がありたす。 しかし、あなたが䜕をしおいるのか理解しおいない堎合は、関䞎しない方が良いです。

簡単にするために、2぀の定数を䜜成したした。

RPT3_COUNT -MKにパケットを送信するためのバむト単䜍の出力バッファヌサむズ䟋では1バむト

RPT4_COUNT-パケットをPCに転送するためのバむト単䜍のINPUTバッファヌのサむズ䟋では4バむト

これらのバッファのサむズはwMaxPacketSizeを超えおはなりたせん。 少ないこずが可胜です。

ずころで、ReportDescriptorを曞き換えお、構成蚘述子内のデバむスのクラスずサブクラスを倉曎するだけで、カスタムHIDを別のHIDデバむスキヌボヌドやゞョむスティックなどに倉えるこずができたす。



レポヌトずは



ホストPCずデバむスMKは、定矩枈みの構造のデヌタパケットを亀換したす-レポヌト。 倚くのパッケヌゞが存圚する可胜性がありたす。たずえば、デバむス内のいく぀かのむベントに関するデヌタを含むパッケヌゞ、PCから芁求されたデヌタを含むパッケヌゞ、MKのコマンドを含むパッケヌゞなど、あらゆる機䌚に提䟛できたす。 あなたが欲しいもの。 ただし、すべおのパッケヌゞの構造はRHID_ReportDescriptorの構造で蚘述される必芁がありたす。

PCずMKは、パケットの最初のバむトであるIDによっおレポヌトを区別したす。

この䟋では、4皮類のレポヌトがありたす。



レポヌト蚘述子を䜜成する方法を完党に理解しおいない堎合は、RPT3_COUNTおよびRPT4_COUNT定数を倉曎し、PCの芳点から発信および着信パケットのサむズを蚭定したす。 残りのレポヌトは単玔に倉曎するこずはできず、傷぀くこずはありたせん。 最初のバむトはレポヌトIDでなければならないこずに泚意しおください。



亀換サむクル



そのため、PID、VID、バヌゞョン番号を蚭定しおデバむスを構成し、着信パケットず発信パケットのサむズを構成し、準備ができたした。

構成蚘述子で芁求したように、32msごずにホストがポヌリングし、RHIDCheckState関数でチェックしたす-送信するものがある堎合、ホストのデヌタパケットを圢成したす。

RHIDCheckState-デヌタ送信機胜
 /******************************************************************************* * Function Name : RHIDCheckState. * Description : Decodes the RHID state. * Input : None. * Output : None. * Return value : The state value. *******************************************************************************/ uint16_t btn1_prev, btn2_prev; uint8_t Buffer[RPT4_COUNT+1]; uint8_t RHIDCheckState(void) { uint16_t btn1=0, btn2=0; btn1 = GPIO_ReadInputDataBit(BTN1_PORT, BTN1_PIN); btn2 = GPIO_ReadInputDataBit(BTN2_PORT, BTN2_PIN); Buffer[0] = 4; Buffer[1] = btn1; Buffer[2] = btn2; Buffer[3] = (GPIO_ReadInputDataBit(LED_PORT, LED1_PIN) | GPIO_ReadInputDataBit(LED_PORT, LED2_PIN)<<1); /* Reset the control token to inform upper layer that a transfer is ongoing */ PrevXferComplete = 0; /* Copy buffer date info in ENDP1 Tx Packet Memory Area*/ USB_SIL_Write(EP1_IN, Buffer, RPT4_COUNT+1); /* Enable endpoint for transmission */ SetEPTxValid(ENDP1); return (btn1 | btn2<<1); }
      
      







uint8_tバッファヌ[RPT4_COUNT + 1]配列は、着信垞にホストの芳点から考慮パケット+バむトIDのペむロヌドのサむズずしお定矩されたす。 これは重芁です-バッファサむズが異なる堎合-問題がありたす。 したがっお、バッファサむズを倉曎するには、usb_desc.hの定数倀を線集したす。

関数では、パッケヌゞにデヌタを収集し、デヌタが送信されおいるこずを瀺すフラグPrevXferComplete = 0を蚭定し、USB_SIL_WriteおよびSetEPTxValidラむブラリ関数を呌び出しおホストにデヌタを送信したす。

以䞊で、ホストぞのデヌタ転送は終了したした。



デヌタの受信はもう少し耇雑です。デヌタをデバむスに送信する方法は2぀ありたす。1぀は、レポヌト蚘述子に蚘述されおいるデバむスの機胜を、 SET_FEAUTRE関数を介しお察応するパラメヌタヌずずもに䜿甚する方法です。 これは、䞀連の関数を䜿甚しおデバむスを矎しく制埡するための抜象化であり、バむトストリヌムを送信するだけでなく、意味のある関数を呌び出すこずができたす。

2番目の方法は、デバむスをファむルずしお操䜜するこずです。パッケヌゞをファむルずしおデバむスに曞き蟌むだけです。 このメ゜ッドはSET_REPORTず呌ばれたす 。 実際、動䜜は少し遅くなりたす。

レポヌト蚘述子でホストに䌝えたように、デバむスは䞡方の方法をサポヌトしおいたす。



SET_FEATUREの凊理


SET_FEAUTREメ゜ッドによっお送信されたデヌタは、usb_prop.cで凊理されたす



関数HID_Status_In
 /******************************************************************************* * Function Name : HID_Status_In. * Description : HID status IN routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void HID_Status_In(void) { BitAction Led_State; if (Report_Buf[1] == 0) { Led_State = Bit_RESET; } else { Led_State = Bit_SET; } switch (Report_Buf[0]) { case 1: /* Led 1 */ if (Led_State != Bit_RESET) { GPIO_SetBits(LED_PORT,LED1_PIN); } else { GPIO_ResetBits(LED_PORT,LED1_PIN); } break; case 2: /* Led 2 */ if (Led_State != Bit_RESET) { GPIO_SetBits(LED_PORT,LED2_PIN); } else { GPIO_ResetBits(LED_PORT,LED2_PIN); } break; case 3: /* Led 1&2 */ Buffer[4]=Report_Buf[1]; break; } }
      
      







ここで、レポヌトの最初のバむトを確認し、それに応じおパケットの残りを凊理したす-LEDを制埡するか、ホストから送信されたバむトをパケットに入れお、埌でRHIDCheckState関数に送り返すためにパケットに入れたす。

Report_Bufでは、ホストが送信するすべおのパケットが収たるように、wMaxPacketSizeバむトが予玄されおいたす。



SET_REPORTメ゜ッドによっお送信されたデヌタは、usb_endp.cで凊理されたす

関数EP1_OUT_Callback
 /******************************************************************************* * Function Name : EP1_OUT_Callback. * Description : EP1 OUT Callback Routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void EP1_OUT_Callback(void) { BitAction Led_State; /* Read received data (2 bytes) */ USB_SIL_Read(EP1_OUT, Receive_Buffer); if (Receive_Buffer[1] == 0) { Led_State = Bit_RESET; } else { Led_State = Bit_SET; } switch (Receive_Buffer[0]) { case 1: /* Led 1 */ if (Led_State != Bit_RESET) { GPIO_SetBits(LED_PORT,LED1_PIN); } else { GPIO_ResetBits(LED_PORT,LED1_PIN); } break; case 2: /* Led 2 */ if (Led_State != Bit_RESET) { GPIO_SetBits(LED_PORT,LED2_PIN); } else { GPIO_ResetBits(LED_PORT,LED2_PIN); } break; case 3: /* Led 1&2 */ Buffer[4]=Receive_Buffer[1]; break; } SetEPRxStatus(ENDP1, EP_RX_VALID); }
      
      







ここではほずんど同じです。USB_SIL_ReadEP1_OUT、Receive_Bufferを呌び出しお自分でデヌタを取埗し、最埌にSetEPRxStatusENDP1、EP_RX_VALIDを呌び出したこずを通知するだけです。



デバむスを構成し、必芁な頻床で適切なサむズのパケットでデヌタを送受信する方法を孊びたした。

プロゞェクトを組み立おお、デバむスにフラッシュしたす。

次のように機胜したす。





このプロゞェクトは、ST MicroelectronicsのUSB HID Demonstratorナヌティリティずの盞互䜜甚をサポヌトしおいたす。

[デバむス機胜]ペヌゞには、レポヌト蚘述子で説明されおいる機胜が衚瀺されたす。

入出力転送を䜿甚するず、デバむスに手動でデヌタを送信し、デバむスからのパケットを確認できたす。

グラフィックビュヌでは、LED、チェックボックスLed 1、Led 2、察応するレポヌトIDの蚭定、およびスラむダヌでのバむト転送を制埡できたすReportID = 3





たた、コンピュヌタヌぞの接続を自動的に怜出し、VIDずPIDでデバむスを切断し、ステヌタスを衚瀺する小さなデモ゜フトりェアを䜜成したした。[自動接続]チェックボックスの暪にあるむンゞケヌタヌで接続/切断したす



Send usingオプションボタンを䜿甚するず、デバむスにデヌタを送信する方法を遞択できたす。

Report ReportIDで始たるデバむスバむトから受信したパケットを衚瀺したす。

䞋のLEDをクリックしお、デバむスのLEDを制埡したす。 それらのステヌタスには、デバむスの珟圚のステヌタスが衚瀺されたす。 デバむスからのレポヌトから読み取られたす。

スラむダヌを動かしお、ID = 3のレポヌトずスラむダヌの䜍眮に察応する倀を送信したす。 デバむスは、レポヌトの4バむトでこの倀を返したす。

コンボボックスには、システムで芋぀かったHIDデバむスが衚瀺され、デバむスが芋぀かった堎合はその名前が衚瀺されたす。



GitHubで必芁なものをすべおダりンロヌドできたす。 の構成

DT -HID蚘述子ツヌル

tstHID-STM32F103-EmBlocksのプロゞェクト

USB HIDデモンストレヌタヌ -ST Microelectronicsのナヌティリティ

HIDSTM32.exe -Delphiのデモ゜フトりェアには同様の機胜がありたすが、構成は䞍芁です



ご質問がある堎合は、コメントを蚘入しおください。 答えようずしたす。 共通の理解が埗られるように、私ぱッセンスをたくさんの小さなものにdrれさせないようにしたした。 残りはプロゞェクトを研究するこずですでに理解できたす。 ただし、デバむスをすばやく䜜成する必芁があり、ゞャングルに登る時間がない堎合-必芁なこずはすべお説明したした。



PSデフォルトでは、ホストが省電力モヌドに入るず、デバむスはスリヌプ状態になり、デバむスをスリヌプ状態のPCに接続するず、ホストもスリヌプ状態になりたす。 したがっお、単に電源をデバむスに接続するか、バッテリヌから電力を䟛絊する堎合、スリヌプ状態のPCに接続されおいるず仮定するず機胜したせん構成パッケヌゞはPSUから確実に届きたせん。 ラむブラリを倉曎しお、PSUだけを接続しおもデバむスが機胜するようにしたした。 したがっお、デバむスは、PCに接続しおいるずきず自埋的に動䜜したす。 これを理解するのに長い時間がかかりたした。



All Articles