With so any APIs, it can be overwhelming to determine which APIs to use, and when. The answer depends on the level of abstraction that is most suitable for the user’s end application. The table shown on this slide makes it possible to understand this more clearly. Examples of USB applications are listed in red blocks. Each application requires different levels of customization. Application 1 is highly-customized and implements its own USB protocol, i.e. a third party USB stack, whereas Application 4 is relatively standard and passes data to higher level APIs in a custom HID mouse. Different layers or levels of abstractions are listed in the black blocks. For an application that involves passing simplified data to a higher level API, using host/device class APIs is the recommended approach. This provides the highest level of abstraction and speeds up the development. This is represented in Application 1 in the diagram on the slide. For an application that involves implementing its own USB protocol using driver lib, working with USB driver API is the recommended approach, as represented in Application 4 in the diagram on the slide. This provides the lowest level of abstraction, giving the user the highest amount of visibility and control. For applications in between, like Examples 2 and 3, a user can pick and choose a level of abstraction that is not too low or high. This is how applications fit into the API system. Note that devices that resemble existing applications require significantly less new code.