getting_started.rst 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. ***************
  2. Getting Started
  3. ***************
  4. Add TinyUSB to your project
  5. ---------------------------
  6. It is relatively simple to incorporate tinyusb to your (existing) project
  7. * Copy or ``git submodule`` this repo into your project in a subfolder. Let's say it is *your_project/tinyusb*
  8. * Add all the .c in the ``tinyusb/src`` folder to your project
  9. * Add *your_project/tinyusb/src* to your include path. Also make sure your current include path also contains the configuration file tusb_config.h.
  10. * Make sure all required macros are all defined properly in tusb_config.h (configure file in demo application is sufficient, but you need to add a few more such as CFG_TUSB_MCU, CFG_TUSB_OS since they are passed by IDE/compiler to maintain a unique configure for all boards).
  11. * If you use the device stack, make sure you have created/modified usb descriptors for your own need. Ultimately you need to implement all **tud descriptor** callbacks for the stack to work.
  12. * Add tusb_init() call to your reset initialization code.
  13. * Call ``tud_int_handler()`` (device) and/or ``tuh_int_handler()`` (host) in your USB IRQ Handler
  14. * Implement all enabled classes's callbacks.
  15. * If you don't use any RTOSes at all, you need to continuously and/or periodically call tud_task()/tuh_task() function. All of the callbacks and functionality are handled and invoked within the call of that task runner.
  16. .. code-block::
  17. int main(void)
  18. {
  19. your_init_code();
  20. tusb_init(); // initialize tinyusb stack
  21. while(1) // the mainloop
  22. {
  23. your_application_code();
  24. tud_task(); // device task
  25. tuh_task(); // host task
  26. }
  27. }
  28. Examples
  29. --------
  30. For your convenience, TinyUSB contains a handful of examples for both host and device with/without RTOS to quickly test the functionality as well as demonstrate how API() should be used. Most examples will work on most of `the supported Boards <boards.md>`_. Firstly we need to ``git clone`` if not already
  31. .. code-block::
  32. $ git clone https://github.com/hathach/tinyusb tinyusb
  33. $ cd tinyusb
  34. Some TinyUSB examples also requires external submodule libraries in ``/lib`` such as FreeRTOS, Lightweight IP to build. Run following command to fetch them
  35. .. code-block::
  36. $ git submodule update --init lib
  37. In addition, MCU driver submodule is also needed to provide low-level MCU peripheral's driver. Luckily, it will be fetched if needed when you run the ``make`` to build your board.
  38. Note: some examples especially those that uses Vendor class (e.g webUSB) may requires udev permission on Linux (and/or macOS) to access usb device. It depends on your OS distro, typically copy ``/examples/device/99-tinyusb.rules`` file to /etc/udev/rules.d/ then run ``sudo udevadm control --reload-rules && sudo udevadm trigger`` is good enough.
  39. Build
  40. ^^^^^
  41. To build example, first change directory to an example folder.
  42. .. code-block::
  43. $ cd examples/device/cdc_msc
  44. Then compile with ``make BOARD=[board_name] all``\ , for example
  45. .. code-block::
  46. $ make BOARD=feather_nrf52840_express all
  47. Note: ``BOARD`` can be found as directory name in ``hw/bsp``\ , either in its family/boards or directly under bsp (no family).
  48. Port Selection
  49. ~~~~~~~~~~~~~~
  50. If a board has several ports, one port is chosen by default in the individual board.mk file. Use option ``PORT=x`` To choose another port. For example to select the HS port of a STM32F746Disco board, use:
  51. .. code-block::
  52. $ make BOARD=stm32f746disco PORT=1 all
  53. Port Speed
  54. ~~~~~~~~~~
  55. A MCU can support multiple operational speed. By default, the example build system will use the fastest supported on the board. Use option ``SPEED=full/high`` e.g To force F723 operate at full instead of default high speed
  56. .. code-block::
  57. $ make BOARD=stm32f746disco SPEED=full all
  58. Debug
  59. ^^^^^
  60. To compile for debugging add ``DEBUG=1``\ , for example
  61. .. code-block::
  62. $ make BOARD=feather_nrf52840_express DEBUG=1 all
  63. Log
  64. ~~~
  65. Should you have an issue running example and/or submitting an bug report. You could enable TinyUSB built-in debug logging with optional ``LOG=``. LOG=1 will only print out error message, LOG=2 print more information with on-going events. LOG=3 or higher is not used yet.
  66. .. code-block::
  67. $ make BOARD=feather_nrf52840_express LOG=2 all
  68. Logger
  69. ~~~~~~
  70. By default log message is printed via on-board UART which is slow and take lots of CPU time comparing to USB speed. If your board support on-board/external debugger, it would be more efficient to use it for logging. There are 2 protocols:
  71. * `LOGGER=rtt`: use [Segger RTT protocol](https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/)
  72. * Cons: requires jlink as the debugger.
  73. * Pros: work with most if not all MCUs
  74. * Software viewer is JLink RTT Viewer/Client/Logger which is bundled with JLink driver package.
  75. * ``LOGGER=swo``\ : Use dedicated SWO pin of ARM Cortex SWD debug header.
  76. * Cons: only work with ARM Cortex MCUs minus M0
  77. * Pros: should be compatible with more debugger that support SWO.
  78. * Software viewer should be provided along with your debugger driver.
  79. .. code-block::
  80. $ make BOARD=feather_nrf52840_express LOG=2 LOGGER=rtt all
  81. $ make BOARD=feather_nrf52840_express LOG=2 LOGGER=swo all
  82. Flash
  83. ^^^^^
  84. ``flash`` target will use the default on-board debugger (jlink/cmsisdap/stlink/dfu) to flash the binary, please install those support software in advance. Some board use bootloader/DFU via serial which is required to pass to make command
  85. .. code-block::
  86. $ make BOARD=feather_nrf52840_express flash
  87. $ make SERIAL=/dev/ttyACM0 BOARD=feather_nrf52840_express flash
  88. Since jlink can be used with most of the boards, there is also ``flash-jlink`` target for your convenience.
  89. .. code-block::
  90. $ make BOARD=feather_nrf52840_express flash-jlink
  91. Some board use uf2 bootloader for drag & drop in to mass storage device, uf2 can be generated with ``uf2`` target
  92. .. code-block::
  93. $ make BOARD=feather_nrf52840_express all uf2