A USB application can be broken down into three pieces: The customer application, The USB protocol stack and The hardware drivers. TI supplies both driver and a protocol stack, leaving only the application left for customer development. Beyond that TI also supplies many examples which display how to make use of the USB controller to implement standard as well as custom USB classes. The USB software is architected such that it exposes many different layers of API. Experts have the option of completely replacing the TI supplied stack with one of the customers own and interfacing directly with hardware. Intermediate programmers might make use of the enumeration related software, but replace all application code with custom developed software. Novices can start by playing with examples and slowly modify them to accomplish the changes needed. The stack is extremely flexible and allows users to migrate in complexity as one understands more of the software.