-[Developing Driver Using Host DDK APIs](#section865734181916)
-[Developing Driver Using Host DDK APIs](#section584mcpsimp)
-[Developing Driver Using Host Raw APIs](#section865734181916)
-[Developing Driver Using Host Raw APIs](#section594mcpsimp)
-[Developing Driver Using Device DDK APIs](#section865734181916)
-[Developing Driver Using Device DDK APIs](#section600mcpsimp)
-[Development Examples](#section263714411191)
-[Development Examples](#section607mcpsimp)
-[Developing Driver Using Host DDK APIs](#section18249155619195)
-[Developing Driver Using Host DDK APIs](#section609mcpsimp)
-[Developing Driver Using Host Raw APIs](#section3571192072014)
-[Developing Driver Using Host Raw APIs](#section612mcpsimp)
-[Developing Driver Using Device DDK APIs](#section6356758162015)
-[Developing Driver Using Device DDK APIs](#section615mcpsimp)
## Overview <a name="section175431838101617"></a>
## Overview<a name="section127mcpsimp"></a>
USB host development aims to provide host-related functions, including protocol encapsulation, device management, and driver installation and uninstall.
USB host development aims to provide host-related functions, including protocol encapsulation, device management, and driver installation and uninstall.
...
@@ -22,379 +22,358 @@ USB device development aims to provide device-related functions, including devic
...
@@ -22,379 +22,358 @@ USB device development aims to provide device-related functions, including devic
The following figures show the UBS host and device driver models.
The following figures show the UBS host and device driver models.
**Figure 1** USB host driver model<aname="fig10451455446"></a>
**Figure 1** USB host driver model<aname="fig1649563542917"></a>
- The USB host Driver Development Kit (DDK) provides driver capability APIs that can be directly called in user mode. The APIs can be classified into the DDK initialization class, interface operation class, and request operation class by function. These APIs can be used to perform DDK initialization, bind/release and open/close an interface, allocate/release a request, and implement isochronous or non-isochronous transfer.
- The USB host Driver Development Kit (DDK) provides driver capability APIs that can be directly called in user mode. The APIs can be classified into the DDK initialization class, interface operation class, and request operation class by function. These APIs can be used to perform DDK initialization, bind/release and open/close an interface, allocate/release a request, and implement synchronous or asynchronous transfer.
- The USB device DDK provides device management, I/O management, and configuration management APIs, which can be used to create and delete a device, obtain/open an interface, and perform isochronous or non-isochronous transfer.
- The USB device DDK provides device management, I/O management, and configuration management APIs, which can be used to create and delete a device, obtain/open an interface, and perform synchronous or asynchronous transfer.
### Available APIs<a name="section17667171301711"></a>
### Available APIs(<a name="section141mcpsimp"></a>)
Table 1 describes the APIs provided by the USB host driver model.
[Figure 1](#fig1649563542917) describes the APIs provided by the USB host driver model.
**Table 1** APIs provided by the USB host driver model
**Table 1** APIs provided by the USB host driver model
<tdclass="cellrowborder"valign="top"width="22.912291229122914%"headers="mcps1.2.4.1.3 "><pid="p201331557185512"><aname="p201331557185512"></a><aname="p201331557185512"></a>Initializes the USB host driver DDK.</p>
<tdclass="cellrowborder"valign="top"width="33.33333333333333%"headers="mcps1.2.4.1.3 "><pid="p27252992712"><aname="p27252992712"></a><aname="p27252992712"></a>Initializes the USB host driver DDK.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p161332570553"><aname="p161332570553"></a><aname="p161332570553"></a>Exits the USB host driver DDK.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p172549192711"><aname="p172549192711"></a><aname="p172549192711"></a>Exits the USB host driver DDK.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p131331557175510"><aname="p131331557175510"></a><aname="p131331557175510"></a>Obtains a USB interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p187255962716"><aname="p187255962716"></a><aname="p187255962716"></a>Obtains a USB interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1470315695811"><aname="p1470315695811"></a><aname="p1470315695811"></a>Releases a USB interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p117251894270"><aname="p117251894270"></a><aname="p117251894270"></a>Releases a USB interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1186597589"><aname="p1186597589"></a><aname="p1186597589"></a>Adds or removes a USB interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p157251914278"><aname="p157251914278"></a><aname="p157251914278"></a>Adds or removes a USB interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p15832129135813"><aname="p15832129135813"></a><aname="p15832129135813"></a>Opens a USB interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p67254915272"><aname="p67254915272"></a><aname="p67254915272"></a>Opens a USB interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1186597589"><aname="p1186597589"></a><aname="p1186597589"></a>Closes a USB interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p67251095276"><aname="p67251095276"></a><aname="p67251095276"></a>Closes a USB interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p15832129135813"><aname="p15832129135813"></a><aname="p15832129135813"></a>Sets a USB interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p6725109112720"><aname="p6725109112720"></a><aname="p6725109112720"></a>Sets a USB interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1186597589"><aname="p1186597589"></a><aname="p1186597589"></a>Obtains USB pipe information.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p107261298272"><aname="p107261298272"></a><aname="p107261298272"></a>Obtains USB pipe information.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p15832129135813"><aname="p15832129135813"></a><aname="p15832129135813"></a>Clears the state of the pipe with the specified index.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p177261797274"><aname="p177261797274"></a><aname="p177261797274"></a>Clears the state of the pipe with the specified index.</p>
</td>
</td>
</tr>
</tr>
<trid="row71857914585"><tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.1 "><pid="p1318619155811"><aname="p1318619155811"></a><aname="p1318619155811"></a>struct UsbRequest *UsbAllocRequest(const UsbInterfaceHandle *interfaceHandle, int isoPackets, int length);</p>
<trid="row1757189172714"><tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.1 "><pid="p1726998273"><aname="p1726998273"></a><aname="p1726998273"></a>struct UsbRequest *UsbAllocRequest(const UsbInterfaceHandle *interfaceHandle, int isoPackets, int length);</p>
</td>
</td>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1186597589"><aname="p1186597589"></a><aname="p1186597589"></a>Allocates a request object.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1272617982713"><aname="p1272617982713"></a><aname="p1272617982713"></a>Allocates a request object.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p15832129135813"><aname="p15832129135813"></a><aname="p15832129135813"></a>Releases a request object.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p177271592271"><aname="p177271592271"></a><aname="p177271592271"></a>Releases a request object.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1186597589"><aname="p1186597589"></a><aname="p1186597589"></a>Sends a request asynchronously.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p372714942718"><aname="p372714942718"></a><aname="p372714942718"></a>Sends an asynchronous request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p15832129135813"><aname="p15832129135813"></a><aname="p15832129135813"></a>Fills in a request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p872713910270"><aname="p872713910270"></a><aname="p872713910270"></a>Fills in a request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1186597589"><aname="p1186597589"></a><aname="p1186597589"></a>Cancels an asynchronous request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p37271897276"><aname="p37271897276"></a><aname="p37271897276"></a>Cancels an asynchronous request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p15832129135813"><aname="p15832129135813"></a><aname="p15832129135813"></a>Sends a synchronous request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p87279914277"><aname="p87279914277"></a><aname="p87279914277"></a>Sends a synchronous request.</p>
<tdclass="cellrowborder"valign="top"width="22.912291229122914%"headers="mcps1.2.4.1.3 "><pid="p752531095814"><aname="p752531095814"></a><aname="p752531095814"></a>Initializes the USB raw APIs.</p>
<tdclass="cellrowborder"valign="top"width="33.33333333333333%"headers="mcps1.2.4.1.3 "><pid="p1572711919272"><aname="p1572711919272"></a><aname="p1572711919272"></a>Initializes the USB raw APIs.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1929141611198"><aname="p1929141611198"></a><aname="p1929141611198"></a>Exits the USB raw APIs.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p372710942717"><aname="p372710942717"></a><aname="p372710942717"></a>Exits the USB raw APIs.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p169531741912"><aname="p169531741912"></a><aname="p169531741912"></a>Opens a USB device.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1772719972717"><aname="p1772719972717"></a><aname="p1772719972717"></a>Opens a USB device.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p4331131817195"><aname="p4331131817195"></a><aname="p4331131817195"></a>Closes a USB device.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1372715902711"><aname="p1372715902711"></a><aname="p1372715902711"></a>Closes a USB device.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p17948193197"><aname="p17948193197"></a><aname="p17948193197"></a>Performs a control transfer synchronously.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p272715932717"><aname="p272715932717"></a><aname="p272715932717"></a>Performs a control transfer synchronously.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p342315202267"><aname="p342315202267"></a><aname="p342315202267"></a>Performs a bulk transfer synchronously.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p872789162713"><aname="p872789162713"></a><aname="p872789162713"></a>Performs a bulk transfer synchronously.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p17948193197"><aname="p17948193197"></a><aname="p17948193197"></a>Performs an interrupt transfer synchronously.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p117271895271"><aname="p117271895271"></a><aname="p117271895271"></a>Performs an interrupt transfer synchronously.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p342315202267"><aname="p342315202267"></a><aname="p342315202267"></a>Obtains the configuration descriptor of a device.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p472714912710"><aname="p472714912710"></a><aname="p472714912710"></a>Obtains the configuration descriptor of a device.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p17948193197"><aname="p17948193197"></a><aname="p17948193197"></a>Releases the memory space of a configuration descriptor.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p772759162711"><aname="p772759162711"></a><aname="p772759162711"></a>Releases the memory space of a configuration descriptor.</p>
</td>
</td>
</tr>
</tr>
<trid="row12422102092613"><tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.1 "><pid="p194231720102610"><aname="p194231720102610"></a><aname="p194231720102610"></a>int UsbRawGetConfiguration(const UsbRawHandle *devHandle, int *config);</p>
<trid="row9756119182711"><tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.1 "><pid="p3727699274"><aname="p3727699274"></a><aname="p3727699274"></a>int UsbRawGetConfiguration(const UsbRawHandle *devHandle, int *config);</p>
</td>
</td>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p342315202267"><aname="p342315202267"></a><aname="p342315202267"></a>Obtains the configuration in use.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p13728109192717"><aname="p13728109192717"></a><aname="p13728109192717"></a>Obtains the configuration in use.</p>
</td>
</td>
</tr>
</tr>
<trid="row1393181951920"><tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.1 "><pid="p79410191191"><aname="p79410191191"></a><aname="p79410191191"></a>int UsbRawSetConfiguration(const UsbRawHandle *devHandle, int config);</p>
<trid="row37567922714"><tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.1 "><pid="p1872849162718"><aname="p1872849162718"></a><aname="p1872849162718"></a>int UsbRawSetConfiguration(const UsbRawHandle *devHandle, int config);</p>
</td>
</td>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p17948193197"><aname="p17948193197"></a><aname="p17948193197"></a>Sets the configuration in use.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p87280914277"><aname="p87280914277"></a><aname="p87280914277"></a>Sets the configuration in use.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p17948193197"><aname="p17948193197"></a><aname="p17948193197"></a>Obtains the device pointer based on the device handle.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p472879202719"><aname="p472879202719"></a><aname="p472879202719"></a>Obtains the device pointer based on the device handle.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p342315202267"><aname="p342315202267"></a><aname="p342315202267"></a>Obtains the device descriptor of the specified USB device.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p8728139172715"><aname="p8728139172715"></a><aname="p8728139172715"></a>Obtains the device descriptor of the specified USB device.</p>
</td>
</td>
</tr>
</tr>
<trid="row1393181951920"><tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.1 "><pid="p79410191191"><aname="p79410191191"></a><aname="p79410191191"></a>int UsbRawClaimInterface(const UsbRawHandle *devHandle, int interfaceNumber);</p>
<trid="row117561919273"><tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.1 "><pid="p072820912714"><aname="p072820912714"></a><aname="p072820912714"></a>int UsbRawClaimInterface(const UsbRawHandle *devHandle, int interfaceNumber);</p>
</td>
</td>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p17948193197"><aname="p17948193197"></a><aname="p17948193197"></a>Declares the interface on the specified device handle.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p972817914279"><aname="p972817914279"></a><aname="p972817914279"></a>Declares the interface on the specified device handle.</p>
</td>
</td>
</tr>
</tr>
<trid="row12422102092613"><tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.1 "><pid="p194231720102610"><aname="p194231720102610"></a><aname="p194231720102610"></a>int UsbRawReleaseInterface(const UsbRawHandle *devHandle, int interfaceNumber);</p>
<trid="row87561920275"><tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.1 "><pid="p2728191276"><aname="p2728191276"></a><aname="p2728191276"></a>int UsbRawReleaseInterface(const UsbRawHandle *devHandle, int interfaceNumber);</p>
</td>
</td>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p342315202267"><aname="p342315202267"></a><aname="p342315202267"></a>Releases the previously declared interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p8728159102710"><aname="p8728159102710"></a><aname="p8728159102710"></a>Releases the previously declared interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p17948193197"><aname="p17948193197"></a><aname="p17948193197"></a>Resets a device.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p107281992272"><aname="p107281992272"></a><aname="p107281992272"></a>Resets a device.</p>
</td>
</td>
</tr>
</tr>
<trid="row12422102092613"><tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.1 "><pid="p194231720102610"><aname="p194231720102610"></a><aname="p194231720102610"></a>struct UsbRawRequest *UsbRawAllocRequest(const UsbRawHandle *devHandle, int isoPackets, int length);</p>
<trid="row14756109152719"><tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.1 "><pid="p137288914273"><aname="p137288914273"></a><aname="p137288914273"></a>struct UsbRawRequest *UsbRawAllocRequest(const UsbRawHandle *devHandle, int isoPackets, int length);</p>
</td>
</td>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p342315202267"><aname="p342315202267"></a><aname="p342315202267"></a>Allocates a transfer request with the specified number of sync packet descriptors.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p27281797274"><aname="p27281797274"></a><aname="p27281797274"></a>Allocates a transfer request with the specified number of sync packet descriptors.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p17948193197"><aname="p17948193197"></a><aname="p17948193197"></a>Releases the previously allocated transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p17281917278"><aname="p17281917278"></a><aname="p17281917278"></a>Releases the previously allocated transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p342315202267"><aname="p342315202267"></a><aname="p342315202267"></a>Fills in the bulk transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p117281090271"><aname="p117281090271"></a><aname="p117281090271"></a>Fills in a bulk transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p17948193197"><aname="p17948193197"></a><aname="p17948193197"></a>Fills in the control setup packet.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p177281299278"><aname="p177281299278"></a><aname="p177281299278"></a>Fills in a control setup packet.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p342315202267"><aname="p342315202267"></a><aname="p342315202267"></a>Fills in the control transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1372815952715"><aname="p1372815952715"></a><aname="p1372815952715"></a>Fills in a control transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p17948193197"><aname="p17948193197"></a><aname="p17948193197"></a>Fills in the interrupt transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p19728092271"><aname="p19728092271"></a><aname="p19728092271"></a>Fills in an interrupt transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p342315202267"><aname="p342315202267"></a><aname="p342315202267"></a>Fills in the isochronous transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p107281913275"><aname="p107281913275"></a><aname="p107281913275"></a>Fills in an isochronous transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p17948193197"><aname="p17948193197"></a><aname="p17948193197"></a>Submits a transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p187299922718"><aname="p187299922718"></a><aname="p187299922718"></a>Submits a transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p342315202267"><aname="p342315202267"></a><aname="p342315202267"></a>Cancels a transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p872912911274"><aname="p872912911274"></a><aname="p872912911274"></a>Cancels a transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p17948193197"><aname="p17948193197"></a><aname="p17948193197"></a>Handles a transfer request event.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p572929102710"><aname="p572929102710"></a><aname="p572929102710"></a>Handles a transfer request event.</p>
</td>
</td>
</tr>
</tr>
</tbody>
</tbody>
</table>
</table>
Table 2 describes the APIs provided by the USB device driver model.
[Figure 2](#fig8847615103013) describes the APIs provided by the USB device driver model.
**Table 2** APIs provided by the USB device driver model
**Table 2** APIs provided by the USB device driver model
<tdclass="cellrowborder"valign="top"width="22.912291229122914%"headers="mcps1.2.4.1.3 "><pid="p213285715558"><aname="p213285715558"></a><aname="p213285715558"></a>Creates a USB device.</p>
<tdclass="cellrowborder"valign="top"width="33.33333333333333%"headers="mcps1.2.4.1.3 "><pid="p241853152716"><aname="p241853152716"></a><aname="p241853152716"></a>Creates a USB device.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p113315745519"><aname="p113315745519"></a><aname="p113315745519"></a>Deletes a USB device.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p5435318271"><aname="p5435318271"></a><aname="p5435318271"></a>Deletes a USB device.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1413365765514"><aname="p1413365765514"></a><aname="p1413365765514"></a>Obtains a USB device.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p54135392719"><aname="p54135392719"></a><aname="p54135392719"></a>Obtains a USB device.</p>
<tdclass="cellrowborder"valign="top"width="22.912291229122914%"headers="mcps1.2.4.1.3 "><pid="p201331557185512"><aname="p201331557185512"></a><aname="p201331557185512"></a>Starts to receive events.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p131331557175510"><aname="p131331557175510"></a><aname="p131331557175510"></a>Opens an interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p142537274"><aname="p142537274"></a><aname="p142537274"></a>Opens an interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1470315695811"><aname="p1470315695811"></a><aname="p1470315695811"></a>Closes an interface.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p124453132715"><aname="p124453132715"></a><aname="p124453132715"></a>Closes an interface.</p>
<tdclass="cellrowborder"valign="top"width="22.912291229122914%"headers="mcps1.2.4.1.3 "><pid="p752531095814"><aname="p752531095814"></a><aname="p752531095814"></a>Applies for a control transfer request.</p>
<tdclass="cellrowborder"valign="top"width="33.33333333333333%"headers="mcps1.2.4.1.3 "><pid="p5514538278"><aname="p5514538278"></a><aname="p5514538278"></a>Applies for a control transfer request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p1929141611198"><aname="p1929141611198"></a><aname="p1929141611198"></a>Applies for a data request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p105105342716"><aname="p105105342716"></a><aname="p105105342716"></a>Applies for a data request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p169531741912"><aname="p169531741912"></a><aname="p169531741912"></a>Releases a request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p26165372718"><aname="p26165372718"></a><aname="p26165372718"></a>Releases a request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p4331131817195"><aname="p4331131817195"></a><aname="p4331131817195"></a> Sends a request asynchronously.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p361253112718"><aname="p361253112718"></a><aname="p361253112718"></a>Sends an asynchronous request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p17948193197"><aname="p17948193197"></a><aname="p17948193197"></a>Sends a request synchronously.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p06853112710"><aname="p06853112710"></a><aname="p06853112710"></a>Sends a synchronous request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p342315202267"><aname="p342315202267"></a><aname="p342315202267"></a>Cancels a request.</p>
<tdclass="cellrowborder"valign="top"headers="mcps1.2.4.1.2 "><pid="p13725312275"><aname="p13725312275"></a><aname="p13725312275"></a>Cancels a request.</p>
</td>
</td>
</tr>
</tr>
</tbody>
</tbody>
</table>
</table>
## Development Guidelines<a name="section65745222184"></a>
## Development Guidelines<a name="section581mcpsimp"></a>
The USB driver is developed based on the Hardware Driver Foundation (HDF), platform, and Operating System Abstraction Layer (OSAL) APIs. A unified driver model is provided for USB devices, irrespective of the operating system and chip architecture. This document uses a serial port as an example to describe how to develop drivers for the USB host and USB device.
The USB driver is developed based on the Hardware Driver Foundation (HDF), platform, and Operating System Abstraction Layer (OSAL) APIs. A unified driver model is provided for USB devices, irrespective of the operating system and chip architecture. This document uses a serial port as an example to describe how to develop drivers for the USB host and USB device.
### How to Develop<a name="section865734181916"></a>
### How to Develop<a name="section583mcpsimp"></a>
### Developing Driver Using Host DDK APIs<a name="section18249155619195"></a>
### Developing Driver Using Host DDK APIs<a name="section584mcpsimp"></a>
1. Configure the driver mapping table.
1. Configure the driver mapping table.
2. Initialize the USB host DDK.
2. Initialize the USB host DDK.
...
@@ -405,15 +384,14 @@ The USB driver is developed based on the Hardware Driver Foundation (HDF), platf
...
@@ -405,15 +384,14 @@ The USB driver is developed based on the Hardware Driver Foundation (HDF), platf
7. Fill in the I/O request based on the input parameters.
7. Fill in the I/O request based on the input parameters.
8. Submit the I/O request in synchronous or asynchronous mode.
8. Submit the I/O request in synchronous or asynchronous mode.
### Developing Driver Using Host Raw APIs<a name="section594mcpsimp"></a>
### Developing Driver Using Host Raw APIs<a name="section18249155619195"></a>
1. Configure the driver mapping table.
1. Configure the driver mapping table.
2. Initialize the host raw data, open the USB device, obtain the descriptor, and then obtain interface and endpoint information based on the descriptor.
2. Initialize the host raw data, open the USB device, obtain the descriptor, and then obtain interface and endpoint information based on the descriptor.
3. Allocate a request and fill in the request based on the transfer type.
3. Allocate a request and fill in the request based on the transfer type.
4. Submit the I/O request object in synchronous or asynchronous mode.
4. Submit the I/O request in synchronous or asynchronous mode.
### Developing Driver Using Device DDK APIs<a name="section18249155619195"></a>
### Developing Driver Using Device DDK APIs<a name="section600mcpsimp"></a>
1. Construct a descriptor.
1. Construct a descriptor.
2. Instantiate a USB device using the descriptor constructed.
2. Instantiate a USB device using the descriptor constructed.
...
@@ -421,11 +399,11 @@ The USB driver is developed based on the Hardware Driver Foundation (HDF), platf
...
@@ -421,11 +399,11 @@ The USB driver is developed based on the Hardware Driver Foundation (HDF), platf
4. Call **UsbFnInterfaceStartRecvEvent** to receive events such as Enable and Setup, and respond to the events in **UsbFnEventCallback**.
4. Call **UsbFnInterfaceStartRecvEvent** to receive events such as Enable and Setup, and respond to the events in **UsbFnEventCallback**.
5. Send and receive data in synchronous or asynchronous mode.
5. Send and receive data in synchronous or asynchronous mode.
## Development Examples<a name="section263714411191"></a>
## Development Examples<a name="section607mcpsimp"></a>
The following example helps you better understand the development of the USB serial port driver.
The following examples help you better understand the development of the USB serial port driver.
### Developing Driver Using Host DDK APIs<a name="section18249155619195"></a>
### Developing Driver Using Host DDK APIs<a name="section609mcpsimp"></a>
```
```
root {
root {
...
@@ -468,7 +446,7 @@ root {
...
@@ -468,7 +446,7 @@ root {
interfaceSubClass = [2, 0];
interfaceSubClass = [2, 0];
// Protocol that the interface complies with. You can enter multiple protocols as needed.
// Protocol that the interface complies with. You can enter multiple protocols as needed.
interfaceProtocol = [1, 2];
interfaceProtocol = [1, 2];
// Interface numer. You can enter multiple interface numbers as needed.
// Interface number. You can enter multiple interface numbers as needed.
static int AcmAllocReadRequests(struct AcmDevice *acm)
static int AcmAllocReadRequests(struct AcmDevice *acm)
{
{
int ret;
int ret;
struct UsbRequestParams readParmas = {};
struct UsbRequestParams readParams;
for (int i = 0; i < ACM_NR; i++) {
for (int i = 0; i < ACM_NR; i++) {
acm->readReq[i] = UsbAllocRequest(InterfaceIdToHandle(acm, acm->dataInPipe->interfaceId), 0, acm->readSize); // Allocate the readReq I/O request object to be sent.
acm->readReq[i] = UsbAllocRequest(InterfaceIdToHandle(acm, acm->dataInPipe->interfaceId), 0, acm->readSize); // Allocate the readReq I/O request to be sent.
HDF_LOGE("%{public}s: interface%{public}d is null", __func__, acm->interfaceIndex[i]);
HDF_LOGE("%s: interface%d is null", __func__, acm->interfaceIndex[i]);
goto error;
goto error;
}
}
}
}
acm->ctrIface = GetUsbInterfaceById((const struct AcmDevice *)acm, USB_CTRL_INTERFACE_ID); // Obtain the UsbInterface object corresponding to the control interface.
acm->ctrIface = GetUsbInterfaceById((const struct AcmDevice *)acm, USB_CTRL_INTERFACE_ID); // Obtain the UsbInterface object corresponding to the control interface.
snd->request = UsbAllocRequest(InterfaceIdToHandle(acm, acm->dataOutPipe->interfaceId), 0, acm->writeSize); // Allocate the I/O request object to be sent.
snd->request = UsbAllocRequest(InterfaceIdToHandle(acm, acm->dataOutPipe->interfaceId), 0, acm->writeSize); // Allocate the I/O request object to be sent.
### Developing Driver Using Device DDK APIs<a name="section6356758162015"></a>
### Developing Driver Using Device DDK APIs<a name="section615mcpsimp"></a>
The core code of the USB Abstract Control Model (ACM) device is available in **drivers\peripheral\usb\gadget\function\acm\cdcacm.c**. The following is an example.
The core code of the USB Abstract Control Model (ACM) device is available in **drivers\peripheral\usb\gadget\function\acm\cdcacm.c**. The following is an example: