µOS++ IIIe Reference 7.0.0
The third edition of µOS++, a POSIX inspired open source framework, written in C++
Loading...
Searching...
No Matches
usbd-wrapper.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the µOS++ project (https://micro-os-plus.github.io/).
3 * Copyright (c) 2016-2025 Liviu Ionescu. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software
6 * for any purpose is hereby granted, under the terms of the MIT license.
7 *
8 * If a copy of the license was not distributed with this file, it can
9 * be obtained from https://opensource.org/licenses/mit.
10 */
11
14#include <Driver_USBD.h>
15
16#include <cassert>
17#include <utility>
18#include <cstdio>
19
20// ----------------------------------------------------------------------------
21
22namespace os
23{
24 namespace driver
25 {
26 // ------------------------------------------------------------------------
27
29 ARM_DRIVER_USBD* driver, ARM_USBD_SignalDeviceEvent_t c_cb_device_func,
30 ARM_USBD_SignalEndpointEvent_t c_cb_endpoint_func) noexcept
31 : driver_ (driver), c_cb_device_func_ (c_cb_device_func),
32 c_cb_endpoint_func_ (c_cb_endpoint_func)
33 {
34 trace::printf ("%s() %p\n", __func__, this);
35 }
36
38 {
39 trace::printf ("%s() %p\n", __func__, this);
40
41 driver_ = nullptr;
42 }
43
44 // ------------------------------------------------------------------------
45
46#pragma GCC diagnostic push
47#if defined(__clang__)
48#elif defined(__GNUC__)
49#pragma GCC diagnostic ignored "-Waggregate-return"
50#endif
51#pragma GCC diagnostic ignored "-Wstrict-aliasing"
52
53 const Version&
55 {
56 // Overwrite the C++ instance. Assume same layout.
57 *(reinterpret_cast<ARM_DRIVER_VERSION*> (&version_))
58 = driver_->GetVersion ();
59 return version_;
60 }
61
64 {
65 // Overwrite the C++ instance. Assume same layout.
66 *(reinterpret_cast<ARM_USBD_CAPABILITIES*> (&capa_))
67 = driver_->GetCapabilities ();
68 return capa_;
69 }
70
73 {
74 // Overwrite the C++ instance. Assume same layout.
75 *(reinterpret_cast<ARM_USBD_STATE*> (&status_))
76 = driver_->DeviceGetState ();
77 return status_;
78 }
79
80#pragma GCC diagnostic pop
81
84 {
85 assert (driver_ != nullptr);
86
87 return_t status;
88
89 if (state == Power::full)
90 {
91 status
92 = driver_->Initialize (c_cb_device_func_, c_cb_endpoint_func_);
93 if (status != ARM_DRIVER_OK)
94 {
95 return status;
96 }
97 }
98
99 status = driver_->PowerControl (static_cast<ARM_POWER_STATE> (state));
100
101 if (state == Power::off)
102 {
103 driver_->Uninitialize ();
104 }
105
106 return status;
107 }
108
111 {
112 return driver_->DeviceConnect ();
113 }
114
117 {
118 return driver_->DeviceDisconnect ();
119 }
120
123 {
124 return driver_->DeviceRemoteWakeup ();
125 }
126
129 usb::device_address_t dev_addr) noexcept
130 {
131 return driver_->DeviceSetAddress (dev_addr);
132 }
133
136 {
137 return driver_->ReadSetupPacket (buf);
138 }
139
142 {
143 return driver_->GetFrameNumber ();
144 }
145
148 usb::endpoint_t ep_addr, usb::Endpoint_type ep_type,
149 usb::packet_size_t ep_max_packet_size) noexcept
150 {
151 return driver_->EndpointConfigure (
152 ep_addr, static_cast<uint8_t> (ep_type), ep_max_packet_size);
153 }
154
157 {
158 return driver_->EndpointUnconfigure (ep_addr);
159 }
160
163 bool stall) noexcept
164 {
165 return driver_->EndpointStall (ep_addr, stall);
166 }
167
170 std::size_t num) noexcept
171 {
172 return driver_->EndpointTransfer (ep_addr, data,
173 static_cast<uint32_t> (num));
174 }
175
176 std::size_t
178 {
179 return driver_->EndpointTransferGetResult (ep_addr);
180 }
181
184 {
185 return driver_->EndpointTransferAbort (ep_addr);
186 }
187
188 } /* namespace driver */
189} /* namespace os */
190
191// ----------------------------------------------------------------------------
USB device driver capabilities.
Definition usb-device.h:63
virtual return_t do_unconfigure_endpoint(usb::endpoint_t ep_addr) noexcept override
virtual ~usbd_wrapper() noexcept
virtual usb::device::Status & do_get_status(void) noexcept override
virtual return_t do_connect(void) noexcept override
ARM_DRIVER_USBD * driver_
Pointer to CMSIS USBD Keil driver.
const usb::device::Capabilities & do_get_capabilities(void) noexcept override
virtual usb::frame_number_t do_get_frame_number(void) noexcept override
virtual return_t do_disconnect(void) noexcept override
virtual return_t do_configure_address(usb::device_address_t dev_addr) noexcept override
virtual const Version & do_get_version(void) noexcept override
virtual return_t do_configure_endpoint(usb::endpoint_t ep_addr, usb::Endpoint_type ep_type, usb::packet_size_t ep_max_packet_size) noexcept override
virtual return_t do_abort_transfer(usb::endpoint_t ep_addr) noexcept override
virtual std::size_t do_get_transfer_count(usb::endpoint_t ep_addr) noexcept override
virtual return_t do_transfer(usb::endpoint_t ep_addr, uint8_t *data, std::size_t num) noexcept override
virtual return_t do_power(Power state) noexcept override
virtual return_t do_stall_endpoint(usb::endpoint_t ep_addr, bool stall) noexcept override
virtual return_t do_wakeup_remote(void) noexcept override
virtual return_t do_read_setup_packet(uint8_t *buf) noexcept override
usbd_wrapper(ARM_DRIVER_USBD *driver, ARM_USBD_SignalDeviceEvent_t c_cb_device_func, ARM_USBD_SignalEndpointEvent_t c_cb_endpoint_func) noexcept
int printf(const char *format,...)
Write a formatted string to the trace device.
Definition trace.cpp:59
uint8_t endpoint_t
Definition usb.h:64
uint8_t device_address_t
Definition usb.h:99
uint16_t packet_size_t
Definition usb.h:92
uint16_t frame_number_t
Definition usb.h:97
Endpoint_type
Endpoint type.
Definition usb.h:77
int32_t return_t
Definition common.h:46
System namespace.
void(* ARM_USBD_SignalEndpointEvent_t)(uint8_t ep_addr, uint32_t event)
void(* ARM_USBD_SignalDeviceEvent_t)(uint32_t event)
struct _ARM_DRIVER_USBD const ARM_DRIVER_USBD