 Next example I will show you is called CDC Lip USB and it's an alternative for CDC VCP. Many times we get from our customers complaints about VCP usage and also we can see the restriction of this type of communication in our daily job. So as virtue comport comes from very old comports which are no longer used and it's a full emulation no plug-and-play if natively supported by this communication interface. So for example as you can see the VCP if you disconnect the USB device and let your comport application open you are not able to communicate again with the same comport inside the application because plug-and-play is not supported there. Second crucial restriction in which is coming with VCP is the additional endpoint which is used by this communication protocol for the interrupt endpoint but almost no communication is on this endpoint and we are able to skip it using different approaches and as some STM32 are quite limited in the number of endpoint for putting VCP into composite device can be quite crucial this one endpoint. So as an alternative we are proposing usage of Lip USB. Lip USB is open source API available on both Windows and Linux. So with this driver you can spare the one endpoint because there is only one bulk in, bulk out and that also mean you don't need to handle the interrupt channel no signal no line coding like before so also bit easier. Additional advantage is also on the windows side there is no additional layer for the VCP and the biggest advantage is the native plug-and-play support so you will be able to see also in our application that it's working without any problem as you would expect with USB. What is the drawback of this approach mainly that the offer of terminal application and API is not so bright like with the virtual comport which is quite standard and almost all the programming languages almost all the types of programs are already prepared to connect some comport and as for the VCP you need to get your driver sign so there is no difference with the VCP only to let you know. So we will start again from Qpamax so we can create almost the same configuration like before for the VCP and then modify to get our functionality. So we have F446 on the nuclear board first what we need to enable is the more precise clock source so we will bypass the clock source from a stealing after that we will enable the OTG full speed as device only in the middleware we will use the communication device class and now we can switch to the clock setting. The stealing clock source is 8 MHz and we want to use it as a PL source for our clock in the end and that's all about the setting we can generate the project and use the Atolic and again bigger heap size. There could be more settings done here in the Qpamax for example change of the device descriptor but I will keep this change on the code to more highlight this change. So okay our project is being generated and open. So first thing we will do is to go to the usbd underscore that see where device descriptor is saved so we have here the default option for the product ID so if you would go with this number our device would be directly assigned to the virtual comport which it's already used on my PC so we need to use some different number. For the final product we should get allocated the product ID and vendor ID combination for the product for the testing is more or less fine to have some which is not used. So for example C1 0 and we can also rewrite the product string because as the device will be unknown for the PC this is the name it will be displayed. So let's put there something else and second thing we want to change here inside of the device descriptor is the device class and subclass as these two numbers are on Windows 10 connected to the VCP functionality using the number 2 and 2 so we will change back to zeros and in next step we need to change the CDC driver file sorry it's not in the core it's class so usbd cdc.c I will copy it so please use the file you have in attachment there is a bit more change I will highlight you the changes using the win merge to show you where are the difference and what is done here in the middleware I cut the third endpoint to the control one so there is no more the functionality demanding this interrupt endpoint and also to simplify the work for me I use only the full speed configuration descriptor so if you intend to use this example with some different speed than the full speed you will need to complete it later on so only for full speed prepared now and as you can see so high speed is cut and here the control endpoint and the interface connected to this control endpoint is completely and only the bulk endpoints are here so here no interrupt endpoint is opened no interrupt endpoint is closed and in last chance again the descriptors bulk speed so that's all all the changes we need to do in the cdc.c driver file and as we change the source file we need also to go into the header file by pressing F3 we move through the files inside of Atolic and here we need to change size of configuration descriptor which is now lower thanks to the cut of the interrupt endpoint and its interface inside of the descriptor so only 32 for now so that is more or less all we need to change and make our device to enumerate itself as the device for the libUSB now we want to add also some communication for the demonstration purposes so we will go again to the interface unlike VCP we won't use here the line coding and we only create the loop in the receive and call the corridor transmit so like before we will call cdc transmit with buffer and length so that's all and we can build and run our project so run so let's take a look inside connected devices on my PC so I can see that there is the STM32 CDC libUSB but there is no driver assigned to this device so now we will use the libUSB files you can find it in attachment of this project and using these files we will install the application which will automatically get for us the driver for this application so let's go to the installation folder of the libUSB here is the int wizard that will guide us through the menu so we need to find among connected device the one which is ours we write the description but at the end it's only about the strings you will able to see find some location for installation of the infile and the infile can be used later on for installing on customer site or another PCs and here we are done but also can immediately install our driver as the driver is not signed we get the warning from Windows that it's not verified we trust this source so we will install and it's successful so now already our device is recognized and libUSB driver is assigned to our device so we may run the application it's a simple terminal which you can find in the attachments for the test so first we start so now we see our device is connected and by typing some message and when we send here on the upper window is display the response from the device which should echo so exactly the same is received now if I disconnect the USB the user USB the device is this is not found by the terminal but it's waiting for it and upon reconnection it's able to find again and connect and the communication is still working so this is also making very important difference compared to CDC-VCP so at the end by few simple steps we can really simplify and to make the application more user friendly for end user