stm32_otgfsdev: Fix bug in stm32_ep_findbyaddr.

stm32_ep_findbyaddr was checking privep->configured, but that field
is never set anywhere. Consequently the function always returned
NULL.

This caused endpoint setup requests to fail, including "clear stall"
requests.
stm32_otgfsdev: Don't disable endpoint in stall

The clrstall logic doesn't re-enable the endpoint. Also
I see no reason to disable the endpoint.
extern in usbdev_trace
stm32_otgfsdev: Add workaround for infinite interrupt loops.

These shouldn't happen, but this workaround manages to recover if they do happen.
stm32_otgfsdev: Properly clear EPDISD interrupts after disabling endpoint.
stm32_otgfsdev: Disable part of epout_disable that hangs.
usbmsc_scsi: Instead of throwing error, just truncate long vendor name.

This allows to have the full name in the USB descriptor and truncated name
in the 8-byte SCSI field.
stm32_spi: Check error flags after send, disable while changing bit count.

If the error flags are not cleared, they may corrupt further transfers.
This is because error conditions stop reception, but reading SR after DR
will reset the error flags. Therefore first byte would get lost but further
bytes would get through.

The most proper solution would be to return the errors to the caller, but
there doesn't seem to be an interface for that.

Another issue: The STM32F4 reference manual notes that the bit count should
not be changed while the SPI peripheral is enabled.
mmcsd_spi: Fix bugs with shared bus

When bus is shared, the speed has to be set every time.

Also SD cards require a few dummy clocks to react into CS release
(it is sampled synchronously to SCLK, unlike what normal SPI devices do).
Fix CNxTimer stop for repeated timers.

Previously repeated timers were re-enabled after the timer action event.
Consequently, if the action event handler tried to stop the timer, the
request would be ignored.

This patch changes the order of the action so that the timer is re-enabled
before the callback. There is still no risk of re-entrancy, because everything
executes on the USRWORK work queue.

This patch does change the timing a bit, but it should not be critical because
CNxTimer is mostly used for low-frequency events anyway.
Fix text placement in CMultiLineTextbox.

Previously if the widget wasn't at (0,0), part of the text would remain outside the widget area.
Fix a bug where windows would sometimes be created with size 1,1.

This bug is twofold:

1) Due to the way nxgl_rectsize computes the size, it will never
   be 0,0 like CWidgetControl expects. Therefore the size is considered
   valid even though it has not been set yet.

2) After the check is fixed to test for > 1, NxWM window creation will
   hang. This is due to the fact that it uses the screen bounds for
   determining window size. This was being blocked on geosem, which
   is only posted after the size has been set.

   Fix is to add another semaphore, boundssem, which is set as soon as
   the screen bounds are known.
Two improvements for CImage.

1. Allow changing the bitmap even after the control has been created.

2. Allow giving 'null' to have the control draw no image at all.
CTaskbar: Allow windows with null icon.

This makes sense for e.g. full screen windows.
Add config options to override NxWM stop/minimize icons.
Get rid of the start window thread.

Instead, handle all events through the USRWORK work queue.

For me, this was necessary because I would open some files in button handlers
and close them in NxTimer handlers. If these belonged to different tasks, the
close operation would fail.

Further benefits:
+ Gets rid of one task and message queue.
+ Reduces the amount of code required
+ Decouples CStartWindow from everything else - now it is just a window with
  application icons, not an integral part of the event logic.
+ All events come from the same thread, which reduces the possibility of multithreading
  errors in user code.
+ The user code can also send events to USRWORK, so that everything gets
  serialized nicely without having to use so many mutexes.

Drawbacks:
- Currently the work state structure is malloc()ed, causing one allocation
  and free per each input event. Could add a memory pool for these later, but
  the speed difference doesn't seem noticeable.
- The work queue will add ~50 ms latency to input events. This is however
  configurable, and the delay is anyway short enough that it is unnoticeable.
Add a screenshot application.

It connects to NX multi-user, fetches the screen data row by row
and writes it to a tif image.
stdthrow: Add handler for bad_function_call.