We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I'm using a Keil MCB1700 evaluation board. The Mass Storage USB device demo works fine, the Virtual COM also works fine but combining them results in a driver failure. Below a detailed list of what I did, any pointer to what I do wrong would be appreciated! It is a long report, skip to the end if you are not interested in what did work :-)
Tool Version Numbers:
Toolchain: MDK Plus 5.28 (Flex) Version: 5.28.0.0
Toolchain Path: C:\Keil_v5\ARM\ARMCC\Bin
C Compiler: Armcc.exe V5.06 update 6 (build 750)
Assembler: Armasm.exe V5.06 update 6 (build 750)
Linker/Locator: ArmLink.exe V5.06 update 6 (build 750)
Library Manager: ArmAr.exe V5.06 update 6 (build 750)
Hex Converter: FromElf.exe V5.06 update 6 (build 750)
CPU DLL: SARMCM3.DLL V5.28.0.0
Dialog DLL: TARMP1.DLL V1.26.0.0
Target DLL: UL2CM3.DLL V1.162.16.0
The PC I'm using is a Windows 10, 64 bits, x64 processor machine.
I start uVision 5, I open the Packet Installer, select the LPC1768 from NXP, click Examples and copy the USB Device Mass Storage and the USB Device Virtual COM examples in a folder called CompositeUSB. The board is a Keil MCB1700 and the support pack is LPC1700_DFP version 2.5.0
In the folder CompositeUSB I copy the folder MassStorage and rename this folder into Composite. In this folder I rename all MassStorage.* files into Composite.*, I start a new Multi Project Workspace and add all three projects. In the Composite project I remove in the Source folder the file MassStorage.c and I add the Composite.c file.
Mass Storage Project
I make the MassStorage project the active one, the USB folder contains two files that are marked outdated. USB_Config_0.c is version 5.0.4 but a newer version 5.2.0 exists, USB_Config_MSC_0.h is version 5.0.4 but a newer version 5.1.1 exists. I do NOT upgrade the files for now.
In the Manage Run-Time environment menu I select the MDK-Plus version for the File System and for the USB components. Then using Project, Rebuild All I recompile, no error or warning. When I execute the program and plug in the USB it detects a mass storage device, it assigns a drive and I can access the content on the SD-card that is mounted in the MCB1700 board.
I stop the program, open the USBD_Config_MSC_0.h file, click on the Configuration Wizard and set Bulk IN and the OUT Endpoint Number to 5 which, according to the spec of the LPC1768 is a BULK endpoint. I recompile and start the program, all works fine.
Then I click on USBD_Config_0.c and select the Update Config file option, same for USBD_Config_MSC_0.h. I reopen the last, the Bulk IN and OUT Endpoint are set to 1 (which will not work since this is an Interrupt Endpoint) and change both Endpoints to 5 again. In the Manage Run-Time environment menu I select the MDK-Plus version for the USB System, Rebuild All, start the program, all works fine.
I stop the program, in the Device Manager from Windows I check the View, Show Hidden Files option, select the USB Mass Storage Device, right click and select the Uninstall Device option.
VirtualCOM Project
I make the VirtualCOM project the active one, here the USB_Config_0.c is version 5.0.0 (not 5.0.4) but a newer version 5.2.0 exists, USB_Config_CDC_0.h is version 5.1.2 but a newer version 5.2.0 exists. I do NOT upgrade the files for now.
In the Manage Run-Time environment menu I select the MDK-Plus version for the File System and for the USB components. Then using Project, Rebuild All I recompile, no error or warning. When I execute the program and plug in the USB it detects a serial device and assigns a COM port. All works fine.
I stop the program, click on USBD_Config_0.c and select the Update Config file option, same for USBD_Config_CDC_0.h. I reopen the last, Interrupt Endpoint is set to 1, the Bulk Endpoint to 2 so OK. In the Manage Run-Time environment menu I check that all versions are set to MDK-Plus, Rebuild All, start the program, all works fine. I do notice that a new Serial Device was added instead of re-using the previous one, I guess the VID/PID combo is different in the newer version of the drivers, no problem.
I stop the program, in the Device Manager from Windows I uninstall the drivers for both Serial Devices.
Composite Project
I make the Composite project the active one. Since this is a copy of the Mass Storage, USB_Config_0.c is version 5.0.4 but a newer version 5.2.0 exists, USB_Config_MSC_0.h is version 5.0.4 but a newer version 5.1.1 exists. I do NOT upgrade the files for now.
In the Manage Run-Time environment menu I select the MDK-Plus version for the File System and for the USB components. I open the USBD_Config_MSC_0.h file and set the IN and the OUT Endpoint Number to 5, rebuild the project, start the program, all works fine. I stop the program and Uninstall the Mass Storage device in the Windows Device Manager.
In the Manage Run-time Environment I select USB, Device and add a CDC device by setting the value to 1. It adds a USBD_Config_CDC_0.h file version 5.2.0. Since the bulk endpoint for the Mass Storage Device is already changed to 5 the bulk endpoint for the CDC device can remain at 2. The Configuration Wizard confirms the Interrupt Endpoint is 1, the Bulk Endpoint is 2.
I rebuild the project, start it and plug in the device to USB. Nothing happens, no beep, no change in the Device Manager.
I stop the program and update both USBD_Config_0.c and USBD_Config_MSC_0.h. I set the BULK endpoint to 5, rebuild, start, plug-in, again nothing happens.
In the Manage Run-Time environment I than set the variant of the USB, CORE to Debug. A validation error is shown, click Resolve and click OK. A file USB_Debug.c is added, I open it and in the Configuration Wizard I enable the USB Device Debug option. I set Core, Driver, CDC and MSC to All events and the rest to Off.
In the file Composite.c I add the header file #include "EventRecorder.h" and I add the call to EventRecorderInitialize (EventRecordAll, 1); at the first line in the main function before anything else is done. I open an event record view by selecting View, Analysis Windows, Event Record.
I rebuild the project and start it, below a screenshot of the Event Recorder. It seems to go wrong on an InitializeFailed call to USBD_MSC.
Any support on how to fix this would be appreciated.