Commit Graph

137 Commits (mbed-os-5.13)

Author SHA1 Message Date
Martin Kojtal f99431f7c2
Merge pull request #9444 from maciejbocianski/usb_msd_tests
Usb msd tests
2019-03-21 10:42:55 +01:00
Cruz Monrreal II a1c047aba4 Added missing astyle corrections for usb/device/targets/* 2019-03-20 12:57:36 -05:00
Juha Ylinen 4b714597bf Fix mutex issue 2019-03-13 12:20:46 +02:00
Juha Ylinen 87f2f7f93f USBCDC_ECM: Add receive functionality
Handle SET_ETHERNET_PACKET_FILTER request
2019-03-13 12:17:37 +02:00
Juha Ylinen fc00718917 USBCDC_ECM: send connection notifications to the host
Fix build issues after rebase
2019-03-13 12:17:37 +02:00
Juha Ylinen e7416db621 Fix USBCDC_ECM descriptors
Replace static arrays used for iMAC and config descriptor with class members
Minor coding style fixes
2019-03-13 12:17:37 +02:00
Juha Ylinen 4e4653b7d4 Add USBCDC_ECM class
Add initial Ethernet over USB communication support using
the ECM (Ethernet Control Model) subclass of USB CDC.
2019-03-13 12:17:37 +02:00
Russ Butler 8ffbe5c603 Lock sleep when USB is initialized
None of the USB drivers currently support entering deep sleep mode
while USB is active. To protect USB from malfunctioning lock deep
sleep in USBPhyHw::init.
2019-02-28 15:21:23 -06:00
Maciej Bocianski 7ff689be20 Add USB mass storage test 2019-02-27 17:18:41 +01:00
Maciej Bocianski 0cd9d24d08 USBMSD: Add media removal event check function 2019-02-27 17:18:39 +01:00
Russ Butler 6527cf2bad Update files to include SPDX-License-Identifier
Update the header of all files to use a newer license template which
includes SPDX-License-Identifier.
2019-02-22 10:53:24 -06:00
Russ Butler 9f116d9f33 Applied more astyle fixes 2019-02-22 10:53:24 -06:00
Russ Butler 005df3559c Applied suggested astyle fixes 2019-02-22 10:53:23 -06:00
Russ Butler 8d731561cf Remove inclusion of mbed.h from USB
Remove mbed.h from USB files and fix the build errors this causes.
This is required to pass CI.
2019-02-22 10:53:23 -06:00
bcostm a98eb739b1 STM32F7 USB: add NUCLEO_F756ZG in pins definition 2019-02-22 10:53:23 -06:00
bcostm e96b8a4803 STM32F7 USB: change VBUS pin for DISCO_F746NG FS 2019-02-22 10:53:22 -06:00
bcostm 82498cf3f8 STM32L4 USB: add pins definition for STM32L496/L4R5 MCUs 2019-02-22 10:53:22 -06:00
TomoYamanaka b3dec25ceb Renesas : Implement USB Device feature
I implemented USB Device feature for Renesas mbed boards.
The code referenced the following code as a starting point and is implemented it by inheritting USBPhy same as other boards.
(mbed-os\features\unsupported\USBDevice\targets\TARGET_RENESAS)
2019-02-22 10:53:22 -06:00
bcostm becb32061d STM32F4 USB: remove useless macro 2019-02-22 10:53:22 -06:00
Russ Butler 468df713fc Ignore disabled Kinetis USB endpoint interrupts
Ignore interrupts on disabled USB endpoints. This prevents handling
interrupts when in the wrong state.

Prior to this patch when running the serial test on a K64F the assert
on line 908 of USBDevice.cpp would sometimes be triggered. This
assert indicates that an endpoint 0 IN interrupt occurred before
the device was ready.

This occurs during the test_cdc_usb_reconnect test when the host sends
a "Set Control Line State" USB request and the device acknowledges it
just before USB is disconnected.
2019-02-22 10:53:20 -06:00
Russ Butler 130927068c Remove HAL_GetTick from ST USBPhy
Remove the function HAL_GetTick from the ST USBPhy driver. This is no
longer needed as that change has been made on master.
2019-02-22 10:53:20 -06:00
Filip Jagodzinski 5a312406c4 USB: EndpointResolver: Add a generic method to get a free endpoint 2019-02-22 10:53:19 -06:00
Russ Butler 6b0e9400b0 Fix ST test failures due to endpoint reconfiguration
Also always use the max endpoint size for SetTxFifo
since re-configuring fifos when endpoints are added or removed
causes tests to fail.
2019-02-22 10:53:18 -06:00
Russ Butler 5fde071509 Implement endpoint_abort for STM32
Make use of the added function HAL_PCD_EP_Abort to implement
endpoint_abort.
2019-02-22 10:53:18 -06:00
Russ Butler c4cf19ee3b Revert "Create HAL_PCD_EP_Abort"
Revert the patch "Create HAL_PCD_EP_Abort" in preparation for an
alternate fix.
2019-02-22 10:53:18 -06:00
Russ Butler 0f70912028 Reset data toggle on Kinetis when unstalling
Data toggle must be reset to DATA0 when an endpoint is unstalled.
This patch makes that change.
2019-02-22 10:53:18 -06:00
Russ Butler dbe41c3659 Abort the current USB transfer when stalling
It is undefined behavior if stalling and unstalling clears an ongoing
transfer. Abort any ongoing transfers explicitly when stalling and
unstalling so the behavior is consistent across devices.
2019-02-22 10:53:18 -06:00
Russ Butler c76d80e36e Alternate Kinetis USB stuck sending bug fix
If an IN endpoint is stalled during a transfer then the data being
sent will repeated and flood the USB bus. This patch prevents
endpoints from being stalled in the middle of a transfer by control
requests by keeping USB suspended until the setup phase of the
control request is done.
2019-02-22 10:53:18 -06:00
Russ Butler a75b40a778 Revert "Fix Kinetis bug causing USB to get stuck"
Revert the commit "Fix Kinetis bug causing USB to get stuck sending"
since this change causes stalls to be missed sometimes.
2019-02-22 10:53:18 -06:00
Russ Butler 3657dab5db Update USBMSD to be more consistent with others
Add second constructor and reorder constructor parameters to match
other USB classes. Also remove the ready() function since there
are no calls that can only mbe made from a ready state.
2019-02-22 10:53:18 -06:00
Russ Butler 799cde0fc3 Remove endpoint parameter from USB callbacks
Remove the endpoint parameter from endpoint callbacks. This
information is redundant because endpoints are known at
construction time because they must be in the configuration
descriptor.
2019-02-22 10:53:18 -06:00
Russ Butler 4284afd297 USBMSD fixes
Make the following fixes:
-deinit in destructor to prevent race conditions
-cancel the reset task before calling it since it may be in progress
-wait for tasks to complete without mutex held
-prevent double connect with _init flag
2019-02-22 10:53:17 -06:00
Russ Butler c08da25aa7 Update USBMSD
Update the USBMSD class for the new API. Add support for passing in
a BlockDevice directly without the need to extend USBMSD.
2019-02-22 10:53:17 -06:00
Russ Butler 33756e2316 Add the PolledQueue implementation of TaskQueue
Add the PolledQueue class which provides a TaskQueue which is run
by calling PolledQueue::process.
2019-02-22 10:53:17 -06:00
Russ Butler 29e59d6b83 Add the TaskQueue abstract interface and friends
Add the classes Task, TaskBase and TaskQueue. TaskQueue queue is an
interface class which can be implemented by anything which can run
code. Task and TaskBase are concrete classes which allow callbacks
to be posted to a TaskQueue to be run.
2019-02-22 10:53:17 -06:00
Russ Butler 322b4b72af Update USBDevice endpoint checks to fix asserts
Only assert if disabled endpoints are used when USBDevice is
configured. USBDevice can leave the configured state due to a
reset at any time, which disables all endpoints. Because this
can happen at any time, thread processing could be performing
any endpoint operation. The endpoint operation should return
failure and do nothing in this case, rather than asserting
as this is not an application error.

An assert should only be triggered when an invalid endpoint is
used after the use of USBDevice acknoledges the switch to
configured mode by complete_set_configuration.

In specific this PR fixes the assert caused with the following
sequence:

-ISR: OUT event sent
-ISR: USB reset event
-ISR: USB configure request start
-Thread: OUT event processed on thread and next read starts
        ***endpoint is used while disabled causing an invalid assert***
-Thread: reset event processed
-Thread: configure event processed

This patch fixes this problem by making the following changes:
1. Operations done on disabled endpoints only assert when in the configured state
2. Adding and removing endpoints is only allowed when
    the flag _endpoint_add_remove_allowed is set
3. The flag _endpoint_add_remove_allowed is set on the set
    configuration request and cleared if the request is aborted  or
    fails
2019-02-22 10:53:17 -06:00
Russ Butler d5fc72d5b4 Fix unbalanced USBDevice unlock
Remove calls to unlock which are not preceded by calls to lock.
Also move the location of the unlock underflow assert so unbalanced
unlocking during post processing is caught.
2019-02-22 10:53:17 -06:00
Russ Butler 793044eb26 Fix various USB warnings
Fix the following warnings:
-[Warning] USBTester.cpp@45,0:  #1299-D: members and base-classes will
    be initialized in declaration order, not in member initialisation
    list order
-[Warning] USBTester.h@41,0:  #1300-D: ~USBTester inherits implicit
    virtual
-[Warning] USBAudio.cpp@345,0:  #1035-D: single-precision operand
    implicitly converted to double-precision
-[Warning] USBHID.cpp@29,0:  #1300-D: ~AsyncSend inherits implicit
    virtual
-[Warning] USBHID.cpp@61,0:  #1300-D: ~AsyncRead inherits implicit
    virtual
-[Warning] USBHID.cpp@93,0:  #1300-D: ~AsyncWait inherits implicit
    virtual
-[Warning] EndpointResolver.cpp@125,26: '<<' in boolean context, did
    you mean '<' ? [-Wint-in-bool-context]
2019-02-22 10:53:17 -06:00
Russ Butler 6d88bd118f Update USBAudio
Update the USBAudio class to use the new USB API. This patch also adds
buffering and blocking functionality so it can be used in practice
from thread context.
2019-02-22 10:53:17 -06:00
Russ Butler 4b609b6240 Add circular byte buffer using dynamic memory
Add the ByteBuffer class which is similar to the CircularBuffer class
but uses dynamic memory rather than template parameters and is
optimized for byte transfers. This is required for USBAudio which
needs a high performance circular buffer which can be resized at
runtime.
2019-02-22 10:53:17 -06:00
Russ Butler 9a35bc7184 Fix Kinetis bug causing USB to get stuck sending
If an IN endpoint is stalled during a transfer by writing to the
USB ENDPOINT register then the data being sent will repeat and flood
the USB bus. This patch prevents the register write from occurring by
instead writing to the buffer descriptor in RAM and letting the USB
hardware handle setting the stall bit.

Note - Control requests on endpoint 0 do still set the STALL bit
directly. This is not a problem since control endpoints cannot be
stalled externally while a transfer is ongoing.
2019-02-22 10:53:17 -06:00
Russ Butler da77f3885b Fix isochronous endpoints on LPC1768
Perform isochronous endpoint processing from the frame interrupt
rather than the endpoint interrupt. Isochronous endpoints to not
generate interrupts normally and are intended to be handled from
the start of frame interrupt.
2019-02-22 10:53:17 -06:00
Russ Butler 2fedc706e6 Fix USB on Kinetis devices
Set correct SYSMPU register for proper USB operation.  This bug was
introduced when the SYSMPU register names and defines were updated
in the commit:
"K64F: Updated the SYSMPU SDK driver"
93f8cfed05
2019-02-22 10:53:17 -06:00
Russ Butler 7ba6314157 Only build in USBPhy_STM32 for supported devices
Define USBSTM_HAL_UNSUPPORTED if DEVICE_USBDEVICE is undefined or
defined to 0.
2019-02-22 10:53:16 -06:00
Russ Butler 3f45a81a81 Fix return code check in endpoint abort
Assert that HAL_PCD_EP_Abort returns HAL_OK rather that something else.
2019-02-22 10:53:16 -06:00
Michel Jaouen ced1cbd0ed Create HAL_PCD_EP_Abort 2019-02-22 10:53:16 -06:00
Russ Butler 17b61daf21 Remove unnecessary USB receive buffer
Remove receive buffer from USBPhy_STM32 and instead passed buffers in
directly.
2019-02-22 10:53:16 -06:00
Russ Butler 57fa607432 Remove ep0_write from set_address
The USBDevice stack automatically sends control endpoint status
so this does not and should not be done from the call to set_address.
2019-02-22 10:53:16 -06:00
Russ Butler a47c383233 Update the STM32 USB driver to the new API
Take the code from
mbed-os\features\unsupported\USBDevice\targets\TARGET_STM
as a starting point and use it to fill in the USBPhy template for STM32
devices.
2019-02-22 10:53:16 -06:00
Russ Butler 67498e384a Implement LPC1768 USB abort function
Implement the USB abort function so interrupts wont fire for a
transfer that has been aborted. The transfer may still take place
but the buffer passed into endpoint_write or endpoint_read will not
be used.
2019-02-22 10:53:16 -06:00
Russ Butler 044804200b Fix LPC1768 test failures
Reset endpoints when they are removed. This ensures buffers and the
data toggle bit get reset back to zero.
2019-02-22 10:53:16 -06:00
Russ Butler 9efccb20eb Add default values to USBCDC constructor
Add reasonable defaults to the USBCDC constructor so it is easier to
use.
2019-02-22 10:53:16 -06:00
Russ Butler 3dcd345efe Update the USBMIDI class
Update the USB class USBMIDI from the unsupported folder.
2019-02-22 10:53:16 -06:00
Russ Butler 9f94e4651a Require USB classes to implement descriptor
Make the function configuration_desc pure virtual inside USBDevice.
This should be a compile time error since no subclass will work
without a configuration descriptor.
2019-02-22 10:53:16 -06:00
Russ Butler 5ffe123973 Update USBHID and USBCDC for new AsyncOp
Update USB classes to use the new AsyncOp API.
2019-02-22 10:53:15 -06:00
Russ Butler c709f68434 Refactor AsyncOp class
Add the OperationList class to simplify managing async operations.
Add a callback to the AsyncOp class so completion can be signaled with
another mechanism. Finally rework the lock handling so AsyncOp::wait
is passed the lock to use rather than taking it in a constructor.
2019-02-22 10:53:15 -06:00
Russ Butler 3d429cf43f Update the USBHID classes
Update the USB classes USBHID, USBKeyboard, USBMouse and
USBMouseKeyboard from the unsupported folder.
2019-02-22 10:53:15 -06:00
Russ Butler 7e5e64bfdf Cleanup USBSerial
Make the following changes
-Make blocking the first parameter in the constructor
-Add destructor and proper cleanup
-Add ready and wait_ready functions
2019-02-22 10:53:15 -06:00
Russ Butler 11e2ba1f92 Add USBDevice destructor
Add a destructor to USBDevice to ensure that resources have been
properly released. Additionally add an assert in the destructor that
deinit has already been called. If it has not been called then
interrupts can still occur which may cause a crash.
2019-02-22 10:53:14 -06:00
Russ Butler ced82dd16b Remove extra USBDevice constructor
Remove the second USBDevice constructor since it does not provide
any new functionality.
2019-02-22 10:53:14 -06:00
Russ Butler e3219cd016 Remove blocking option from USB connect
Remove the option to block in USBDevice::connect since this
should be handled at a higher level. Also call init to ensure that
the USBDevice has been initalized.
2019-02-22 10:53:14 -06:00
Russ Butler 7245a33164 Fix Kinetis USB disconnect
When disconnecting in the middle of a setup packet USB stops working
even after being re-connected. This is because the setup packet
suspended endpoint events but nothing resumed endpoint events.
This patch adds code to resume endpoint events in the reset handler.
2019-02-22 10:53:14 -06:00
Russ Butler 630e6292c9 Prevent Kinetis USB setup packets at wrong time
When disconnecting USB clear all pending interrupts. This ensures that
pending setup packets are dropped rather than being triggered after
disconnect.
2019-02-22 10:53:14 -06:00
Maciej Bocianski 561a2407f4 USBDevice: endpoint_add/read_start functions return value fix 2019-02-22 10:53:13 -06:00
Russ Butler ca4a68649d Add endpoint_remove_all helper function
Add the helper function endpoint_remove_all which removes all added
endpoints. This is useful for class drivers switching between
different USB configurations.
2019-02-22 10:53:13 -06:00
Maciej Bocianski ff3b0c1623 code formatting fixes 2019-02-22 10:53:13 -06:00
Maciej Bocianski 69a095cf3e USBDevice - add multiconfiguration support 2019-02-22 10:53:13 -06:00
Russ Butler dc29fdefcc Add USBPhy template
Add a template for implementing a USBPhy.
2019-02-22 10:52:35 -06:00
Russ Butler 76aa7e0b6d Move USBPhy and related files to USB directory
Move the USBPhy header files into usb/device/USBPhy. Also move hal
and target USB files since mbed 2 does not compile when these files
are present without the USBPhy headers.

Directory restructure summary:
platform/USBPhy*
    to usb/device/USBPhy/USBPhy*
hal/*
    to usb/device/hal/*
targets/TARGET_Freescale/usb/*
    to usb/device/targets/TARGET_Freescale/*
targets/TARGET_NXP/TARGET_LPC176X/usb/*
    to usb/device/targets/TARGET_NXP/*
2019-02-22 10:52:35 -06:00
Russ Butler 0653799b5a Limit USB control transfer size
Limit the size of control reads to the max packet size of endpoint
zero. This fixes the handling of large transfers.
2019-02-22 10:52:35 -06:00
Russ Butler 0eac26038d Update USBCDC and USBSerial
Update the USBCDC and USBSerial classes to the new API. This patch also
updates the blocking behavior to unblock at the appropriate times and
to let the processor sleep when blocking rather than busy waiting.
2019-02-22 10:52:34 -06:00
Russ Butler 0d8c8f0a28 Add USB utility classes
Add an allocation free linked list implementation. Additionally add
the class AsyncOp which provides blocking and wakeup funcionality
to simplify making asynchronous operations block.
2019-02-22 10:52:34 -06:00
Russ Butler 09c1d2cf1e Add abort API to USBDevice
Add the function endpoint_abort and ensure ongoing transfer are
aborted when an endpoint is removed.
2019-02-22 10:52:34 -06:00
Russ Butler 544282d934 Update USBDevice to reflect the updated USBPhy
Update USBDevice so the USB buffers are user supplied.
2019-02-22 10:52:34 -06:00
Russ Butler 4c398a308f Call disconnect when uninitializing USB
Disconnect USB when uninitializing USB so it is in a well defined
state.
2019-02-22 10:52:33 -06:00
Russ Butler 12231917ef Explicitly return when endpoint 0 is stalled
Stalling endpoint 0 indicates the end of a control transfer.
Return immediately when this occurs rather than continuing processing.

In particular, this patch prevents status from erroneously being
sent when _request_setup returns false inside _complete_request.
2019-02-22 10:52:33 -06:00
Russ Butler 8e2361a6b5 Allow transfer to start when configuring USB
Allow reads and writes to be started when entering the configured
state.
2019-02-22 10:52:33 -06:00
Russ Butler 7c96e22fa7 Move USBDevice processing out of user callbacks
Perform processing triggered by user callbacks when USB is being
unlocked rather than synchronously. This prevents recursive callbacks
which reduces stack usage. This also prevents state change inside
the user callback which makes the code easier to reason about.
2019-02-22 10:52:33 -06:00
Russ Butler ff157a237a Update stall state on set and clear feature
Call USBDevice::endpoint_stall/unstall in the request to set/clear
halt so the endpoint state is properly updated in the array
_endpoint_info.
2019-02-22 10:52:33 -06:00
Russ Butler 23f3c01633 Fix USB init problems
Initialize the _transfer structure so the behavior is the same
regardless of prior memory contents. This fixes a hang during
USB testing when CI flags are used.
2019-02-22 10:52:33 -06:00
Russ Butler de12bb57fa Update USBTester for simplified read handling
Remove read_start and replace read_finish with read to match the new
USBDevice API.
2019-02-22 10:52:33 -06:00
Russ Butler 3168a92231 Change USBDevice read handling
Remove the USBDevice function read_start and automatically start all
reads internally in USBDevice. This patch also renames the function
read_finish to read.
2019-02-22 10:52:33 -06:00
Russ Butler 57ca5bc335 Add and assert USB callback completion
Assert that when a callback is completed it is the active callback.
2019-02-22 10:52:33 -06:00
Russ Butler caace4ac61 Update USBDevice and configure to use a USBPhy
Update the USBDevice class API so it matches mbed-os's naming
conventions, has a more robust API and uses USBPhy as its backend.
2019-02-22 10:52:32 -06:00
Russ Butler f7cb2cd280 Update USB licenses and format code
Update USB licenses from MIT to Apache 2 and run astyle on the code.
2019-02-22 10:52:32 -06:00
Russ Butler a4b6cfe90a Copy USBDevice from unsupported
Copy the USBDevice code out of unsupported and into a top level USB
folder in preparation for development.

squash
2019-02-22 10:52:32 -06:00
Russ Butler 8ae123f2d4 Add USBPhy, USB HAL and Utility class
Add the USBPhy and USBPhyEvents abstract classes, the HAL header using
this class and the EndpointResolver utility class.
2019-02-22 10:52:32 -06:00