/**
@page MTP_Standalone USB Host Media Transfer Protocol (MTP) application
@verbatim
******************************************************************************
* @file USB_Host/MTP_Standalone/readme.txt
* @author MCD Application Team
* @brief Description of the USB Host MTP application.
******************************************************************************
* @attention
*
* Copyright (c) 2016 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
@endverbatim
@par Application Description
This application is a part of the USB Host Library package using STM32Cube firmware. It describes how to use
USB host application based on the Media Transfer Protocol (MTP) on the STM32F7xx devices.
MTP is used to transfer data between computer/Host and devices connected to it. This protocol was
developed for intelligent storage devices for downloading photographs from digital cameras music files
on digital audio players and media files on portable media players.
At the beginning of the main program the HAL_Init() function is called to reset all the peripherals,
initialize the Flash interface and the systick. The user is provided with the SystemClock_Config()
function to configure the system clock (SYSCLK) to run at 200 Mhz. The Full Speed (FS) USB module uses
internally a 48-MHz clock which is coming from a specific output of two PLLs: main PLL or PLL SAI.
In the High Speed (HS) mode the USB clock (60 MHz) is driven by the ULPI.
When the application is started, the connected device (Android devices: Smartphone, Tablet...)
is detected in MTP mode and gets initialized.
The STM32 MCU behaves as a MTP Host, it enumerates the device and extracts VID, PID, manufacturer name,
Serial number and product name information and displays it on the LCD screen.
Then the Host detects the number of storage devices and displays on the LCD screen. The user will have
to copy the .wav files on the root of the default storage. Only the files present on this space are visible
by the application.
A menu is displayed and the user can select any operation from the menu using the Joystick buttons:
- "Explore audio file" operation searches for all MTP objects, here are .Wav files and displays them
on the LCD screen.
- "Start audio Player" operation starts playing the song from selected storage device.
This application uses the I2S interface to stream audio data from USB Host to the audio codec implemented
on the evaluation board. Then audio downstream is driven to headphone or speaker.
The USBH_AUDIO_ChangeOutBuffer() API is called while playing songs and the bytes are stored in a
circular buffer. Sampling frequency, Channels number and File size (duration) are detected.
The audio.c file contains a set of APIs for Audio Out playback, for example when the WAV file is
playing, the USBH_AUDIO_SetVolume() API is called to change the volume settings.
- "Re-Enumerate" operation performs a new Enumeration of the device.
@note Care must be taken when using HAL_Delay(), this function provides accurate delay (in milliseconds)
based on variable incremented in SysTick ISR. This implies that if HAL_Delay() is called from
a peripheral ISR process, then the SysTick interrupt must have higher priority (numerically lower)
than the peripheral interrupt. Otherwise the caller ISR process will be blocked.
To change the SysTick interrupt priority you have to use HAL_NVIC_SetPriority() function.
@note The application needs to ensure that the SysTick time base is always set to 1 millisecond
to have correct HAL operation.
For more details about the STM32Cube USB Host library, please refer to UM1720
"STM32Cube USB Host library".
@note The application is compliant with the MTP implementation for the Android 4.0.x/ 4.1.x/4.2.x and 4.3.x
with USB debug mode disabled on the device.
@note The STM32F7xx devices can reach a maximum clock frequency of 216MHz but as this application uses SDRAM,
the system clock is limited to 200MHz. Indeed proper functioning of the SDRAM is only guaranteed
at a maximum system clock frequency of 200MHz.
@par USB Library Configuration
To select the appropriate USB Core to work with, user must add the following macro defines within the
compiler preprocessor (already done in the preconfigured projects provided with this application):
- "USE_USB_HS" when using USB High Speed (HS) Core
- "USE_USB_FS" when using USB Full Speed (FS) Core
- "USE_USB_HS" and "USE_USB_HS_IN_FS" when using USB High Speed (HS) Core in FS mode
It is possible to fine tune needed USB Host features by modifying defines values in USBH configuration
file <20>usbh_conf.h<> available under the project includes directory, in a way to fit the application
requirements, such as:
- Level of debug: USBH_DEBUG_LEVEL
0: No debug messages
1: Only User messages are shown
2: User and Error messages are shown
3: All messages and internal debug messages are shown
By default debug messages are displayed on the debugger IO terminal; to redirect the Library
messages on the LCD screen, lcd_log.c driver need to be added to the application sources.
@par Keywords
Connectivity, USB_Host, USB, MTP, Android, Full Speed, High Speed, LCD, Enumeration, Removable drive, Audio, Wav
@Note<74>If the user code size exceeds the DTCM-RAM size or starts from internal cacheable memories (SRAM1 and SRAM2),that is shared between several processors,
<20><><A0><A0><A0>then it is highly recommended to enable the CPU cache and maintain its coherence at application level.
<0A><><A0><A0><A0><A0>The address and the size of cacheable buffers (shared between CPU and other masters) must be properly updated to be aligned to cache line size (32 bytes).
@Note It is recommended to enable the cache and maintain its coherence, but depending on the use case
<0A><><A0><A0><A0> It is also possible to configure the MPU as "Write through", to guarantee the write access coherence.
<0A><><A0><A0><A0><A0>In that case, the MPU must be configured as Cacheable/Bufferable/Not Shareable.
<0A><><A0><A0><A0><A0>Even though the user must manage the cache coherence for read accesses.
<0A><><A0><A0><A0><A0>Please refer to the AN4838 <20>Managing memory protection unit (MPU) in STM32 MCUs<55>
<0A><><A0><A0><A0><A0>Please refer to the AN4839 <20>Level 1 cache on STM32F7 Series<65>
@par Directory contents
- USB_Host/MTP_Standalone/Src/main.c Main program
- USB_Host/MTP_Standalone/Src/system_stm32f7xx.c STM32F7xx system clock configuration file
- USB_Host/MTP_Standalone/Src/stm32f7xx_it.c Interrupt handlers
- USB_Host/MTP_Standalone/Src/menu.c MTP State Machine
- USB_Host/MTP_Standalone/Src/usbh_conf.c General low level driver configuration
- USB_Host/MTP_Standalone/Src/audio.c Audio Out (playback) interface API
- USB_Host/MTP_Standalone/Src/mtp.c Explore the MTP storage objects
- USB_Host/MTP_Standalone/Inc/main.h Main program header file
- USB_Host/MTP_Standalone/Inc/stm32f7xx_it.h Interrupt handlers header file
- USB_Host/MTP_Standalone/Inc/lcd_log_conf.h LCD log configuration file
- USB_Host/MTP_Standalone/Inc/stm32f7xx_hal_conf.h HAL configuration file
- USB_Host/MTP_Standalone/Inc/usbh_conf.h USB Host driver Configuration file
@par Hardware and Software environment
- This application runs on STM32F767xx/STM32F769xx/STM32F777xx/STM32F779xx devices.
- This application has been tested with STMicroelectronics STM32F769I-EVAL
evaluation boards and can be easily tailored to any other supported device
and development board.
- STM32F769I-EVAL Set-up
- Plug the MTP device into the STM32F769I-EVAL board through 'USB micro A-Male
to A-Female' cable to the connector:
- CN8 : to use USB High Speed (HS)
- CN13: to use USB Full Speed (FS)
- CN14: to use USB HS-IN-FS.
Note that some FS signals are shared with the HS ULPI bus, so some PCB rework is needed.
For more details, refer to section "USB OTG2 HS & FS" in STM32F769I-EVAL Evaluation Board
User Manual.
@note Make sure that :
- jumper JP14 must be removed when using USB OTG FS
- Use CN28 connector to connect the board to external headset
- Please ensure that jumpers JP3 and JP6 are fitted in position 1-2 (Audio)
- Load .wav audio file (audio_sample.wav) available under "/Utilities/Media/Audio" to the root of MTP device
@par How to use it ?
In order to make the program work, you must do the following :
- Open your preferred toolchain
- Rebuild all files and load your image into target memory
- In the workspace toolbar select the project configuration:
- STM32F769I-EVAL_USBH-HS: to configure the project for STM32F7xx devices using USB OTG HS peripheral
- STM32F769I-EVAL_USBH-FS: to configure the project for STM32F7xx devices using USB OTG FS peripheral
- STM32F769I-EVAL_USBH-HS-IN-FS: to configure the project for STM32F7xx devices and use USB OTG HS
peripheral In FS (using embedded PHY).
- Run the application
*/