This is the quick start guide for the USB host mass-storage module (UHI MSC) with step-by-step instructions on how to configure and use the modules in a selection of use cases.
The use cases contain several code fragments. The code fragments in the steps for setup can be copied into a custom initialization function, while the steps for usage can be copied into, e.g., the main application function.
Basic use case
In this basic use case, the "USB Host MSC (Single Class support)" module is used.
The "USB Host MSC (Multiple Classes support)" module usage is described in Advanced use cases.
This example do a simple physical memory access, but a File System module can be added to decode the USB memory file system, see FatFS examples.
Setup steps
Prerequisites
This module is based on USB host stack full interrupt driven and supporting Sleep manager sleepmgr. For AVR and SAM3/4 devices the clk_group clock services is supported. For SAMD21 devices the SAM System Clock Management (SYSTEM CLOCK) Driver clock driver is supported.
The following procedure must be executed to setup the project correctly:
- Specify the clock configuration:
- UC3 and SAM3/4 devices without USB high speed support need 48MHz clock input.
You must use a PLL and an external OSC.
- UC3 and SAM3/4 devices with USB high speed support need 12MHz clock input.
You must use an external OSC.
- UC3 devices with USBC hardware need CPU frequency higher than 25MHz.
- SAMD21 devices without USB high speed support need 48MHz clock input.
You must use a DFLL and an external OSC.
- In conf_board.h, the define CONF_BOARD_USB_PORT must be added to enable USB lines. (Not mandatory for all boards)
- Enable interrupts
- Initialize the clock service
The usage of Sleep manager sleepmgr service is optional, but recommended to reduce power consumption:
- Initialize the sleep manager service
- Activate sleep mode when the application is in IDLE state
conf_clock.h examples with USB support.
For AVR and SAM3/4 devices, add to the initialization code:
For SAMD21 devices, add to the initialization code:
Add to the main IDLE loop:
Example code
Content of conf_usb_host.h:
#define USB_HOST_POWER_MAX 500
Add to application C-file:
Workflow
- Ensure that conf_usb_host.h is available and contains the following configuration which is the main USB device configuration:
#define USB_HOST_POWER_MAX 500 // (500mA)
- Call the USB host stack start function to enable USB Host stack:
Usage steps
Example code
Content of conf_usb_host.h:
#define USB_HOST_UHI UHI_MSC
#define UHI_MSC_CHANGE(dev, b_plug) my_callback_msc_change(dev, b_plug)
extern bool my_callback_msc_change(
uhc_device_t* dev,
bool b_plug);
Add to application C-file:
static bool my_flag_autorize_msc_check = false;
{
if (b_plug) {
my_flag_autorize_msc_check = true;
} else {
my_flag_autorize_msc_check = false;
}
}
void my_task(void)
{
if (!my_flag_autorize_msc_check) {
return;
}
my_flag_autorize_msc_check = false;
continue;
}
uint32_t max_lba;
}
}
Workflow
- Ensure that conf_usb_host.h is available and contains the following configuration which is the USB host MSC configuration:
#define USB_HOST_UHI UHI_MSC
- Note
- It defines the list of UHI supported by USB host.
#define UHI_MSC_CHANGE(dev, b_plug) my_callback_msc_change(dev, b_plug)
extern bool my_callback_msc_change(uhc_device_t* dev, bool b_plug);
- Note
- This callback is called when a USB device MSC is plugged or unplugged.
- The access of the USB memories is allowed through functions described in USB host Mass Storage interface for control access module.
Advanced use cases
For more advanced use of the UHI MSC module, see the following use cases: