Subversion Repositories freemyipod

Rev

Rev 835 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 835 Rev 891
Line 1... Line 1...
1
//
1
#include "global.h"
2
//
2
#include "usb.h"
3
//    Copyright 2010 TheSeven
3
#include "util.h"
4
//
4
 
5
//
5
void usb_start_rx(const struct usb_instance* data, union usb_endpoint_number ep, void* buf, int size)
6
//    This file is part of emCORE.
6
{
7
//
7
    data->driver->start_rx(data, ep, buf, size);
8
//    emCORE is free software: you can redistribute it and/or
8
}
9
//    modify it under the terms of the GNU General Public License as
9
 
10
//    published by the Free Software Foundation, either version 2 of the
10
void usb_start_tx(const struct usb_instance* data, union usb_endpoint_number ep, const void* buf, int size)
11
//    License, or (at your option) any later version.
11
{
12
//
12
    data->driver->start_tx(data, ep, buf, size);
13
//    emCORE is distributed in the hope that it will be useful,
13
}
14
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
15
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15
void usb_set_stall(const struct usb_instance* data, union usb_endpoint_number ep, int stall)
16
//    See the GNU General Public License for more details.
16
{
17
//
17
    data->driver->set_stall(data, ep, stall);
18
//    You should have received a copy of the GNU General Public License along
18
}
19
//    with emCORE.  If not, see <http://www.gnu.org/licenses/>.
19
 
20
//
20
void usb_ep0_start_rx(const struct usb_instance* data, int non_setup, bool (*callback)(const struct usb_instance* data, int bytesleft))
21
//
21
{
22
 
22
    data->state->ep0_rx_callback = callback;
23
 
23
    data->driver->ep0_start_rx(data, non_setup);
24
#include "global.h"
24
}
25
#include "panic.h"
25
 
26
#include "usb.h"
26
bool usb_ep0_rx_callback(const struct usb_instance* data, int bytesleft)
27
#include "usb_ch9.h"
27
{
28
#include "usbdrv.h"
28
    usb_ep0_start_rx(data, 0, NULL);
29
#include "thread.h"
29
    return true;
30
#include "console.h"
30
}
31
#include "util.h"
31
 
32
#include "contextswitch.h"
32
void usb_ep0_start_tx(const struct usb_instance* data, const void* buf, int len, bool last, bool (*callback)(const struct usb_instance* data, int bytesleft))
33
#include "power.h"
33
{
34
#include "mmu.h"
34
    // Expect zero-length ACK if we are about to actually send data, otherwise expect SETUP.
35
#include "shutdown.h"
35
    if (last) usb_ep0_start_rx(data, !!len, usb_ep0_rx_callback);
36
#include "execimage.h"
36
 
37
#include "dbgconsole.h"
37
    if (((uint32_t)buf) & (CACHEALIGN_SIZE - 1))
38
#ifdef HAVE_I2C
38
    {
39
#include "i2c.h"
39
        memcpy(data->buffer->raw, buf, len);
40
#endif
40
        buf = data->buffer->raw;
41
#ifdef HAVE_BOOTFLASH
41
    }
42
#include "bootflash.h"
42
 
43
#endif
43
    data->state->ep0_tx_callback = callback;
44
#ifdef HAVE_HWKEYAES
44
    data->driver->ep0_start_tx(data, buf, len);
45
#include "hwkeyaes.h"
45
}
46
#endif
46
 
47
#ifdef HAVE_HMACSHA1
47
bool usb_ep0_tx_callback(const struct usb_instance* data, int bytesleft)
48
#include "hmacsha1.h"
48
{
49
#endif
49
    if (bytesleft || !data->state->ep0_tx_len) return false;
50
#ifdef USB_HAVE_TARGET_SPECIFIC_REQUESTS
50
    int len = MIN(64, data->state->ep0_tx_len);
51
#include "usbtarget.h"
51
    data->state->ep0_tx_ptr += 64;
52
#endif
52
    data->state->ep0_tx_len -= len;
53
#ifdef HAVE_STORAGE
53
    usb_ep0_start_tx(data, data->state->ep0_tx_ptr, len, !data->state->ep0_tx_len, usb_ep0_tx_callback);
54
#include "storage.h"
54
    return true;
55
#include "disk.h"
55
}
56
#include "file.h"
56
 
57
#include "dir.h"
57
void usb_unconfigure_ep(const struct usb_instance* data, union usb_endpoint_number ep)
58
#include "libc/include/errno.h"
58
{
59
#endif
59
    data->driver->unconfigure_ep(data, ep);
60
 
60
}
61
 
61
 
62
static uint8_t ctrlresp[2] CACHEALIGN_ATTR;
62
void usb_configure_ep(const struct usb_instance* data, union usb_endpoint_number ep, enum usb_endpoint_type type, int maxpacket)
63
static uint32_t dbgrecvbuf[0x80] CACHEALIGN_ATTR;
63
{
64
static uint32_t dbgsendbuf[0x80] CACHEALIGN_ATTR;
64
    // Reset the endpoint, just in case someone left it in a dirty state.
65
static uint32_t dbgasyncsendbuf[0x80] CACHEALIGN_ATTR;
65
    usb_unconfigure_ep(data, ep);
66
static char dbgendpoints[4] IBSS_ATTR;
66
 
67
 
67
    // Write the new configuration for the endpoint.
68
enum dbgaction_t
68
    // This resets the data toggle to DATA0, as required by the USB specification.
69
{
69
    data->driver->configure_ep(data, ep, type, maxpacket);
70
    DBGACTION_IDLE = 0,
70
}
71
    DBGACTION_I2CSEND,
71
 
72
    DBGACTION_I2CRECV,
72
int usb_get_max_transfer_size(const struct usb_instance* data, union usb_endpoint_number ep)
73
    DBGACTION_RESET,
73
{
74
    DBGACTION_POWEROFF,
74
    return data->driver->get_max_transfer_size(data, ep);
75
    DBGACTION_CWRITE,
75
}
76
    DBGACTION_CREAD,
76
 
77
    DBGACTION_CFLUSH,
77
static void usb_unconfigure(const struct usb_instance* data)
78
    DBGACTION_EXECIMAGE,
78
{
79
    DBGACTION_EXECFIRMWARE,
79
    // Notify a configuration and its active interface altsettings that it was just kicked out.
80
    DBGACTION_READBOOTFLASH,
80
    int configid = data->state->current_configuration;
81
    DBGACTION_WRITEBOOTFLASH,
81
    if (!configid) return;
82
    DBGACTION_HWKEYAES,
82
    const struct usb_configuration* configuration = data->configurations[configid - 1];
83
    DBGACTION_HMACSHA1,
83
    int i;
84
    DBGACTION_TARGETSPECIFIC,
84
    for (i = 0; i < configuration->interface_count; i++)
85
    DBGACTION_STORAGE,
85
    {
86
    DBGACTION_MALLOC,
86
        const struct usb_interface* interface = configuration->interfaces[i];
87
    DBGACTION_MEMALIGN,
87
        const struct usb_altsetting* altsetting = interface->altsettings[data->state->interface_altsetting[i]];
88
    DBGACTION_REALLOC,
88
        if (altsetting->unset_altsetting)
89
    DBGACTION_REOWNALLOC,
89
            altsetting->unset_altsetting(data, i, data->state->interface_altsetting[i]);
90
    DBGACTION_FREE,
90
    }
91
    DBGACTION_FREEMONITOR,
91
    if (configuration->unset_configuration)
92
    DBGACTION_RTCREAD,
92
        configuration->unset_configuration(data, configid);
93
    DBGACTION_RTCWRITE,
93
    data->state->current_configuration = 0;
94
};
94
}
95
 
95
 
96
static struct scheduler_thread dbgthread_handle IBSS_ATTR;
96
static const struct usb_endpoint* usb_find_endpoint(const struct usb_instance* data,
97
static uint32_t dbgstack[0x200] STACK_ATTR;
97
                                                    union usb_endpoint_number ep, int* ifidx, int* epidx)
98
struct wakeup dbgwakeup IBSS_ATTR;
98
{
99
static enum dbgaction_t dbgaction IBSS_ATTR;
99
    // Figure out who's currently owning a (hardware) endpoint.
100
static int dbgi2cbus;
100
    // Returns a pointer to the usb_endpoint struct, and sets *epidx to its index within its altsetting.
101
static int dbgi2cslave;
101
    // *ifidx will be set to the interface number within the current configuration that the altsetting belongs to.
102
static int dbgactionaddr;
102
    // If nobody currently owns the specified endpoint, return NULL (*epidx and *ifidx will contain garbage).
103
static int dbgactionoffset;
103
    int configid = data->state->current_configuration;
104
static int dbgactionlength;
104
    if (!configid) return NULL;
105
static int dbgactionconsoles;
105
    const struct usb_configuration* configuration = data->configurations[configid - 1];
106
static int dbgactiontype;
106
    for (*ifidx = 0; *ifidx < configuration->interface_count; (*ifidx)++)
107
static char dbgconsendbuf[4096];
107
    {
108
static char dbgconrecvbuf[1024];
108
        const struct usb_interface* interface = configuration->interfaces[*ifidx];
109
static int dbgconsendreadidx IBSS_ATTR;
109
        const struct usb_altsetting* altsetting = interface->altsettings[data->state->interface_altsetting[*ifidx]];
110
static int dbgconsendwriteidx IBSS_ATTR;
110
        for (*epidx = 0; *epidx < altsetting->endpoint_count; (*epidx)++)
111
static int dbgconrecvreadidx IBSS_ATTR;
111
        {
112
static int dbgconrecvwriteidx IBSS_ATTR;
112
            const struct usb_endpoint* endpoint = altsetting->endpoints[*epidx];
113
static struct wakeup dbgconsendwakeup IBSS_ATTR;
113
            if (endpoint->number.byte == ep.byte) return endpoint;
114
static struct wakeup dbgconrecvwakeup IBSS_ATTR;
114
        }
115
static bool dbgconsoleattached IBSS_ATTR;
115
    }
116
 
116
    return NULL;
117
static const char dbgconoverflowstr[] = "\n\n[overflowed]\n\n";
117
}
118
 
118
 
119
extern int _poolstart;   // These aren't ints at all, but gcc complains about void types being
119
static void usb_handle_ep0_setup(const struct usb_instance* data, union usb_ep0_buffer* buffer)
120
extern int _poolend;     // used here, and we only need the address, so just make it happy...
120
{
121
 
121
    // size < -2: do nothing at all (dangerous, you need to take care of priming EP0 yourself!)
122
 
122
    // size == -2: send STALL
123
static struct usb_device_descriptor device_descriptor CACHEALIGN_ATTR =
123
    // size == -1: try to run default handler, or send STALL if none exists
124
{
124
    // size == 0: send ACK
125
    .bLength            = sizeof(struct usb_device_descriptor),
125
    // size > 0: send <size> bytes at <addr>, then expect ACK
126
    .bDescriptorType    = USB_DT_DEVICE,
126
    const void* addr = data->buffer;
127
    .bcdUSB             = 0x0200,
127
    int size = -1;
128
    .bDeviceClass       = USB_CLASS_VENDOR_SPEC,
128
    switch (buffer->setup.bmRequestType.recipient)
129
    .bDeviceSubClass    = 0xff,
129
    {
130
    .bDeviceProtocol    = 0xff,
130
    case USB_SETUP_BMREQUESTTYPE_RECIPIENT_DEVICE:
131
    .bMaxPacketSize0    = 64,
131
        if (data->ctrl_request) size = data->ctrl_request(data, buffer, &addr);
132
    .idVendor           = 0xffff,
132
        if (size != -1) break;
133
    .idProduct          = 0xe000,
133
        switch (buffer->setup.bmRequestType.type)
134
    .bcdDevice          = 0x0001,
134
        {
135
    .iManufacturer      = 1,
135
        case USB_SETUP_BMREQUESTTYPE_TYPE_STANDARD:
136
    .iProduct           = 2,
136
            switch (buffer->setup.bRequest.req)
137
    .iSerialNumber      = 0,
137
            {
138
    .bNumConfigurations = 1
138
            case USB_SETUP_BREQUEST_GET_STATUS:
139
};
139
                if (buffer->setup.wLength != 2 || buffer->setup.wIndex
140
 
140
                 || !data->state->current_address || buffer->setup.wValue) break;
141
static struct usb_config_bundle
141
                data->buffer->raw[0] = 0;
142
{
142
                data->buffer->raw[1] = 1;
143
    struct usb_config_descriptor config_descriptor;
143
                size = 2;
144
    struct usb_interface_descriptor interface_descriptor;
144
                break;
145
    struct usb_endpoint_descriptor endpoint1_descriptor;
145
            case USB_SETUP_BREQUEST_SET_ADDRESS:
146
    struct usb_endpoint_descriptor endpoint2_descriptor;
146
                if (buffer->setup.wLength || buffer->setup.wIndex || buffer->setup.wValue > 127) break;
147
    struct usb_endpoint_descriptor endpoint3_descriptor;
147
                data->state->current_address = buffer->setup.wValue;
148
    struct usb_endpoint_descriptor endpoint4_descriptor;
148
                // We can already set the address here, the driver has to take care to send the ACK with the old address.
149
} __attribute__((packed)) config_bundle CACHEALIGN_ATTR =
149
                data->driver->set_address(data, data->state->current_address);
150
{
150
                size = 0;
151
    .config_descriptor =
151
                break;
152
    {
152
            case USB_SETUP_BREQUEST_GET_DESCRIPTOR:
153
        .bLength             = sizeof(struct usb_config_descriptor),
153
                if (!buffer->setup.wLength) break;
154
        .bDescriptorType     = USB_DT_CONFIG,
154
                switch (buffer->setup.wValue >> 8)
155
        .wTotalLength        = sizeof(struct usb_config_descriptor)
155
                {
156
                             + sizeof(struct usb_interface_descriptor)
156
                case USB_DESCRIPTOR_TYPE_DEVICE:
157
                             + sizeof(struct usb_endpoint_descriptor) * 4,
157
                    if ((buffer->setup.wValue & 0xff) || buffer->setup.wIndex) break;
158
        .bNumInterfaces      = 1,
158
                    addr = data->devicedescriptor;
159
        .bConfigurationValue = 1,
159
                    size = data->devicedescriptor->bLength;
160
        .iConfiguration      = 0,
160
                    break;
161
        .bmAttributes        = USB_CONFIG_ATT_ONE,
161
                case USB_DESCRIPTOR_TYPE_CONFIGURATION:
162
        .bMaxPower           = 250
162
                    if (buffer->setup.wIndex
163
    },
163
                     || (buffer->setup.wValue & 0xff) >= data->configuration_count) break;
164
    .interface_descriptor =
164
                    addr = data->configurations[buffer->setup.wValue & 0xff]->descriptor;
165
    {
165
                    size = data->configurations[buffer->setup.wValue & 0xff]->descriptor->wTotalLength;
166
        .bLength             = sizeof(struct usb_interface_descriptor),
166
                    break;
167
        .bDescriptorType     = USB_DT_INTERFACE,
167
                case USB_DESCRIPTOR_TYPE_STRING:
168
        .bInterfaceNumber    = 0,
168
                    if ((buffer->setup.wValue & 0xff) > data->stringdescriptor_count) break;
169
        .bAlternateSetting   = 0,
169
                    addr = data->stringdescriptors[buffer->setup.wValue & 0xff];
170
        .bNumEndpoints       = 4,
170
                    size = data->stringdescriptors[buffer->setup.wValue & 0xff]->bLength;
171
        .bInterfaceClass     = USB_CLASS_VENDOR_SPEC,
171
                    break;
172
        .bInterfaceSubClass  = 0xff,
172
                }
173
        .bInterfaceProtocol  = 0xff,
173
                if (size > buffer->setup.wLength) size = buffer->setup.wLength;
174
        .iInterface          = 0
174
                break;
175
    },
175
            case USB_SETUP_BREQUEST_GET_CONFIGURATION:
176
    .endpoint1_descriptor =
176
                if (buffer->setup.wLength != 1 || buffer->setup.wIndex
177
    {
177
                 || !data->state->current_address || buffer->setup.wValue) break;
178
        .bLength             = sizeof(struct usb_endpoint_descriptor),
178
                data->buffer->raw[0] = data->state->current_configuration;
179
        .bDescriptorType     = USB_DT_ENDPOINT,
179
                size = 1;
180
        .bEndpointAddress    = 0,
180
                break;
181
        .bmAttributes        = USB_ENDPOINT_XFER_BULK,
181
            case USB_SETUP_BREQUEST_SET_CONFIGURATION:
182
        .wMaxPacketSize      = 0,
182
                if (buffer->setup.wLength || buffer->setup.wIndex || !data->state->current_address
183
        .bInterval           = 1
183
                 || buffer->setup.wValue > data->configuration_count) break;
184
    },
184
                usb_unconfigure(data);
185
    .endpoint2_descriptor =
185
                data->state->current_configuration = buffer->setup.wValue;
186
    {
186
                if (data->state->current_configuration)
187
        .bLength             = sizeof(struct usb_endpoint_descriptor),
187
                {
188
        .bDescriptorType     = USB_DT_ENDPOINT,
188
                    // Notify the configuration and its interface default altsettings that it should set up stuff
189
        .bEndpointAddress    = 0,
189
                    int configid = data->state->current_configuration;
190
        .bmAttributes        = USB_ENDPOINT_XFER_BULK,
190
                    const struct usb_configuration* configuration = data->configurations[configid - 1];
191
        .wMaxPacketSize      = 0,
191
                    if (configuration->set_configuration)
192
        .bInterval           = 1
192
                        configuration->set_configuration(data, configid);
193
    },
193
                    int i;
194
    .endpoint3_descriptor =
194
                    for (i = 0; i < configuration->interface_count; i++)
195
    {
195
                    {
196
        .bLength             = sizeof(struct usb_endpoint_descriptor),
196
                        const struct usb_interface* interface = configuration->interfaces[i];
197
        .bDescriptorType     = USB_DT_ENDPOINT,
197
                        data->state->interface_altsetting[i] = 0;
198
        .bEndpointAddress    = 0,
198
                        const struct usb_altsetting* altsetting = interface->altsettings[0];
199
        .bmAttributes        = USB_ENDPOINT_XFER_BULK,
199
                        if (altsetting->set_altsetting) altsetting->set_altsetting(data, i, 0);
200
        .wMaxPacketSize      = 0,
200
                    }
201
        .bInterval           = 1
201
                }
202
    },
202
                size = 0;
203
    .endpoint4_descriptor =
203
                break;
204
    {
204
            default: break;
205
        .bLength             = sizeof(struct usb_endpoint_descriptor),
205
            }
206
        .bDescriptorType     = USB_DT_ENDPOINT,
206
            break;
207
        .bEndpointAddress    = 0,
207
        }
208
        .bmAttributes        = USB_ENDPOINT_XFER_BULK,
208
        break;
209
        .wMaxPacketSize      = 0,
209
    case USB_SETUP_BMREQUESTTYPE_RECIPIENT_INTERFACE:
210
        .bInterval           = 1
210
    {
211
    }
211
        if (!data->state->current_configuration) break;
212
};
212
        int configid = data->state->current_configuration;
213
 
213
        const struct usb_configuration* configuration = data->configurations[configid - 1];
214
static struct usb_string_descriptor string_vendor CACHEALIGN_ATTR =
214
        int intfid = buffer->setup.wIndex;
215
{
215
        if (intfid >= configuration->interface_count) break;
216
    30,
216
        const struct usb_interface* interface = configuration->interfaces[intfid];
217
    USB_DT_STRING,
217
        if (interface->ctrl_request) size = interface->ctrl_request(data, intfid, buffer, &addr);
218
    {'f', 'r', 'e', 'e', 'm', 'y', 'i', 'p', 'o', 'd', '.', 'o', 'r', 'g'}
218
        if (size != -1) break;
219
};
219
        switch (buffer->setup.bmRequestType.type)
220
 
220
        {
221
static struct usb_string_descriptor string_product CACHEALIGN_ATTR =
221
        case USB_SETUP_BMREQUESTTYPE_TYPE_STANDARD:
222
{
222
            switch (buffer->setup.bRequest.req)
223
    32,
223
            {
224
    USB_DT_STRING,
224
            case USB_SETUP_BREQUEST_GET_STATUS:
225
    {'e', 'm', 'C', 'O', 'R', 'E', ' ', 'D', 'e', 'b', 'u', 'g', 'g', 'e', 'r'}
225
                if (buffer->setup.wLength != 2 || buffer->setup.wValue) break;
226
};
226
                data->buffer->raw[0] = 0;
227
 
227
                data->buffer->raw[1] = 0;
228
static const struct usb_string_descriptor lang_descriptor CACHEALIGN_ATTR =
228
                size = 2;
229
{
229
                break;
230
    4,
230
            case USB_SETUP_BREQUEST_GET_INTERFACE:
231
    USB_DT_STRING,
231
                if (buffer->setup.wLength != 1 || buffer->setup.wValue) break;
232
    {0x0409}
232
                data->buffer->raw[0] = data->state->interface_altsetting[intfid];
233
};
233
                size = 1;
234
 
234
                break;
235
 
235
            case USB_SETUP_BREQUEST_SET_INTERFACE:
236
void usb_setup_dbg_listener()
236
            {
237
{
237
                if (buffer->setup.wLength
238
    usb_drv_recv(dbgendpoints[0], dbgrecvbuf, 512);
238
                 || buffer->setup.wValue > interface->altsetting_count) break;
239
}
239
                const struct usb_altsetting* altsetting = interface->altsettings[data->state->interface_altsetting[intfid]];
240
 
240
                if (altsetting->unset_altsetting)
241
void usb_handle_control_request(struct usb_ctrlrequest* req)
241
                    altsetting->unset_altsetting(data, intfid, data->state->interface_altsetting[intfid]);
242
{
242
                data->state->interface_altsetting[intfid] = buffer->setup.wValue;
243
    const void* addr;
243
                altsetting = interface->altsettings[data->state->interface_altsetting[intfid]];
244
    int size = -1;
244
                if (altsetting->set_altsetting)
245
    switch (req->bRequest)
245
                    altsetting->set_altsetting(data, intfid, data->state->interface_altsetting[intfid]);
246
    {
246
                break;
247
    case USB_REQ_GET_STATUS:
247
            }
248
        if (req->bRequestType == USB_DIR_IN) ctrlresp[0] = 1;
248
            default: break;
249
        else ctrlresp[0] = 0;
249
            }
250
        ctrlresp[1] = 0;
250
            break;
251
        addr = ctrlresp;
251
            default: break;
252
        size = 2;
252
        }
253
        break;
253
        break;
254
    case USB_REQ_CLEAR_FEATURE:
254
        case USB_SETUP_BMREQUESTTYPE_RECIPIENT_ENDPOINT:
255
        if (req->bRequestType == USB_RECIP_ENDPOINT && req->wValue == USB_ENDPOINT_HALT)
255
        {
256
            usb_drv_stall(req->wIndex & 0xf, false, req->wIndex >> 7);
256
            if (!data->state->current_configuration) break;
257
        size = 0;
257
            union usb_endpoint_number ep = { .byte = buffer->setup.wIndex };
258
        break;
258
            int intfid;
259
    case USB_REQ_SET_FEATURE:
259
            int epid;
260
        size = 0;
260
            const struct usb_endpoint* endpoint = usb_find_endpoint(data, ep, &intfid, &epid);
261
        break;
261
            if (!endpoint) break;
262
    case USB_REQ_SET_ADDRESS:
262
            if (endpoint->ctrl_request) size = endpoint->ctrl_request(data, intfid, epid, buffer, &addr);
263
        size = 0;
263
            if (size != -1) break;
264
        usb_drv_cancel_all_transfers();
264
            switch (buffer->setup.bmRequestType.type)
265
        usb_drv_set_address(req->wValue);
265
            {
266
        usb_setup_dbg_listener();
266
            case USB_SETUP_BMREQUESTTYPE_TYPE_STANDARD:
267
        break;
267
                switch (buffer->setup.bRequest.req)
268
    case USB_REQ_GET_DESCRIPTOR:
268
                {
269
        switch (req->wValue >> 8)
269
                case USB_SETUP_BREQUEST_GET_STATUS:
270
        {
270
                    if (buffer->setup.wLength != 2 || buffer->setup.wValue) break;
271
        case USB_DT_DEVICE:
271
                    data->buffer->raw[0] = 0;
272
            addr = &device_descriptor;
272
                    data->buffer->raw[1] = data->driver->get_stall(data, ep);
273
            size = sizeof(device_descriptor);
273
                    addr = data->buffer;
274
            break;
274
                    size = 2;
275
        case USB_DT_OTHER_SPEED_CONFIG:
275
                    break;
276
 
276
                case USB_SETUP_BREQUEST_CLEAR_FEATURE:
277
        case USB_DT_CONFIG:
277
                    if (buffer->setup.wLength || buffer->setup.wValue) break;
278
            if ((req->wValue >> 8) == USB_DT_CONFIG)
278
                    data->driver->set_stall(data, ep, false);
279
            {
279
                    size = 0;
280
                int maxpacket = usb_drv_port_speed() ? 512 : 64;
280
                    break;
281
                config_bundle.endpoint1_descriptor.wMaxPacketSize = maxpacket;
281
                case USB_SETUP_BREQUEST_SET_FEATURE:
282
                config_bundle.endpoint2_descriptor.wMaxPacketSize = maxpacket;
282
                    if (buffer->setup.wLength || buffer->setup.wValue) break;
283
                config_bundle.endpoint3_descriptor.wMaxPacketSize = maxpacket;
283
                    data->driver->set_stall(data, ep, true);
284
                config_bundle.endpoint4_descriptor.wMaxPacketSize = maxpacket;
284
                    size = 0;
285
                config_bundle.config_descriptor.bDescriptorType = USB_DT_CONFIG;
285
                    break;
286
            }
286
                default: break;
287
            else
287
                }
288
            {
288
                break;
289
                int maxpacket = usb_drv_port_speed() ? 64 : 512;
289
                default: break;
290
                config_bundle.endpoint1_descriptor.wMaxPacketSize = maxpacket;
290
            }
291
                config_bundle.endpoint2_descriptor.wMaxPacketSize = maxpacket;
291
            break;
292
                config_bundle.endpoint3_descriptor.wMaxPacketSize = maxpacket;
292
        }
293
                config_bundle.endpoint4_descriptor.wMaxPacketSize = maxpacket;
293
        default: break;
294
                config_bundle.config_descriptor.bDescriptorType = USB_DT_OTHER_SPEED_CONFIG;
294
    }
295
            }
295
    }
296
            addr = &config_bundle;
296
    // See comment at the top of this function
297
            size = sizeof(config_bundle);
297
    if (size == 0) usb_ep0_start_tx(data, NULL, 0, true, NULL);
298
            break;
298
    else if (size > 0)
299
        case USB_DT_STRING:
299
    {
300
            switch (req->wValue & 0xff)
300
        usb_ep0_start_rx(data, 0, NULL);
301
            {
301
        int len = MIN(64, size);
302
            case 0:
302
        data->state->ep0_tx_ptr = addr;
303
                addr = &lang_descriptor;
303
        data->state->ep0_tx_len = size - len;
304
                size = lang_descriptor.bLength;
304
        usb_ep0_start_tx(data, addr, len, !data->state->ep0_tx_len, usb_ep0_tx_callback);
305
                break;
305
    }
306
            case 1:
306
    else if (size >= -2)
307
                addr = &string_vendor;
307
    {
308
                size = string_vendor.bLength;
308
        union usb_endpoint_number ep = { .number = 0, .direction = USB_ENDPOINT_DIRECTION_IN };
309
                break;
309
        usb_set_stall(data, ep, 1);
310
            case 2:
310
        ep.direction = USB_ENDPOINT_DIRECTION_OUT;
311
                addr = &string_product;
311
        usb_set_stall(data, ep, 1);
312
                size = string_product.bLength;
312
    }
313
                break;
313
}
314
            }
314
 
315
            break;
315
void usb_handle_bus_reset(const struct usb_instance* data, int highspeed)
316
        }
316
{
317
        break;
317
    data->state->current_address = 0;
318
    case USB_REQ_GET_CONFIGURATION:
318
    usb_unconfigure(data);
319
        ctrlresp[0] = 1;
319
    if (data->bus_reset) data->bus_reset(data, highspeed);
320
        addr = ctrlresp;
320
    int c, i;
321
        size = 1;
321
    for (c = 0; c < data->configuration_count; c++)
322
        break;
322
    {
323
    case USB_REQ_SET_CONFIGURATION:
323
        const struct usb_configuration* configuration = data->configurations[c];
324
        usb_drv_cancel_all_transfers();
324
        for (i = 0; i < configuration->interface_count; i++)
325
        usb_setup_dbg_listener();
325
        {
326
        size = 0;
326
            const struct usb_interface* interface = configuration->interfaces[i];
327
        break;
327
            if (interface->bus_reset) interface->bus_reset(data, c, i, highspeed);
328
    }
328
        }
329
    if (!size) usb_drv_send_nonblocking(0, NULL, 0);
329
    }
330
    else if (size == -1)
330
 
331
    {
331
    // Prime EP0 for the first setup packet.
332
        usb_drv_stall(0, true, true);
332
    usb_ep0_start_rx(data, 0, NULL);
333
        usb_drv_stall(0, true, false);
333
}
334
    }
334
 
335
    else
335
void usb_handle_timeout(const struct usb_instance* data, union usb_endpoint_number epnum, int bytesleft)
336
    {
336
{
337
        usb_drv_recv(0, NULL, 0);
337
    // If the host doesn't fetch an EP0 IN packet, we can't do much about it.
338
        usb_drv_send_nonblocking(0, addr, size > req->wLength ? req->wLength : size);
338
    // This will be recovered by the next SETUP packet.
339
    }
339
    if (epnum.number)
340
}
340
    {
341
 
341
        int epidx;
342
bool set_dbgaction(enum dbgaction_t action, int addsize)
342
        int ifidx;
343
{
343
        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &epidx, &ifidx);
344
    if (dbgaction != DBGACTION_IDLE)
344
        if (!endpoint) data->driver->unconfigure_ep(data, epnum);
345
    {
345
        else if (endpoint->timeout) endpoint->timeout(data, ifidx, epidx, bytesleft);
346
        dbgsendbuf[0] = 3;
346
    }
347
        usb_drv_send_nonblocking(dbgendpoints[1], dbgsendbuf, 16 + addsize);
347
}
348
        return true;
348
 
349
    }
349
void usb_handle_xfer_complete(const struct usb_instance* data, union usb_endpoint_number epnum, int bytesleft)
350
    dbgaction = action;
350
{
351
    wakeup_signal(&dbgwakeup);
351
    if (!epnum.number)
352
    return false;
352
    {
353
}
353
        bool (*callback)(const struct usb_instance* data, int size);
354
 
354
        if (epnum.direction == USB_ENDPOINT_DIRECTION_OUT)
355
void reset() __attribute__((noreturn));
355
        {
356
 
356
            callback = data->state->ep0_rx_callback;
357
void usb_handle_transfer_complete(int endpoint, int dir, int status, int length)
357
            data->state->ep0_rx_callback = NULL;
358
{
358
        }
359
    void* addr = dbgsendbuf;
359
        else
360
    int size = 0;
360
        {
361
    if (endpoint == dbgendpoints[0])
361
            callback = data->state->ep0_tx_callback;
362
    {
362
            data->state->ep0_tx_callback = NULL;
363
#ifdef USB_HAVE_TARGET_SPECIFIC_REQUESTS
363
        }
364
        if (dbgrecvbuf[0] >= 0xffff0000)
364
        if (callback) callback(data, bytesleft);
365
        {
365
    }
366
            if (!set_dbgaction(DBGACTION_TARGETSPECIFIC, 0))
366
    else
367
                memcpy(dbgasyncsendbuf, dbgrecvbuf, sizeof(dbgasyncsendbuf));
367
    {
368
            usb_setup_dbg_listener();
368
        int epidx;
369
            return;
369
        int ifidx;
370
        }
370
        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &epidx, &ifidx);
371
#endif
371
        if (!endpoint) usb_unconfigure_ep(data, epnum);
372
        switch (dbgrecvbuf[0])
372
        else if (endpoint->xfer_complete) endpoint->xfer_complete(data, ifidx, epidx, bytesleft);
373
        {
373
    }
374
        case 1:  // GET INFO
374
}
375
            dbgsendbuf[0] = 1;
375
 
376
            size = 16;
376
void usb_handle_setup_received(const struct usb_instance* data, union usb_endpoint_number epnum)
377
            switch (dbgrecvbuf[1])
377
{
378
            {
378
    if (!epnum.number)
379
            case 0:  // GET VERSION INFO
379
    {
380
                dbgsendbuf[1] = VERSION_SVN_INT;
380
        if (!data->ep0_setup_hook || !data->ep0_setup_hook(data, data->buffer)) usb_handle_ep0_setup(data, data->buffer);
381
                dbgsendbuf[2] = VERSION_MAJOR | (VERSION_MINOR << 8)
381
    }
382
                              | (VERSION_PATCH << 16) | (2 << 24);
382
    else
383
                dbgsendbuf[3] = PLATFORM_ID;
383
    {
384
                break;
384
        int epidx;
385
            case 1:  // GET PACKET SIZE INFO
385
        int ifidx;
386
                dbgsendbuf[1] = 0x02000200;
386
        const struct usb_endpoint* endpoint = usb_find_endpoint(data, epnum, &epidx, &ifidx);
387
                dbgsendbuf[2] = usb_drv_get_max_out_size();
387
        if (!endpoint) usb_unconfigure_ep(data, epnum);
388
                dbgsendbuf[3] = usb_drv_get_max_in_size();
388
        else if (endpoint->setup_received) endpoint->setup_received(data, ifidx, epidx);
389
                break;
389
    }
390
            case 2:  // GET USER MEMORY INFO
390
}
391
                dbgsendbuf[1] = (uint32_t)&_poolstart;
391
 
392
                dbgsendbuf[2] = (uint32_t)&_poolend;
392
void usb_init(const struct usb_instance* data)
393
                break;
393
{
394
            default:
394
    // Initialize data struct
395
                dbgsendbuf[0] = 2;
395
    data->state->current_address = 0;
396
            }
396
    data->state->current_configuration = 0;
397
            break;
397
 
398
        case 2:  // RESET
398
    // Initialize driver
399
            if (dbgrecvbuf[1])
399
    data->driver->init(data);
400
            {
400
}
401
                if (set_dbgaction(DBGACTION_RESET, 0)) break;
401
 
402
                dbgsendbuf[0] = 1;
402
void usb_exit(const struct usb_instance* data)
403
                size = 16;
403
{
404
            }
404
    // Shut down driver
405
            else reset();
405
    data->driver->exit(data);
406
            break;
406
 
407
        case 3:  // POWER OFF
407
    // Unconfigure everything
408
            if (set_dbgaction(DBGACTION_POWEROFF, 0)) break;
408
    usb_unconfigure(data);
409
            dbgactiontype = dbgrecvbuf[1];
409
}
410
            dbgsendbuf[0] = 1;
410
 
411
            size = 16;
-
 
412
            break;
-
 
413
        case 4:  // READ MEMORY
-
 
414
            dbgsendbuf[0] = 1;
-
 
415
            memcpy(&dbgsendbuf[4], (const void*)dbgrecvbuf[1], dbgrecvbuf[2]);
-
 
416
            size = dbgrecvbuf[2] + 16;
-
 
417
            break;
-
 
418
        case 5:  // WRITE MEMORY
-
 
419
            dbgsendbuf[0] = 1;
-
 
420
            memcpy((void*)dbgrecvbuf[1], &dbgrecvbuf[4], dbgrecvbuf[2]);
-
 
421
            size = 16;
-
 
422
            break;
-
 
423
        case 6:  // READ DMA
-
 
424
            dbgsendbuf[0] = 1;
-
 
425
            usb_drv_send_nonblocking(dbgendpoints[1], dbgsendbuf, 16);
-
 
426
            usb_drv_send_nonblocking(dbgendpoints[3], (const void*)dbgrecvbuf[1], dbgrecvbuf[2]);
-
 
427
            break;
-
 
428
        case 7:  // WRITE DMA
-
 
429
            dbgsendbuf[0] = 1;
-
 
430
            size = 16;
-
 
431
            usb_drv_recv(dbgendpoints[2], (void*)dbgrecvbuf[1], dbgrecvbuf[2]);
-
 
432
            break;
-
 
433
#ifdef HAVE_I2C
-
 
434
        case 8:  // READ I2C
-
 
435
            if (set_dbgaction(DBGACTION_I2CRECV, dbgrecvbuf[1] >> 24)) break;
-
 
436
            dbgi2cbus = dbgrecvbuf[1] & 0xff;
-
 
437
            dbgi2cslave = (dbgrecvbuf[1] >> 8) & 0xff;
-
 
438
            dbgactionaddr = (dbgrecvbuf[1] >> 16) & 0xff;
-
 
439
            dbgactionlength = dbgrecvbuf[1] >> 24;
-
 
440
            if (!dbgactionlength) dbgactionlength = 256;
-
 
441
            break;
-
 
442
        case 9:  // WRITE I2C
-
 
443
            if (set_dbgaction(DBGACTION_I2CSEND, 0)) break;
-
 
444
            dbgi2cbus = dbgrecvbuf[1] & 0xff;
-
 
445
            dbgi2cslave = (dbgrecvbuf[1] >> 8) & 0xff;
-
 
446
            dbgactionaddr = (dbgrecvbuf[1] >> 16) & 0xff;
-
 
447
            dbgactionlength = dbgrecvbuf[1] >> 24;
-
 
448
            if (!dbgactionlength) dbgactionlength = 256;
-
 
449
            memcpy(dbgasyncsendbuf, &dbgrecvbuf[4], dbgactionlength);
-
 
450
            break;
-
 
451
#endif
-
 
452
        case 10:  // READ CONSOLE
-
 
453
            dbgconsoleattached = true;
-
 
454
            int bytes = dbgconsendwriteidx - dbgconsendreadidx;
-
 
455
            int used = 0;
-
 
456
            if (bytes)
-
 
457
            {
-
 
458
                if (bytes < 0) bytes += sizeof(dbgconsendbuf);
-
 
459
                used = bytes;
-
 
460
                if (bytes > dbgrecvbuf[1]) bytes = dbgrecvbuf[1];
-
 
461
                int readbytes = bytes;
-
 
462
                char* outptr = (char*)&dbgsendbuf[4];
-
 
463
                if (dbgconsendreadidx + bytes >= sizeof(dbgconsendbuf))
-
 
464
                {
-
 
465
                    readbytes = sizeof(dbgconsendbuf) - dbgconsendreadidx;
-
 
466
                    memcpy(outptr, &dbgconsendbuf[dbgconsendreadidx], readbytes);
-
 
467
                    dbgconsendreadidx = 0;
-
 
468
                    outptr = &outptr[readbytes];
-
 
469
                    readbytes = bytes - readbytes;
-
 
470
                }
-
 
471
                if (readbytes) memcpy(outptr, &dbgconsendbuf[dbgconsendreadidx], readbytes);
-
 
472
                dbgconsendreadidx += readbytes;
-
 
473
                wakeup_signal(&dbgconsendwakeup);
-
 
474
            }
-
 
475
            dbgsendbuf[0] = 1;
-
 
476
            dbgsendbuf[1] = bytes;
-
 
477
            dbgsendbuf[2] = sizeof(dbgconsendbuf);
-
 
478
            dbgsendbuf[3] = used - bytes;
-
 
479
            size = 16 + dbgrecvbuf[1];
-
 
480
            break;
-
 
481
        case 11:  // WRITE CONSOLE
-
 
482
            bytes = dbgconrecvreadidx - dbgconrecvwriteidx - 1;
-
 
483
            if (bytes < 0) bytes += sizeof(dbgconrecvbuf);
-
 
484
            if (bytes)
-
 
485
            {
-
 
486
                if (bytes > dbgrecvbuf[1]) bytes = dbgrecvbuf[1];
-
 
487
                int writebytes = bytes;
-
 
488
                char* readptr = (char*)&dbgrecvbuf[4];
-
 
489
                if (dbgconrecvwriteidx + bytes >= sizeof(dbgconrecvbuf))
-
 
490
                {
-
 
491
                    writebytes = sizeof(dbgconrecvbuf) - dbgconrecvwriteidx;
-
 
492
                    memcpy(&dbgconrecvbuf[dbgconrecvwriteidx], readptr, writebytes);
-
 
493
                    dbgconrecvwriteidx = 0;
-
 
494
                    readptr = &readptr[writebytes];
-
 
495
                    writebytes = bytes - writebytes;
-
 
496
                }
-
 
497
                if (writebytes) memcpy(&dbgconrecvbuf[dbgconrecvwriteidx], readptr, writebytes);
-
 
498
                dbgconrecvwriteidx += writebytes;
-
 
499
                wakeup_signal(&dbgconrecvwakeup);
-
 
500
            }
-
 
501
            dbgsendbuf[0] = 1;
-
 
502
            dbgsendbuf[1] = bytes;
-
 
503
            dbgsendbuf[2] = sizeof(dbgconrecvbuf);
-
 
504
            dbgsendbuf[3] = dbgconrecvreadidx - dbgconrecvwriteidx - 1;
-
 
505
            size = 16;
-
 
506
            break;
-
 
507
        case 12:  // CWRITE
-
 
508
            if (set_dbgaction(DBGACTION_CWRITE, 0)) break;
-
 
509
            dbgactionconsoles = dbgrecvbuf[1];
-
 
510
            dbgactionlength = dbgrecvbuf[2];
-
 
511
            memcpy(dbgasyncsendbuf, &dbgrecvbuf[4], dbgactionlength);
-
 
512
            break;
-
 
513
        case 13:  // CREAD
-
 
514
            if (set_dbgaction(DBGACTION_CREAD, dbgrecvbuf[2])) break;
-
 
515
            dbgactionconsoles = dbgrecvbuf[1];
-
 
516
            dbgactionlength = dbgrecvbuf[2];
-
 
517
            break;
-
 
518
        case 14:  // CFLUSH
-
 
519
            if (set_dbgaction(DBGACTION_CFLUSH, 0)) break;
-
 
520
            dbgactionconsoles = dbgrecvbuf[1];
-
 
521
            break;
-
 
522
        case 15:  // GET PROCESS INFO
-
 
523
            dbgsendbuf[0] = 1;
-
 
524
            dbgsendbuf[1] = SCHEDULER_THREAD_INFO_VERSION;
-
 
525
            dbgsendbuf[2] = (uint32_t)head_thread;
-
 
526
            size = 16;
-
 
527
            break;
-
 
528
        case 16:  // FREEZE SCHEDULER
-
 
529
            dbgsendbuf[1] = scheduler_freeze(dbgrecvbuf[1]);
-
 
530
            scheduler_switch(NULL, NULL);
-
 
531
            dbgsendbuf[0] = 1;
-
 
532
            size = 16;
-
 
533
            break;
-
 
534
        case 17:  // SUSPEND THREAD
-
 
535
            if (dbgrecvbuf[1])
-
 
536
            {
-
 
537
                if (thread_suspend((struct scheduler_thread*)(dbgrecvbuf[2])) == ALREADY_SUSPENDED)
-
 
538
                    dbgsendbuf[1] = 1;
-
 
539
                else dbgsendbuf[1] = 0;
-
 
540
            }
-
 
541
            else
-
 
542
            {
-
 
543
                if (thread_resume((struct scheduler_thread*)(dbgrecvbuf[2])) == ALREADY_RESUMED)
-
 
544
                    dbgsendbuf[1] = 0;
-
 
545
                else dbgsendbuf[1] = 1;
-
 
546
            }
-
 
547
            dbgsendbuf[0] = 1;
-
 
548
            size = 16;
-
 
549
            break;
-
 
550
        case 18:  // KILL THREAD
-
 
551
            thread_terminate((struct scheduler_thread*)(dbgrecvbuf[1]));
-
 
552
            dbgsendbuf[0] = 1;
-
 
553
            size = 16;
-
 
554
            break;
-
 
555
        case 19:  // CREATE THREAD
-
 
556
            dbgsendbuf[0] = 1;
-
 
557
            dbgsendbuf[1] = (uint32_t)thread_create(NULL, (const char*)(dbgsendbuf[1]),
-
 
558
                                                    (const void*)(dbgsendbuf[2]),
-
 
559
                                                    (char*)(dbgsendbuf[3]),
-
 
560
                                                    dbgsendbuf[4], (enum thread_type)dbgsendbuf[5],
-
 
561
                                                    dbgsendbuf[6], dbgsendbuf[7],
-
 
562
                                                    (void*)dbgsendbuf[8], (void*)dbgsendbuf[9],
-
 
563
                                                    (void*)dbgsendbuf[10], (void*)dbgsendbuf[11]);
-
 
564
            size = 16;
-
 
565
            break;
-
 
566
        case 20:  // FLUSH CACHE
-
 
567
            clean_dcache();
-
 
568
            invalidate_icache();
-
 
569
            dbgsendbuf[0] = 1;
-
 
570
            size = 16;
-
 
571
            break;
-
 
572
        case 21:  // EXECIMAGE
-
 
573
            if (set_dbgaction(DBGACTION_EXECIMAGE, 0)) break;
-
 
574
            dbgactionaddr = dbgrecvbuf[1];
-
 
575
            dbgactiontype = dbgrecvbuf[2];
-
 
576
            dbgactionlength = dbgrecvbuf[3];
-
 
577
            memcpy(dbgasyncsendbuf, &dbgrecvbuf[4], 0x1f0);
-
 
578
            break;
-
 
579
#ifdef HAVE_BOOTFLASH
-
 
580
        case 22:  // READ BOOT FLASH
-
 
581
            if (set_dbgaction(DBGACTION_READBOOTFLASH, 0)) break;
-
 
582
            dbgactionaddr = dbgrecvbuf[1];
-
 
583
            dbgactionoffset = dbgrecvbuf[2];
-
 
584
            dbgactionlength = dbgrecvbuf[3];
-
 
585
            break;
-
 
586
        case 23:  // WRITE BOOT FLASH
-
 
587
            if (set_dbgaction(DBGACTION_WRITEBOOTFLASH, 0)) break;
-
 
588
            dbgactionaddr = dbgrecvbuf[1];
-
 
589
            dbgactionoffset = dbgrecvbuf[2];
-
 
590
            dbgactionlength = dbgrecvbuf[3];
-
 
591
            break;
-
 
592
#endif
-
 
593
        case 24:  // EXECFIRMWARE
-
 
594
            if (set_dbgaction(DBGACTION_EXECFIRMWARE, 0)) break;
-
 
595
            dbgactionaddr = dbgrecvbuf[1];
-
 
596
            dbgactionoffset = dbgrecvbuf[2];
-
 
597
            dbgactionlength = dbgrecvbuf[3];
-
 
598
            break;
-
 
599
#ifdef HAVE_HWKEYAES
-
 
600
        case 25:  // HWKEYAES
-
 
601
            if (set_dbgaction(DBGACTION_HWKEYAES, 0)) break;
-
 
602
            dbgactiontype = ((uint8_t*)dbgrecvbuf)[4];
-
 
603
            dbgactionoffset = ((uint16_t*)dbgrecvbuf)[3];
-
 
604
            dbgactionaddr = dbgrecvbuf[2];
-
 
605
            dbgactionlength = dbgrecvbuf[3];
-
 
606
            break;
-
 
607
#endif
-
 
608
#ifdef HAVE_HMACSHA1
-
 
609
        case 26:  // HMACSHA1
-
 
610
            if (set_dbgaction(DBGACTION_HMACSHA1, 0)) break;
-
 
611
            dbgactionaddr = dbgrecvbuf[1];
-
 
612
            dbgactionlength = dbgrecvbuf[2];
-
 
613
            dbgactionoffset = dbgrecvbuf[3];
-
 
614
            break;
-
 
615
#endif
-
 
616
#ifdef HAVE_STORAGE
-
 
617
        case 27:  // STORAGE_GET_INFO
-
 
618
        case 28:  // STORAGE_READ_SECTORS_MD
-
 
619
        case 29:  // STORAGE_WRITE_SECTORS_MD
-
 
620
        case 30:  // FILE_OPEN
-
 
621
        case 31:  // FILESIZE
-
 
622
        case 32:  // READ
-
 
623
        case 33:  // WRITE
-
 
624
        case 34:  // LSEEK
-
 
625
        case 35:  // FTRUNCATE
-
 
626
        case 36:  // FSYNC
-
 
627
        case 37:  // CLOSE
-
 
628
        case 38:  // CLOSE_MONITOR_FILES
-
 
629
        case 39:  // RELEASE_FILES
-
 
630
        case 40:  // REMOVE
-
 
631
        case 41:  // RENAME
-
 
632
        case 42:  // OPENDIR
-
 
633
        case 43:  // READDIR
-
 
634
        case 44:  // CLOSEDIR
-
 
635
        case 45:  // CLOSE_MONITOR_DIRS
-
 
636
        case 46:  // RELEASE_DIRS
-
 
637
        case 47:  // MKDIR
-
 
638
        case 48:  // RMDIR
-
 
639
        case 49:  // ERRNO
-
 
640
#ifdef HAVE_HOTSWAP
-
 
641
        case 50:  // DISK_MOUNT
-
 
642
        case 51:  // DISK_UNMOUNT
-
 
643
#endif
-
 
644
        case 58:  // FAT_ENABLE_FLUSHING
-
 
645
        case 59:  // FAT_SIZE
-
 
646
            if (!set_dbgaction(DBGACTION_STORAGE, 0))
-
 
647
                memcpy(dbgasyncsendbuf, dbgrecvbuf, sizeof(dbgasyncsendbuf));
-
 
648
            break;
-
 
649
#endif
-
 
650
        case 52:  // MALLOC
-
 
651
            if (set_dbgaction(DBGACTION_MALLOC, 0)) break;
-
 
652
            dbgactionlength = dbgrecvbuf[1];
-
 
653
            break;
-
 
654
        case 53:  // MEMALIGN
-
 
655
            if (set_dbgaction(DBGACTION_MEMALIGN, 0)) break;
-
 
656
            dbgactionoffset = dbgrecvbuf[1];
-
 
657
            dbgactionlength = dbgrecvbuf[2];
-
 
658
            break;
-
 
659
        case 54:  // REALLOC
-
 
660
            if (set_dbgaction(DBGACTION_REALLOC, 0)) break;
-
 
661
            dbgactionaddr = dbgrecvbuf[1];
-
 
662
            dbgactionlength = dbgrecvbuf[2];
-
 
663
            break;
-
 
664
        case 55:  // REOWNALLOC
-
 
665
            if (set_dbgaction(DBGACTION_REOWNALLOC, 0)) break;
-
 
666
            dbgactionaddr = dbgrecvbuf[1];
-
 
667
            dbgactionoffset = dbgrecvbuf[2];
-
 
668
            break;
-
 
669
        case 56:  // FREE
-
 
670
            if (set_dbgaction(DBGACTION_FREE, 0)) break;
-
 
671
            dbgactionaddr = dbgrecvbuf[1];
-
 
672
            break;
-
 
673
        case 57:  // FREE MONITOR ALLOCATIONS
-
 
674
            if (set_dbgaction(DBGACTION_FREEMONITOR, 0)) break;
-
 
675
            break;
-
 
676
#ifdef HAVE_RTC
-
 
677
        case 60:  // RTC READ
-
 
678
            if (set_dbgaction(DBGACTION_RTCREAD, 0)) break;
-
 
679
            break;
-
 
680
        case 61:  // RTC WRITE
-
 
681
            if (set_dbgaction(DBGACTION_RTCWRITE, 0)) break;
-
 
682
            memcpy(dbgasyncsendbuf, &dbgrecvbuf[1], 7);
-
 
683
            break;
-
 
684
#endif
-
 
685
        default:
-
 
686
            dbgsendbuf[0] = 2;
-
 
687
            size = 16;
-
 
688
        }
-
 
689
        usb_setup_dbg_listener();
-
 
690
        if (size) usb_drv_send_nonblocking(dbgendpoints[1], addr, size);
-
 
691
    }
-
 
692
}
-
 
693
 
-
 
694
void usb_handle_bus_reset(void)
-
 
695
{
-
 
696
    dbgendpoints[0] = usb_drv_request_endpoint(USB_ENDPOINT_XFER_BULK, USB_DIR_OUT);
-
 
697
    dbgendpoints[1] = usb_drv_request_endpoint(USB_ENDPOINT_XFER_BULK, USB_DIR_IN);
-
 
698
    dbgendpoints[2] = usb_drv_request_endpoint(USB_ENDPOINT_XFER_BULK, USB_DIR_OUT);
-
 
699
    dbgendpoints[3] = usb_drv_request_endpoint(USB_ENDPOINT_XFER_BULK, USB_DIR_IN);
-
 
700
    config_bundle.endpoint1_descriptor.bEndpointAddress = dbgendpoints[0];
-
 
701
    config_bundle.endpoint2_descriptor.bEndpointAddress = dbgendpoints[1];
-
 
702
    config_bundle.endpoint3_descriptor.bEndpointAddress = dbgendpoints[2];
-
 
703
    config_bundle.endpoint4_descriptor.bEndpointAddress = dbgendpoints[3];
-
 
704
    usb_setup_dbg_listener();
-
 
705
}
-
 
706
 
-
 
707
void dbgthread(void* arg0, void* arg1, void* arg2, void* arg3)
-
 
708
{
-
 
709
    struct scheduler_thread* t;
-
 
710
    while (1)
-
 
711
    {
-
 
712
        wakeup_wait(&dbgwakeup, TIMEOUT_BLOCK);
-
 
713
        for (t = head_thread; t; t = t->thread_next)
-
 
714
            if (t->state == THREAD_DEFUNCT)
-
 
715
            {
-
 
716
                if (t->block_type == THREAD_DEFUNCT_STKOV)
-
 
717
                {
-
 
718
                    if (t->name) cprintf(1, "\n*PANIC*\nStack overflow! (%s)\n", t->name);
-
 
719
                    else cprintf(1, "\n*PANIC*\nStack overflow! (%08X)\n", t);
-
 
720
                }
-
 
721
                t->state = THREAD_DEFUNCT_ACK;
-
 
722
            }
-
 
723
        if (dbgaction != DBGACTION_IDLE)
-
 
724
        {
-
 
725
            switch (dbgaction)
-
 
726
            {
-
 
727
#ifdef HAVE_I2C
-
 
728
            case DBGACTION_I2CSEND:
-
 
729
                i2c_send(dbgi2cbus, dbgi2cslave, dbgactionaddr,
-
 
730
                         (uint8_t*)dbgasyncsendbuf, dbgactionlength);
-
 
731
                dbgasyncsendbuf[0] = 1;
-
 
732
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
733
                break;
-
 
734
            case DBGACTION_I2CRECV:
-
 
735
                i2c_recv(dbgi2cbus, dbgi2cslave, dbgactionaddr,
-
 
736
                         (uint8_t*)(&dbgasyncsendbuf[4]), dbgactionlength);
-
 
737
                dbgasyncsendbuf[0] = 1;
-
 
738
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16 + dbgactionlength);
-
 
739
                break;
-
 
740
#endif
-
 
741
            case DBGACTION_POWEROFF:
-
 
742
                if (dbgactiontype) shutdown(true);
-
 
743
                power_off();
-
 
744
                break;
-
 
745
            case DBGACTION_RESET:
-
 
746
                shutdown(false);
-
 
747
                reset();
-
 
748
                break;
-
 
749
            case DBGACTION_CWRITE:
-
 
750
                cwrite(dbgactionconsoles, (const char*)dbgasyncsendbuf, dbgactionlength);
-
 
751
                dbgasyncsendbuf[0] = 1;
-
 
752
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
753
                break;
-
 
754
            case DBGACTION_CREAD:
-
 
755
                dbgasyncsendbuf[0] = 1;
-
 
756
                dbgasyncsendbuf[1] = cread(dbgactionconsoles, (char*)&dbgasyncsendbuf[4],
-
 
757
                                           dbgactionlength, 0);
-
 
758
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16 + dbgactionlength);
-
 
759
                break;
-
 
760
            case DBGACTION_CFLUSH:
-
 
761
                cflush(dbgactionconsoles);
-
 
762
                dbgasyncsendbuf[0] = 1;
-
 
763
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
764
                break;
-
 
765
            case DBGACTION_EXECIMAGE:
-
 
766
                if (dbgactionlength & 0x80000000)
-
 
767
                {
-
 
768
                    dbgactionlength &= ~0x80000000;
-
 
769
                    int i;
-
 
770
                    for (i = 0; i < dbgactionlength; i++)
-
 
771
                        dbgasyncsendbuf[i] += (uint32_t)dbgasyncsendbuf;
-
 
772
                }
-
 
773
                dbgasyncsendbuf[1] = (uint32_t)execimage((void*)dbgactionaddr, dbgactiontype,
-
 
774
                                                         (int)dbgactionlength,
-
 
775
                                                         (const char**)dbgasyncsendbuf);
-
 
776
                dbgasyncsendbuf[0] = 1;
-
 
777
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
778
                break;
-
 
779
            case DBGACTION_EXECFIRMWARE:
-
 
780
                dbgasyncsendbuf[0] = 1;
-
 
781
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
782
                shutdown(false);
-
 
783
                execfirmware((void*)dbgactionaddr, (void*)dbgactionoffset,
-
 
784
                             (size_t)dbgactionlength);
-
 
785
#ifdef HAVE_BOOTFLASH
-
 
786
            case DBGACTION_READBOOTFLASH:
-
 
787
                bootflash_readraw((void*)dbgactionaddr, dbgactionoffset, dbgactionlength);
-
 
788
                dbgasyncsendbuf[0] = 1;
-
 
789
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
790
                break;
-
 
791
            case DBGACTION_WRITEBOOTFLASH:
-
 
792
                bootflash_writeraw((void*)dbgactionaddr, dbgactionoffset, dbgactionlength);
-
 
793
                dbgasyncsendbuf[0] = 1;
-
 
794
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
795
                break;
-
 
796
#endif
-
 
797
#ifdef HAVE_HWKEYAES
-
 
798
            case DBGACTION_HWKEYAES:
-
 
799
                hwkeyaes((enum hwkeyaes_direction) dbgactiontype, dbgactionoffset,
-
 
800
                         (void*)dbgactionaddr, dbgactionlength);
-
 
801
                dbgasyncsendbuf[0] = 1;
-
 
802
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
803
                break;
-
 
804
#endif
-
 
805
#ifdef HAVE_HMACSHA1
-
 
806
            case DBGACTION_HMACSHA1:
-
 
807
                hmacsha1((void*)dbgactionaddr, dbgactionlength, (void*)dbgactionoffset);
-
 
808
                dbgasyncsendbuf[0] = 1;
-
 
809
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
810
                break;
-
 
811
#endif
-
 
812
#ifdef USB_HAVE_TARGET_SPECIFIC_REQUESTS
-
 
813
            case DBGACTION_TARGETSPECIFIC:
-
 
814
            {
-
 
815
                int size = usb_target_handle_request(dbgasyncsendbuf, sizeof(dbgasyncsendbuf));
-
 
816
                if (size) usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, size);
-
 
817
                break;
-
 
818
            }
-
 
819
#endif
-
 
820
#ifdef HAVE_STORAGE
-
 
821
            case DBGACTION_STORAGE:
-
 
822
                switch(dbgasyncsendbuf[0])
-
 
823
                {
-
 
824
                case 27:  // STORAGE_GET_INFO
-
 
825
                    dbgasyncsendbuf[0] = 1;
-
 
826
                    storage_get_info(dbgasyncsendbuf[1],
-
 
827
                                     (struct storage_info*)&dbgasyncsendbuf[4]);
-
 
828
                    dbgasyncsendbuf[1] = 1;
-
 
829
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf,
-
 
830
                                             16 + sizeof(struct storage_info));
-
 
831
                    break;
-
 
832
                case 28:  // STORAGE_READ_SECTORS_MD
-
 
833
                {
-
 
834
                    dbgasyncsendbuf[0] = 1;
-
 
835
                    int rc = storage_read_sectors_md(dbgasyncsendbuf[1],
-
 
836
                                                     dbgasyncsendbuf[2]
-
 
837
                                                   | (((uint64_t)(dbgasyncsendbuf[3]) << 32)),
-
 
838
                                                     dbgasyncsendbuf[4],
-
 
839
                                                     (void*)(dbgasyncsendbuf[5]));
-
 
840
                    dbgasyncsendbuf[1] = (uint32_t)rc;
-
 
841
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
842
                    break;
-
 
843
                }
-
 
844
                case 29:  // STORAGE_WRITE_SECTORS_MD
-
 
845
                {
-
 
846
                    dbgasyncsendbuf[0] = 1;
-
 
847
                    int rc = storage_write_sectors_md(dbgasyncsendbuf[1],
-
 
848
                                                      dbgasyncsendbuf[2]
-
 
849
                                                    | (((uint64_t)(dbgasyncsendbuf[3]) << 32)),
-
 
850
                                                      dbgasyncsendbuf[4],
-
 
851
                                                      (void*)(dbgasyncsendbuf[5]));
-
 
852
                    dbgasyncsendbuf[1] = (uint32_t)rc;
-
 
853
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
854
                    break;
-
 
855
                }
-
 
856
                case 30:  // FILE_OPEN
-
 
857
                {
-
 
858
                    dbgasyncsendbuf[0] = 1;
-
 
859
                    int fd = file_open((char*)(&dbgasyncsendbuf[4]), (int)(dbgasyncsendbuf[1]));
-
 
860
                    if (fd > 0) reown_file(fd, KERNEL_OWNER(KERNEL_OWNER_USB_MONITOR));
-
 
861
                    dbgasyncsendbuf[1] = (uint32_t)fd;
-
 
862
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
863
                    break;
-
 
864
                }
-
 
865
                case 31:  // FILESIZE
-
 
866
                    dbgasyncsendbuf[0] = 1;
-
 
867
                    dbgasyncsendbuf[1] = (uint32_t)filesize((int)(dbgasyncsendbuf[1]));
-
 
868
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
869
                    break;
-
 
870
                case 32:  // READ
-
 
871
                    dbgasyncsendbuf[0] = 1;
-
 
872
                    dbgasyncsendbuf[1] = (uint32_t)read((int)(dbgasyncsendbuf[1]),
-
 
873
                                                        (void*)(dbgasyncsendbuf[2]),
-
 
874
                                                        (size_t)(dbgasyncsendbuf[3]));
-
 
875
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
876
                    break;
-
 
877
                case 33:  // WRITE
-
 
878
                    dbgasyncsendbuf[0] = 1;
-
 
879
                    dbgasyncsendbuf[1] = (uint32_t)write((int)(dbgasyncsendbuf[1]),
-
 
880
                                                         (void*)(dbgasyncsendbuf[2]),
-
 
881
                                                         (size_t)(dbgasyncsendbuf[3]));
-
 
882
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
883
                    break;
-
 
884
                case 34:  // LSEEK
-
 
885
                    dbgasyncsendbuf[0] = 1;
-
 
886
                    dbgasyncsendbuf[1] = (uint32_t)lseek((int)(dbgasyncsendbuf[1]),
-
 
887
                                                         (off_t)(dbgasyncsendbuf[2]),
-
 
888
                                                         (int)(dbgasyncsendbuf[3]));
-
 
889
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
890
                    break;
-
 
891
                case 35:  // FTRUNCATE
-
 
892
                    dbgasyncsendbuf[0] = 1;
-
 
893
                    dbgasyncsendbuf[1] = (uint32_t)ftruncate((int)(dbgasyncsendbuf[1]),
-
 
894
                                                             (off_t)(dbgasyncsendbuf[2]));
-
 
895
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
896
                    break;
-
 
897
                case 36:  // FSYNC
-
 
898
                    dbgasyncsendbuf[0] = 1;
-
 
899
                    dbgasyncsendbuf[1] = (uint32_t)fsync((int)(dbgasyncsendbuf[1]));
-
 
900
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
901
                    break;
-
 
902
                case 37:  // CLOSE
-
 
903
                    dbgasyncsendbuf[0] = 1;
-
 
904
                    dbgasyncsendbuf[1] = (uint32_t)close((int)(dbgasyncsendbuf[1]));
-
 
905
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
906
                    break;
-
 
907
                case 38:  // CLOSE_MONITOR_FILES
-
 
908
                    dbgasyncsendbuf[0] = 1;
-
 
909
                    int rc = close_all_of_process(KERNEL_OWNER(KERNEL_OWNER_USB_MONITOR));
-
 
910
                    dbgasyncsendbuf[1] = (uint32_t)rc;
-
 
911
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
912
                    break;
-
 
913
                case 39:  // RELEASE_FILES
-
 
914
                    dbgasyncsendbuf[0] = 1;
-
 
915
                    dbgasyncsendbuf[1] = (uint32_t)release_files((int)(dbgasyncsendbuf[1]));
-
 
916
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
917
                    break;
-
 
918
                case 40:  // REMOVE
-
 
919
                    dbgasyncsendbuf[0] = 1;
-
 
920
                    dbgasyncsendbuf[1] = (uint32_t)remove((char*)(&dbgasyncsendbuf[4]));
-
 
921
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
922
                    break;
-
 
923
                case 41:  // RENAME
-
 
924
                    dbgasyncsendbuf[0] = 1;
-
 
925
                    dbgasyncsendbuf[1] = (uint32_t)rename((char*)(&dbgasyncsendbuf[4]),
-
 
926
                                                          (char*)(&dbgasyncsendbuf[66]));
-
 
927
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
928
                    break;
-
 
929
                case 42:  // OPENDIR
-
 
930
                    dbgasyncsendbuf[0] = 1;
-
 
931
                    DIR* dir = opendir((char*)(&dbgasyncsendbuf[4]));
-
 
932
                    if (dir > 0) reown_dir(dir, KERNEL_OWNER(KERNEL_OWNER_USB_MONITOR));
-
 
933
                    dbgasyncsendbuf[1] = (uint32_t)dir;
-
 
934
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
935
                    break;
-
 
936
                case 43:  // READDIR
-
 
937
                    dbgasyncsendbuf[0] = 1;
-
 
938
                    dbgasyncsendbuf[3] = (uint32_t)readdir((DIR*)(dbgasyncsendbuf[1]));
-
 
939
                    dbgasyncsendbuf[1] = 1;
-
 
940
                    dbgasyncsendbuf[2] = MAX_PATH;
-
 
941
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
942
                    break;
-
 
943
                case 44:  // CLOSEDIR
-
 
944
                    dbgasyncsendbuf[0] = 1;
-
 
945
                    dbgasyncsendbuf[1] = (uint32_t)closedir((DIR*)(dbgasyncsendbuf[1]));
-
 
946
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
947
                    break;
-
 
948
                case 45:  // CLOSE_MONITOR_DIRS
-
 
949
                    dbgasyncsendbuf[0] = 1;
-
 
950
                    rc = closedir_all_of_process(KERNEL_OWNER(KERNEL_OWNER_USB_MONITOR));
-
 
951
                    dbgasyncsendbuf[1] = (uint32_t)rc;
-
 
952
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
953
                    break;
-
 
954
                case 46:  // RELEASE_DIRS
-
 
955
                    dbgasyncsendbuf[0] = 1;
-
 
956
                    dbgasyncsendbuf[1] = (uint32_t)release_dirs((int)(dbgasyncsendbuf[1]));
-
 
957
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
958
                    break;
-
 
959
                case 47:  // MKDIR
-
 
960
                    dbgasyncsendbuf[0] = 1;
-
 
961
                    dbgasyncsendbuf[1] = (uint32_t)mkdir((char*)(&dbgasyncsendbuf[4]));
-
 
962
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
963
                    break;
-
 
964
                case 48:  // RMDIR
-
 
965
                    dbgasyncsendbuf[0] = 1;
-
 
966
                    dbgasyncsendbuf[1] = (uint32_t)rmdir((char*)(&dbgasyncsendbuf[4]));
-
 
967
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
968
                    break;
-
 
969
                case 49:  // ERRNO
-
 
970
                    dbgasyncsendbuf[0] = 1;
-
 
971
                    dbgasyncsendbuf[1] = (uint32_t)errno;
-
 
972
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
973
                    break;
-
 
974
#ifdef HAVE_HOTSWAP
-
 
975
                case 50:  // DISK_MOUNT
-
 
976
                    dbgasyncsendbuf[0] = 1;
-
 
977
                    dbgasyncsendbuf[1] = (uint32_t)disk_mount((int)(dbgasyncsendbuf[1]));
-
 
978
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
979
                    break;
-
 
980
                case 51:  // DISK_UNMOUNT
-
 
981
                    dbgasyncsendbuf[0] = 1;
-
 
982
                    dbgasyncsendbuf[1] = (uint32_t)disk_unmount((int)(dbgasyncsendbuf[1]));
-
 
983
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
984
                    break;
-
 
985
#endif
-
 
986
                case 58:  // FAT_ENABLE_FLUSHING
-
 
987
                    dbgasyncsendbuf[0] = 1;
-
 
988
                    fat_enable_flushing((bool)(dbgasyncsendbuf[1]));
-
 
989
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
990
                    break;
-
 
991
                case 59:  // FAT_SIZE
-
 
992
                    dbgasyncsendbuf[0] = 1;
-
 
993
                    fat_size_mv(dbgasyncsendbuf[1], &dbgasyncsendbuf[1], &dbgasyncsendbuf[2]);
-
 
994
                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
995
                    break;
-
 
996
                }
-
 
997
                break;
-
 
998
#endif
-
 
999
            case DBGACTION_MALLOC:
-
 
1000
                dbgasyncsendbuf[0] = 1;
-
 
1001
                dbgasyncsendbuf[1] = (uint32_t)malloc((size_t)dbgactionlength);
-
 
1002
                if (dbgasyncsendbuf[1])
-
 
1003
                    reownalloc(dbgasyncsendbuf[1], KERNEL_OWNER(KERNEL_OWNER_USB_MONITOR));
-
 
1004
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
1005
                break;
-
 
1006
            case DBGACTION_MEMALIGN:
-
 
1007
                dbgasyncsendbuf[0] = 1;
-
 
1008
                dbgasyncsendbuf[1] = (uint32_t)memalign((size_t)dbgactionoffset,
-
 
1009
                                                        (size_t)dbgactionlength);
-
 
1010
                if (dbgasyncsendbuf[1])
-
 
1011
                    reownalloc(dbgasyncsendbuf[1], KERNEL_OWNER(KERNEL_OWNER_USB_MONITOR));
-
 
1012
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
1013
                break;
-
 
1014
            case DBGACTION_REALLOC:
-
 
1015
                dbgasyncsendbuf[0] = 1;
-
 
1016
                dbgasyncsendbuf[1] = (uint32_t)realloc((void*)dbgactionaddr,
-
 
1017
                                                       (size_t)dbgactionlength);
-
 
1018
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
1019
                break;
-
 
1020
            case DBGACTION_REOWNALLOC:
-
 
1021
                dbgasyncsendbuf[0] = 1;
-
 
1022
                reownalloc((void*)dbgactionaddr, (void*)dbgactionoffset);
-
 
1023
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
1024
                break;
-
 
1025
            case DBGACTION_FREE:
-
 
1026
                dbgasyncsendbuf[0] = 1;
-
 
1027
                free((void*)dbgactionaddr);
-
 
1028
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
1029
                break;
-
 
1030
            case DBGACTION_FREEMONITOR:
-
 
1031
                dbgasyncsendbuf[0] = 1;
-
 
1032
                int rc = free_all_of_thread(KERNEL_OWNER(KERNEL_OWNER_USB_MONITOR));
-
 
1033
                dbgasyncsendbuf[1] = (uint32_t)rc;
-
 
1034
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
1035
                break;
-
 
1036
#ifdef HAVE_RTC
-
 
1037
            case DBGACTION_RTCREAD:
-
 
1038
                dbgasyncsendbuf[0] = 1;
-
 
1039
                rtc_read_datetime((struct rtc_datetime*)(&dbgasyncsendbuf[1]));
-
 
1040
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
1041
                break;
-
 
1042
            case DBGACTION_RTCWRITE:
-
 
1043
                rtc_write_datetime((const struct rtc_datetime*)(dbgasyncsendbuf));
-
 
1044
                dbgasyncsendbuf[0] = 1;
-
 
1045
                usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16);
-
 
1046
                break;
-
 
1047
#endif
-
 
1048
            }
-
 
1049
            dbgaction = DBGACTION_IDLE;
-
 
1050
        }
-
 
1051
    }
-
 
1052
}
-
 
1053
 
-
 
1054
void usb_init(void)
-
 
1055
{
-
 
1056
    dbgaction = DBGACTION_IDLE;
-
 
1057
    wakeup_init(&dbgwakeup);
-
 
1058
    dbgconsendreadidx = 0;
-
 
1059
    dbgconsendwriteidx = 0;
-
 
1060
    dbgconrecvreadidx = 0;
-
 
1061
    dbgconrecvwriteidx = 0;
-
 
1062
    wakeup_init(&dbgconsendwakeup);
-
 
1063
    wakeup_init(&dbgconrecvwakeup);
-
 
1064
    dbgconsoleattached = false;
-
 
1065
    thread_create(&dbgthread_handle, "monitor worker", dbgthread, dbgstack,
-
 
1066
                  sizeof(dbgstack), CORE_THREAD, 255, true, NULL, NULL, NULL, NULL);
-
 
1067
    usb_drv_init();
-
 
1068
}
-
 
1069
 
-
 
1070
int dbgconsole_getfree() ICODE_ATTR;
-
 
1071
int dbgconsole_getfree()
-
 
1072
{
-
 
1073
    int free = dbgconsendreadidx - dbgconsendwriteidx - 1;
-
 
1074
    if (free < 0) free += sizeof(dbgconsendbuf);
-
 
1075
    return free;
-
 
1076
}
-
 
1077
 
-
 
1078
int dbgconsole_makespace(int length, bool safe) ICODE_ATTR;
-
 
1079
int dbgconsole_makespace(int length, bool safe)
-
 
1080
{
-
 
1081
    int free = dbgconsole_getfree();
-
 
1082
    while (!free && dbgconsoleattached && !safe)
-
 
1083
    {
-
 
1084
        dbgconsoleattached = false;
-
 
1085
        wakeup_wait(&dbgconsendwakeup, 2000000);
-
 
1086
        free = dbgconsole_getfree();
-
 
1087
    }
-
 
1088
    if (free) return free > length ? length : free;
-
 
1089
    if (length > sizeof(dbgconsendbuf) - 17) length = sizeof(dbgconsendbuf) - 17;
-
 
1090
    uint32_t mode = enter_critical_section();
-
 
1091
    dbgconsendreadidx += length;
-
 
1092
    if (dbgconsendreadidx >= sizeof(dbgconsendbuf))
-
 
1093
        dbgconsendreadidx -= sizeof(dbgconsendbuf);
-
 
1094
    int offset = 0;
-
 
1095
    int idx = dbgconsendreadidx;
-
 
1096
    if (idx + 16 >= sizeof(dbgconsendbuf))
-
 
1097
    {
-
 
1098
        offset = sizeof(dbgconsendbuf) - dbgconsendreadidx;
-
 
1099
        memcpy(&dbgconsendbuf[dbgconsendreadidx], dbgconoverflowstr, offset);
-
 
1100
        idx = 0;
-
 
1101
    }
-
 
1102
    if (offset != 16) memcpy(&dbgconsendbuf[idx], &dbgconoverflowstr[offset], 16 - offset);
-
 
1103
    leave_critical_section(mode);
-
 
1104
    return length;
-
 
1105
}
-
 
1106
 
-
 
1107
void dbgconsole_putc_internal(char string, bool safe)
-
 
1108
{
-
 
1109
    dbgconsole_makespace(1, safe);
-
 
1110
    dbgconsendbuf[dbgconsendwriteidx++] = string;
-
 
1111
    if (dbgconsendwriteidx >= sizeof(dbgconsendbuf))
-
 
1112
        dbgconsendwriteidx -= sizeof(dbgconsendbuf);
-
 
1113
}
-
 
1114
 
-
 
1115
void dbgconsole_putc(char string)
-
 
1116
{
-
 
1117
    dbgconsole_putc_internal(string, false);
-
 
1118
}
-
 
1119
 
-
 
1120
void dbgconsole_sputc(char string)
-
 
1121
{
-
 
1122
    dbgconsole_putc_internal(string, true);
-
 
1123
}
-
 
1124
 
-
 
1125
void dbgconsole_write_internal(const char* string, size_t length, bool safe)
-
 
1126
{
-
 
1127
    while (length)
-
 
1128
    {
-
 
1129
        int space = dbgconsole_makespace(length, safe);
-
 
1130
        if (dbgconsendwriteidx + space >= sizeof(dbgconsendbuf))
-
 
1131
        {
-
 
1132
            int bytes = sizeof(dbgconsendbuf) - dbgconsendwriteidx;
-
 
1133
            memcpy(&dbgconsendbuf[dbgconsendwriteidx], string, bytes);
-
 
1134
            dbgconsendwriteidx = 0;
-
 
1135
            string = &string[bytes];
-
 
1136
            space -= bytes;
-
 
1137
            length -= bytes;
-
 
1138
        }
-
 
1139
        if (space) memcpy(&dbgconsendbuf[dbgconsendwriteidx], string, space);
-
 
1140
        dbgconsendwriteidx += space;
-
 
1141
        string = &string[space];
-
 
1142
        length -= space;
-
 
1143
    }
-
 
1144
}
-
 
1145
 
-
 
1146
void dbgconsole_write(const char* string, size_t length)
-
 
1147
{
-
 
1148
    dbgconsole_write_internal(string, length, false);
-
 
1149
}
-
 
1150
 
-
 
1151
void dbgconsole_swrite(const char* string, size_t length)
-
 
1152
{
-
 
1153
    dbgconsole_write_internal(string, length, true);
-
 
1154
}
-
 
1155
 
-
 
1156
void dbgconsole_puts(const char* string)
-
 
1157
{
-
 
1158
    dbgconsole_write(string, strlen(string));
-
 
1159
}
-
 
1160
 
-
 
1161
void dbgconsole_sputs(const char* string)
-
 
1162
{
-
 
1163
    dbgconsole_swrite(string, strlen(string));
-
 
1164
}
-
 
1165
 
-
 
1166
int dbgconsole_getavailable() ICODE_ATTR;
-
 
1167
int dbgconsole_getavailable()
-
 
1168
{
-
 
1169
    int available = dbgconrecvwriteidx - dbgconrecvreadidx;
-
 
1170
    if (available < 0) available += sizeof(dbgconrecvbuf);
-
 
1171
    return available;
-
 
1172
}
-
 
1173
 
-
 
1174
int dbgconsole_getc(int timeout)
-
 
1175
{
-
 
1176
    if (!dbgconsole_getavailable())
-
 
1177
    {
-
 
1178
        wakeup_wait(&dbgconrecvwakeup, TIMEOUT_NONE);
-
 
1179
        if (!dbgconsole_getavailable())
-
 
1180
        {
-
 
1181
            wakeup_wait(&dbgconrecvwakeup, timeout);
-
 
1182
            if (!dbgconsole_getavailable()) return -1;
-
 
1183
        }
-
 
1184
    }
-
 
1185
    int byte = dbgconrecvbuf[dbgconrecvreadidx++];
-
 
1186
    if (dbgconrecvreadidx >= sizeof(dbgconrecvbuf))
-
 
1187
        dbgconrecvreadidx -= sizeof(dbgconrecvbuf);
-
 
1188
    return byte;
-
 
1189
}
-
 
1190
 
-
 
1191
int dbgconsole_read(char* buffer, size_t length, int timeout)
-
 
1192
{
-
 
1193
    if (!length) return 0;
-
 
1194
    int available = dbgconsole_getavailable();
-
 
1195
    if (!available)
-
 
1196
    {
-
 
1197
        wakeup_wait(&dbgconrecvwakeup, TIMEOUT_NONE);
-
 
1198
        int available = dbgconsole_getavailable();
-
 
1199
        if (!available)
-
 
1200
        {
-
 
1201
            wakeup_wait(&dbgconrecvwakeup, timeout);
-
 
1202
            int available = dbgconsole_getavailable();
-
 
1203
            if (!available) return 0;
-
 
1204
        }
-
 
1205
    }
-
 
1206
    if (available > length) available = length;
-
 
1207
    int left = available;
-
 
1208
    if (dbgconrecvreadidx + available >= sizeof(dbgconrecvbuf))
-
 
1209
    {
-
 
1210
        int bytes = sizeof(dbgconrecvbuf) - dbgconrecvreadidx;
-
 
1211
        memcpy(buffer, &dbgconrecvbuf[dbgconrecvreadidx], bytes);
-
 
1212
        dbgconrecvreadidx = 0;
-
 
1213
        buffer = &buffer[bytes];
-
 
1214
        left -= bytes;
-
 
1215
    }
-
 
1216
    if (left) memcpy(buffer, &dbgconrecvbuf[dbgconrecvreadidx], left);
-
 
1217
    dbgconrecvreadidx += left;
-
 
1218
    return available;
-
 
1219
}
-
 
1220
 
-
 
1221
void usb_exit(void)
-
 
1222
{
-
 
1223
    usb_drv_exit();
-
 
1224
}
-