Subversion Repositories freemyipod

Rev

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

Rev 892 Rev 896
Line 62... Line 62...
62
enum dbgstate_t
62
enum dbgstate_t
63
{
63
{
64
    DBGSTATE_IDLE = 0,
64
    DBGSTATE_IDLE = 0,
65
    DBGSTATE_SETUP,
65
    DBGSTATE_SETUP,
66
    DBGSTATE_WRITE_MEM,
66
    DBGSTATE_WRITE_MEM,
-
 
67
    DBGSTATE_WRITE_CONSOLE,
67
    DBGSTATE_ASYNC,
68
    DBGSTATE_ASYNC,
68
    DBGSTATE_RESPOND,
69
    DBGSTATE_RESPOND,
-
 
70
    DBGSTATE_READ_CONSOLE,
69
};
71
};
70
 
72
 
71
static struct scheduler_thread dbgthread_handle IBSS_ATTR;
73
static struct scheduler_thread dbgthread_handle IBSS_ATTR;
72
static uint32_t dbgstack[0x200] STACK_ATTR;
74
static uint32_t dbgstack[0x200] STACK_ATTR;
73
struct wakeup dbgwakeup IBSS_ATTR;
75
struct wakeup dbgwakeup IBSS_ATTR;
Line 155... Line 157...
155
            }
157
            }
156
            dbgbuf[0] = 1;
158
            dbgbuf[0] = 1;
157
            break;
159
            break;
158
        }
160
        }
159
        case 10:  // READ CONSOLE
161
        case 10:  // READ CONSOLE
160
            dbgconsoleattached = true;
-
 
161
            int bytes = dbgconsendwriteidx - dbgconsendreadidx;
-
 
162
            int used = 0;
-
 
163
            if (bytes)
-
 
164
            {
-
 
165
                if (bytes < 0) bytes += sizeof(dbgconsendbuf);
-
 
166
                used = bytes;
-
 
167
                if (bytes > buf[1]) bytes = buf[1];
-
 
168
                int readbytes = bytes;
-
 
169
                char* outptr = (char*)&dbgbuf[4];
162
            dbgmemaddr = (void*)buf[1];
170
                if (dbgconsendreadidx + bytes >= sizeof(dbgconsendbuf))
-
 
171
                {
-
 
172
                    readbytes = sizeof(dbgconsendbuf) - dbgconsendreadidx;
-
 
173
                    memcpy(outptr, &dbgconsendbuf[dbgconsendreadidx], readbytes);
-
 
174
                    dbgconsendreadidx = 0;
163
            dbgstate = DBGSTATE_READ_CONSOLE;
175
                    outptr = &outptr[readbytes];
-
 
176
                    readbytes = bytes - readbytes;
164
            usb_ep0_start_tx(dbgusb, NULL, 0, true, NULL);
177
                }
-
 
178
                if (readbytes) memcpy(outptr, &dbgconsendbuf[dbgconsendreadidx], readbytes);
-
 
179
                dbgconsendreadidx += readbytes;
-
 
180
                wakeup_signal(&dbgconsendwakeup);
-
 
181
            }
-
 
182
            dbgbuf[0] = 1;
165
            return true;
183
            dbgbuf[1] = bytes;
-
 
184
            dbgbuf[2] = sizeof(dbgconsendbuf);
-
 
185
            dbgbuf[3] = used - bytes;
-
 
186
            break;
166
            break;
187
        case 11:  // WRITE CONSOLE
167
        case 11:  // WRITE CONSOLE
-
 
168
        {
-
 
169
            int total = 0;
188
            bytes = dbgconrecvreadidx - dbgconrecvwriteidx - 1;
170
            int bytes = dbgconrecvreadidx - dbgconrecvwriteidx - 1;
189
            if (bytes < 0) bytes += sizeof(dbgconrecvbuf);
171
            if (bytes < 0) bytes += sizeof(dbgconrecvbuf);
190
            if (bytes)
172
            if (bytes)
191
            {
173
            {
192
                if (bytes > buf[1]) bytes = buf[1];
174
                if (bytes > buf[1]) bytes = buf[1];
-
 
175
                total = bytes;
-
 
176
                if (bytes > 48) bytes = 48;
193
                int writebytes = bytes;
177
                int writebytes = bytes;
194
                char* readptr = (char*)&buf[4];
178
                char* readptr = (char*)&buf[4];
195
                if (dbgconrecvwriteidx + bytes >= sizeof(dbgconrecvbuf))
179
                if (dbgconrecvwriteidx + bytes >= sizeof(dbgconrecvbuf))
196
                {
180
                {
197
                    writebytes = sizeof(dbgconrecvbuf) - dbgconrecvwriteidx;
181
                    writebytes = sizeof(dbgconrecvbuf) - dbgconrecvwriteidx;
Line 203... Line 187...
203
                if (writebytes) memcpy(&dbgconrecvbuf[dbgconrecvwriteidx], readptr, writebytes);
187
                if (writebytes) memcpy(&dbgconrecvbuf[dbgconrecvwriteidx], readptr, writebytes);
204
                dbgconrecvwriteidx += writebytes;
188
                dbgconrecvwriteidx += writebytes;
205
                wakeup_signal(&dbgconrecvwakeup);
189
                wakeup_signal(&dbgconrecvwakeup);
206
            }
190
            }
207
            dbgbuf[0] = 1;
191
            dbgbuf[0] = 1;
208
            dbgbuf[1] = bytes;
192
            dbgbuf[1] = total;
209
            dbgbuf[2] = sizeof(dbgconrecvbuf);
193
            dbgbuf[2] = sizeof(dbgconrecvbuf);
-
 
194
            if (total > 48)
-
 
195
            {
-
 
196
                dbgmemlen = total - 48;
-
 
197
                dbgstate = DBGSTATE_WRITE_CONSOLE;
-
 
198
                usb_ep0_start_rx(dbgusb, 1, usbdebug_handle_data);
-
 
199
                return true;
-
 
200
            }
210
            dbgbuf[3] = dbgconrecvreadidx - dbgconrecvwriteidx - 1;
201
            dbgbuf[3] = dbgconrecvreadidx - dbgconrecvwriteidx - 1;
211
            break;
202
            break;
-
 
203
        }
212
        case 15:  // GET PROCESS INFO
204
        case 15:  // GET PROCESS INFO
213
            dbgbuf[0] = 1;
205
            dbgbuf[0] = 1;
214
            dbgbuf[1] = SCHEDULER_THREAD_INFO_VERSION;
206
            dbgbuf[1] = SCHEDULER_THREAD_INFO_VERSION;
215
            dbgbuf[2] = (uint32_t)head_thread;
207
            dbgbuf[2] = (uint32_t)head_thread;
216
            break;
208
            break;
Line 265... Line 257...
265
            break;
257
            break;
266
        }
258
        }
267
        break;
259
        break;
268
    case DBGSTATE_WRITE_MEM:
260
    case DBGSTATE_WRITE_MEM:
269
    {
261
    {
270
        int len = MIN(64, dbgmemlen);
262
        int len = MIN(64 - bytesleft, dbgmemlen);
271
        dbgmemlen -= len;
263
        dbgmemlen -= len;
272
        memcpy(dbgmemaddr, buf, len);
264
        memcpy(dbgmemaddr, buf, len);
273
        if (dbgmemlen)
265
        if (dbgmemlen && !bytesleft)
274
        {
266
        {
275
            dbgmemaddr += len;
267
            dbgmemaddr += len;
276
            usb_ep0_start_rx(dbgusb, 1, usbdebug_handle_data);
268
            usb_ep0_start_rx(dbgusb, 1, usbdebug_handle_data);
277
            return true;
269
            return true;
278
        }
270
        }
279
        dbgbuf[0] = 1;
271
        dbgbuf[0] = 1;
280
        break;
272
        break;
281
    }
273
    }
-
 
274
    case DBGSTATE_WRITE_CONSOLE:
-
 
275
    {
-
 
276
        int bytes = MIN(64 - bytesleft, dbgmemlen);
-
 
277
        dbgmemlen -= bytes;
-
 
278
        if (bytes)
-
 
279
        {
-
 
280
            int writebytes = bytes;
-
 
281
            char* readptr = (char*)buf;
-
 
282
            if (dbgconrecvwriteidx + bytes >= sizeof(dbgconrecvbuf))
-
 
283
            {
-
 
284
                writebytes = sizeof(dbgconrecvbuf) - dbgconrecvwriteidx;
-
 
285
                memcpy(&dbgconrecvbuf[dbgconrecvwriteidx], readptr, writebytes);
-
 
286
                dbgconrecvwriteidx = 0;
-
 
287
                readptr = &readptr[writebytes];
-
 
288
                writebytes = bytes - writebytes;
-
 
289
            }
-
 
290
            if (writebytes) memcpy(&dbgconrecvbuf[dbgconrecvwriteidx], readptr, writebytes);
-
 
291
            dbgconrecvwriteidx += writebytes;
-
 
292
            wakeup_signal(&dbgconrecvwakeup);
-
 
293
            if (dbgmemlen && !bytesleft)
-
 
294
            {
-
 
295
                usb_ep0_start_rx(dbgusb, 1, usbdebug_handle_data);
-
 
296
                return true;
-
 
297
            }
-
 
298
        }
-
 
299
        dbgbuf[3] = dbgconrecvreadidx - dbgconrecvwriteidx - 1;
-
 
300
        if (dbgbuf[3] < 0) dbgbuf[3] += sizeof(dbgconrecvbuf);
-
 
301
    }
282
    default: break;
302
    default: break;
283
    }
303
    }
284
    dbgstate = DBGSTATE_RESPOND;
304
    dbgstate = DBGSTATE_RESPOND;
285
    usb_ep0_start_tx(dbgusb, NULL, 0, true, NULL);
305
    usb_ep0_start_tx(dbgusb, NULL, 0, true, NULL);
286
    return true;
306
    return true;
287
}
307
}
288
 
308
 
-
 
309
bool read_console_callback(const struct usb_instance* data, int bytesleft)
-
 
310
{
-
 
311
    if (bytesleft || !dbgmemaddr) return false;
-
 
312
    dbgconsoleattached = true;
-
 
313
    int bytes = MIN(64, dbgmemlen);
-
 
314
    if (bytes)
-
 
315
    {
-
 
316
        int readbytes = bytes;
-
 
317
        char* outptr = (char*)dbgbuf;
-
 
318
        if (dbgconsendreadidx + bytes >= sizeof(dbgconsendbuf))
-
 
319
        {
-
 
320
            readbytes = sizeof(dbgconsendbuf) - dbgconsendreadidx;
-
 
321
            memcpy(outptr, &dbgconsendbuf[dbgconsendreadidx], readbytes);
-
 
322
            dbgconsendreadidx = 0;
-
 
323
            outptr = &outptr[readbytes];
-
 
324
            readbytes = bytes - readbytes;
-
 
325
        }
-
 
326
        if (readbytes) memcpy(outptr, &dbgconsendbuf[dbgconsendreadidx], readbytes);
-
 
327
        dbgconsendreadidx += readbytes;
-
 
328
        wakeup_signal(&dbgconsendwakeup);
-
 
329
        dbgmemlen -= bytes;
-
 
330
    }
-
 
331
    bytes = MIN(64, (int)dbgmemaddr);
-
 
332
    dbgmemaddr -= bytes;
-
 
333
    if (dbgmemaddr)
-
 
334
    {
-
 
335
        usb_ep0_start_rx(dbgusb, 0, NULL);
-
 
336
        usb_ep0_start_tx(dbgusb, dbgbuf, bytes, false, read_console_callback);
-
 
337
    }
-
 
338
    else usb_ep0_start_tx(dbgusb, dbgbuf, bytes, true, NULL);
-
 
339
    return true;
-
 
340
}
-
 
341
 
289
int usbdebug_handle_setup(const struct usb_instance* data, int interface, union usb_ep0_buffer* request, const void** response)
342
int usbdebug_handle_setup(const struct usb_instance* data, int interface, union usb_ep0_buffer* request, const void** response)
290
{
343
{
291
    int size = -1;
344
    int size = -1;
292
    switch (request->setup.bmRequestType.type)
345
    switch (request->setup.bmRequestType.type)
293
    {
346
    {
Line 313... Line 366...
313
                    if (dbgmemlen)
366
                    if (dbgmemlen)
314
                    {
367
                    {
315
                        usb_ep0_start_rx(dbgusb, 0, NULL);
368
                        usb_ep0_start_rx(dbgusb, 0, NULL);
316
                        data->state->ep0_tx_ptr = dbgmemaddr - 16;
369
                        data->state->ep0_tx_ptr = dbgmemaddr - 16;
317
                        data->state->ep0_tx_len = dbgmemlen;
370
                        data->state->ep0_tx_len = dbgmemlen;
318
                        usb_ep0_start_tx(dbgusb, dbgbuf, len + 16, !data->state->ep0_tx_len, usb_ep0_tx_callback);
371
                        usb_ep0_start_tx(dbgusb, dbgbuf, len + 16, false, usb_ep0_tx_callback);
319
                        return -3;
372
                        return -3;
320
                    }
373
                    }
321
                    dbgstate = DBGSTATE_IDLE;
374
                    dbgstate = DBGSTATE_IDLE;
322
                    *response = dbgbuf;
375
                    *response = dbgbuf;
323
                    return len + 16;
376
                    return len + 16;
324
                }
377
                }
-
 
378
                case DBGSTATE_READ_CONSOLE:
-
 
379
                {
-
 
380
                    dbgconsoleattached = true;
-
 
381
                    dbgmemlen = dbgconsendwriteidx - dbgconsendreadidx;
-
 
382
                    if (dbgmemlen < 0) dbgmemlen += sizeof(dbgconsendbuf);
-
 
383
                    int used = dbgmemlen;
-
 
384
                    if (dbgmemlen > (int)dbgmemaddr) dbgmemlen = (int)dbgmemaddr;
-
 
385
                    int bytes = MIN(48, dbgmemlen);
-
 
386
                    dbgbuf[0] = 1;
-
 
387
                    dbgbuf[1] = dbgmemlen;
-
 
388
                    dbgbuf[2] = sizeof(dbgconsendbuf);
-
 
389
                    dbgbuf[3] = used - dbgmemlen;
-
 
390
                    if (bytes)
-
 
391
                    {
-
 
392
                        int readbytes = bytes;
-
 
393
                        char* outptr = (char*)&dbgbuf[4];
-
 
394
                        if (dbgconsendreadidx + bytes >= sizeof(dbgconsendbuf))
-
 
395
                        {
-
 
396
                            readbytes = sizeof(dbgconsendbuf) - dbgconsendreadidx;
-
 
397
                            memcpy(outptr, &dbgconsendbuf[dbgconsendreadidx], readbytes);
-
 
398
                            dbgconsendreadidx = 0;
-
 
399
                            outptr = &outptr[readbytes];
-
 
400
                            readbytes = bytes - readbytes;
-
 
401
                        }
-
 
402
                        if (readbytes) memcpy(outptr, &dbgconsendbuf[dbgconsendreadidx], readbytes);
-
 
403
                        dbgconsendreadidx += readbytes;
-
 
404
                        wakeup_signal(&dbgconsendwakeup);
-
 
405
                    }
-
 
406
                    dbgmemlen -= bytes;
-
 
407
                    bytes = MIN(48, (int)dbgmemaddr);
-
 
408
                    dbgmemaddr -= bytes;
-
 
409
                    if (dbgmemaddr)
-
 
410
                    {
-
 
411
                        usb_ep0_start_rx(dbgusb, 0, NULL);
-
 
412
                        usb_ep0_start_tx(dbgusb, dbgbuf, bytes + 16, false, read_console_callback);
-
 
413
                        return -3;
-
 
414
                    }
-
 
415
                    dbgstate = DBGSTATE_IDLE;
-
 
416
                    *response = dbgbuf;
-
 
417
                    return bytes + 16;
-
 
418
                }
325
                default: return -2;
419
                default: return -2;
326
                }
420
                }
327
                break;
421
                break;
328
            }
422
            }
329
            break;
423
            break;