08000448 : #pragma GCC push_options #pragma GCC optimize ("O1") void InitEndpoints(void) { 8000448: b410 push {r4} trace("InitEndpoints\n"); USB_CNTR = 1; // disable reset and int 800044a: 4931 ldr r1, [pc, #196] @ (8000510 ) 800044c: 2301 movs r3, #1 800044e: f8c1 3c40 str.w r3, [r1, #3136] @ 0xc40 CMD.Configuration = 0; // nothing before CONFIGURED 8000452: 4b30 ldr r3, [pc, #192] @ (8000514 ) 8000454: 2200 movs r2, #0 8000456: 759a strb r2, [r3, #22] CMD.TransferLen = 0; // nothing to transfer 8000458: 609a str r2, [r3, #8] CMD.PacketLen = 0; // nothing to transfer 800045a: 60da str r2, [r3, #12] CMD.TransferPtr = 0; 800045c: 611a str r2, [r3, #16] USB_CNTR = 0; // all int off 800045e: f8c1 2c40 str.w r2, [r1, #3136] @ 0xc40 suspended = false; 8000462: 4b2d ldr r3, [pc, #180] @ (8000518 ) 8000464: 701a strb r2, [r3, #0] configurationSet = false; 8000466: 4b2d ldr r3, [pc, #180] @ (800051c ) 8000468: 701a strb r2, [r3, #0] transmitting = false; 800046a: 4b2d ldr r3, [pc, #180] @ (8000520 ) 800046c: 701a strb r2, [r3, #0] receiving = false; 800046e: 4b2d ldr r3, [pc, #180] @ (8000524 ) 8000470: 701a strb r2, [r3, #0] // EP0 = Control, IN and OUT EpTable[0].TxOffset = Ep0TxOffset; 8000472: 4b2d ldr r3, [pc, #180] @ (8000528 ) 8000474: f8a3 2090 strh.w r2, [r3, #144] @ 0x90 EpTable[0].TxCount = 0; 8000478: f8a3 2092 strh.w r2, [r3, #146] @ 0x92 EpTable[0].RxOffset = Ep0RxOffset; 800047c: 2040 movs r0, #64 @ 0x40 800047e: f8a3 0094 strh.w r0, [r3, #148] @ 0x94 EpTable[0].RxCount = EpCtrlLenId; 8000482: f44f 4004 mov.w r0, #33792 @ 0x8400 8000486: f8a3 0096 strh.w r0, [r3, #150] @ 0x96 // EP1 = Bulk IN (only IN) EpTable[1].TxOffset = Ep1TxAOffset; 800048a: 2480 movs r4, #128 @ 0x80 800048c: f8a3 4098 strh.w r4, [r3, #152] @ 0x98 EpTable[1].TxCount = 0; 8000490: f8a3 209a strh.w r2, [r3, #154] @ 0x9a EpTable[1].RxOffset = Ep1TxBOffset; // here 2nd tx buffer 8000494: f04f 0cc0 mov.w ip, #192 @ 0xc0 8000498: f8a3 c09c strh.w ip, [r3, #156] @ 0x9c EpTable[1].RxCount = EpBulkLenId; 800049c: f8a3 009e strh.w r0, [r3, #158] @ 0x9e // EP2 = Bulk OUT (only OUT) EpTable[2].TxOffset = Ep2RxAOffset; 80004a0: f44f 7c80 mov.w ip, #256 @ 0x100 80004a4: f8a3 c0a0 strh.w ip, [r3, #160] @ 0xa0 EpTable[2].TxCount = EpBulkLenId; 80004a8: f8a3 00a2 strh.w r0, [r3, #162] @ 0xa2 EpTable[2].RxOffset = Ep2RxBOffset; 80004ac: f44f 7ca0 mov.w ip, #320 @ 0x140 80004b0: f8a3 c0a4 strh.w ip, [r3, #164] @ 0xa4 EpTable[2].RxCount = EpBulkLenId; 80004b4: f8a3 00a6 strh.w r0, [r3, #166] @ 0xa6 // EP3 = Int, IN and OUT EpTable[3].TxOffset = Ep3TxOffset; 80004b8: f44f 70c0 mov.w r0, #384 @ 0x180 80004bc: f8a3 00a8 strh.w r0, [r3, #168] @ 0xa8 EpTable[3].TxCount = EpIntLenId; 80004c0: f44f 5080 mov.w r0, #4096 @ 0x1000 80004c4: f8a3 00aa strh.w r0, [r3, #170] @ 0xaa EpTable[3].RxOffset = Ep3RxOffset; 80004c8: f44f 7cc4 mov.w ip, #392 @ 0x188 80004cc: f8a3 c0ac strh.w ip, [r3, #172] @ 0xac EpTable[3].RxCount = EpIntLenId; 80004d0: f8a3 00ae strh.w r0, [r3, #174] @ 0xae USB_BTABLE = EpTableOffset; 80004d4: f44f 73c8 mov.w r3, #400 @ 0x190 80004d8: f8c1 3c50 str.w r3, [r1, #3152] @ 0xc50 USB_EP0R = 80004dc: f243 2320 movw r3, #12832 @ 0x3220 80004e0: f8c1 3c00 str.w r3, [r1, #3072] @ 0xc00 (3 << 12) | // STAT_RX = 3, rx enabled (2 << 4) | // STAT_TX = 2, send nak (1 << 9) | // EP_TYPE = 1, control logEpCtrl; USB_EP1R = 80004e4: 2321 movs r3, #33 @ 0x21 80004e6: f8c1 3c04 str.w r3, [r1, #3076] @ 0xc04 (0 << 12) | // STAT_RX = 0, rx disabled (2 << 4) | // STAT_TX = 2, send nak (0 << 9) | // EP_TYPE = 0, bulk logEpBulkIn; USB_EP2R = 80004ea: f243 0302 movw r3, #12290 @ 0x3002 80004ee: f8c1 3c08 str.w r3, [r1, #3080] @ 0xc08 (3 << 12) | // STAT_RX = 3, rx enabled (0 << 4) | // STAT_TX = 0, tx disabled (0 << 9) | // EP_TYPE = 0, bulk logEpBulkOut; USB_EP3R = 80004f2: f243 6323 movw r3, #13859 @ 0x3623 80004f6: f8c1 3c0c str.w r3, [r1, #3084] @ 0xc0c (3 << 12) | // STAT_RX = 3, rx enabled (2 << 4) | // STAT_TX = 2, send nak (3 << 9) | // EP_TYPE = 0, bulk logEpInt; USB_ISTR = 0; // remove pending interrupts 80004fa: f8c1 2c44 str.w r2, [r1, #3140] @ 0xc44 USB_CNTR = 80004fe: f44f 431f mov.w r3, #40704 @ 0x9f00 8000502: f8c1 3c40 str.w r3, [r1, #3136] @ 0xc40 USB_DADDR = 0x80 | adr; 8000506: f8c1 4c4c str.w r4, [r1, #3148] @ 0xc4c RESETM | // Int after reset SUSPM | WKUPM | ESOFM | SOFM; // Int every 1ms frame USB_SetAddress(0); } 800050a: f85d 4b04 ldr.w r4, [sp], #4 800050e: 4770 bx lr 8000510: 40005000 .word 0x40005000 8000514: 20000030 .word 0x20000030 8000518: 2000004d .word 0x2000004d 800051c: 2000004c .word 0x2000004c 8000520: 2000004e .word 0x2000004e 8000524: 2000004f .word 0x2000004f 8000528: 40006100 .word 0x40006100 0800052c : #pragma GCC pop_options