ARC-FW.elf: file format elf32-littlearm Sections: Idx Name Size VMA LMA File off Algn 0 .text 00002fe8 00000000 00000000 00010000 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .relocate 000000cc 20000000 00002fe8 00020000 2**2 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000600 200000cc 000030b4 000200cc 2**2 ALLOC 3 .stack 00002004 200006cc 000036b4 000200cc 2**0 ALLOC 4 .ARM.attributes 00000028 00000000 00000000 000200cc 2**0 CONTENTS, READONLY 5 .comment 0000001e 00000000 00000000 000200f4 2**0 CONTENTS, READONLY 6 .debug_info 000297e9 00000000 00000000 00020112 2**0 CONTENTS, READONLY, DEBUGGING, OCTETS 7 .debug_abbrev 00003c17 00000000 00000000 000498fb 2**0 CONTENTS, READONLY, DEBUGGING, OCTETS 8 .debug_loc 0000f20d 00000000 00000000 0004d512 2**0 CONTENTS, READONLY, DEBUGGING, OCTETS 9 .debug_aranges 00000d30 00000000 00000000 0005c71f 2**0 CONTENTS, READONLY, DEBUGGING, OCTETS 10 .debug_ranges 00002ec0 00000000 00000000 0005d44f 2**0 CONTENTS, READONLY, DEBUGGING, OCTETS 11 .debug_macro 00009c1a 00000000 00000000 0006030f 2**0 CONTENTS, READONLY, DEBUGGING, OCTETS 12 .debug_line 00015ed9 00000000 00000000 00069f29 2**0 CONTENTS, READONLY, DEBUGGING, OCTETS 13 .debug_str 0008795f 00000000 00000000 0007fe02 2**0 CONTENTS, READONLY, DEBUGGING, OCTETS 14 .debug_frame 00002830 00000000 00000000 00107764 2**2 CONTENTS, READONLY, DEBUGGING, OCTETS Disassembly of section .text: 00000000 : 0: d0 26 00 20 55 01 00 00 51 01 00 00 51 01 00 00 .&. U...Q...Q... ... 2c: 51 01 00 00 00 00 00 00 00 00 00 00 51 01 00 00 Q...........Q... 3c: 51 01 00 00 51 01 00 00 51 01 00 00 51 01 00 00 Q...Q...Q...Q... 4c: 51 01 00 00 51 01 00 00 51 01 00 00 51 01 00 00 Q...Q...Q...Q... 5c: 19 11 00 00 51 01 00 00 51 01 00 00 51 01 00 00 ....Q...Q...Q... 6c: 51 01 00 00 51 01 00 00 00 00 00 00 00 00 00 00 Q...Q........... 7c: 51 01 00 00 51 01 00 00 51 01 00 00 51 01 00 00 Q...Q...Q...Q... 8c: 51 01 00 00 51 01 00 00 00 00 00 00 00 00 00 00 Q...Q........... 9c: 51 01 00 00 51 01 00 00 51 01 00 00 51 01 00 00 Q...Q...Q...Q... ac: 51 01 00 00 00 00 00 00 Q....... 000000b4 <__do_global_dtors_aux>: b4: b510 push {r4, lr} b6: 4c06 ldr r4, [pc, #24] ; (d0 <__do_global_dtors_aux+0x1c>) b8: 7823 ldrb r3, [r4, #0] ba: 2b00 cmp r3, #0 bc: d107 bne.n ce <__do_global_dtors_aux+0x1a> be: 4b05 ldr r3, [pc, #20] ; (d4 <__do_global_dtors_aux+0x20>) c0: 2b00 cmp r3, #0 c2: d002 beq.n ca <__do_global_dtors_aux+0x16> c4: 4804 ldr r0, [pc, #16] ; (d8 <__do_global_dtors_aux+0x24>) c6: e000 b.n ca <__do_global_dtors_aux+0x16> c8: bf00 nop ca: 2301 movs r3, #1 cc: 7023 strb r3, [r4, #0] ce: bd10 pop {r4, pc} d0: 200000cc .word 0x200000cc d4: 00000000 .word 0x00000000 d8: 00002fe8 .word 0x00002fe8 000000dc : dc: 4b04 ldr r3, [pc, #16] ; (f0 ) de: b510 push {r4, lr} e0: 2b00 cmp r3, #0 e2: d003 beq.n ec e4: 4903 ldr r1, [pc, #12] ; (f4 ) e6: 4804 ldr r0, [pc, #16] ; (f8 ) e8: e000 b.n ec ea: bf00 nop ec: bd10 pop {r4, pc} ee: 46c0 nop ; (mov r8, r8) f0: 00000000 .word 0x00000000 f4: 200000d0 .word 0x200000d0 f8: 00002fe8 .word 0x00002fe8 000000fc <_delay_init>: fc: 4b02 ldr r3, [pc, #8] ; (108 <_delay_init+0xc>) fe: 4a03 ldr r2, [pc, #12] ; (10c <_delay_init+0x10>) 100: 605a str r2, [r3, #4] 102: 2205 movs r2, #5 104: 601a str r2, [r3, #0] 106: 4770 bx lr 108: e000e010 .word 0xe000e010 10c: 00ffffff .word 0x00ffffff 00000110 <_delay_cycles>: } /** * \brief Delay loop to delay n number of cycles */ void _delay_cycles(void *const hw, uint32_t cycles) { 110: b570 push {r4, r5, r6, lr} uint32_t buf = cycles; while (n--) { SysTick->LOAD = 0xFFFFFF; SysTick->VAL = 0xFFFFFF; while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)) 112: 2580 movs r5, #128 ; 0x80 uint8_t n = cycles >> 24; 114: 0e0b lsrs r3, r1, #24 116: 4a0c ldr r2, [pc, #48] ; (148 <_delay_cycles+0x38>) SysTick->LOAD = 0xFFFFFF; 118: 4c0c ldr r4, [pc, #48] ; (14c <_delay_cycles+0x3c>) uint8_t n = cycles >> 24; 11a: b2d8 uxtb r0, r3 while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)) 11c: 026d lsls r5, r5, #9 while (n--) { 11e: 3801 subs r0, #1 120: b2c0 uxtb r0, r0 122: 28ff cmp r0, #255 ; 0xff 124: d10a bne.n 13c <_delay_cycles+0x2c> 126: 0618 lsls r0, r3, #24 128: 1a1b subs r3, r3, r0 12a: 185b adds r3, r3, r1 ; buf -= 0xFFFFFF; } SysTick->LOAD = buf; 12c: 6053 str r3, [r2, #4] SysTick->VAL = buf; 12e: 6093 str r3, [r2, #8] while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)) 130: 2380 movs r3, #128 ; 0x80 132: 025b lsls r3, r3, #9 134: 6811 ldr r1, [r2, #0] 136: 4219 tst r1, r3 138: d0fc beq.n 134 <_delay_cycles+0x24> ; } 13a: bd70 pop {r4, r5, r6, pc} SysTick->LOAD = 0xFFFFFF; 13c: 6054 str r4, [r2, #4] SysTick->VAL = 0xFFFFFF; 13e: 6094 str r4, [r2, #8] while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)) 140: 6816 ldr r6, [r2, #0] 142: 422e tst r6, r5 144: d0fc beq.n 140 <_delay_cycles+0x30> 146: e7ea b.n 11e <_delay_cycles+0xe> 148: e000e010 .word 0xe000e010 14c: 00ffffff .word 0x00ffffff 00000150 : /** * \brief Default interrupt handler for unused IRQs. */ void Dummy_Handler(void) { while (1) { 150: e7fe b.n 150 ... 00000154 : if (pSrc != pDest) { 154: 4925 ldr r1, [pc, #148] ; (1ec ) 156: 4826 ldr r0, [pc, #152] ; (1f0 ) { 158: b570 push {r4, r5, r6, lr} if (pSrc != pDest) { 15a: 4281 cmp r1, r0 15c: d00a beq.n 174 *pDest++ = *pSrc++; 15e: 4b25 ldr r3, [pc, #148] ; (1f4 ) 160: 1ec4 subs r4, r0, #3 162: 2200 movs r2, #0 164: 42a3 cmp r3, r4 166: d303 bcc.n 170 168: 3303 adds r3, #3 16a: 1a1a subs r2, r3, r0 16c: 0892 lsrs r2, r2, #2 16e: 0092 lsls r2, r2, #2 170: 4b21 ldr r3, [pc, #132] ; (1f8 ) 172: 4798 blx r3 *pDest++ = 0; 174: 4821 ldr r0, [pc, #132] ; (1fc ) 176: 4b22 ldr r3, [pc, #136] ; (200 ) 178: 1ec1 subs r1, r0, #3 17a: 2200 movs r2, #0 17c: 4299 cmp r1, r3 17e: d803 bhi.n 188 180: 3303 adds r3, #3 182: 1a1a subs r2, r3, r0 184: 0892 lsrs r2, r2, #2 186: 0092 lsls r2, r2, #2 188: 2100 movs r1, #0 18a: 4b1e ldr r3, [pc, #120] ; (204 ) 18c: 4798 blx r3 SCB->VTOR = ((uint32_t)pSrc & SCB_VTOR_TBLOFF_Msk); 18e: 22ff movs r2, #255 ; 0xff 190: 4b1d ldr r3, [pc, #116] ; (208 ) USB->DEVICE.QOSCTRL.bit.CQOS = 2; 192: 2103 movs r1, #3 SCB->VTOR = ((uint32_t)pSrc & SCB_VTOR_TBLOFF_Msk); 194: 4393 bics r3, r2 196: 4a1d ldr r2, [pc, #116] ; (20c ) USB->DEVICE.QOSCTRL.bit.DQOS = 2; 198: 250c movs r5, #12 SCB->VTOR = ((uint32_t)pSrc & SCB_VTOR_TBLOFF_Msk); 19a: 6093 str r3, [r2, #8] SBMATRIX->SFR[SBMATRIX_SLAVE_HMCRAMC0].reg = 2; 19c: 2202 movs r2, #2 USB->DEVICE.QOSCTRL.bit.DQOS = 2; 19e: 2408 movs r4, #8 DMAC->QOSCTRL.bit.DQOS = 2; 1a0: 2630 movs r6, #48 ; 0x30 SBMATRIX->SFR[SBMATRIX_SLAVE_HMCRAMC0].reg = 2; 1a2: 4b1b ldr r3, [pc, #108] ; (210 ) USB->DEVICE.QOSCTRL.bit.CQOS = 2; 1a4: 481b ldr r0, [pc, #108] ; (214 ) SBMATRIX->SFR[SBMATRIX_SLAVE_HMCRAMC0].reg = 2; 1a6: 625a str r2, [r3, #36] ; 0x24 USB->DEVICE.QOSCTRL.bit.CQOS = 2; 1a8: 78c3 ldrb r3, [r0, #3] 1aa: 438b bics r3, r1 1ac: 4313 orrs r3, r2 1ae: 70c3 strb r3, [r0, #3] USB->DEVICE.QOSCTRL.bit.DQOS = 2; 1b0: 78c3 ldrb r3, [r0, #3] 1b2: 43ab bics r3, r5 1b4: 4323 orrs r3, r4 1b6: 70c3 strb r3, [r0, #3] DMAC->QOSCTRL.bit.DQOS = 2; 1b8: 4b17 ldr r3, [pc, #92] ; (218 ) 1ba: 7b98 ldrb r0, [r3, #14] 1bc: 43b0 bics r0, r6 1be: 0006 movs r6, r0 1c0: 2020 movs r0, #32 1c2: 4330 orrs r0, r6 1c4: 7398 strb r0, [r3, #14] DMAC->QOSCTRL.bit.FQOS = 2; 1c6: 7b98 ldrb r0, [r3, #14] 1c8: 43a8 bics r0, r5 1ca: 4304 orrs r4, r0 1cc: 739c strb r4, [r3, #14] DMAC->QOSCTRL.bit.WRBQOS = 2; 1ce: 7b98 ldrb r0, [r3, #14] 1d0: 4388 bics r0, r1 1d2: 4302 orrs r2, r0 1d4: 739a strb r2, [r3, #14] NVMCTRL->CTRLB.bit.MANW = 1; 1d6: 2380 movs r3, #128 ; 0x80 1d8: 4a10 ldr r2, [pc, #64] ; (21c ) 1da: 6851 ldr r1, [r2, #4] 1dc: 430b orrs r3, r1 1de: 6053 str r3, [r2, #4] __libc_init_array(); 1e0: 4b0f ldr r3, [pc, #60] ; (220 ) 1e2: 4798 blx r3 main(); 1e4: 4b0f ldr r3, [pc, #60] ; (224 ) 1e6: 4798 blx r3 while (1) 1e8: e7fe b.n 1e8 1ea: 46c0 nop ; (mov r8, r8) 1ec: 00002fe8 .word 0x00002fe8 1f0: 20000000 .word 0x20000000 1f4: 200000cc .word 0x200000cc 1f8: 0000261d .word 0x0000261d 1fc: 200000cc .word 0x200000cc 200: 200006cc .word 0x200006cc 204: 0000262f .word 0x0000262f 208: 00000000 .word 0x00000000 20c: e000ed00 .word 0xe000ed00 210: 410070fc .word 0x410070fc 214: 41005000 .word 0x41005000 218: 41004800 .word 0x41004800 21c: 41004000 .word 0x41004000 220: 000025d5 .word 0x000025d5 224: 00001bad .word 0x00001bad 00000228 : * \param[in] ep Endpoint address. * \param[in] req Pointer to the request. * \return Operation status. */ static int32_t cdcdf_acm_req(uint8_t ep, struct usb_req *req, enum usb_ctrl_stage stage) { 228: b5f0 push {r4, r5, r6, r7, lr} 22a: 0017 movs r7, r2 if (0x01 != ((req->bmRequestType >> 5) & 0x03)) { // class request 22c: 780a ldrb r2, [r1, #0] { 22e: b085 sub sp, #20 if (0x01 != ((req->bmRequestType >> 5) & 0x03)) { // class request 230: 0653 lsls r3, r2, #25 { 232: 000c movs r4, r1 234: 9001 str r0, [sp, #4] if (0x01 != ((req->bmRequestType >> 5) & 0x03)) { // class request 236: 0f9b lsrs r3, r3, #30 238: 2b01 cmp r3, #1 23a: d152 bne.n 2e2 return ERR_NOT_FOUND; } if ((req->wIndex == _cdcdf_acm_funcd.func_iface[0]) || (req->wIndex == _cdcdf_acm_funcd.func_iface[1])) { 23c: 7963 ldrb r3, [r4, #5] 23e: 7909 ldrb r1, [r1, #4] 240: 4d2a ldr r5, [pc, #168] ; (2ec ) 242: 021b lsls r3, r3, #8 244: 430b orrs r3, r1 246: 7829 ldrb r1, [r5, #0] 248: 4299 cmp r1, r3 24a: d002 beq.n 252 24c: 7869 ldrb r1, [r5, #1] 24e: 4299 cmp r1, r3 250: d147 bne.n 2e2 uint16_t len = req->wLength; 252: 79e6 ldrb r6, [r4, #7] 254: 79a3 ldrb r3, [r4, #6] 256: 0236 lsls r6, r6, #8 if (req->bmRequestType & USB_EP_DIR_IN) { 258: b252 sxtb r2, r2 uint16_t len = req->wLength; 25a: 431e orrs r6, r3 if (req->bmRequestType & USB_EP_DIR_IN) { 25c: 2a00 cmp r2, #0 25e: da0f bge.n 280 return ERR_NONE; 260: 2000 movs r0, #0 if (USB_DATA_STAGE == stage) { 262: 2f01 cmp r7, #1 264: d00a beq.n 27c switch (req->bRequest) { 266: 7863 ldrb r3, [r4, #1] 268: 2b21 cmp r3, #33 ; 0x21 26a: d111 bne.n 290 if (sizeof(struct usb_cdc_line_coding) != len) { 26c: 2e07 cmp r6, #7 26e: d13b bne.n 2e8 return usbdc_xfer(ep, (uint8_t *)&usbd_cdc_line_coding, len, false); 270: 0003 movs r3, r0 272: 1da9 adds r1, r5, #6 return usbdc_xfer(ep, ctrl_buf, len, false); 274: 0032 movs r2, r6 276: 9801 ldr r0, [sp, #4] 278: 4c1d ldr r4, [pc, #116] ; (2f0 ) 27a: 47a0 blx r4 return cdcdf_acm_set_req(ep, req, stage); } } else { return ERR_NOT_FOUND; } } 27c: b005 add sp, #20 27e: bdf0 pop {r4, r5, r6, r7, pc} uint8_t * ctrl_buf = usbdc_get_ctrl_buffer(); 280: 4b1c ldr r3, [pc, #112] ; (2f4 ) 282: 4798 blx r3 switch (req->bRequest) { 284: 7863 ldrb r3, [r4, #1] uint8_t * ctrl_buf = usbdc_get_ctrl_buffer(); 286: 0001 movs r1, r0 switch (req->bRequest) { 288: 2b20 cmp r3, #32 28a: d003 beq.n 294 28c: 2b22 cmp r3, #34 ; 0x22 28e: d019 beq.n 2c4 return ERR_INVALID_ARG; 290: 200d movs r0, #13 292: e027 b.n 2e4 if (sizeof(struct usb_cdc_line_coding) != len) { 294: 2e07 cmp r6, #7 296: d127 bne.n 2e8 if (USB_SETUP_STAGE == stage) { 298: 2f00 cmp r7, #0 29a: d101 bne.n 2a0 return usbdc_xfer(ep, ctrl_buf, len, false); 29c: 003b movs r3, r7 29e: e7e9 b.n 274 memcpy(&line_coding_tmp, ctrl_buf, sizeof(struct usb_cdc_line_coding)); 2a0: 0032 movs r2, r6 2a2: 4c15 ldr r4, [pc, #84] ; (2f8 ) 2a4: a802 add r0, sp, #8 2a6: 47a0 blx r4 if ((NULL == cdcdf_acm_set_line_coding) || (true == cdcdf_acm_set_line_coding(&line_coding_tmp))) { 2a8: 692b ldr r3, [r5, #16] 2aa: 2b00 cmp r3, #0 2ac: d105 bne.n 2ba usbd_cdc_line_coding = line_coding_tmp; 2ae: 2207 movs r2, #7 2b0: 1da8 adds r0, r5, #6 2b2: a902 add r1, sp, #8 2b4: 47a0 blx r4 return ERR_NONE; 2b6: 2000 movs r0, #0 2b8: e7e0 b.n 27c if ((NULL == cdcdf_acm_set_line_coding) || (true == cdcdf_acm_set_line_coding(&line_coding_tmp))) { 2ba: a802 add r0, sp, #8 2bc: 4798 blx r3 2be: 2800 cmp r0, #0 2c0: d1f5 bne.n 2ae 2c2: e7f8 b.n 2b6 usbdc_xfer(0, NULL, 0, 0); 2c4: 2300 movs r3, #0 2c6: 4e0a ldr r6, [pc, #40] ; (2f0 ) 2c8: 001a movs r2, r3 2ca: 0019 movs r1, r3 2cc: 0018 movs r0, r3 2ce: 47b0 blx r6 if (NULL != cdcdf_acm_notify_state) { 2d0: 696b ldr r3, [r5, #20] 2d2: 2b00 cmp r3, #0 2d4: d0ef beq.n 2b6 cdcdf_acm_notify_state(req->wValue); 2d6: 78e0 ldrb r0, [r4, #3] 2d8: 78a2 ldrb r2, [r4, #2] 2da: 0200 lsls r0, r0, #8 2dc: 4310 orrs r0, r2 2de: 4798 blx r3 2e0: e7e9 b.n 2b6 return ERR_NOT_FOUND; 2e2: 200a movs r0, #10 return ERR_INVALID_DATA; 2e4: 4240 negs r0, r0 2e6: e7c9 b.n 27c 2e8: 2001 movs r0, #1 2ea: e7fb b.n 2e4 2ec: 200000e8 .word 0x200000e8 2f0: 00002001 .word 0x00002001 2f4: 00002429 .word 0x00002429 2f8: 0000261d .word 0x0000261d 000002fc : { 2fc: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} 2fe: 0015 movs r5, r2 switch (ctrl) { 300: 2901 cmp r1, #1 302: d04f beq.n 3a4 304: 2902 cmp r1, #2 306: d100 bne.n 30a 308: e076 b.n 3f8 30a: 2900 cmp r1, #0 30c: d000 beq.n 310 30e: e075 b.n 3fc return cdcdf_acm_enable(drv, (struct usbd_descriptors *)param); 310: 6883 ldr r3, [r0, #8] ifc = desc->sod; 312: 6810 ldr r0, [r2, #0] 314: 001e movs r6, r3 316: 9300 str r3, [sp, #0] for (i = 0; i < 2; i++) { 318: 3302 adds r3, #2 31a: 9301 str r3, [sp, #4] if (NULL == ifc) { 31c: 2800 cmp r0, #0 31e: d102 bne.n 326 return ERR_NOT_FOUND; 320: 200a movs r0, #10 return ERR_NOT_INITIALIZED; 322: 4240 negs r0, r0 324: e020 b.n 368 if ((CDC_CLASS_COMM == ifc_desc.bInterfaceClass) || (CDC_CLASS_DATA == ifc_desc.bInterfaceClass)) { 326: 2108 movs r1, #8 328: 7943 ldrb r3, [r0, #5] ifc_desc.bInterfaceNumber = ifc[2]; 32a: 7882 ldrb r2, [r0, #2] if ((CDC_CLASS_COMM == ifc_desc.bInterfaceClass) || (CDC_CLASS_DATA == ifc_desc.bInterfaceClass)) { 32c: 438b bics r3, r1 32e: 2b02 cmp r3, #2 330: d1f6 bne.n 320 if (func_data->func_iface[i] == ifc_desc.bInterfaceNumber) { // Initialized 332: 7833 ldrb r3, [r6, #0] 334: 429a cmp r2, r3 336: d063 beq.n 400 } else if (func_data->func_iface[i] != 0xFF) { // Occupied 338: 2bff cmp r3, #255 ; 0xff 33a: d163 bne.n 404 func_data->func_iface[i] = ifc_desc.bInterfaceNumber; 33c: 7032 strb r2, [r6, #0] ep = usb_find_desc(ifc, desc->eod, USB_DT_ENDPOINT); 33e: 6869 ldr r1, [r5, #4] 340: 2205 movs r2, #5 342: 4b32 ldr r3, [pc, #200] ; (40c ) 344: 4798 blx r3 ep = usb_find_ep_desc(usb_desc_next(desc->sod), desc->eod); 346: 1e04 subs r4, r0, #0 while (NULL != ep) { 348: d10f bne.n 36a ifc = usb_find_desc(usb_desc_next(desc->sod), desc->eod, USB_DT_INTERFACE); 34a: 6828 ldr r0, [r5, #0] 34c: 2204 movs r2, #4 * \param[in] desc Byte pointer to the descriptor start address * \return Byte pointer to the next descriptor */ static inline uint8_t *usb_desc_next(uint8_t *desc) { return (desc + usb_desc_len(desc)); 34e: 7803 ldrb r3, [r0, #0] 350: 6869 ldr r1, [r5, #4] 352: 18c0 adds r0, r0, r3 354: 4b2d ldr r3, [pc, #180] ; (40c ) 356: 4798 blx r3 for (i = 0; i < 2; i++) { 358: 9b01 ldr r3, [sp, #4] 35a: 3601 adds r6, #1 35c: 42b3 cmp r3, r6 35e: d1dd bne.n 31c _cdcdf_acm_funcd.enabled = true; 360: 2201 movs r2, #1 return ERR_NONE; 362: 0020 movs r0, r4 _cdcdf_acm_funcd.enabled = true; 364: 4b2a ldr r3, [pc, #168] ; (410 ) 366: 715a strb r2, [r3, #5] } 368: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc} return (ptr[0] + (ptr[1] << 8)); 36a: 7963 ldrb r3, [r4, #5] 36c: 7922 ldrb r2, [r4, #4] 36e: 021b lsls r3, r3, #8 ep_desc.bEndpointAddress = ep[2]; 370: 78a7 ldrb r7, [r4, #2] 372: 18d2 adds r2, r2, r3 if (usb_d_ep_init(ep_desc.bEndpointAddress, ep_desc.bmAttributes, ep_desc.wMaxPacketSize)) { 374: 0038 movs r0, r7 376: 78e1 ldrb r1, [r4, #3] 378: 4b26 ldr r3, [pc, #152] ; (414 ) 37a: b292 uxth r2, r2 37c: 4798 blx r3 37e: 2800 cmp r0, #0 380: d142 bne.n 408 if (ep_desc.bEndpointAddress & USB_EP_DIR_IN) { 382: b27b sxtb r3, r7 384: 4a24 ldr r2, [pc, #144] ; (418 ) 386: 2b00 cmp r3, #0 388: da09 bge.n 39e func_data->func_ep_in[i] = ep_desc.bEndpointAddress; 38a: 70b7 strb r7, [r6, #2] usb_d_ep_enable(func_data->func_ep_out); 38c: 0038 movs r0, r7 38e: 4790 blx r2 desc->sod = ep; 390: 602c str r4, [r5, #0] return (desc + usb_desc_len(desc)); 392: 7820 ldrb r0, [r4, #0] ep = usb_find_ep_desc(usb_desc_next(desc->sod), desc->eod); 394: 6869 ldr r1, [r5, #4] 396: 4b21 ldr r3, [pc, #132] ; (41c ) 398: 1820 adds r0, r4, r0 39a: 4798 blx r3 39c: e7d3 b.n 346 func_data->func_ep_out = ep_desc.bEndpointAddress; 39e: 9b00 ldr r3, [sp, #0] 3a0: 711f strb r7, [r3, #4] 3a2: e7f3 b.n 38c return cdcdf_acm_disable(drv, (struct usbd_descriptors *)param); 3a4: 6884 ldr r4, [r0, #8] if (desc) { 3a6: 2a00 cmp r2, #0 3a8: d005 beq.n 3b6 ifc_desc.bInterfaceClass = desc->sod[5]; 3aa: 6813 ldr r3, [r2, #0] if ((ifc_desc.bInterfaceClass != CDC_CLASS_COMM) && (ifc_desc.bInterfaceClass != CDC_CLASS_DATA)) { 3ac: 2208 movs r2, #8 3ae: 795b ldrb r3, [r3, #5] 3b0: 4393 bics r3, r2 3b2: 2b02 cmp r3, #2 3b4: d1b4 bne.n 320 if (func_data->func_iface[i] == 0xFF) { 3b6: 7823 ldrb r3, [r4, #0] 3b8: 2bff cmp r3, #255 ; 0xff 3ba: d007 beq.n 3cc func_data->func_iface[i] = 0xFF; 3bc: 25ff movs r5, #255 ; 0xff if (func_data->func_ep_in[i] != 0xFF) { 3be: 78a0 ldrb r0, [r4, #2] func_data->func_iface[i] = 0xFF; 3c0: 7025 strb r5, [r4, #0] if (func_data->func_ep_in[i] != 0xFF) { 3c2: 42a8 cmp r0, r5 3c4: d002 beq.n 3cc usb_d_ep_deinit(func_data->func_ep_in[i]); 3c6: 4b16 ldr r3, [pc, #88] ; (420 ) 3c8: 4798 blx r3 func_data->func_ep_in[i] = 0xFF; 3ca: 70a5 strb r5, [r4, #2] if (func_data->func_iface[i] == 0xFF) { 3cc: 7863 ldrb r3, [r4, #1] 3ce: 2bff cmp r3, #255 ; 0xff 3d0: d007 beq.n 3e2 func_data->func_iface[i] = 0xFF; 3d2: 25ff movs r5, #255 ; 0xff if (func_data->func_ep_in[i] != 0xFF) { 3d4: 78e0 ldrb r0, [r4, #3] func_data->func_iface[i] = 0xFF; 3d6: 7065 strb r5, [r4, #1] if (func_data->func_ep_in[i] != 0xFF) { 3d8: 42a8 cmp r0, r5 3da: d002 beq.n 3e2 usb_d_ep_deinit(func_data->func_ep_in[i]); 3dc: 4b10 ldr r3, [pc, #64] ; (420 ) 3de: 4798 blx r3 func_data->func_ep_in[i] = 0xFF; 3e0: 70e5 strb r5, [r4, #3] if (func_data->func_ep_out != 0xFF) { 3e2: 7920 ldrb r0, [r4, #4] 3e4: 28ff cmp r0, #255 ; 0xff 3e6: d003 beq.n 3f0 usb_d_ep_deinit(func_data->func_ep_out); 3e8: 4b0d ldr r3, [pc, #52] ; (420 ) 3ea: 4798 blx r3 func_data->func_ep_out = 0xFF; 3ec: 23ff movs r3, #255 ; 0xff 3ee: 7123 strb r3, [r4, #4] _cdcdf_acm_funcd.enabled = false; 3f0: 2000 movs r0, #0 3f2: 4b07 ldr r3, [pc, #28] ; (410 ) 3f4: 7158 strb r0, [r3, #5] return ERR_NONE; 3f6: e7b7 b.n 368 return ERR_UNSUPPORTED_OP; 3f8: 201b movs r0, #27 3fa: e792 b.n 322 switch (ctrl) { 3fc: 200d movs r0, #13 3fe: e790 b.n 322 return ERR_ALREADY_INITIALIZED; 400: 2012 movs r0, #18 402: e78e b.n 322 return ERR_NO_RESOURCE; 404: 201c movs r0, #28 406: e78c b.n 322 return ERR_NOT_INITIALIZED; 408: 2014 movs r0, #20 40a: e78a b.n 322 40c: 0000162d .word 0x0000162d 410: 200000e8 .word 0x200000e8 414: 0000193d .word 0x0000193d 418: 000019cd .word 0x000019cd 41c: 00001647 .word 0x00001647 420: 000019a1 .word 0x000019a1 00000424 : /** * \brief Initialize the USB CDC ACM Function Driver */ int32_t cdcdf_acm_init(void) { 424: b510 push {r4, lr} if (usbdc_get_state() > USBD_S_POWER) { 426: 4b0a ldr r3, [pc, #40] ; (450 ) 428: 4798 blx r3 42a: 2801 cmp r0, #1 42c: d80c bhi.n 448 return ERR_DENIED; } _cdcdf_acm.ctrl = cdcdf_acm_ctrl; 42e: 4809 ldr r0, [pc, #36] ; (454 ) 430: 4b09 ldr r3, [pc, #36] ; (458 ) _cdcdf_acm.func_data = &_cdcdf_acm_funcd; 432: 6200 str r0, [r0, #32] _cdcdf_acm.ctrl = cdcdf_acm_ctrl; 434: 61c3 str r3, [r0, #28] usbdc_register_function(&_cdcdf_acm); 436: 4b09 ldr r3, [pc, #36] ; (45c ) 438: 3018 adds r0, #24 43a: 4798 blx r3 usbdc_register_handler(USBDC_HDL_REQ, &cdcdf_acm_req_h); 43c: 2001 movs r0, #1 43e: 4908 ldr r1, [pc, #32] ; (460 ) 440: 4b08 ldr r3, [pc, #32] ; (464 ) 442: 4798 blx r3 return ERR_NONE; 444: 2000 movs r0, #0 } 446: bd10 pop {r4, pc} return ERR_DENIED; 448: 2011 movs r0, #17 44a: 4240 negs r0, r0 44c: e7fb b.n 446 44e: 46c0 nop ; (mov r8, r8) 450: 00002435 .word 0x00002435 454: 200000e8 .word 0x200000e8 458: 000002fd .word 0x000002fd 45c: 000023d1 .word 0x000023d1 460: 20000000 .word 0x20000000 464: 00002345 .word 0x00002345 00000468 : /** * \brief USB CDC ACM Function Write Data */ int32_t cdcdf_acm_write(uint8_t *buf, uint32_t size) { 468: b510 push {r4, lr} /** * \brief Check whether CDC ACM Function is enabled */ bool cdcdf_acm_is_enabled(void) { return _cdcdf_acm_funcd.enabled; 46a: 4b07 ldr r3, [pc, #28] ; (488 ) { 46c: 000a movs r2, r1 if (!cdcdf_acm_is_enabled()) { 46e: 7959 ldrb r1, [r3, #5] { 470: 0004 movs r4, r0 if (!cdcdf_acm_is_enabled()) { 472: 2900 cmp r1, #0 474: d005 beq.n 482 return usbdc_xfer(_cdcdf_acm_funcd.func_ep_in[CDCDF_ACM_DATA_EP_INDEX], buf, size, true); 476: 0021 movs r1, r4 478: 78d8 ldrb r0, [r3, #3] 47a: 4c04 ldr r4, [pc, #16] ; (48c ) 47c: 2301 movs r3, #1 47e: 47a0 blx r4 } 480: bd10 pop {r4, pc} return ERR_DENIED; 482: 2011 movs r0, #17 484: 4240 negs r0, r0 486: e7fb b.n 480 488: 200000e8 .word 0x200000e8 48c: 00002001 .word 0x00002001 00000490 : { 490: 000a movs r2, r1 492: b510 push {r4, lr} 494: 2803 cmp r0, #3 496: d810 bhi.n 4ba 498: 4b09 ldr r3, [pc, #36] ; (4c0 ) 49a: f002 f83f bl 251c <__gnu_thumb1_case_uqi> 49e: 0802 .short 0x0802 4a0: 0c0a .short 0x0c0a usb_d_ep_register_callback(_cdcdf_acm_funcd.func_ep_out, USB_D_EP_CB_XFER, func); 4a2: 7918 ldrb r0, [r3, #4] usb_d_ep_register_callback(_cdcdf_acm_funcd.func_ep_in[CDCDF_ACM_DATA_EP_INDEX], USB_D_EP_CB_XFER, func); 4a4: 2102 movs r1, #2 4a6: 4b07 ldr r3, [pc, #28] ; (4c4 ) 4a8: 4798 blx r3 return ERR_NONE; 4aa: 2000 movs r0, #0 } 4ac: bd10 pop {r4, pc} usb_d_ep_register_callback(_cdcdf_acm_funcd.func_ep_in[CDCDF_ACM_DATA_EP_INDEX], USB_D_EP_CB_XFER, func); 4ae: 78d8 ldrb r0, [r3, #3] 4b0: e7f8 b.n 4a4 cdcdf_acm_set_line_coding = (cdcdf_acm_set_line_coding_t)func; 4b2: 6119 str r1, [r3, #16] break; 4b4: e7f9 b.n 4aa cdcdf_acm_notify_state = (cdcdf_acm_notify_state_t)func; 4b6: 6159 str r1, [r3, #20] 4b8: e7f7 b.n 4aa return ERR_NONE; 4ba: 200d movs r0, #13 4bc: 4240 negs r0, r0 4be: e7f5 b.n 4ac 4c0: 200000e8 .word 0x200000e8 4c4: 00001b61 .word 0x00001b61 000004c8 : return _cdcdf_acm_funcd.enabled; 4c8: 4b01 ldr r3, [pc, #4] ; (4d0 ) 4ca: 7958 ldrb r0, [r3, #5] } 4cc: 4770 bx lr 4ce: 46c0 nop ; (mov r8, r8) 4d0: 200000e8 .word 0x200000e8 000004d4 <_sbrk>: extern caddr_t _sbrk(int incr) { static unsigned char *heap = NULL; unsigned char * prev_heap; if (heap == NULL) { 4d4: 4a05 ldr r2, [pc, #20] ; (4ec <_sbrk+0x18>) { 4d6: 0003 movs r3, r0 if (heap == NULL) { 4d8: 6811 ldr r1, [r2, #0] 4da: 2900 cmp r1, #0 4dc: d101 bne.n 4e2 <_sbrk+0xe> heap = (unsigned char *)&_end; 4de: 4904 ldr r1, [pc, #16] ; (4f0 <_sbrk+0x1c>) 4e0: 6011 str r1, [r2, #0] } prev_heap = heap; 4e2: 6810 ldr r0, [r2, #0] heap += incr; 4e4: 18c3 adds r3, r0, r3 4e6: 6013 str r3, [r2, #0] return (caddr_t)prev_heap; } 4e8: 4770 bx lr 4ea: 46c0 nop ; (mov r8, r8) 4ec: 2000010c .word 0x2000010c 4f0: 200026d0 .word 0x200026d0 000004f4 <_dummy_func_no_return>: static bool _dummy_func_no_return(uint32_t unused0, uint32_t unused1) { (void)unused0; (void)unused1; return false; } 4f4: 2000 movs r0, #0 4f6: 4770 bx lr 000004f8 <_usb_d_dev_wait_dfll_rdy>: */ static inline void _usb_d_dev_wait_dfll_rdy(void) { #define DFLL_READY_FLAG (SYSCTRL_PCLKSR_DFLLRDY | SYSCTRL_PCLKSR_DFLLLCKF | SYSCTRL_PCLKSR_DFLLLCKC) /* In USB recovery mode the status is not checked */ if (!(SYSCTRL->DFLLCTRL.reg & SYSCTRL_DFLLCTRL_USBCRM)) { 4f8: 4b07 ldr r3, [pc, #28] ; (518 <_usb_d_dev_wait_dfll_rdy+0x20>) 4fa: 8c9a ldrh r2, [r3, #36] ; 0x24 4fc: 0692 lsls r2, r2, #26 4fe: d504 bpl.n 50a <_usb_d_dev_wait_dfll_rdy+0x12> static inline hri_sysctrl_pclksr_reg_t hri_sysctrl_get_PCLKSR_reg(const void *const hw, hri_sysctrl_pclksr_reg_t mask) { uint32_t tmp; tmp = ((Sysctrl *)hw)->PCLKSR.reg; tmp &= mask; 500: 2210 movs r2, #16 tmp = ((Sysctrl *)hw)->PCLKSR.reg; 502: 68d9 ldr r1, [r3, #12] while (hri_sysctrl_get_PCLKSR_reg(SYSCTRL, DFLL_READY_FLAG) != DFLL_READY_FLAG) ; } else { while (hri_sysctrl_get_PCLKSR_reg(SYSCTRL, SYSCTRL_PCLKSR_DFLLRDY) != SYSCTRL_PCLKSR_DFLLRDY) 504: 4211 tst r1, r2 506: d0fc beq.n 502 <_usb_d_dev_wait_dfll_rdy+0xa> 508: e004 b.n 514 <_usb_d_dev_wait_dfll_rdy+0x1c> tmp &= mask; 50a: 21d0 movs r1, #208 ; 0xd0 tmp = ((Sysctrl *)hw)->PCLKSR.reg; 50c: 68da ldr r2, [r3, #12] tmp &= mask; 50e: 400a ands r2, r1 while (hri_sysctrl_get_PCLKSR_reg(SYSCTRL, DFLL_READY_FLAG) != DFLL_READY_FLAG) 510: 2ad0 cmp r2, #208 ; 0xd0 512: d1fb bne.n 50c <_usb_d_dev_wait_dfll_rdy+0x14> ; } } 514: 4770 bx lr 516: 46c0 nop ; (mov r8, r8) 518: 40000800 .word 0x40000800 0000051c <_usb_d_dev_ept>: * \param[in] epn Endpoint number. * \param[in] dir Endpoint direction. */ static inline struct _usb_d_dev_ep *_usb_d_dev_ept(uint8_t epn, bool dir) { uint8_t ep_index = (epn == 0) ? 0 : (dir ? (epn + CONF_USB_D_MAX_EP_N) : epn); 51c: 2800 cmp r0, #0 51e: d003 beq.n 528 <_usb_d_dev_ept+0xc> 520: 2900 cmp r1, #0 522: d001 beq.n 528 <_usb_d_dev_ept+0xc> 524: 3002 adds r0, #2 526: b2c0 uxtb r0, r0 return &dev_inst.ep[ep_index]; 528: 2314 movs r3, #20 52a: 3001 adds r0, #1 52c: 4358 muls r0, r3 52e: 4b01 ldr r3, [pc, #4] ; (534 <_usb_d_dev_ept+0x18>) 530: 18c0 adds r0, r0, r3 } 532: 4770 bx lr 534: 20000170 .word 0x20000170 00000538 <_usb_d_dev_handle_setup>: * \brief Handles setup received interrupt * \param[in] ept Pointer to endpoint information. */ static void _usb_d_dev_handle_setup(struct _usb_d_dev_ep *ept) { uint8_t epn = USB_EP_GET_N(ept->ep); 538: 230f movs r3, #15 { 53a: b570 push {r4, r5, r6, lr} 53c: 0001 movs r1, r0 uint8_t epn = USB_EP_GET_N(ept->ep); 53e: 7c80 ldrb r0, [r0, #18] bool is_ctrl = _usb_d_dev_ep_is_ctrl(ept); if (!is_ctrl) { 540: 2507 movs r5, #7 uint8_t epn = USB_EP_GET_N(ept->ep); 542: 4003 ands r3, r0 bool is_ctrl = _usb_d_dev_ep_is_ctrl(ept); 544: 001a movs r2, r3 546: 7ccc ldrb r4, [r1, #19] if (!is_ctrl) { 548: 3208 adds r2, #8 54a: 4025 ands r5, r4 54c: 015b lsls r3, r3, #5 54e: 2d01 cmp r5, #1 550: d008 beq.n 564 <_usb_d_dev_handle_setup+0x2c> } static inline void hri_usbendpoint_clear_EPINTFLAG_reg(const void *const hw, uint8_t submodule_index, hri_usbendpoint_epintflag_reg_t mask) { ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTFLAG.reg = mask; 552: 4914 ldr r1, [pc, #80] ; (5a4 <_usb_d_dev_handle_setup+0x6c>) 554: 0152 lsls r2, r2, #5 556: 1852 adds r2, r2, r1 558: 2110 movs r1, #16 55a: 71d1 strb r1, [r2, #7] } } static inline void hri_usbendpoint_clear_EPINTEN_RXSTP_bit(const void *const hw, uint8_t submodule_index) { ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENCLR.reg = USB_DEVICE_EPINTENSET_RXSTP; 55c: 4a12 ldr r2, [pc, #72] ; (5a8 <_usb_d_dev_handle_setup+0x70>) 55e: 189b adds r3, r3, r2 560: 7259 strb r1, [r3, #9] _usbd_ep_clear_bank_status(epn, 1); _usbd_ep_int_ack(epn, USB_D_BANK0_INT_FLAGS | USB_D_BANK1_INT_FLAGS); _usbd_ep_int_dis(epn, USB_D_BANK0_INT_FLAGS | USB_D_BANK1_INT_FLAGS); /* Invoke callback. */ dev_inst.ep_callbacks.setup(ept->ep); } 562: bd70 pop {r4, r5, r6, pc} if (_usb_d_dev_ep_is_busy(ept)) { 564: 2540 movs r5, #64 ; 0x40 566: 422c tst r4, r5 568: d006 beq.n 578 <_usb_d_dev_handle_setup+0x40> ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSCLR.reg = mask; 56a: 2680 movs r6, #128 ; 0x80 ept->flags.bits.is_busy = 0; 56c: 43ac bics r4, r5 56e: 74cc strb r4, [r1, #19] 570: 4c0d ldr r4, [pc, #52] ; (5a8 <_usb_d_dev_handle_setup+0x70>) 572: 191c adds r4, r3, r4 574: 7166 strb r6, [r4, #5] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSSET.reg = mask; 576: 71a5 strb r5, [r4, #6] ept->flags.bits.is_stalled = 0; 578: 2508 movs r5, #8 57a: 7ccc ldrb r4, [r1, #19] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTFLAG.reg = mask; 57c: 0152 lsls r2, r2, #5 57e: 43ac bics r4, r5 580: 74cc strb r4, [r1, #19] bank->STATUS_BK.reg = 0; 582: 2400 movs r4, #0 584: 4909 ldr r1, [pc, #36] ; (5ac <_usb_d_dev_handle_setup+0x74>) 586: 18c9 adds r1, r1, r3 588: 728c strb r4, [r1, #10] 58a: 768c strb r4, [r1, #26] 58c: 4905 ldr r1, [pc, #20] ; (5a4 <_usb_d_dev_handle_setup+0x6c>) 58e: 1852 adds r2, r2, r1 590: 216f movs r1, #111 ; 0x6f 592: 71d1 strb r1, [r2, #7] } static inline void hri_usbendpoint_clear_EPINTEN_reg(const void *const hw, uint8_t submodule_index, hri_usbendpoint_epintenset_reg_t mask) { ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENCLR.reg = mask; 594: 4a04 ldr r2, [pc, #16] ; (5a8 <_usb_d_dev_handle_setup+0x70>) 596: 189b adds r3, r3, r2 598: 7259 strb r1, [r3, #9] dev_inst.ep_callbacks.setup(ept->ep); 59a: 4b05 ldr r3, [pc, #20] ; (5b0 <_usb_d_dev_handle_setup+0x78>) 59c: 689b ldr r3, [r3, #8] 59e: 4798 blx r3 5a0: e7df b.n 562 <_usb_d_dev_handle_setup+0x2a> 5a2: 46c0 nop ; (mov r8, r8) 5a4: 41005000 .word 0x41005000 5a8: 410050ff .word 0x410050ff 5ac: 20000110 .word 0x20000110 5b0: 20000170 .word 0x20000170 000005b4 <_usb_d_dev_handle_stall>: _usbd_ep_int_dis(epn, USB_DEVICE_EPINTFLAG_STALL0 << bank_n); 5b4: 2320 movs r3, #32 5b6: 408b lsls r3, r1 hri_usbendpoint_clear_EPINTEN_reg(USB, epn, flags); 5b8: b2da uxtb r2, r3 5ba: 230f movs r3, #15 * \brief Handles stall sent interrupt * \param[in] ept Pointer to endpoint information. * \param[in] bank_n Bank number. */ static void _usb_d_dev_handle_stall(struct _usb_d_dev_ep *ept, const uint8_t bank_n) { 5bc: b510 push {r4, lr} 5be: 0004 movs r4, r0 uint8_t epn = USB_EP_GET_N(ept->ep); 5c0: 7c80 ldrb r0, [r0, #18] 5c2: 4905 ldr r1, [pc, #20] ; (5d8 <_usb_d_dev_handle_stall+0x24>) 5c4: 4003 ands r3, r0 5c6: 015b lsls r3, r3, #5 5c8: 185b adds r3, r3, r1 5ca: 725a strb r2, [r3, #9] /* Clear interrupt enable. Leave status there for status check. */ _usbd_ep_int_stall_en(epn, bank_n, false); dev_inst.ep_callbacks.done(ept->ep, USB_TRANS_STALL, ept->trans_count); 5cc: 4b03 ldr r3, [pc, #12] ; (5dc <_usb_d_dev_handle_stall+0x28>) 5ce: 2101 movs r1, #1 5d0: 691b ldr r3, [r3, #16] 5d2: 68a2 ldr r2, [r4, #8] 5d4: 4798 blx r3 } 5d6: bd10 pop {r4, pc} 5d8: 410050ff .word 0x410050ff 5dc: 20000170 .word 0x20000170 000005e0 <_usb_d_dev_trans_done>: * \brief Finish the transaction and invoke callback * \param[in, out] ept Pointer to endpoint information. * \param[in] code Information code passed. */ static void _usb_d_dev_trans_done(struct _usb_d_dev_ep *ept, const int32_t code) { 5e0: b510 push {r4, lr} 5e2: 0003 movs r3, r0 if (!(_usb_d_dev_ep_is_used(ept) && _usb_d_dev_ep_is_busy(ept))) { 5e4: 7c80 ldrb r0, [r0, #18] 5e6: 28ff cmp r0, #255 ; 0xff 5e8: d009 beq.n 5fe <_usb_d_dev_trans_done+0x1e> 5ea: 2440 movs r4, #64 ; 0x40 5ec: 7cda ldrb r2, [r3, #19] 5ee: 4222 tst r2, r4 5f0: d005 beq.n 5fe <_usb_d_dev_trans_done+0x1e> return; } ept->flags.bits.is_busy = 0; 5f2: 43a2 bics r2, r4 5f4: 74da strb r2, [r3, #19] dev_inst.ep_callbacks.done(ept->ep, code, ept->trans_count); 5f6: 4a02 ldr r2, [pc, #8] ; (600 <_usb_d_dev_trans_done+0x20>) 5f8: 6914 ldr r4, [r2, #16] 5fa: 689a ldr r2, [r3, #8] 5fc: 47a0 blx r4 } 5fe: bd10 pop {r4, pc} 600: 20000170 .word 0x20000170 00000604 <_usb_d_dev_trans_stop>: * \param[in, out] ept Pointer to endpoint information. * \param[in] dir Endpoint direction. * \param[in] code Information code passed. */ static void _usb_d_dev_trans_stop(struct _usb_d_dev_ep *ept, bool dir, const int32_t code) { 604: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} 606: 4694 mov ip, r2 uint8_t epn = USB_EP_GET_N(ept->ep); 608: 7c83 ldrb r3, [r0, #18] ; const uint8_t intflags[2] = {USB_D_BANK0_INT_FLAGS, USB_D_BANK1_INT_FLAGS}; 60a: 4a13 ldr r2, [pc, #76] ; (658 <_usb_d_dev_trans_stop+0x54>) 60c: ae01 add r6, sp, #4 { 60e: 000d movs r5, r1 const uint8_t intflags[2] = {USB_D_BANK0_INT_FLAGS, USB_D_BANK1_INT_FLAGS}; 610: 8032 strh r2, [r6, #0] if (!(_usb_d_dev_ep_is_used(ept) && _usb_d_dev_ep_is_busy(ept))) { 612: 2bff cmp r3, #255 ; 0xff 614: d01a beq.n 64c <_usb_d_dev_trans_stop+0x48> 616: 2740 movs r7, #64 ; 0x40 618: 7cc2 ldrb r2, [r0, #19] 61a: 423a tst r2, r7 61c: d016 beq.n 64c <_usb_d_dev_trans_stop+0x48> ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSCLR.reg = mask; 61e: 220f movs r2, #15 620: 4013 ands r3, r2 622: 001c movs r4, r3 624: 3408 adds r4, #8 626: 0162 lsls r2, r4, #5 return; } /* Stop transfer */ if (dir) { 628: 2900 cmp r1, #0 62a: d010 beq.n 64e <_usb_d_dev_trans_stop+0x4a> 62c: 4f0b ldr r7, [pc, #44] ; (65c <_usb_d_dev_trans_stop+0x58>) 62e: 19d2 adds r2, r2, r7 630: 2780 movs r7, #128 ; 0x80 632: 7117 strb r7, [r2, #4] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTFLAG.reg = mask; 634: 4909 ldr r1, [pc, #36] ; (65c <_usb_d_dev_trans_stop+0x58>) 636: 0164 lsls r4, r4, #5 638: 1864 adds r4, r4, r1 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENCLR.reg = mask; 63a: 4909 ldr r1, [pc, #36] ; (660 <_usb_d_dev_trans_stop+0x5c>) _usbd_ep_set_in_rdy(epn, 1, false); } else { /* NAK OUT */ _usbd_ep_set_out_rdy(epn, 0, false); } _usbd_ep_int_ack(epn, intflags[dir]); 63c: 5d72 ldrb r2, [r6, r5] 63e: 015b lsls r3, r3, #5 640: 185b adds r3, r3, r1 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTFLAG.reg = mask; 642: 71e2 strb r2, [r4, #7] _usbd_ep_int_dis(epn, intflags[dir]); _usb_d_dev_trans_done(ept, code); 644: 4661 mov r1, ip ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENCLR.reg = mask; 646: 725a strb r2, [r3, #9] 648: 4b06 ldr r3, [pc, #24] ; (664 <_usb_d_dev_trans_stop+0x60>) 64a: 4798 blx r3 } 64c: bdf7 pop {r0, r1, r2, r4, r5, r6, r7, pc} ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSSET.reg = mask; 64e: 4903 ldr r1, [pc, #12] ; (65c <_usb_d_dev_trans_stop+0x58>) 650: 1852 adds r2, r2, r1 652: 7157 strb r7, [r2, #5] } 654: e7ee b.n 634 <_usb_d_dev_trans_stop+0x30> 656: 46c0 nop ; (mov r8, r8) 658: 00004a25 .word 0x00004a25 65c: 41005000 .word 0x41005000 660: 410050ff .word 0x410050ff 664: 000005e1 .word 0x000005e1 00000668 <_usb_d_dev_handle_trfail>: { 668: b5f0 push {r4, r5, r6, r7, lr} 66a: 000d movs r5, r1 uint8_t epn = USB_EP_GET_N(ept->ep); 66c: 210f movs r1, #15 66e: 7c83 ldrb r3, [r0, #18] { 670: b085 sub sp, #20 uint8_t epn = USB_EP_GET_N(ept->ep); 672: 400b ands r3, r1 674: 469c mov ip, r3 const uint8_t fail[2] = {USB_DEVICE_EPINTFLAG_TRFAIL0, USB_DEVICE_EPINTFLAG_TRFAIL1}; 676: 4b30 ldr r3, [pc, #192] ; (738 <_usb_d_dev_handle_trfail+0xd0>) 678: ae03 add r6, sp, #12 67a: 8033 strh r3, [r6, #0] UsbDeviceDescBank *bank = prvt_inst.desc_table[epn].DeviceDescBank; 67c: 4663 mov r3, ip 67e: 015b lsls r3, r3, #5 680: 9300 str r3, [sp, #0] uint8_t eptype 682: 4663 mov r3, ip 684: 3308 adds r3, #8 686: 492d ldr r1, [pc, #180] ; (73c <_usb_d_dev_handle_trfail+0xd4>) static inline hri_usbendpoint_epcfg_reg_t hri_usbendpoint_read_EPCFG_EPTYPE1_bf(const void *const hw, uint8_t submodule_index) { uint8_t tmp; tmp = ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPCFG.reg; 688: 015c lsls r4, r3, #5 68a: 2d00 cmp r5, #0 68c: d020 beq.n 6d0 <_usb_d_dev_handle_trfail+0x68> 68e: 5d09 ldrb r1, [r1, r4] tmp = (tmp & USB_DEVICE_EPCFG_EPTYPE1_Msk) >> USB_DEVICE_EPCFG_EPTYPE1_Pos; 690: 0649 lsls r1, r1, #25 692: 0f49 lsrs r1, r1, #29 st.reg = bank[bank_n].STATUS_BK.reg; 694: 9a00 ldr r2, [sp, #0] 696: 012c lsls r4, r5, #4 698: 18a4 adds r4, r4, r2 69a: 4a29 ldr r2, [pc, #164] ; (740 <_usb_d_dev_handle_trfail+0xd8>) hri_usbendpoint_clear_EPINTFLAG_reg(hw, epn, fail[bank_n]); 69c: 5d76 ldrb r6, [r6, r5] st.reg = bank[bank_n].STATUS_BK.reg; 69e: 1914 adds r4, r2, r4 6a0: 7aa7 ldrb r7, [r4, #10] 6a2: b2ff uxtb r7, r7 if ((eptype == USB_D_EPTYPE_ISOCH) && st.bit.CRCERR) { 6a4: 2902 cmp r1, #2 6a6: d117 bne.n 6d8 <_usb_d_dev_handle_trfail+0x70> 6a8: 3901 subs r1, #1 6aa: 420f tst r7, r1 6ac: d014 beq.n 6d8 <_usb_d_dev_handle_trfail+0x70> bank[bank_n].STATUS_BK.bit.CRCERR = 0; 6ae: 7aa7 ldrb r7, [r4, #10] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTFLAG.reg = mask; 6b0: 4a22 ldr r2, [pc, #136] ; (73c <_usb_d_dev_handle_trfail+0xd4>) 6b2: 015b lsls r3, r3, #5 6b4: 189b adds r3, r3, r2 6b6: 438f bics r7, r1 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENCLR.reg = mask; 6b8: 9a00 ldr r2, [sp, #0] 6ba: 72a7 strb r7, [r4, #10] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTFLAG.reg = mask; 6bc: 71de strb r6, [r3, #7] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENCLR.reg = mask; 6be: 4b21 ldr r3, [pc, #132] ; (744 <_usb_d_dev_handle_trfail+0xdc>) _usb_d_dev_trans_stop(ept, bank_n, USB_TRANS_ERROR); 6c0: 4029 ands r1, r5 6c2: 18d2 adds r2, r2, r3 6c4: 7256 strb r6, [r2, #9] 6c6: 2204 movs r2, #4 _usb_d_dev_trans_stop(ept, _usb_d_dev_ep_is_in(ept), USB_TRANS_DONE); 6c8: 4b1f ldr r3, [pc, #124] ; (748 <_usb_d_dev_handle_trfail+0xe0>) 6ca: 4798 blx r3 } 6cc: b005 add sp, #20 6ce: bdf0 pop {r4, r5, r6, r7, pc} tmp = ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPCFG.reg; 6d0: 5d0c ldrb r4, [r1, r4] tmp = (tmp & USB_DEVICE_EPCFG_EPTYPE0_Msk) >> USB_DEVICE_EPCFG_EPTYPE0_Pos; 6d2: 2107 movs r1, #7 6d4: 4021 ands r1, r4 return tmp; 6d6: e7dd b.n 694 <_usb_d_dev_handle_trfail+0x2c> } else if (st.bit.ERRORFLOW) { 6d8: 2102 movs r1, #2 6da: 003a movs r2, r7 6dc: 400a ands r2, r1 6de: 9201 str r2, [sp, #4] 6e0: 420f tst r7, r1 6e2: d017 beq.n 714 <_usb_d_dev_handle_trfail+0xac> bank[bank_n].STATUS_BK.bit.ERRORFLOW = 0; 6e4: 7aa2 ldrb r2, [r4, #10] bool is_ctrl = _usb_d_dev_ep_is_ctrl(ept); 6e6: 7cc7 ldrb r7, [r0, #19] bank[bank_n].STATUS_BK.bit.ERRORFLOW = 0; 6e8: 438a bics r2, r1 6ea: 72a2 strb r2, [r4, #10] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTFLAG.reg = mask; 6ec: 4a13 ldr r2, [pc, #76] ; (73c <_usb_d_dev_handle_trfail+0xd4>) 6ee: 015b lsls r3, r3, #5 6f0: 189b adds r3, r3, r2 6f2: 71de strb r6, [r3, #7] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENCLR.reg = mask; 6f4: 9a00 ldr r2, [sp, #0] 6f6: 4b13 ldr r3, [pc, #76] ; (744 <_usb_d_dev_handle_trfail+0xdc>) 6f8: 18d2 adds r2, r2, r3 if (is_ctrl && _usb_d_dev_ep_is_busy(ept)) { 6fa: 2307 movs r3, #7 6fc: 7256 strb r6, [r2, #9] 6fe: 403b ands r3, r7 700: 2b01 cmp r3, #1 702: d1e3 bne.n 6cc <_usb_d_dev_handle_trfail+0x64> 704: 067b lsls r3, r7, #25 706: d5e1 bpl.n 6cc <_usb_d_dev_handle_trfail+0x64> if (bank_n != _usb_d_dev_ep_is_in(ept)) { 708: 7cc1 ldrb r1, [r0, #19] 70a: 09c9 lsrs r1, r1, #7 70c: 42a9 cmp r1, r5 70e: d0dd beq.n 6cc <_usb_d_dev_handle_trfail+0x64> _usb_d_dev_trans_stop(ept, _usb_d_dev_ep_is_in(ept), USB_TRANS_DONE); 710: 2200 movs r2, #0 712: e7d9 b.n 6c8 <_usb_d_dev_handle_trfail+0x60> bank->STATUS_BK.reg = 0; 714: 4662 mov r2, ip 716: 0051 lsls r1, r2, #1 718: 194d adds r5, r1, r5 71a: 4a09 ldr r2, [pc, #36] ; (740 <_usb_d_dev_handle_trfail+0xd8>) 71c: 012d lsls r5, r5, #4 71e: 1955 adds r5, r2, r5 720: 9a01 ldr r2, [sp, #4] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTFLAG.reg = mask; 722: 015b lsls r3, r3, #5 724: 72aa strb r2, [r5, #10] 726: 4a05 ldr r2, [pc, #20] ; (73c <_usb_d_dev_handle_trfail+0xd4>) 728: 189b adds r3, r3, r2 72a: 71de strb r6, [r3, #7] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENCLR.reg = mask; 72c: 9a00 ldr r2, [sp, #0] 72e: 4b05 ldr r3, [pc, #20] ; (744 <_usb_d_dev_handle_trfail+0xdc>) 730: 18d2 adds r2, r2, r3 732: 7256 strb r6, [r2, #9] } 734: e7ca b.n 6cc <_usb_d_dev_handle_trfail+0x64> 736: 46c0 nop ; (mov r8, r8) 738: 00000804 .word 0x00000804 73c: 41005000 .word 0x41005000 740: 20000110 .word 0x20000110 744: 410050ff .word 0x410050ff 748: 00000605 .word 0x00000605 0000074c <_usb_d_dev_reset_epts>: for (i = 0; i < USB_D_N_EP; i++) { 74c: 238c movs r3, #140 ; 0x8c { 74e: b570 push {r4, r5, r6, lr} dev_inst.ep[i].ep = 0xFF; 750: 26ff movs r6, #255 ; 0xff 752: 4d09 ldr r5, [pc, #36] ; (778 <_usb_d_dev_reset_epts+0x2c>) 754: 009b lsls r3, r3, #2 756: 4c09 ldr r4, [pc, #36] ; (77c <_usb_d_dev_reset_epts+0x30>) 758: 18ed adds r5, r5, r3 _usb_d_dev_trans_done(&dev_inst.ep[i], USB_TRANS_RESET); 75a: 2103 movs r1, #3 75c: 0020 movs r0, r4 75e: 4b08 ldr r3, [pc, #32] ; (780 <_usb_d_dev_reset_epts+0x34>) 760: 4798 blx r3 dev_inst.ep[i].flags.u8 = 0; 762: 2100 movs r1, #0 dev_inst.ep[i].ep = 0xFF; 764: 74a6 strb r6, [r4, #18] dev_inst.ep[i].flags.u8 = 0; 766: 74e1 strb r1, [r4, #19] for (i = 0; i < USB_D_N_EP; i++) { 768: 3414 adds r4, #20 76a: 42ac cmp r4, r5 76c: d1f5 bne.n 75a <_usb_d_dev_reset_epts+0xe> memset(prvt_inst.desc_table, 0, sizeof(UsbDeviceDescriptor) * (CONF_USB_D_MAX_EP_N + 1)); 76e: 2260 movs r2, #96 ; 0x60 770: 4b04 ldr r3, [pc, #16] ; (784 <_usb_d_dev_reset_epts+0x38>) 772: 4805 ldr r0, [pc, #20] ; (788 <_usb_d_dev_reset_epts+0x3c>) 774: 4798 blx r3 } 776: bd70 pop {r4, r5, r6, pc} 778: 20000170 .word 0x20000170 77c: 20000184 .word 0x20000184 780: 000005e1 .word 0x000005e1 784: 0000262f .word 0x0000262f 788: 20000110 .word 0x20000110 0000078c <_usb_d_dev_in_next>: { 78c: b5f0 push {r4, r5, r6, r7, lr} uint8_t epn = USB_EP_GET_N(ept->ep); 78e: 270f movs r7, #15 { 790: b085 sub sp, #20 792: 9101 str r1, [sp, #4] uint8_t epn = USB_EP_GET_N(ept->ep); 794: 7c83 ldrb r3, [r0, #18] { 796: 0004 movs r4, r0 uint8_t epn = USB_EP_GET_N(ept->ep); 798: 9302 str r3, [sp, #8] 79a: 401f ands r7, r3 uint16_t trans_count = isr ? bank[1].PCKSIZE.bit.BYTE_COUNT : 0; 79c: 2300 movs r3, #0 79e: 4299 cmp r1, r3 7a0: d005 beq.n 7ae <_usb_d_dev_in_next+0x22> UsbDeviceDescBank *bank = &prvt_inst.desc_table[epn].DeviceDescBank[0]; 7a2: 4b4b ldr r3, [pc, #300] ; (8d0 <_usb_d_dev_in_next+0x144>) 7a4: 017a lsls r2, r7, #5 7a6: 189b adds r3, r3, r2 uint16_t trans_count = isr ? bank[1].PCKSIZE.bit.BYTE_COUNT : 0; 7a8: 695b ldr r3, [r3, #20] 7aa: 049b lsls r3, r3, #18 7ac: 0c9b lsrs r3, r3, #18 uint16_t last_pkt = trans_count & ((ept->size == 1023) ? ept->size : (ept->size - 1)); 7ae: 8a25 ldrh r5, [r4, #16] 7b0: 4a48 ldr r2, [pc, #288] ; (8d4 <_usb_d_dev_in_next+0x148>) 7b2: 46ac mov ip, r5 7b4: 4295 cmp r5, r2 7b6: d002 beq.n 7be <_usb_d_dev_in_next+0x32> 7b8: 1e6a subs r2, r5, #1 7ba: b212 sxth r2, r2 7bc: 4694 mov ip, r2 bool is_ctrl = _usb_d_dev_ep_is_ctrl(ept); 7be: 2207 movs r2, #7 7c0: 7ce0 ldrb r0, [r4, #19] 7c2: 4002 ands r2, r0 7c4: 9203 str r2, [sp, #12] if (isr) { 7c6: 9a01 ldr r2, [sp, #4] 7c8: 2a00 cmp r2, #0 7ca: d004 beq.n 7d6 <_usb_d_dev_in_next+0x4a> ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTFLAG.reg = mask; 7cc: 4942 ldr r1, [pc, #264] ; (8d8 <_usb_d_dev_in_next+0x14c>) 7ce: 017a lsls r2, r7, #5 7d0: 1852 adds r2, r2, r1 7d2: 2102 movs r1, #2 7d4: 71d1 strb r1, [r2, #7] ept->trans_count += trans_count; 7d6: 68a2 ldr r2, [r4, #8] 7d8: 1899 adds r1, r3, r2 if (ept->trans_count < ept->trans_size) { 7da: 6862 ldr r2, [r4, #4] ept->trans_count += trans_count; 7dc: 60a1 str r1, [r4, #8] if (ept->trans_count < ept->trans_size) { 7de: 4291 cmp r1, r2 7e0: d240 bcs.n 864 <_usb_d_dev_in_next+0xd8> memcpy(ept->cache, &ept->trans_buf[ept->trans_count], trans_next); 7e2: 6823 ldr r3, [r4, #0] trans_next = ept->trans_size - ept->trans_count; 7e4: 1a52 subs r2, r2, r1 memcpy(ept->cache, &ept->trans_buf[ept->trans_count], trans_next); 7e6: 1859 adds r1, r3, r1 7e8: 017b lsls r3, r7, #5 7ea: 4e39 ldr r6, [pc, #228] ; (8d0 <_usb_d_dev_in_next+0x144>) trans_next = ept->trans_size - ept->trans_count; 7ec: b292 uxth r2, r2 if (ept->flags.bits.use_cache) { 7ee: 9302 str r3, [sp, #8] 7f0: 0683 lsls r3, r0, #26 7f2: d52c bpl.n 84e <_usb_d_dev_in_next+0xc2> if (trans_next > ept->size) { 7f4: 1c2b adds r3, r5, #0 7f6: 4295 cmp r5, r2 7f8: d900 bls.n 7fc <_usb_d_dev_in_next+0x70> 7fa: 1c13 adds r3, r2, #0 7fc: b29d uxth r5, r3 memcpy(ept->cache, &ept->trans_buf[ept->trans_count], trans_next); 7fe: 002a movs r2, r5 800: 4b36 ldr r3, [pc, #216] ; (8dc <_usb_d_dev_in_next+0x150>) 802: 68e0 ldr r0, [r4, #12] 804: 4798 blx r3 bank->ADDR.reg = addr; 806: 4b32 ldr r3, [pc, #200] ; (8d0 <_usb_d_dev_in_next+0x144>) _usbd_ep_set_buf(epn, 1, (uint32_t)ept->cache); 808: 68e2 ldr r2, [r4, #12] bank->ADDR.reg = addr; 80a: 0179 lsls r1, r7, #5 80c: 185b adds r3, r3, r1 80e: 611a str r2, [r3, #16] bank->PCKSIZE.bit.BYTE_COUNT = size; 810: 017b lsls r3, r7, #5 812: 18f6 adds r6, r6, r3 814: 6973 ldr r3, [r6, #20] 816: 04ad lsls r5, r5, #18 818: 0b9b lsrs r3, r3, #14 81a: 0caa lsrs r2, r5, #18 81c: 039d lsls r5, r3, #14 81e: 4315 orrs r5, r2 820: 6175 str r5, [r6, #20] bank->PCKSIZE.bit.MULTI_PACKET_SIZE = count; 822: 6973 ldr r3, [r6, #20] 824: 4a2e ldr r2, [pc, #184] ; (8e0 <_usb_d_dev_in_next+0x154>) 826: 4013 ands r3, r2 828: 6173 str r3, [r6, #20] if (!isr) { 82a: 9b01 ldr r3, [sp, #4] 82c: 2b00 cmp r3, #0 82e: d108 bne.n 842 <_usb_d_dev_in_next+0xb6> if (is_ctrl) { 830: 9b03 ldr r3, [sp, #12] inten = USB_D_BANK1_INT_FLAGS | USB_DEVICE_EPINTFLAG_TRFAIL0; 832: 224e movs r2, #78 ; 0x4e if (is_ctrl) { 834: 2b01 cmp r3, #1 836: d000 beq.n 83a <_usb_d_dev_in_next+0xae> inten = USB_D_BANK1_INT_FLAGS; 838: 3a04 subs r2, #4 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENSET.reg = mask; 83a: 492a ldr r1, [pc, #168] ; (8e4 <_usb_d_dev_in_next+0x158>) 83c: 017b lsls r3, r7, #5 83e: 185b adds r3, r3, r1 840: 729a strb r2, [r3, #10] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSSET.reg = mask; 842: 4a25 ldr r2, [pc, #148] ; (8d8 <_usb_d_dev_in_next+0x14c>) 844: 017b lsls r3, r7, #5 846: 189b adds r3, r3, r2 848: 2280 movs r2, #128 ; 0x80 84a: 715a strb r2, [r3, #5] } 84c: e039 b.n 8c2 <_usb_d_dev_in_next+0x136> if (trans_next > USB_D_DEV_TRANS_MAX) { 84e: 2380 movs r3, #128 ; 0x80 850: 1c15 adds r5, r2, #0 852: 019b lsls r3, r3, #6 854: 429a cmp r2, r3 856: d900 bls.n 85a <_usb_d_dev_in_next+0xce> 858: 1c1d adds r5, r3, #0 bank->ADDR.reg = addr; 85a: 017b lsls r3, r7, #5 85c: 18f3 adds r3, r6, r3 85e: b2ad uxth r5, r5 860: 6119 str r1, [r3, #16] } 862: e7d5 b.n 810 <_usb_d_dev_in_next+0x84> } else if (ept->flags.bits.need_zlp) { 864: 2610 movs r6, #16 866: 017a lsls r2, r7, #5 868: 4230 tst r0, r6 86a: d00e beq.n 88a <_usb_d_dev_in_next+0xfe> ept->flags.bits.need_zlp = 0; 86c: 7ce3 ldrb r3, [r4, #19] bank->PCKSIZE.bit.MULTI_PACKET_SIZE = count; 86e: 491c ldr r1, [pc, #112] ; (8e0 <_usb_d_dev_in_next+0x154>) ept->flags.bits.need_zlp = 0; 870: 43b3 bics r3, r6 872: 74e3 strb r3, [r4, #19] bank->PCKSIZE.bit.BYTE_COUNT = size; 874: 4b16 ldr r3, [pc, #88] ; (8d0 <_usb_d_dev_in_next+0x144>) 876: 189a adds r2, r3, r2 878: 1992 adds r2, r2, r6 87a: 6853 ldr r3, [r2, #4] 87c: 0b9b lsrs r3, r3, #14 87e: 039b lsls r3, r3, #14 880: 6053 str r3, [r2, #4] bank->PCKSIZE.bit.MULTI_PACKET_SIZE = count; 882: 6853 ldr r3, [r2, #4] 884: 400b ands r3, r1 886: 6053 str r3, [r2, #4] goto _in_tx_exec; 888: e7cf b.n 82a <_usb_d_dev_in_next+0x9e> if (is_ctrl) { 88a: 9803 ldr r0, [sp, #12] 88c: 2801 cmp r0, #1 88e: d11a bne.n 8c6 <_usb_d_dev_in_next+0x13a> ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENCLR.reg = mask; 890: 4814 ldr r0, [pc, #80] ; (8e4 <_usb_d_dev_in_next+0x158>) 892: 1812 adds r2, r2, r0 894: 204b movs r0, #75 ; 0x4b 896: 7250 strb r0, [r2, #9] if (last_pkt == ept->size) { 898: 4662 mov r2, ip 89a: 4013 ands r3, r2 89c: 429d cmp r5, r3 89e: d10c bne.n 8ba <_usb_d_dev_in_next+0x12e> ept->flags.bits.is_busy = 0; 8a0: 2540 movs r5, #64 ; 0x40 8a2: 7ce3 ldrb r3, [r4, #19] if (dev_inst.ep_callbacks.more(ept->ep, ept->trans_count)) { 8a4: 9802 ldr r0, [sp, #8] ept->flags.bits.is_busy = 0; 8a6: 43ab bics r3, r5 8a8: 74e3 strb r3, [r4, #19] if (dev_inst.ep_callbacks.more(ept->ep, ept->trans_count)) { 8aa: 4b0f ldr r3, [pc, #60] ; (8e8 <_usb_d_dev_in_next+0x15c>) 8ac: 68db ldr r3, [r3, #12] 8ae: 4798 blx r3 8b0: 2800 cmp r0, #0 8b2: d106 bne.n 8c2 <_usb_d_dev_in_next+0x136> ept->flags.bits.is_busy = 1; 8b4: 7ce3 ldrb r3, [r4, #19] 8b6: 432b orrs r3, r5 8b8: 74e3 strb r3, [r4, #19] _usb_d_dev_trans_done(ept, USB_TRANS_DONE); 8ba: 2100 movs r1, #0 8bc: 0020 movs r0, r4 8be: 4b0b ldr r3, [pc, #44] ; (8ec <_usb_d_dev_in_next+0x160>) 8c0: 4798 blx r3 } 8c2: b005 add sp, #20 8c4: bdf0 pop {r4, r5, r6, r7, pc} 8c6: 4807 ldr r0, [pc, #28] ; (8e4 <_usb_d_dev_in_next+0x158>) 8c8: 1812 adds r2, r2, r0 8ca: 204a movs r0, #74 ; 0x4a 8cc: e7e3 b.n 896 <_usb_d_dev_in_next+0x10a> 8ce: 46c0 nop ; (mov r8, r8) 8d0: 20000110 .word 0x20000110 8d4: 000003ff .word 0x000003ff 8d8: 41005100 .word 0x41005100 8dc: 0000261d .word 0x0000261d 8e0: f0003fff .word 0xf0003fff 8e4: 410050ff .word 0x410050ff 8e8: 20000170 .word 0x20000170 8ec: 000005e1 .word 0x000005e1 000008f0 <_usb_d_dev_out_next>: uint8_t epn = USB_EP_GET_N(ept->ep); 8f0: 230f movs r3, #15 { 8f2: b5f0 push {r4, r5, r6, r7, lr} uint8_t epn = USB_EP_GET_N(ept->ep); 8f4: 7c85 ldrb r5, [r0, #18] { 8f6: b085 sub sp, #20 8f8: 0004 movs r4, r0 8fa: 000e movs r6, r1 uint8_t epn = USB_EP_GET_N(ept->ep); 8fc: 401d ands r5, r3 uint16_t trans_size = isr ? bank->PCKSIZE.bit.MULTI_PACKET_SIZE : 0; 8fe: 9103 str r1, [sp, #12] uint16_t last_trans = isr ? bank->PCKSIZE.bit.BYTE_COUNT : 0; 900: 9101 str r1, [sp, #4] uint16_t trans_size = isr ? bank->PCKSIZE.bit.MULTI_PACKET_SIZE : 0; 902: 2900 cmp r1, #0 904: d00a beq.n 91c <_usb_d_dev_out_next+0x2c> 906: 4b61 ldr r3, [pc, #388] ; (a8c <_usb_d_dev_out_next+0x19c>) 908: 016a lsls r2, r5, #5 90a: 189b adds r3, r3, r2 90c: 6859 ldr r1, [r3, #4] 90e: 0109 lsls r1, r1, #4 910: 0c8a lsrs r2, r1, #18 912: 9203 str r2, [sp, #12] uint16_t last_trans = isr ? bank->PCKSIZE.bit.BYTE_COUNT : 0; 914: 6859 ldr r1, [r3, #4] 916: 0489 lsls r1, r1, #18 918: 0c8b lsrs r3, r1, #18 91a: 9301 str r3, [sp, #4] uint16_t size_mask = (ept->size == 1023) ? 1023 : (ept->size - 1); 91c: 8a23 ldrh r3, [r4, #16] 91e: 9300 str r3, [sp, #0] 920: 9a00 ldr r2, [sp, #0] 922: 4b5b ldr r3, [pc, #364] ; (a90 <_usb_d_dev_out_next+0x1a0>) 924: 429a cmp r2, r3 926: d003 beq.n 930 <_usb_d_dev_out_next+0x40> 928: 0013 movs r3, r2 92a: 3b01 subs r3, #1 92c: b29b uxth r3, r3 92e: 9300 str r3, [sp, #0] uint16_t last_pkt = last_trans & size_mask; 930: 9b01 ldr r3, [sp, #4] 932: 9f00 ldr r7, [sp, #0] bool is_ctrl = _usb_d_dev_ep_is_ctrl(ept); 934: 7ce2 ldrb r2, [r4, #19] uint16_t last_pkt = last_trans & size_mask; 936: 401f ands r7, r3 bool is_ctrl = _usb_d_dev_ep_is_ctrl(ept); 938: 2307 movs r3, #7 93a: 4013 ands r3, r2 93c: 9302 str r3, [sp, #8] if (isr) { 93e: 2e00 cmp r6, #0 940: d004 beq.n 94c <_usb_d_dev_out_next+0x5c> ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTFLAG.reg = mask; 942: 4954 ldr r1, [pc, #336] ; (a94 <_usb_d_dev_out_next+0x1a4>) 944: 016b lsls r3, r5, #5 946: 185b adds r3, r3, r1 948: 2101 movs r1, #1 94a: 71d9 strb r1, [r3, #7] if (ept->flags.bits.use_cache && ept->trans_size) { 94c: 0693 lsls r3, r2, #26 94e: d50f bpl.n 970 <_usb_d_dev_out_next+0x80> 950: 6863 ldr r3, [r4, #4] 952: 2b00 cmp r3, #0 954: d00c beq.n 970 <_usb_d_dev_out_next+0x80> uint16_t buf_remain = ept->trans_size - ept->trans_count; 956: 68a2 ldr r2, [r4, #8] memcpy(&ept->trans_buf[ept->trans_count], ept->cache, (buf_remain > last_pkt) ? last_pkt : buf_remain); 958: 6821 ldr r1, [r4, #0] uint16_t buf_remain = ept->trans_size - ept->trans_count; 95a: 1a9b subs r3, r3, r2 memcpy(&ept->trans_buf[ept->trans_count], ept->cache, (buf_remain > last_pkt) ? last_pkt : buf_remain); 95c: 1888 adds r0, r1, r2 95e: 1c1a adds r2, r3, #0 960: b29b uxth r3, r3 962: 42bb cmp r3, r7 964: d900 bls.n 968 <_usb_d_dev_out_next+0x78> 966: 1c3a adds r2, r7, #0 968: 68e1 ldr r1, [r4, #12] 96a: 4b4b ldr r3, [pc, #300] ; (a98 <_usb_d_dev_out_next+0x1a8>) 96c: b292 uxth r2, r2 96e: 4798 blx r3 if (ept->trans_size == 0 && ept->flags.bits.need_zlp) { 970: 6863 ldr r3, [r4, #4] 972: 016a lsls r2, r5, #5 974: 4694 mov ip, r2 976: 2b00 cmp r3, #0 978: d12c bne.n 9d4 <_usb_d_dev_out_next+0xe4> 97a: 7ce2 ldrb r2, [r4, #19] 97c: 06d1 lsls r1, r2, #27 97e: d529 bpl.n 9d4 <_usb_d_dev_out_next+0xe4> ept->flags.bits.need_zlp = 0; 980: 3330 adds r3, #48 ; 0x30 982: 439a bics r2, r3 984: 3b10 subs r3, #16 986: 431a orrs r2, r3 988: 74e2 strb r2, [r4, #19] bank->ADDR.reg = addr; 98a: 4662 mov r2, ip 98c: 68e1 ldr r1, [r4, #12] 98e: 4b3f ldr r3, [pc, #252] ; (a8c <_usb_d_dev_out_next+0x19c>) bank->PCKSIZE.bit.MULTI_PACKET_SIZE = size; 990: 4842 ldr r0, [pc, #264] ; (a9c <_usb_d_dev_out_next+0x1ac>) bank->ADDR.reg = addr; 992: 5099 str r1, [r3, r2] bank->PCKSIZE.bit.MULTI_PACKET_SIZE = size; 994: 8a21 ldrh r1, [r4, #16] 996: 4463 add r3, ip 998: 685a ldr r2, [r3, #4] 99a: 0489 lsls r1, r1, #18 99c: 0909 lsrs r1, r1, #4 99e: 4002 ands r2, r0 9a0: 430a orrs r2, r1 9a2: 605a str r2, [r3, #4] bank->PCKSIZE.bit.BYTE_COUNT = count; 9a4: 685a ldr r2, [r3, #4] 9a6: 0b92 lsrs r2, r2, #14 9a8: 0392 lsls r2, r2, #14 9aa: 605a str r2, [r3, #4] if (!isr) { 9ac: 2e00 cmp r6, #0 9ae: d10b bne.n 9c8 <_usb_d_dev_out_next+0xd8> if (is_ctrl) { 9b0: 9902 ldr r1, [sp, #8] inten = USB_D_BANK0_INT_FLAGS; 9b2: 2225 movs r2, #37 ; 0x25 9b4: 016b lsls r3, r5, #5 if (is_ctrl) { 9b6: 2901 cmp r1, #1 9b8: d103 bne.n 9c2 <_usb_d_dev_out_next+0xd2> bank->STATUS_BK.reg = 0; 9ba: 4a34 ldr r2, [pc, #208] ; (a8c <_usb_d_dev_out_next+0x19c>) 9bc: 18d2 adds r2, r2, r3 9be: 7696 strb r6, [r2, #26] inten = USB_D_BANK0_INT_FLAGS | USB_DEVICE_EPINTFLAG_TRFAIL1; 9c0: 222d movs r2, #45 ; 0x2d ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENSET.reg = mask; 9c2: 4937 ldr r1, [pc, #220] ; (aa0 <_usb_d_dev_out_next+0x1b0>) 9c4: 185b adds r3, r3, r1 9c6: 729a strb r2, [r3, #10] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSCLR.reg = mask; 9c8: 4b32 ldr r3, [pc, #200] ; (a94 <_usb_d_dev_out_next+0x1a4>) 9ca: 016d lsls r5, r5, #5 9cc: 18ed adds r5, r5, r3 9ce: 2340 movs r3, #64 ; 0x40 9d0: 712b strb r3, [r5, #4] } 9d2: e01d b.n a10 <_usb_d_dev_out_next+0x120> ept->trans_count += last_trans; 9d4: 68a1 ldr r1, [r4, #8] } else if (isr && last_pkt < ept->size) { 9d6: 2e00 cmp r6, #0 9d8: d01c beq.n a14 <_usb_d_dev_out_next+0x124> 9da: 8a22 ldrh r2, [r4, #16] 9dc: 42ba cmp r2, r7 9de: d919 bls.n a14 <_usb_d_dev_out_next+0x124> ept->flags.bits.need_zlp = 0; 9e0: 2210 movs r2, #16 9e2: 7ce3 ldrb r3, [r4, #19] 9e4: 4393 bics r3, r2 9e6: 74e3 strb r3, [r4, #19] ept->trans_count += last_trans; 9e8: 9b01 ldr r3, [sp, #4] 9ea: 1859 adds r1, r3, r1 9ec: 60a1 str r1, [r4, #8] if (is_ctrl) { 9ee: 9a02 ldr r2, [sp, #8] 9f0: 016b lsls r3, r5, #5 9f2: 2a01 cmp r2, #1 9f4: d146 bne.n a84 <_usb_d_dev_out_next+0x194> ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENCLR.reg = mask; 9f6: 4a2a ldr r2, [pc, #168] ; (aa0 <_usb_d_dev_out_next+0x1b0>) 9f8: 189b adds r3, r3, r2 9fa: 222d movs r2, #45 ; 0x2d 9fc: 725a strb r2, [r3, #9] if (0 == epn) { 9fe: 2d00 cmp r5, #0 a00: d102 bne.n a08 <_usb_d_dev_out_next+0x118> bank->ADDR.reg = addr; a02: 4b22 ldr r3, [pc, #136] ; (a8c <_usb_d_dev_out_next+0x19c>) a04: 68e2 ldr r2, [r4, #12] a06: 601a str r2, [r3, #0] _usb_d_dev_trans_done(ept, USB_TRANS_DONE); a08: 2100 movs r1, #0 a0a: 0020 movs r0, r4 a0c: 4b25 ldr r3, [pc, #148] ; (aa4 <_usb_d_dev_out_next+0x1b4>) a0e: 4798 blx r3 } a10: b005 add sp, #20 a12: bdf0 pop {r4, r5, r6, r7, pc} ept->trans_count += trans_size; a14: 9a03 ldr r2, [sp, #12] a16: 1851 adds r1, r2, r1 a18: 60a1 str r1, [r4, #8] if (ept->trans_count < ept->trans_size) { a1a: 428b cmp r3, r1 a1c: d9e7 bls.n 9ee <_usb_d_dev_out_next+0xfe> if (ept->flags.bits.use_cache) { a1e: 2020 movs r0, #32 a20: 7ce2 ldrb r2, [r4, #19] trans_next = ept->trans_size - ept->trans_count; a22: 1a5b subs r3, r3, r1 _usbd_ep_set_out_trans(epn, 0, ept->size, 0); a24: 8a27 ldrh r7, [r4, #16] trans_next = ept->trans_size - ept->trans_count; a26: b29b uxth r3, r3 if (ept->flags.bits.use_cache) { a28: 4202 tst r2, r0 a2a: d016 beq.n a5a <_usb_d_dev_out_next+0x16a> if (trans_next > ept->size) { a2c: 1c39 adds r1, r7, #0 a2e: 429f cmp r7, r3 a30: d900 bls.n a34 <_usb_d_dev_out_next+0x144> a32: 1c19 adds r1, r3, #0 _usbd_ep_set_buf(epn, 0, (uint32_t)ept->cache); a34: 68e0 ldr r0, [r4, #12] bank->ADDR.reg = addr; a36: 4a15 ldr r2, [pc, #84] ; (a8c <_usb_d_dev_out_next+0x19c>) a38: b28b uxth r3, r1 a3a: 0169 lsls r1, r5, #5 a3c: 5050 str r0, [r2, r1] bank->PCKSIZE.bit.MULTI_PACKET_SIZE = size; a3e: 4a13 ldr r2, [pc, #76] ; (a8c <_usb_d_dev_out_next+0x19c>) a40: 4816 ldr r0, [pc, #88] ; (a9c <_usb_d_dev_out_next+0x1ac>) a42: 4462 add r2, ip a44: 6851 ldr r1, [r2, #4] a46: 049b lsls r3, r3, #18 a48: 091b lsrs r3, r3, #4 a4a: 4001 ands r1, r0 a4c: 430b orrs r3, r1 a4e: 6053 str r3, [r2, #4] bank->PCKSIZE.bit.BYTE_COUNT = count; a50: 6853 ldr r3, [r2, #4] a52: 0b9b lsrs r3, r3, #14 a54: 039b lsls r3, r3, #14 a56: 6053 str r3, [r2, #4] goto _out_rx_exec; a58: e7a8 b.n 9ac <_usb_d_dev_out_next+0xbc> if (trans_next > ept->size) { a5a: 429f cmp r7, r3 a5c: d20b bcs.n a76 <_usb_d_dev_out_next+0x186> if (trans_next > USB_D_DEV_TRANS_MAX) { a5e: 2080 movs r0, #128 ; 0x80 a60: 0180 lsls r0, r0, #6 a62: 4283 cmp r3, r0 a64: d80c bhi.n a80 <_usb_d_dev_out_next+0x190> trans_next -= trans_next & size_mask; a66: 9a00 ldr r2, [sp, #0] a68: 4393 bics r3, r2 _usbd_ep_set_buf(epn, 0, (uint32_t)&ept->trans_buf[ept->trans_count]); a6a: 6820 ldr r0, [r4, #0] bank->ADDR.reg = addr; a6c: 4a07 ldr r2, [pc, #28] ; (a8c <_usb_d_dev_out_next+0x19c>) _usbd_ep_set_buf(epn, 0, (uint32_t)&ept->trans_buf[ept->trans_count]); a6e: 1841 adds r1, r0, r1 bank->ADDR.reg = addr; a70: 0168 lsls r0, r5, #5 a72: 5011 str r1, [r2, r0] } a74: e7e3 b.n a3e <_usb_d_dev_out_next+0x14e> } else if (trans_next < ept->size) { a76: 429f cmp r7, r3 a78: d9f7 bls.n a6a <_usb_d_dev_out_next+0x17a> ept->flags.bits.use_cache = 1; a7a: 4310 orrs r0, r2 a7c: 74e0 strb r0, [r4, #19] a7e: e7f4 b.n a6a <_usb_d_dev_out_next+0x17a> trans_next = USB_D_DEV_TRANS_MAX; a80: 0003 movs r3, r0 a82: e7f2 b.n a6a <_usb_d_dev_out_next+0x17a> a84: 4a06 ldr r2, [pc, #24] ; (aa0 <_usb_d_dev_out_next+0x1b0>) a86: 189b adds r3, r3, r2 a88: 2225 movs r2, #37 ; 0x25 a8a: e7b7 b.n 9fc <_usb_d_dev_out_next+0x10c> a8c: 20000110 .word 0x20000110 a90: 000003ff .word 0x000003ff a94: 41005100 .word 0x41005100 a98: 0000261d .word 0x0000261d a9c: f0003fff .word 0xf0003fff aa0: 410050ff .word 0x410050ff aa4: 000005e1 .word 0x000005e1 00000aa8 <_usbd_ep_pcksize_size>: : ((n > 256) ? 6 : ((n > 128) ? 5 : ((n > 64) ? 4 : ((n > 32) ? 3 : ((n > 16) ? 2 : ((n > 8) ? 1 : 0))))))); aa8: 2380 movs r3, #128 ; 0x80 { aaa: 0002 movs r2, r0 : ((n > 256) ? 6 : ((n > 128) ? 5 : ((n > 64) ? 4 : ((n > 32) ? 3 : ((n > 16) ? 2 : ((n > 8) ? 1 : 0))))))); aac: 009b lsls r3, r3, #2 aae: 2007 movs r0, #7 ab0: 429a cmp r2, r3 ab2: d814 bhi.n ade <_usbd_ep_pcksize_size+0x36> ab4: 3b01 subs r3, #1 ab6: 3bff subs r3, #255 ; 0xff ab8: 3801 subs r0, #1 aba: 429a cmp r2, r3 abc: d80f bhi.n ade <_usbd_ep_pcksize_size+0x36> abe: 3801 subs r0, #1 ac0: 2a80 cmp r2, #128 ; 0x80 ac2: d80c bhi.n ade <_usbd_ep_pcksize_size+0x36> ac4: 3801 subs r0, #1 ac6: 2a40 cmp r2, #64 ; 0x40 ac8: d809 bhi.n ade <_usbd_ep_pcksize_size+0x36> aca: 3801 subs r0, #1 acc: 2a20 cmp r2, #32 ace: d806 bhi.n ade <_usbd_ep_pcksize_size+0x36> ad0: 3801 subs r0, #1 ad2: 2a10 cmp r2, #16 ad4: d803 bhi.n ade <_usbd_ep_pcksize_size+0x36> ad6: 3006 adds r0, #6 ad8: 4290 cmp r0, r2 ada: 4180 sbcs r0, r0 adc: 4240 negs r0, r0 } ade: 4770 bx lr 00000ae0 <_usb_d_dev_init>: { ae0: b510 push {r4, lr} return ((Usb *)hw)->DEVICE.SYNCBUSY.reg & reg; ae2: 4c2a ldr r4, [pc, #168] ; (b8c <_usb_d_dev_init+0xac>) ae4: 78a3 ldrb r3, [r4, #2] if (!hri_usbdevice_is_syncing(hw, USB_SYNCBUSY_SWRST)) { ae6: 07db lsls r3, r3, #31 ae8: d418 bmi.n b1c <_usb_d_dev_init+0x3c> while (((Usb *)hw)->DEVICE.SYNCBUSY.reg & reg) { aea: 2303 movs r3, #3 aec: 78a2 ldrb r2, [r4, #2] aee: 421a tst r2, r3 af0: d1fc bne.n aec <_usb_d_dev_init+0xc> static inline hri_usb_ctrla_reg_t hri_usb_get_CTRLA_reg(const void *const hw, hri_usb_ctrla_reg_t mask) { uint8_t tmp; hri_usb_wait_for_sync(hw, USB_SYNCBUSY_MASK); tmp = ((Usb *)hw)->HOST.CTRLA.reg; tmp &= mask; af2: 2202 movs r2, #2 tmp = ((Usb *)hw)->HOST.CTRLA.reg; af4: 7823 ldrb r3, [r4, #0] if (hri_usbdevice_get_CTRLA_reg(hw, USB_CTRLA_ENABLE)) { af6: 4213 tst r3, r2 af8: d00a beq.n b10 <_usb_d_dev_init+0x30> ((Usb *)hw)->HOST.CTRLA.reg &= ~USB_CTRLA_ENABLE; afa: 7823 ldrb r3, [r4, #0] afc: 4393 bics r3, r2 afe: 7023 strb r3, [r4, #0] while (((Usb *)hw)->DEVICE.SYNCBUSY.reg & reg) { b00: 2303 movs r3, #3 b02: 78a2 ldrb r2, [r4, #2] b04: 421a tst r2, r3 b06: d1fc bne.n b02 <_usb_d_dev_init+0x22> b08: 2302 movs r3, #2 b0a: 78a2 ldrb r2, [r4, #2] b0c: 421a tst r2, r3 b0e: d1fc bne.n b0a <_usb_d_dev_init+0x2a> } static inline void hri_usb_write_CTRLA_reg(const void *const hw, hri_usb_ctrla_reg_t data) { USB_CRITICAL_SECTION_ENTER(); ((Usb *)hw)->HOST.CTRLA.reg = data; b10: 2301 movs r3, #1 b12: 7023 strb r3, [r4, #0] while (((Usb *)hw)->DEVICE.SYNCBUSY.reg & reg) { b14: 3302 adds r3, #2 b16: 78a2 ldrb r2, [r4, #2] b18: 421a tst r2, r3 b1a: d1fc bne.n b16 <_usb_d_dev_init+0x36> b1c: 2301 movs r3, #1 b1e: 78a2 ldrb r2, [r4, #2] b20: 421a tst r2, r3 b22: d1fc bne.n b1e <_usb_d_dev_init+0x3e> dev_inst.callbacks.sof = (_usb_d_dev_sof_cb_t)_dummy_func_no_return; b24: 4b1a ldr r3, [pc, #104] ; (b90 <_usb_d_dev_init+0xb0>) b26: 4a1b ldr r2, [pc, #108] ; (b94 <_usb_d_dev_init+0xb4>) b28: 601a str r2, [r3, #0] dev_inst.callbacks.event = (_usb_d_dev_event_cb_t)_dummy_func_no_return; b2a: 605a str r2, [r3, #4] dev_inst.ep_callbacks.setup = (_usb_d_dev_ep_cb_setup_t)_dummy_func_no_return; b2c: 609a str r2, [r3, #8] dev_inst.ep_callbacks.more = (_usb_d_dev_ep_cb_more_t)_dummy_func_no_return; b2e: 60da str r2, [r3, #12] dev_inst.ep_callbacks.done = (_usb_d_dev_ep_cb_done_t)_dummy_func_no_return; b30: 611a str r2, [r3, #16] _usb_d_dev_reset_epts(); b32: 4b19 ldr r3, [pc, #100] ; (b98 <_usb_d_dev_init+0xb8>) b34: 4798 blx r3 uint32_t pad_transn b36: 201f movs r0, #31 = (*((uint32_t *)(NVMCTRL_OTP4) + (NVM_USB_PAD_TRANSN_POS / 32)) >> (NVM_USB_PAD_TRANSN_POS % 32)) b38: 4b18 ldr r3, [pc, #96] ; (b9c <_usb_d_dev_init+0xbc>) b3a: 681a ldr r2, [r3, #0] b3c: 0b53 lsrs r3, r2, #13 = (*((uint32_t *)(NVMCTRL_OTP4) + (NVM_USB_PAD_TRANSP_POS / 32)) >> (NVM_USB_PAD_TRANSP_POS % 32)) b3e: 0c91 lsrs r1, r2, #18 uint32_t pad_trim = (*((uint32_t *)(NVMCTRL_OTP4) + (NVM_USB_PAD_TRIM_POS / 32)) >> (NVM_USB_PAD_TRIM_POS % 32)) b40: 0192 lsls r2, r2, #6 uint32_t pad_transn b42: 4003 ands r3, r0 uint32_t pad_transp b44: 4001 ands r1, r0 uint32_t pad_trim = (*((uint32_t *)(NVMCTRL_OTP4) + (NVM_USB_PAD_TRIM_POS / 32)) >> (NVM_USB_PAD_TRIM_POS % 32)) b46: 0f52 lsrs r2, r2, #29 if (pad_transn == 0x1F) { b48: 4283 cmp r3, r0 b4a: d100 bne.n b4e <_usb_d_dev_init+0x6e> pad_transn = 5; b4c: 2305 movs r3, #5 if (pad_transp == 0x1F) { b4e: 291f cmp r1, #31 b50: d100 bne.n b54 <_usb_d_dev_init+0x74> pad_transp = 29; b52: 3902 subs r1, #2 if (pad_trim == 0x7) { b54: 2a07 cmp r2, #7 b56: d100 bne.n b5a <_usb_d_dev_init+0x7a> pad_trim = 5; b58: 3a02 subs r2, #2 hw->DEVICE.PADCAL.reg = USB_PADCAL_TRANSN(pad_transn) | USB_PADCAL_TRANSP(pad_transp) | USB_PADCAL_TRIM(pad_trim); b5a: 019b lsls r3, r3, #6 b5c: 430b orrs r3, r1 b5e: 0312 lsls r2, r2, #12 b60: 4313 orrs r3, r2 b62: 8523 strh r3, [r4, #40] ; 0x28 hw->DEVICE.QOSCTRL.bit.CQOS = 3; b64: 2303 movs r3, #3 b66: 78e2 ldrb r2, [r4, #3] b68: 431a orrs r2, r3 b6a: 70e2 strb r2, [r4, #3] hw->DEVICE.QOSCTRL.bit.DQOS = 3; b6c: 220c movs r2, #12 b6e: 78e1 ldrb r1, [r4, #3] b70: 430a orrs r2, r1 b72: 70e2 strb r2, [r4, #3] ((Usb *)hw)->HOST.CTRLA.reg = data; b74: 2204 movs r2, #4 b76: 7022 strb r2, [r4, #0] while (((Usb *)hw)->DEVICE.SYNCBUSY.reg & reg) { b78: 78a2 ldrb r2, [r4, #2] b7a: 0010 movs r0, r2 b7c: 4018 ands r0, r3 b7e: 421a tst r2, r3 b80: d1fa bne.n b78 <_usb_d_dev_init+0x98> hri_usbdevice_write_DESCADD_reg(hw, (uint32_t)prvt_inst.desc_table); b82: 4b07 ldr r3, [pc, #28] ; (ba0 <_usb_d_dev_init+0xc0>) } static inline void hri_usb_write_DESCADD_reg(const void *const hw, hri_usb_descadd_reg_t data) { USB_CRITICAL_SECTION_ENTER(); ((Usb *)hw)->HOST.DESCADD.reg = data; b84: 6263 str r3, [r4, #36] ; 0x24 ((Usb *)hw)->DEVICE.CTRLB.reg = data; b86: 2301 movs r3, #1 b88: 8123 strh r3, [r4, #8] } b8a: bd10 pop {r4, pc} b8c: 41005000 .word 0x41005000 b90: 20000170 .word 0x20000170 b94: 000004f5 .word 0x000004f5 b98: 0000074d .word 0x0000074d b9c: 00806024 .word 0x00806024 ba0: 20000110 .word 0x20000110 00000ba4 <_usb_d_dev_enable>: tmp &= mask; ba4: 2203 movs r2, #3 tmp = ((Usb *)hw)->HOST.SYNCBUSY.reg; ba6: 4b0e ldr r3, [pc, #56] ; (be0 <_usb_d_dev_enable+0x3c>) ba8: 7899 ldrb r1, [r3, #2] if (hri_usbdevice_get_SYNCBUSY_reg(hw, (USB_SYNCBUSY_ENABLE | USB_SYNCBUSY_SWRST))) { baa: 4211 tst r1, r2 bac: d114 bne.n bd8 <_usb_d_dev_enable+0x34> while (((Usb *)hw)->DEVICE.SYNCBUSY.reg & reg) { bae: 7899 ldrb r1, [r3, #2] bb0: 4211 tst r1, r2 bb2: d1fc bne.n bae <_usb_d_dev_enable+0xa> if ((ctrla & USB_CTRLA_ENABLE) == 0) { bb4: 2202 movs r2, #2 return ((Usb *)hw)->HOST.CTRLA.reg; bb6: 7819 ldrb r1, [r3, #0] bb8: b2c8 uxtb r0, r1 bba: 4211 tst r1, r2 bbc: d105 bne.n bca <_usb_d_dev_enable+0x26> hri_usbdevice_write_CTRLA_reg(hw, ctrla | USB_CTRLA_ENABLE); bbe: 4302 orrs r2, r0 ((Usb *)hw)->HOST.CTRLA.reg = data; bc0: 701a strb r2, [r3, #0] while (((Usb *)hw)->DEVICE.SYNCBUSY.reg & reg) { bc2: 2203 movs r2, #3 bc4: 7899 ldrb r1, [r3, #2] bc6: 4211 tst r1, r2 bc8: d1fc bne.n bc4 <_usb_d_dev_enable+0x20> */ __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) { if ((int32_t)(IRQn) >= 0) { NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); bca: 2180 movs r1, #128 ; 0x80 return ERR_NONE; bcc: 2000 movs r0, #0 bce: 4a05 ldr r2, [pc, #20] ; (be4 <_usb_d_dev_enable+0x40>) bd0: 6011 str r1, [r2, #0] ((Usb *)hw)->DEVICE.INTENSET.reg = mask; bd2: 4a05 ldr r2, [pc, #20] ; (be8 <_usb_d_dev_enable+0x44>) bd4: 831a strh r2, [r3, #24] } bd6: 4770 bx lr return -USB_ERR_DENIED; bd8: 2011 movs r0, #17 bda: 4240 negs r0, r0 bdc: e7fb b.n bd6 <_usb_d_dev_enable+0x32> bde: 46c0 nop ; (mov r8, r8) be0: 41005000 .word 0x41005000 be4: e000e100 .word 0xe000e100 be8: 0000028d .word 0x0000028d 00000bec <_usb_d_dev_attach>: ((Usb *)hw)->DEVICE.CTRLB.reg &= ~USB_DEVICE_CTRLB_DETACH; bec: 2101 movs r1, #1 bee: 4a02 ldr r2, [pc, #8] ; (bf8 <_usb_d_dev_attach+0xc>) bf0: 8913 ldrh r3, [r2, #8] bf2: 438b bics r3, r1 bf4: 8113 strh r3, [r2, #8] } bf6: 4770 bx lr bf8: 41005000 .word 0x41005000 00000bfc <_usb_d_dev_set_address>: hri_usbdevice_write_DADD_reg(USB, USB_DEVICE_DADD_ADDEN | USB_DEVICE_DADD_DADD(addr)); bfc: 2380 movs r3, #128 ; 0x80 bfe: 4318 orrs r0, r3 ((Usb *)hw)->DEVICE.DADD.reg = data; c00: 4b01 ldr r3, [pc, #4] ; (c08 <_usb_d_dev_set_address+0xc>) c02: 7298 strb r0, [r3, #10] } c04: 4770 bx lr c06: 46c0 nop ; (mov r8, r8) c08: 41005000 .word 0x41005000 00000c0c <_usb_d_dev_ep_init>: { c0c: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} uint8_t epn = USB_EP_GET_N(ep); c0e: 240f movs r4, #15 c10: 4004 ands r4, r0 struct _usb_d_dev_ep *ept = _usb_d_dev_ept(epn, dir); c12: 4b2e ldr r3, [pc, #184] ; (ccc <_usb_d_dev_ep_init+0xc0>) { c14: 9100 str r1, [sp, #0] c16: 0006 movs r6, r0 struct _usb_d_dev_ep *ept = _usb_d_dev_ept(epn, dir); c18: 09c1 lsrs r1, r0, #7 c1a: b247 sxtb r7, r0 c1c: 0020 movs r0, r4 { c1e: 9201 str r2, [sp, #4] struct _usb_d_dev_ep *ept = _usb_d_dev_ept(epn, dir); c20: 4798 blx r3 uint8_t ep_type = attr & USB_EP_XTYPE_MASK; c22: 2103 movs r1, #3 c24: 9b00 ldr r3, [sp, #0] struct _usb_d_dev_ep *ept = _usb_d_dev_ept(epn, dir); c26: 0005 movs r5, r0 uint8_t ep_type = attr & USB_EP_XTYPE_MASK; c28: 400b ands r3, r1 c2a: 9300 str r3, [sp, #0] if (epn > CONF_USB_D_MAX_EP_N) { c2c: 2c02 cmp r4, #2 c2e: d844 bhi.n cba <_usb_d_dev_ep_init+0xae> if (ept->ep != 0xFF) { c30: 7c83 ldrb r3, [r0, #18] c32: 2bff cmp r3, #255 ; 0xff c34: d144 bne.n cc0 <_usb_d_dev_ep_init+0xb4> if (ep_type == USB_EP_XTYPE_CTRL) { c36: 9b00 ldr r3, [sp, #0] c38: 2b00 cmp r3, #0 c3a: d110 bne.n c5e <_usb_d_dev_ep_init+0x52> struct _usb_d_dev_ep *ept_in = _usb_d_dev_ept(epn, !dir); c3c: 43f9 mvns r1, r7 c3e: b2c9 uxtb r1, r1 c40: 4b22 ldr r3, [pc, #136] ; (ccc <_usb_d_dev_ep_init+0xc0>) c42: 0020 movs r0, r4 c44: 09c9 lsrs r1, r1, #7 c46: 4798 blx r3 if (ept_in->ep != 0xFF) { c48: 7c83 ldrb r3, [r0, #18] c4a: 2bff cmp r3, #255 ; 0xff c4c: d138 bne.n cc0 <_usb_d_dev_ep_init+0xb4> if (pcfg->cache == NULL) { c4e: 3bf3 subs r3, #243 ; 0xf3 c50: 4363 muls r3, r4 c52: 4a1f ldr r2, [pc, #124] ; (cd0 <_usb_d_dev_ep_init+0xc4>) c54: 589b ldr r3, [r3, r2] c56: 2b00 cmp r3, #0 c58: d134 bne.n cc4 <_usb_d_dev_ep_init+0xb8> return -USB_ERR_FUNC; c5a: 2013 movs r0, #19 c5c: e02e b.n cbc <_usb_d_dev_ep_init+0xb0> if ((dir ? pcfg->i_cache : pcfg->cache) && ((dir ? pcfg->i_size : pcfg->size) < max_pkt_siz)) { c5e: 2f00 cmp r7, #0 c60: da14 bge.n c8c <_usb_d_dev_ep_init+0x80> c62: 220c movs r2, #12 c64: 4362 muls r2, r4 c66: 4b1a ldr r3, [pc, #104] ; (cd0 <_usb_d_dev_ep_init+0xc4>) c68: 189b adds r3, r3, r2 c6a: 685a ldr r2, [r3, #4] c6c: 2a00 cmp r2, #0 c6e: d119 bne.n ca4 <_usb_d_dev_ep_init+0x98> ept->cache = (uint8_t *)(dir ? pcfg->i_cache : pcfg->cache); c70: 230c movs r3, #12 c72: 4363 muls r3, r4 c74: 4c16 ldr r4, [pc, #88] ; (cd0 <_usb_d_dev_ep_init+0xc4>) c76: 18e4 adds r4, r4, r3 c78: 6863 ldr r3, [r4, #4] return USB_OK; c7a: 2000 movs r0, #0 ept->flags.u8 = (ep_type + 1); c7c: 9900 ldr r1, [sp, #0] ept->cache = (uint8_t *)(dir ? pcfg->i_cache : pcfg->cache); c7e: 60eb str r3, [r5, #12] ept->size = max_pkt_siz; c80: 9b01 ldr r3, [sp, #4] ept->flags.u8 = (ep_type + 1); c82: 3101 adds r1, #1 ept->size = max_pkt_siz; c84: 822b strh r3, [r5, #16] ept->flags.u8 = (ep_type + 1); c86: 74e9 strb r1, [r5, #19] ept->ep = ep; c88: 74ae strb r6, [r5, #18] } c8a: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc} if ((dir ? pcfg->i_cache : pcfg->cache) && ((dir ? pcfg->i_size : pcfg->size) < max_pkt_siz)) { c8c: 230c movs r3, #12 c8e: 4363 muls r3, r4 c90: 4a0f ldr r2, [pc, #60] ; (cd0 <_usb_d_dev_ep_init+0xc4>) c92: 589b ldr r3, [r3, r2] c94: 2b00 cmp r3, #0 c96: d00b beq.n cb0 <_usb_d_dev_ep_init+0xa4> c98: 220c movs r2, #12 c9a: 4362 muls r2, r4 c9c: 4b0c ldr r3, [pc, #48] ; (cd0 <_usb_d_dev_ep_init+0xc4>) c9e: 189b adds r3, r3, r2 ca0: 891b ldrh r3, [r3, #8] ca2: e000 b.n ca6 <_usb_d_dev_ep_init+0x9a> ca4: 895b ldrh r3, [r3, #10] ca6: 9a01 ldr r2, [sp, #4] ca8: 429a cmp r2, r3 caa: dcd6 bgt.n c5a <_usb_d_dev_ep_init+0x4e> ept->cache = (uint8_t *)(dir ? pcfg->i_cache : pcfg->cache); cac: 2f00 cmp r7, #0 cae: dbdf blt.n c70 <_usb_d_dev_ep_init+0x64> cb0: 230c movs r3, #12 cb2: 435c muls r4, r3 cb4: 4b06 ldr r3, [pc, #24] ; (cd0 <_usb_d_dev_ep_init+0xc4>) cb6: 58e3 ldr r3, [r4, r3] cb8: e7df b.n c7a <_usb_d_dev_ep_init+0x6e> return -USB_ERR_PARAM; cba: 2012 movs r0, #18 return -USB_ERR_FUNC; cbc: 4240 negs r0, r0 cbe: e7e4 b.n c8a <_usb_d_dev_ep_init+0x7e> return -USB_ERR_REDO; cc0: 2014 movs r0, #20 cc2: e7fb b.n cbc <_usb_d_dev_ep_init+0xb0> if ((dir ? pcfg->i_cache : pcfg->cache) && ((dir ? pcfg->i_size : pcfg->size) < max_pkt_siz)) { cc4: 2f00 cmp r7, #0 cc6: dae7 bge.n c98 <_usb_d_dev_ep_init+0x8c> cc8: e7cb b.n c62 <_usb_d_dev_ep_init+0x56> cca: 46c0 nop ; (mov r8, r8) ccc: 0000051d .word 0x0000051d cd0: 00002e88 .word 0x00002e88 00000cd4 <_usb_d_dev_ep_deinit>: { cd4: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} uint8_t epn = USB_EP_GET_N(ep); cd6: 250f movs r5, #15 { cd8: 0004 movs r4, r0 uint8_t epn = USB_EP_GET_N(ep); cda: 4005 ands r5, r0 if (epn > CONF_USB_D_MAX_EP_N || !_usb_d_dev_ep_is_used(ept)) { cdc: 2d02 cmp r5, #2 cde: d81a bhi.n d16 <_usb_d_dev_ep_deinit+0x42> ce0: b243 sxtb r3, r0 bool dir = USB_EP_GET_DIR(ep); ce2: 09c7 lsrs r7, r0, #7 ce4: 9301 str r3, [sp, #4] struct _usb_d_dev_ep *ept = _usb_d_dev_ept(epn, dir); ce6: 0039 movs r1, r7 ce8: 4b14 ldr r3, [pc, #80] ; (d3c <_usb_d_dev_ep_deinit+0x68>) cea: 0028 movs r0, r5 cec: 4798 blx r3 if (epn > CONF_USB_D_MAX_EP_N || !_usb_d_dev_ep_is_used(ept)) { cee: 7c83 ldrb r3, [r0, #18] struct _usb_d_dev_ep *ept = _usb_d_dev_ept(epn, dir); cf0: 0006 movs r6, r0 if (epn > CONF_USB_D_MAX_EP_N || !_usb_d_dev_ep_is_used(ept)) { cf2: 2bff cmp r3, #255 ; 0xff cf4: d00f beq.n d16 <_usb_d_dev_ep_deinit+0x42> _usb_d_dev_trans_stop(ept, dir, USB_TRANS_RESET); cf6: 2203 movs r2, #3 cf8: 4b11 ldr r3, [pc, #68] ; (d40 <_usb_d_dev_ep_deinit+0x6c>) cfa: 0039 movs r1, r7 cfc: 4798 blx r3 if (_usb_d_dev_ep_is_ctrl(ept)) { cfe: 2207 movs r2, #7 d00: 7cf3 ldrb r3, [r6, #19] d02: 4013 ands r3, r2 d04: 2b01 cmp r3, #1 d06: d107 bne.n d18 <_usb_d_dev_ep_deinit+0x44> hw->DEVICE.DeviceEndpoint[ep].EPCFG.reg = 0; d08: 2200 movs r2, #0 d0a: 4b0e ldr r3, [pc, #56] ; (d44 <_usb_d_dev_ep_deinit+0x70>) d0c: 3408 adds r4, #8 d0e: 0164 lsls r4, r4, #5 d10: 54e2 strb r2, [r4, r3] ept->ep = 0xFF; d12: 23ff movs r3, #255 ; 0xff d14: 8273 strh r3, [r6, #18] } d16: bdf7 pop {r0, r1, r2, r4, r5, r6, r7, pc} } else if (USB_EP_GET_DIR(ep)) { d18: b263 sxtb r3, r4 d1a: 2b00 cmp r3, #0 d1c: da07 bge.n d2e <_usb_d_dev_ep_deinit+0x5a> hw->DEVICE.DeviceEndpoint[USB_EP_GET_N(ep)].EPCFG.reg &= ~USB_DEVICE_EPCFG_EPTYPE1_Msk; d1e: 2270 movs r2, #112 ; 0x70 d20: 4b09 ldr r3, [pc, #36] ; (d48 <_usb_d_dev_ep_deinit+0x74>) d22: 016d lsls r5, r5, #5 d24: 18ed adds r5, r5, r3 d26: 786b ldrb r3, [r5, #1] d28: 4393 bics r3, r2 d2a: 706b strb r3, [r5, #1] d2c: e7f1 b.n d12 <_usb_d_dev_ep_deinit+0x3e> hw->DEVICE.DeviceEndpoint[ep].EPCFG.reg &= ~USB_DEVICE_EPCFG_EPTYPE0_Msk; d2e: 4b06 ldr r3, [pc, #24] ; (d48 <_usb_d_dev_ep_deinit+0x74>) d30: 0164 lsls r4, r4, #5 d32: 18e4 adds r4, r4, r3 d34: 7863 ldrb r3, [r4, #1] d36: 4393 bics r3, r2 d38: 7063 strb r3, [r4, #1] d3a: e7ea b.n d12 <_usb_d_dev_ep_deinit+0x3e> d3c: 0000051d .word 0x0000051d d40: 00000605 .word 0x00000605 d44: 41005000 .word 0x41005000 d48: 410050ff .word 0x410050ff 00000d4c <_usb_d_dev_ep_enable>: { d4c: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} uint8_t epn = USB_EP_GET_N(ep); d4e: 240f movs r4, #15 d50: 4004 ands r4, r0 struct _usb_d_dev_ep *ept = _usb_d_dev_ept(epn, dir); d52: 09c1 lsrs r1, r0, #7 d54: 4b47 ldr r3, [pc, #284] ; (e74 <_usb_d_dev_ep_enable+0x128>) d56: b245 sxtb r5, r0 d58: 0020 movs r0, r4 d5a: 4798 blx r3 return ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPCFG.reg; d5c: 4b46 ldr r3, [pc, #280] ; (e78 <_usb_d_dev_ep_enable+0x12c>) d5e: 0161 lsls r1, r4, #5 d60: 18ce adds r6, r1, r3 d62: 7872 ldrb r2, [r6, #1] d64: 0007 movs r7, r0 d66: b2d2 uxtb r2, r2 if (epn > CONF_USB_D_MAX_EP_N || !_usb_d_dev_ep_is_used(ept)) { d68: 2c02 cmp r4, #2 d6a: d900 bls.n d6e <_usb_d_dev_ep_enable+0x22> d6c: e07d b.n e6a <_usb_d_dev_ep_enable+0x11e> d6e: 7c83 ldrb r3, [r0, #18] d70: 9301 str r3, [sp, #4] d72: 2bff cmp r3, #255 ; 0xff d74: d100 bne.n d78 <_usb_d_dev_ep_enable+0x2c> d76: e078 b.n e6a <_usb_d_dev_ep_enable+0x11e> bank = prvt_inst.desc_table[epn].DeviceDescBank; d78: 4b40 ldr r3, [pc, #256] ; (e7c <_usb_d_dev_ep_enable+0x130>) d7a: 185c adds r4, r3, r1 if (ept->flags.bits.eptype == USB_D_EPTYPE_CTRL) { d7c: 7cc3 ldrb r3, [r0, #19] d7e: 2107 movs r1, #7 d80: 0018 movs r0, r3 d82: 4008 ands r0, r1 d84: 2801 cmp r0, #1 d86: d13b bne.n e00 <_usb_d_dev_ep_enable+0xb4> if (epcfg & (USB_DEVICE_EPCFG_EPTYPE1_Msk | USB_DEVICE_EPCFG_EPTYPE0_Msk)) { d88: 2377 movs r3, #119 ; 0x77 d8a: 0011 movs r1, r2 d8c: 4019 ands r1, r3 d8e: 9100 str r1, [sp, #0] d90: 421a tst r2, r3 d92: d000 beq.n d96 <_usb_d_dev_ep_enable+0x4a> d94: e06c b.n e70 <_usb_d_dev_ep_enable+0x124> ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPCFG.reg = data; d96: 3b66 subs r3, #102 ; 0x66 d98: 7073 strb r3, [r6, #1] bank[0].PCKSIZE.reg = USB_DEVICE_PCKSIZE_MULTI_PACKET_SIZE(ept->size) d9a: 8a3d ldrh r5, [r7, #16] | USB_DEVICE_PCKSIZE_SIZE(_usbd_ep_pcksize_size(ept->size)); d9c: 4b38 ldr r3, [pc, #224] ; (e80 <_usb_d_dev_ep_enable+0x134>) d9e: 0028 movs r0, r5 da0: 4798 blx r3 da2: 23e0 movs r3, #224 ; 0xe0 bank[0].PCKSIZE.reg = USB_DEVICE_PCKSIZE_MULTI_PACKET_SIZE(ept->size) da4: 4a37 ldr r2, [pc, #220] ; (e84 <_usb_d_dev_ep_enable+0x138>) | USB_DEVICE_PCKSIZE_SIZE(_usbd_ep_pcksize_size(ept->size)); da6: 05db lsls r3, r3, #23 da8: 0700 lsls r0, r0, #28 daa: 4018 ands r0, r3 bank[0].PCKSIZE.reg = USB_DEVICE_PCKSIZE_MULTI_PACKET_SIZE(ept->size) dac: 03ab lsls r3, r5, #14 dae: 4013 ands r3, r2 | USB_DEVICE_PCKSIZE_SIZE(_usbd_ep_pcksize_size(ept->size)); db0: 4303 orrs r3, r0 bank[0].PCKSIZE.reg = USB_DEVICE_PCKSIZE_MULTI_PACKET_SIZE(ept->size) db2: 6063 str r3, [r4, #4] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSSET.reg = mask; db4: 2140 movs r1, #64 ; 0x40 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSCLR.reg = mask; db6: 2380 movs r3, #128 ; 0x80 uint8_t epn = USB_EP_GET_N(ept->ep); db8: 220f movs r2, #15 = USB_DEVICE_PCKSIZE_BYTE_COUNT(ept->size) | USB_DEVICE_PCKSIZE_SIZE(_usbd_ep_pcksize_size(ept->size)); dba: 04ad lsls r5, r5, #18 dbc: 0cad lsrs r5, r5, #18 dbe: 4328 orrs r0, r5 dc0: 6160 str r0, [r4, #20] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSSET.reg = mask; dc2: 71b1 strb r1, [r6, #6] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSCLR.reg = mask; dc4: 7173 strb r3, [r6, #5] bank->STATUS_BK.reg = 0; dc6: 9b00 ldr r3, [sp, #0] bank->ADDR.reg = addr; dc8: 482c ldr r0, [pc, #176] ; (e7c <_usb_d_dev_ep_enable+0x130>) bank->STATUS_BK.reg = 0; dca: 72a3 strb r3, [r4, #10] dcc: 76a3 strb r3, [r4, #26] uint8_t epn = USB_EP_GET_N(ept->ep); dce: 9b01 ldr r3, [sp, #4] bank->PCKSIZE.bit.MULTI_PACKET_SIZE = size; dd0: 03ac lsls r4, r5, #14 uint8_t epn = USB_EP_GET_N(ept->ep); dd2: 4013 ands r3, r2 _usbd_ep_set_buf(epn, 0, (uint32_t)ept->cache); dd4: 68fa ldr r2, [r7, #12] bank->ADDR.reg = addr; dd6: 015b lsls r3, r3, #5 dd8: 501a str r2, [r3, r0] bank->PCKSIZE.bit.MULTI_PACKET_SIZE = size; dda: 18c0 adds r0, r0, r3 ddc: 6842 ldr r2, [r0, #4] dde: 4d2a ldr r5, [pc, #168] ; (e88 <_usb_d_dev_ep_enable+0x13c>) de0: 4015 ands r5, r2 de2: 4325 orrs r5, r4 de4: 6045 str r5, [r0, #4] bank->PCKSIZE.bit.BYTE_COUNT = count; de6: 6842 ldr r2, [r0, #4] de8: 0b92 lsrs r2, r2, #14 dea: 0392 lsls r2, r2, #14 dec: 6042 str r2, [r0, #4] dee: 4a22 ldr r2, [pc, #136] ; (e78 <_usb_d_dev_ep_enable+0x12c>) return USB_OK; df0: 9800 ldr r0, [sp, #0] df2: 189b adds r3, r3, r2 df4: 22b0 movs r2, #176 ; 0xb0 df6: 715a strb r2, [r3, #5] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENSET.reg = mask; df8: 3aa0 subs r2, #160 ; 0xa0 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSSET.reg = mask; dfa: 7199 strb r1, [r3, #6] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENSET.reg = mask; dfc: 729a strb r2, [r3, #10] } dfe: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc} } else if (dir) { e00: 2d00 cmp r5, #0 e02: da19 bge.n e38 <_usb_d_dev_ep_enable+0xec> if (epcfg & USB_DEVICE_EPCFG_EPTYPE1_Msk) { e04: 2170 movs r1, #112 ; 0x70 e06: 0015 movs r5, r2 e08: 400d ands r5, r1 e0a: 420a tst r2, r1 e0c: d130 bne.n e70 <_usb_d_dev_ep_enable+0x124> epcfg |= USB_DEVICE_EPCFG_EPTYPE1(ept->flags.bits.eptype); e0e: 075b lsls r3, r3, #29 e10: 0e5b lsrs r3, r3, #25 e12: 4313 orrs r3, r2 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPCFG.reg = data; e14: 7073 strb r3, [r6, #1] = USB_DEVICE_PCKSIZE_BYTE_COUNT(ept->size) | USB_DEVICE_PCKSIZE_SIZE(_usbd_ep_pcksize_size(ept->size)); e16: 8a3f ldrh r7, [r7, #16] e18: 4b19 ldr r3, [pc, #100] ; (e80 <_usb_d_dev_ep_enable+0x134>) e1a: 0038 movs r0, r7 e1c: 4798 blx r3 e1e: 23e0 movs r3, #224 ; 0xe0 e20: 0700 lsls r0, r0, #28 e22: 05db lsls r3, r3, #23 e24: 4018 ands r0, r3 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSCLR.reg = mask; e26: 2380 movs r3, #128 ; 0x80 e28: 04bf lsls r7, r7, #18 e2a: 0cbf lsrs r7, r7, #18 e2c: 4338 orrs r0, r7 e2e: 6160 str r0, [r4, #20] e30: 7173 strb r3, [r6, #5] bank->STATUS_BK.reg = 0; e32: 76a5 strb r5, [r4, #26] return USB_OK; e34: 0028 movs r0, r5 } e36: e7e2 b.n dfe <_usb_d_dev_ep_enable+0xb2> if (epcfg & USB_DEVICE_EPCFG_EPTYPE0_Msk) { e38: 0015 movs r5, r2 e3a: 400d ands r5, r1 e3c: 420a tst r2, r1 e3e: d117 bne.n e70 <_usb_d_dev_ep_enable+0x124> epcfg |= USB_DEVICE_EPCFG_EPTYPE0(ept->flags.bits.eptype); e40: 075b lsls r3, r3, #29 e42: 0f5b lsrs r3, r3, #29 e44: 4313 orrs r3, r2 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPCFG.reg = data; e46: 7073 strb r3, [r6, #1] bank[0].PCKSIZE.reg = USB_DEVICE_PCKSIZE_MULTI_PACKET_SIZE(ept->size) e48: 8a3f ldrh r7, [r7, #16] | USB_DEVICE_PCKSIZE_SIZE(_usbd_ep_pcksize_size(ept->size)); e4a: 4b0d ldr r3, [pc, #52] ; (e80 <_usb_d_dev_ep_enable+0x134>) e4c: 0038 movs r0, r7 e4e: 4798 blx r3 bank[0].PCKSIZE.reg = USB_DEVICE_PCKSIZE_MULTI_PACKET_SIZE(ept->size) e50: 4a0c ldr r2, [pc, #48] ; (e84 <_usb_d_dev_ep_enable+0x138>) e52: 03bb lsls r3, r7, #14 e54: 4013 ands r3, r2 | USB_DEVICE_PCKSIZE_SIZE(_usbd_ep_pcksize_size(ept->size)); e56: 22e0 movs r2, #224 ; 0xe0 e58: 0700 lsls r0, r0, #28 e5a: 05d2 lsls r2, r2, #23 e5c: 4010 ands r0, r2 e5e: 4303 orrs r3, r0 bank[0].PCKSIZE.reg = USB_DEVICE_PCKSIZE_MULTI_PACKET_SIZE(ept->size) e60: 6063 str r3, [r4, #4] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSSET.reg = mask; e62: 2340 movs r3, #64 ; 0x40 e64: 71b3 strb r3, [r6, #6] bank->STATUS_BK.reg = 0; e66: 72a5 strb r5, [r4, #10] e68: e7e4 b.n e34 <_usb_d_dev_ep_enable+0xe8> return -USB_ERR_PARAM; e6a: 2012 movs r0, #18 return -USB_ERR_REDO; e6c: 4240 negs r0, r0 e6e: e7c6 b.n dfe <_usb_d_dev_ep_enable+0xb2> e70: 2014 movs r0, #20 e72: e7fb b.n e6c <_usb_d_dev_ep_enable+0x120> e74: 0000051d .word 0x0000051d e78: 410050ff .word 0x410050ff e7c: 20000110 .word 0x20000110 e80: 00000aa9 .word 0x00000aa9 e84: 0fffc000 .word 0x0fffc000 e88: f0003fff .word 0xf0003fff 00000e8c <_usb_d_dev_ep_stall>: { e8c: b5f8 push {r3, r4, r5, r6, r7, lr} uint8_t epn = USB_EP_GET_N(ep); e8e: 0007 movs r7, r0 e90: 260f movs r6, #15 bool dir = USB_EP_GET_DIR(ep); e92: 09c4 lsrs r4, r0, #7 uint8_t epn = USB_EP_GET_N(ep); e94: 4037 ands r7, r6 { e96: 000d movs r5, r1 struct _usb_d_dev_ep *ept = _usb_d_dev_ept(epn, dir); e98: 0038 movs r0, r7 e9a: 0021 movs r1, r4 e9c: 4b29 ldr r3, [pc, #164] ; (f44 <_usb_d_dev_ep_stall+0xb8>) e9e: 4798 blx r3 ea0: 0002 movs r2, r0 if (epn > CONF_USB_D_MAX_EP_N) { ea2: 2f02 cmp r7, #2 ea4: d84a bhi.n f3c <_usb_d_dev_ep_stall+0xb0> uint8_t epn = USB_EP_GET_N(ept->ep); ea6: 7c83 ldrb r3, [r0, #18] hri_usbendpoint_set_EPSTATUS_reg(USB, epn, (USB_DEVICE_EPSTATUS_STALLRQ0 << bank_n)); ea8: 2010 movs r0, #16 uint8_t epn = USB_EP_GET_N(ept->ep); eaa: 4033 ands r3, r6 hri_usbendpoint_set_EPSTATUS_reg(USB, epn, (USB_DEVICE_EPSTATUS_STALLRQ0 << bank_n)); eac: 40a0 lsls r0, r4 if (USB_EP_STALL_SET == ctrl) { eae: 2d01 cmp r5, #1 eb0: d110 bne.n ed4 <_usb_d_dev_ep_stall+0x48> eb2: 4d25 ldr r5, [pc, #148] ; (f48 <_usb_d_dev_ep_stall+0xbc>) eb4: 0159 lsls r1, r3, #5 hri_usbendpoint_set_EPSTATUS_reg(USB, epn, (USB_DEVICE_EPSTATUS_STALLRQ0 << bank_n)); eb6: b2c0 uxtb r0, r0 eb8: 1949 adds r1, r1, r5 eba: 7148 strb r0, [r1, #5] _usbd_ep_int_en(epn, USB_DEVICE_EPINTFLAG_STALL0 << dir); ebc: 2120 movs r1, #32 ebe: 40a1 lsls r1, r4 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENSET.reg = mask; ec0: 4822 ldr r0, [pc, #136] ; (f4c <_usb_d_dev_ep_stall+0xc0>) ec2: 015b lsls r3, r3, #5 hri_usbendpoint_set_EPINTEN_reg(USB, epn, flags); ec4: b2c9 uxtb r1, r1 ec6: 181b adds r3, r3, r0 ec8: 7299 strb r1, [r3, #10] ept->flags.bits.is_stalled = 1; eca: 2308 movs r3, #8 ecc: 7cd1 ldrb r1, [r2, #19] ece: 430b orrs r3, r1 ept->flags.bits.is_stalled = 0; ed0: 74d3 strb r3, [r2, #19] ed2: e009 b.n ee8 <_usb_d_dev_ep_stall+0x5c> } else if (USB_EP_STALL_CLR == ctrl) { ed4: 015b lsls r3, r3, #5 ed6: 2d00 cmp r5, #0 ed8: d129 bne.n f2e <_usb_d_dev_ep_stall+0xa2> return ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUS.reg; eda: 491d ldr r1, [pc, #116] ; (f50 <_usb_d_dev_ep_stall+0xc4>) edc: 185d adds r5, r3, r1 ede: 491b ldr r1, [pc, #108] ; (f4c <_usb_d_dev_ep_stall+0xc0>) ee0: 185b adds r3, r3, r1 ee2: 79d9 ldrb r1, [r3, #7] if (!is_stalled) { ee4: 4208 tst r0, r1 ee6: d101 bne.n eec <_usb_d_dev_ep_stall+0x60> rc = _usb_d_dev_ep_stall_clr(ept, dir); ee8: 2000 movs r0, #0 eea: e01c b.n f26 <_usb_d_dev_ep_stall+0x9a> _usbd_ep_int_dis(epn, USB_DEVICE_EPINTFLAG_STALL0 << dir); eec: 2120 movs r1, #32 eee: 40a1 lsls r1, r4 hri_usbendpoint_clear_EPSTATUS_reg(USB, epn, (USB_DEVICE_EPSTATUS_STALLRQ0 << bank_n)); ef0: b2c0 uxtb r0, r0 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSCLR.reg = mask; ef2: 7158 strb r0, [r3, #5] hri_usbendpoint_clear_EPINTEN_reg(USB, epn, flags); ef4: b2c8 uxtb r0, r1 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTENCLR.reg = mask; ef6: 7258 strb r0, [r3, #9] return ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTFLAG.reg; ef8: 7a1e ldrb r6, [r3, #8] if (_usbd_ep_is_stall_sent(epn, dir)) { efa: 4231 tst r1, r6 efc: d004 beq.n f08 <_usb_d_dev_ep_stall+0x7c> hri_usbendpoint_clear_EPSTATUS_reg(USB, epn, (USB_DEVICE_EPSTATUS_DTGLOUT << bank_n)); efe: 2101 movs r1, #1 f00: 40a1 lsls r1, r4 f02: b2c9 uxtb r1, r1 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTFLAG.reg = mask; f04: 7218 strb r0, [r3, #8] ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUSCLR.reg = mask; f06: 7159 strb r1, [r3, #5] if (_usb_d_dev_ep_is_ctrl(ept)) { f08: 2107 movs r1, #7 f0a: 7cd3 ldrb r3, [r2, #19] f0c: 4019 ands r1, r3 f0e: 2901 cmp r1, #1 f10: d10a bne.n f28 <_usb_d_dev_ep_stall+0x9c> return ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPSTATUS.reg; f12: 35ff adds r5, #255 ; 0xff f14: 79ec ldrb r4, [r5, #7] if ((hri_usbendpoint_read_EPSTATUS_reg(USB, epn) & USB_DEVICE_EPSTATUS_STALLRQ_Msk) == 0) { f16: 312f adds r1, #47 ; 0x2f f18: 0020 movs r0, r4 f1a: 4008 ands r0, r1 f1c: 420c tst r4, r1 f1e: d1e3 bne.n ee8 <_usb_d_dev_ep_stall+0x5c> ept->flags.bits.is_stalled = 0; f20: 3928 subs r1, #40 ; 0x28 f22: 438b bics r3, r1 f24: 74d3 strb r3, [r2, #19] } f26: bdf8 pop {r3, r4, r5, r6, r7, pc} ept->flags.bits.is_stalled = 0; f28: 2108 movs r1, #8 f2a: 438b bics r3, r1 f2c: e7d0 b.n ed0 <_usb_d_dev_ep_stall+0x44> f2e: 4a06 ldr r2, [pc, #24] ; (f48 <_usb_d_dev_ep_stall+0xbc>) f30: 189b adds r3, r3, r2 f32: 799b ldrb r3, [r3, #6] return (hri_usbendpoint_read_EPSTATUS_reg(hw, epn) & (USB_DEVICE_EPSTATUS_STALLRQ0 << bank_n)); f34: 4018 ands r0, r3 return _usbd_ep_is_stalled(epn, dir); f36: 1e43 subs r3, r0, #1 f38: 4198 sbcs r0, r3 f3a: e7f4 b.n f26 <_usb_d_dev_ep_stall+0x9a> return -USB_ERR_PARAM; f3c: 2012 movs r0, #18 f3e: 4240 negs r0, r0 f40: e7f1 b.n f26 <_usb_d_dev_ep_stall+0x9a> f42: 46c0 nop ; (mov r8, r8) f44: 0000051d .word 0x0000051d f48: 41005100 .word 0x41005100 f4c: 410050ff .word 0x410050ff f50: 41005000 .word 0x41005000 00000f54 <_usb_d_dev_ep_read_req>: int32_t _usb_d_dev_ep_read_req(const uint8_t ep, uint8_t *req_buf) { f54: b5f8 push {r3, r4, r5, r6, r7, lr} uint8_t epn = USB_EP_GET_N(ep); f56: 230f movs r3, #15 f58: 4018 ands r0, r3 UsbDeviceDescBank *bank = prvt_inst.desc_table[epn].DeviceDescBank; f5a: 4b11 ldr r3, [pc, #68] ; (fa0 <_usb_d_dev_ep_read_req+0x4c>) f5c: 0144 lsls r4, r0, #5 f5e: 191b adds r3, r3, r4 { f60: 000f movs r7, r1 uint32_t addr = bank[0].ADDR.reg; f62: 6819 ldr r1, [r3, #0] uint16_t bytes = bank[0].PCKSIZE.bit.BYTE_COUNT; f64: 685d ldr r5, [r3, #4] f66: 04ad lsls r5, r5, #18 f68: 0cad lsrs r5, r5, #18 if (epn > CONF_USB_D_MAX_EP_N || !req_buf) { f6a: 2802 cmp r0, #2 f6c: d812 bhi.n f94 <_usb_d_dev_ep_read_req+0x40> f6e: 2f00 cmp r7, #0 f70: d010 beq.n f94 <_usb_d_dev_ep_read_req+0x40> return ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPCFG.reg; f72: 4b0c ldr r3, [pc, #48] ; (fa4 <_usb_d_dev_ep_read_req+0x50>) f74: 18e4 adds r4, r4, r3 f76: 7863 ldrb r3, [r4, #1] return -USB_ERR_PARAM; } if (!_usbd_ep_is_ctrl(epn)) { f78: 2b11 cmp r3, #17 f7a: d10e bne.n f9a <_usb_d_dev_ep_read_req+0x46> tmp &= mask; f7c: 2610 movs r6, #16 tmp = ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTFLAG.reg; f7e: 7a22 ldrb r2, [r4, #8] return -USB_ERR_FUNC; } if (!_usbd_ep_is_setup(epn)) { return ERR_NONE; f80: 2000 movs r0, #0 if (!_usbd_ep_is_setup(epn)) { f82: 4232 tst r2, r6 f84: d005 beq.n f92 <_usb_d_dev_ep_read_req+0x3e> } memcpy(req_buf, (void *)addr, 8); f86: 2208 movs r2, #8 f88: 0038 movs r0, r7 f8a: 4b07 ldr r3, [pc, #28] ; (fa8 <_usb_d_dev_ep_read_req+0x54>) f8c: 4798 blx r3 _usbd_ep_ack_setup(epn); return bytes; f8e: 0028 movs r0, r5 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPINTFLAG.reg = mask; f90: 7226 strb r6, [r4, #8] } f92: bdf8 pop {r3, r4, r5, r6, r7, pc} return -USB_ERR_PARAM; f94: 2012 movs r0, #18 return -USB_ERR_FUNC; f96: 4240 negs r0, r0 f98: e7fb b.n f92 <_usb_d_dev_ep_read_req+0x3e> f9a: 2013 movs r0, #19 f9c: e7fb b.n f96 <_usb_d_dev_ep_read_req+0x42> f9e: 46c0 nop ; (mov r8, r8) fa0: 20000110 .word 0x20000110 fa4: 410050ff .word 0x410050ff fa8: 0000261d .word 0x0000261d 00000fac <_usb_d_dev_ep_trans>: int32_t _usb_d_dev_ep_trans(const struct usb_d_transfer *trans) { fac: b5f0 push {r4, r5, r6, r7, lr} uint8_t epn = USB_EP_GET_N(trans->ep); fae: 250f movs r5, #15 fb0: 7a07 ldrb r7, [r0, #8] { fb2: b087 sub sp, #28 fb4: b27b sxtb r3, r7 uint8_t epn = USB_EP_GET_N(trans->ep); fb6: 403d ands r5, r7 bool dir = USB_EP_GET_DIR(trans->ep); fb8: 09ff lsrs r7, r7, #7 struct _usb_d_dev_ep *ept = _usb_d_dev_ept(epn, dir); fba: 0039 movs r1, r7 fbc: 9302 str r3, [sp, #8] { fbe: 0006 movs r6, r0 struct _usb_d_dev_ep *ept = _usb_d_dev_ept(epn, dir); fc0: 4b3a ldr r3, [pc, #232] ; (10ac <_usb_d_dev_ep_trans+0x100>) fc2: 0028 movs r0, r5 fc4: 4798 blx r3 uint16_t size_mask = (ept->size == 1023) ? 1023 : (ept->size - 1); fc6: 493a ldr r1, [pc, #232] ; (10b0 <_usb_d_dev_ep_trans+0x104>) fc8: 8a03 ldrh r3, [r0, #16] struct _usb_d_dev_ep *ept = _usb_d_dev_ept(epn, dir); fca: 0004 movs r4, r0 uint16_t size_mask = (ept->size == 1023) ? 1023 : (ept->size - 1); fcc: 001a movs r2, r3 fce: 428b cmp r3, r1 fd0: d001 beq.n fd6 <_usb_d_dev_ep_trans+0x2a> fd2: 1e5a subs r2, r3, #1 fd4: b292 uxth r2, r2 bool size_n_aligned = (trans->size & size_mask); fd6: 6871 ldr r1, [r6, #4] fd8: 400a ands r2, r1 fda: 9201 str r2, [sp, #4] bool use_cache = false; volatile hal_atomic_t flags; if (epn > CONF_USB_D_MAX_EP_N) { fdc: 2d02 cmp r5, #2 fde: d862 bhi.n 10a6 <_usb_d_dev_ep_trans+0xfa> * 1. Buffer not in RAM (cache all). * 2. IN/OUT with unaligned buffer (cache all). * 3. OUT with unaligned packet size (cache last packet). * 4. OUT size < 8 (sub-case for 3). */ if (!_usb_is_addr4dma(trans->buf, trans->size) || (!_usb_is_aligned(trans->buf)) fe0: 2080 movs r0, #128 ; 0x80 fe2: 6832 ldr r2, [r6, #0] fe4: 0580 lsls r0, r0, #22 fe6: 4282 cmp r2, r0 fe8: d30d bcc.n 1006 <_usb_d_dev_ep_trans+0x5a> fea: 4d32 ldr r5, [pc, #200] ; (10b4 <_usb_d_dev_ep_trans+0x108>) fec: 1888 adds r0, r1, r2 fee: 42a8 cmp r0, r5 ff0: d809 bhi.n 1006 <_usb_d_dev_ep_trans+0x5a> ff2: 2003 movs r0, #3 ff4: 0015 movs r5, r2 ff6: 4005 ands r5, r0 ff8: 4202 tst r2, r0 ffa: d104 bne.n 1006 <_usb_d_dev_ep_trans+0x5a> || (!dir && (trans->size < ept->size))) { ffc: 9a02 ldr r2, [sp, #8] ffe: 2a00 cmp r2, #0 1000: db0e blt.n 1020 <_usb_d_dev_ep_trans+0x74> 1002: 4299 cmp r1, r3 1004: d206 bcs.n 1014 <_usb_d_dev_ep_trans+0x68> if (!ept->cache) { 1006: 68e3 ldr r3, [r4, #12] return -USB_ERR_FUNC; } /* Use cache all the time. */ use_cache = true; 1008: 2501 movs r5, #1 if (!ept->cache) { 100a: 2b00 cmp r3, #0 100c: d108 bne.n 1020 <_usb_d_dev_ep_trans+0x74> return -USB_ERR_FUNC; 100e: 2013 movs r0, #19 return -USB_ERR_PARAM; 1010: 4240 negs r0, r0 1012: e017 b.n 1044 <_usb_d_dev_ep_trans+0x98> } if (!dir && size_n_aligned) { 1014: 9b01 ldr r3, [sp, #4] 1016: 2b00 cmp r3, #0 1018: d016 beq.n 1048 <_usb_d_dev_ep_trans+0x9c> if (!ept->cache) { 101a: 68e3 ldr r3, [r4, #12] 101c: 2b00 cmp r3, #0 101e: d042 beq.n 10a6 <_usb_d_dev_ep_trans+0xfa> } /* Set 'use_cache' on last packet. */ } /* Check halt */ if (ept->flags.bits.is_stalled) { 1020: 7ce3 ldrb r3, [r4, #19] return USB_HALTED; 1022: 2002 movs r0, #2 if (ept->flags.bits.is_stalled) { 1024: 071b lsls r3, r3, #28 1026: d40d bmi.n 1044 <_usb_d_dev_ep_trans+0x98> } /* Try to start transactions. */ atomic_enter_critical(&flags); 1028: 4b23 ldr r3, [pc, #140] ; (10b8 <_usb_d_dev_ep_trans+0x10c>) 102a: a805 add r0, sp, #20 102c: 4798 blx r3 if (_usb_d_dev_ep_is_busy(ept)) { 102e: 7ce1 ldrb r1, [r4, #19] 1030: 2340 movs r3, #64 ; 0x40 1032: 000a movs r2, r1 1034: 401a ands r2, r3 1036: 9203 str r2, [sp, #12] 1038: 4a20 ldr r2, [pc, #128] ; (10bc <_usb_d_dev_ep_trans+0x110>) 103a: 4219 tst r1, r3 103c: d006 beq.n 104c <_usb_d_dev_ep_trans+0xa0> atomic_leave_critical(&flags); 103e: a805 add r0, sp, #20 1040: 4790 blx r2 return USB_BUSY; 1042: 2001 movs r0, #1 } else { _usb_d_dev_out_next(ept, false); } return ERR_NONE; } 1044: b007 add sp, #28 1046: bdf0 pop {r4, r5, r6, r7, pc} bool use_cache = false; 1048: 9d01 ldr r5, [sp, #4] 104a: e7e9 b.n 1020 <_usb_d_dev_ep_trans+0x74> ept->flags.bits.is_busy = 1; 104c: 430b orrs r3, r1 104e: 74e3 strb r3, [r4, #19] atomic_leave_critical(&flags); 1050: a805 add r0, sp, #20 1052: 4790 blx r2 ept->flags.bits.dir = dir; 1054: 217f movs r1, #127 ; 0x7f ept->trans_buf = trans->buf; 1056: 6833 ldr r3, [r6, #0] ept->flags.bits.dir = dir; 1058: 01fa lsls r2, r7, #7 ept->trans_buf = trans->buf; 105a: 6023 str r3, [r4, #0] ept->trans_size = trans->size; 105c: 6873 ldr r3, [r6, #4] ept->flags.bits.need_zlp = (trans->zlp && (!size_n_aligned)); 105e: 9f03 ldr r7, [sp, #12] ept->trans_size = trans->size; 1060: 6063 str r3, [r4, #4] ept->trans_count = 0; 1062: 9b03 ldr r3, [sp, #12] 1064: 60a3 str r3, [r4, #8] ept->flags.bits.dir = dir; 1066: 7ce3 ldrb r3, [r4, #19] 1068: 400b ands r3, r1 ept->flags.bits.use_cache = use_cache; 106a: 4313 orrs r3, r2 106c: 0169 lsls r1, r5, #5 106e: 001d movs r5, r3 1070: 2320 movs r3, #32 1072: 439d bics r5, r3 1074: 430d orrs r5, r1 1076: 74e5 strb r5, [r4, #19] ept->flags.bits.need_zlp = (trans->zlp && (!size_n_aligned)); 1078: 7a73 ldrb r3, [r6, #9] 107a: 2b00 cmp r3, #0 107c: d002 beq.n 1084 <_usb_d_dev_ep_trans+0xd8> 107e: 9f01 ldr r7, [sp, #4] 1080: 427b negs r3, r7 1082: 415f adcs r7, r3 1084: 2210 movs r2, #16 1086: 7ce3 ldrb r3, [r4, #19] 1088: 013f lsls r7, r7, #4 108a: 4393 bics r3, r2 108c: 431f orrs r7, r3 if (dir) { 108e: 9b02 ldr r3, [sp, #8] _usb_d_dev_in_next(ept, false); 1090: 2100 movs r1, #0 1092: 0020 movs r0, r4 ept->flags.bits.need_zlp = (trans->zlp && (!size_n_aligned)); 1094: 74e7 strb r7, [r4, #19] if (dir) { 1096: 2b00 cmp r3, #0 1098: da03 bge.n 10a2 <_usb_d_dev_ep_trans+0xf6> _usb_d_dev_in_next(ept, false); 109a: 4b09 ldr r3, [pc, #36] ; (10c0 <_usb_d_dev_ep_trans+0x114>) _usb_d_dev_out_next(ept, false); 109c: 4798 blx r3 return ERR_NONE; 109e: 2000 movs r0, #0 10a0: e7d0 b.n 1044 <_usb_d_dev_ep_trans+0x98> _usb_d_dev_out_next(ept, false); 10a2: 4b08 ldr r3, [pc, #32] ; (10c4 <_usb_d_dev_ep_trans+0x118>) 10a4: e7fa b.n 109c <_usb_d_dev_ep_trans+0xf0> return -USB_ERR_PARAM; 10a6: 2012 movs r0, #18 10a8: e7b2 b.n 1010 <_usb_d_dev_ep_trans+0x64> 10aa: 46c0 nop ; (mov r8, r8) 10ac: 0000051d .word 0x0000051d 10b0: 000003ff .word 0x000003ff 10b4: 20007fff .word 0x20007fff 10b8: 00002449 .word 0x00002449 10bc: 00002457 .word 0x00002457 10c0: 0000078d .word 0x0000078d 10c4: 000008f1 .word 0x000008f1 000010c8 <_usb_d_dev_register_callback>: return USB_OK; } void _usb_d_dev_register_callback(const enum usb_d_cb_type type, const FUNC_PTR func) { FUNC_PTR f = (func == NULL) ? (FUNC_PTR)_dummy_func_no_return : (FUNC_PTR)func; 10c8: 2900 cmp r1, #0 10ca: d100 bne.n 10ce <_usb_d_dev_register_callback+0x6> 10cc: 4905 ldr r1, [pc, #20] ; (10e4 <_usb_d_dev_register_callback+0x1c>) if (type == USB_D_CB_EVENT) { 10ce: 2801 cmp r0, #1 10d0: d102 bne.n 10d8 <_usb_d_dev_register_callback+0x10> dev_inst.callbacks.event = (_usb_d_dev_event_cb_t)f; 10d2: 4b05 ldr r3, [pc, #20] ; (10e8 <_usb_d_dev_register_callback+0x20>) 10d4: 6059 str r1, [r3, #4] } else if (type == USB_D_CB_SOF) { dev_inst.callbacks.sof = (_usb_d_dev_sof_cb_t)f; } } 10d6: 4770 bx lr } else if (type == USB_D_CB_SOF) { 10d8: 2800 cmp r0, #0 10da: d1fc bne.n 10d6 <_usb_d_dev_register_callback+0xe> dev_inst.callbacks.sof = (_usb_d_dev_sof_cb_t)f; 10dc: 4b02 ldr r3, [pc, #8] ; (10e8 <_usb_d_dev_register_callback+0x20>) 10de: 6019 str r1, [r3, #0] } 10e0: e7f9 b.n 10d6 <_usb_d_dev_register_callback+0xe> 10e2: 46c0 nop ; (mov r8, r8) 10e4: 000004f5 .word 0x000004f5 10e8: 20000170 .word 0x20000170 000010ec <_usb_d_dev_register_ep_callback>: void _usb_d_dev_register_ep_callback(const enum usb_d_dev_ep_cb_type type, const FUNC_PTR func) { FUNC_PTR f = (func == NULL) ? (FUNC_PTR)_dummy_func_no_return : (FUNC_PTR)func; 10ec: 2900 cmp r1, #0 10ee: d100 bne.n 10f2 <_usb_d_dev_register_ep_callback+0x6> 10f0: 4907 ldr r1, [pc, #28] ; (1110 <_usb_d_dev_register_ep_callback+0x24>) if (type == USB_D_DEV_EP_CB_SETUP) { 10f2: 2800 cmp r0, #0 10f4: d102 bne.n 10fc <_usb_d_dev_register_ep_callback+0x10> dev_inst.ep_callbacks.setup = (_usb_d_dev_ep_cb_setup_t)f; 10f6: 4b07 ldr r3, [pc, #28] ; (1114 <_usb_d_dev_register_ep_callback+0x28>) 10f8: 6099 str r1, [r3, #8] } else if (type == USB_D_DEV_EP_CB_MORE) { dev_inst.ep_callbacks.more = (_usb_d_dev_ep_cb_more_t)f; } else if (type == USB_D_DEV_EP_CB_DONE) { dev_inst.ep_callbacks.done = (_usb_d_dev_ep_cb_done_t)f; } } 10fa: 4770 bx lr } else if (type == USB_D_DEV_EP_CB_MORE) { 10fc: 2801 cmp r0, #1 10fe: d102 bne.n 1106 <_usb_d_dev_register_ep_callback+0x1a> dev_inst.ep_callbacks.more = (_usb_d_dev_ep_cb_more_t)f; 1100: 4b04 ldr r3, [pc, #16] ; (1114 <_usb_d_dev_register_ep_callback+0x28>) 1102: 60d9 str r1, [r3, #12] 1104: e7f9 b.n 10fa <_usb_d_dev_register_ep_callback+0xe> } else if (type == USB_D_DEV_EP_CB_DONE) { 1106: 2802 cmp r0, #2 1108: d1f7 bne.n 10fa <_usb_d_dev_register_ep_callback+0xe> dev_inst.ep_callbacks.done = (_usb_d_dev_ep_cb_done_t)f; 110a: 4b02 ldr r3, [pc, #8] ; (1114 <_usb_d_dev_register_ep_callback+0x28>) 110c: 6119 str r1, [r3, #16] } 110e: e7f4 b.n 10fa <_usb_d_dev_register_ep_callback+0xe> 1110: 000004f5 .word 0x000004f5 1114: 20000170 .word 0x20000170 00001118 : /** * \brief USB interrupt handler */ void USB_Handler(void) { 1118: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} uint16_t epint = hw->DEVICE.EPINTSMRY.reg; 111a: 4b6c ldr r3, [pc, #432] ; (12cc ) 111c: 8c1a ldrh r2, [r3, #32] 111e: b291 uxth r1, r2 1120: 9101 str r1, [sp, #4] if (0 == epint) { 1122: 2a00 cmp r2, #0 1124: d000 beq.n 1128 1126: e066 b.n 11f6 return ((Usb *)hw)->DEVICE.INTFLAG.reg; 1128: 8b9a ldrh r2, [r3, #28] return ((Usb *)hw)->DEVICE.INTENSET.reg; 112a: 8b19 ldrh r1, [r3, #24] if (flags & USB_DEVICE_INTFLAG_SOF) { 112c: 2004 movs r0, #4 flags &= hri_usbdevice_read_INTEN_reg(USB); 112e: 400a ands r2, r1 if (flags & USB_DEVICE_INTFLAG_SOF) { 1130: 0011 movs r1, r2 1132: 4001 ands r1, r0 1134: 4202 tst r2, r0 1136: d004 beq.n 1142 ((Usb *)hw)->DEVICE.INTFLAG.reg = mask; 1138: 8398 strh r0, [r3, #28] dev_inst.callbacks.sof(); 113a: 4b65 ldr r3, [pc, #404] ; (12d0 ) 113c: 681b ldr r3, [r3, #0] 113e: 4798 blx r3 _usb_d_dev_handler(); } 1140: bdf7 pop {r0, r1, r2, r4, r5, r6, r7, pc} if (flags & USB_DEVICE_INTFLAG_LPMSUSP) { 1142: 2480 movs r4, #128 ; 0x80 1144: 0016 movs r6, r2 1146: 00a4 lsls r4, r4, #2 1148: 4026 ands r6, r4 114a: 4222 tst r2, r4 114c: d01d beq.n 118a 114e: 4a61 ldr r2, [pc, #388] ; (12d4 ) 1150: 839a strh r2, [r3, #28] ((Usb *)hw)->DEVICE.INTENCLR.reg = mask; 1152: 829a strh r2, [r3, #20] ((Usb *)hw)->DEVICE.INTENSET.reg = mask; 1154: 3a92 subs r2, #146 ; 0x92 1156: 3aff subs r2, #255 ; 0xff 1158: 831a strh r2, [r3, #24] if (bank->EXTREG.bit.SUBPID == 0x3) { 115a: 4b5f ldr r3, [pc, #380] ; (12d8 ) 115c: 891a ldrh r2, [r3, #8] 115e: 0712 lsls r2, r2, #28 1160: 0f12 lsrs r2, r2, #28 1162: 2a03 cmp r2, #3 1164: d005 beq.n 1172 1166: 8d1a ldrh r2, [r3, #40] ; 0x28 1168: 0712 lsls r2, r2, #28 116a: 0f12 lsrs r2, r2, #28 116c: 2a03 cmp r2, #3 116e: d107 bne.n 1180 UsbDeviceDescBank *bank = &prvt_inst.desc_table[i].DeviceDescBank[0]; 1170: 2101 movs r1, #1 bank->EXTREG.reg = 0; 1172: 2200 movs r2, #0 lpm_variable = bank->EXTREG.bit.VARIABLE; 1174: 0149 lsls r1, r1, #5 1176: 185b adds r3, r3, r1 1178: 8919 ldrh r1, [r3, #8] bank->EXTREG.reg = 0; 117a: 811a strh r2, [r3, #8] lpm_variable = bank->EXTREG.bit.VARIABLE; 117c: 0449 lsls r1, r1, #17 117e: 0d49 lsrs r1, r1, #21 dev_inst.callbacks.event(USB_EV_LPM_SUSPEND, lpm_variable); 1180: 2003 movs r0, #3 1182: 4b53 ldr r3, [pc, #332] ; (12d0 ) 1184: 685b ldr r3, [r3, #4] dev_inst.callbacks.event(USB_EV_SUSPEND, 0); 1186: 4798 blx r3 1188: e7da b.n 1140 } else if (flags & USB_DEVICE_INTFLAG_RAMACER) { 118a: 2480 movs r4, #128 ; 0x80 118c: 0015 movs r5, r2 118e: 4025 ands r5, r4 1190: 4222 tst r2, r4 1192: d005 beq.n 11a0 ((Usb *)hw)->DEVICE.INTFLAG.reg = mask; 1194: 839c strh r4, [r3, #28] dev_inst.callbacks.event(USB_EV_ERROR, 0); 1196: 4b4e ldr r3, [pc, #312] ; (12d0 ) 1198: 0031 movs r1, r6 119a: 2005 movs r0, #5 119c: 685b ldr r3, [r3, #4] 119e: e7f2 b.n 1186 } else if (flags & USB_D_WAKEUP_INT_FLAGS) { 11a0: 2670 movs r6, #112 ; 0x70 11a2: 0014 movs r4, r2 11a4: 4034 ands r4, r6 11a6: 4232 tst r2, r6 11a8: d00a beq.n 11c0 ((Usb *)hw)->DEVICE.INTENSET.reg = mask; 11aa: 4a4a ldr r2, [pc, #296] ; (12d4 ) ((Usb *)hw)->DEVICE.INTFLAG.reg = mask; 11ac: 839e strh r6, [r3, #28] ((Usb *)hw)->DEVICE.INTENCLR.reg = mask; 11ae: 829e strh r6, [r3, #20] ((Usb *)hw)->DEVICE.INTENSET.reg = mask; 11b0: 831a strh r2, [r3, #24] _usb_d_dev_wait_dfll_rdy(); 11b2: 4b4a ldr r3, [pc, #296] ; (12dc ) 11b4: 4798 blx r3 dev_inst.callbacks.event(USB_EV_WAKEUP, 0); 11b6: 4b46 ldr r3, [pc, #280] ; (12d0 ) 11b8: 0029 movs r1, r5 11ba: 2002 movs r0, #2 11bc: 685b ldr r3, [r3, #4] 11be: e7e2 b.n 1186 } else if (flags & USB_DEVICE_INTFLAG_EORST) { 11c0: 2508 movs r5, #8 11c2: 0011 movs r1, r2 11c4: 4029 ands r1, r5 11c6: 422a tst r2, r5 11c8: d00c beq.n 11e4 ((UsbDevice *)hw)->DeviceEndpoint[submodule_index].EPCFG.reg = data; 11ca: 4a45 ldr r2, [pc, #276] ; (12e0 ) 11cc: 7054 strb r4, [r2, #1] ((Usb *)hw)->DEVICE.INTENSET.reg = mask; 11ce: 4a41 ldr r2, [pc, #260] ; (12d4 ) ((Usb *)hw)->DEVICE.INTFLAG.reg = mask; 11d0: 839d strh r5, [r3, #28] ((Usb *)hw)->DEVICE.INTENCLR.reg = mask; 11d2: 829e strh r6, [r3, #20] ((Usb *)hw)->DEVICE.INTENSET.reg = mask; 11d4: 831a strh r2, [r3, #24] _usb_d_dev_reset_epts(); 11d6: 4b43 ldr r3, [pc, #268] ; (12e4 ) 11d8: 4798 blx r3 dev_inst.callbacks.event(USB_EV_RESET, 0); 11da: 4b3d ldr r3, [pc, #244] ; (12d0 ) 11dc: 0021 movs r1, r4 11de: 2001 movs r0, #1 11e0: 685b ldr r3, [r3, #4] 11e2: e7d0 b.n 1186 } else if (flags & USB_DEVICE_INTFLAG_SUSPEND) { 11e4: 07d2 lsls r2, r2, #31 11e6: d506 bpl.n 11f6 ((Usb *)hw)->DEVICE.INTFLAG.reg = mask; 11e8: 4a3a ldr r2, [pc, #232] ; (12d4 ) 11ea: 839a strh r2, [r3, #28] ((Usb *)hw)->DEVICE.INTENCLR.reg = mask; 11ec: 829a strh r2, [r3, #20] ((Usb *)hw)->DEVICE.INTENSET.reg = mask; 11ee: 831e strh r6, [r3, #24] dev_inst.callbacks.event(USB_EV_SUSPEND, 0); 11f0: 4b37 ldr r3, [pc, #220] ; (12d0 ) 11f2: 685b ldr r3, [r3, #4] 11f4: e7c7 b.n 1186 uint32_t lpm_variable = 0; 11f6: 2600 movs r6, #0 uint8_t epn = USB_EP_GET_N(ept->ep); 11f8: 270f movs r7, #15 if (!(epint & (1u << epn))) { 11fa: 2501 movs r5, #1 11fc: 4c3a ldr r4, [pc, #232] ; (12e8 ) if (ept->ep == 0xFF) { 11fe: 7ca3 ldrb r3, [r4, #18] 1200: 2bff cmp r3, #255 ; 0xff 1202: d038 beq.n 1276 if (!(epint & (1u << epn))) { 1204: 002a movs r2, r5 1206: 403b ands r3, r7 1208: 409a lsls r2, r3 120a: 9901 ldr r1, [sp, #4] 120c: 4211 tst r1, r2 120e: d032 beq.n 1276 flags = hw->DEVICE.DeviceEndpoint[epn].EPINTFLAG.reg; 1210: 4936 ldr r1, [pc, #216] ; (12ec ) 1212: 015a lsls r2, r3, #5 1214: 1852 adds r2, r2, r1 mask = hw->DEVICE.DeviceEndpoint[epn].EPINTENSET.reg; 1216: 4932 ldr r1, [pc, #200] ; (12e0 ) 1218: 015b lsls r3, r3, #5 121a: 185b adds r3, r3, r1 flags = hw->DEVICE.DeviceEndpoint[epn].EPINTFLAG.reg; 121c: 7812 ldrb r2, [r2, #0] mask = hw->DEVICE.DeviceEndpoint[epn].EPINTENSET.reg; 121e: 7a99 ldrb r1, [r3, #10] flags &= mask; 1220: 000b movs r3, r1 1222: 4013 ands r3, r2 if (flags) { 1224: 4211 tst r1, r2 1226: d026 beq.n 1276 if ((ept->flags.bits.eptype == 0x1) && !_usb_d_dev_ep_is_busy(ept)) { 1228: 2114 movs r1, #20 122a: 4371 muls r1, r6 122c: 4a28 ldr r2, [pc, #160] ; (12d0 ) 122e: 1852 adds r2, r2, r1 1230: 2147 movs r1, #71 ; 0x47 1232: 3210 adds r2, #16 1234: 7dd2 ldrb r2, [r2, #23] 1236: 4011 ands r1, r2 1238: 2901 cmp r1, #1 123a: d111 bne.n 1260 if (flags & USB_DEVICE_EPINTFLAG_RXSTP) { 123c: 06da lsls r2, r3, #27 123e: d503 bpl.n 1248 _usb_d_dev_handle_setup(ept); 1240: 0020 movs r0, r4 1242: 4b2b ldr r3, [pc, #172] ; (12f0 ) 1244: 4798 blx r3 1246: e016 b.n 1276 } else if (flags & USB_DEVICE_EPINTFLAG_STALL1) { 1248: 2240 movs r2, #64 ; 0x40 124a: 0019 movs r1, r3 124c: 4011 ands r1, r2 124e: 4213 tst r3, r2 1250: d001 beq.n 1256 _usb_d_dev_handle_stall(ept, 1); 1252: 0029 movs r1, r5 1254: e001 b.n 125a } else if (flags & USB_DEVICE_EPINTFLAG_STALL0) { 1256: 069b lsls r3, r3, #26 1258: d50d bpl.n 1276 _usb_d_dev_handle_stall(ept, 0); 125a: 0020 movs r0, r4 125c: 4b25 ldr r3, [pc, #148] ; (12f4 ) 125e: e009 b.n 1274 } else if (_usb_d_dev_ep_is_in(ept)) { 1260: b251 sxtb r1, r2 1262: 2900 cmp r1, #0 1264: da1c bge.n 12a0 if (flags & USB_DEVICE_EPINTFLAG_STALL1) { 1266: 0659 lsls r1, r3, #25 1268: d4f3 bmi.n 1252 } else if (flags & USB_DEVICE_EPINTFLAG_TRFAIL1) { 126a: 0719 lsls r1, r3, #28 126c: d508 bpl.n 1280 _usb_d_dev_handle_trfail(ept, 1); 126e: 0029 movs r1, r5 1270: 0020 movs r0, r4 1272: 4b21 ldr r3, [pc, #132] ; (12f8 ) 1274: 4798 blx r3 for (i = 0; i < USB_D_N_EP; i++) { 1276: 3601 adds r6, #1 1278: 3414 adds r4, #20 127a: 2e1b cmp r6, #27 127c: d1bf bne.n 11fe 127e: e75f b.n 1140 } else if (flags & USB_DEVICE_EPINTFLAG_TRCPT1) { 1280: 0799 lsls r1, r3, #30 1282: d503 bpl.n 128c _usb_d_dev_in_next(ept, true); 1284: 0029 movs r1, r5 1286: 0020 movs r0, r4 1288: 4b1c ldr r3, [pc, #112] ; (12fc ) 128a: e7f3 b.n 1274 } else if (_usb_d_dev_ep_is_ctrl(ept)) { 128c: 2107 movs r1, #7 128e: 400a ands r2, r1 1290: 2a01 cmp r2, #1 1292: d1f0 bne.n 1276 _usb_d_dev_handle_trfail(ept, 0); 1294: 2100 movs r1, #0 if (flags & USB_DEVICE_EPINTFLAG_TRFAIL0) { 1296: 075a lsls r2, r3, #29 1298: d4ea bmi.n 1270 } else if (flags & USB_DEVICE_EPINTFLAG_RXSTP) { 129a: 06db lsls r3, r3, #27 129c: d5eb bpl.n 1276 129e: e7cf b.n 1240 if (flags & USB_DEVICE_EPINTFLAG_STALL0) { 12a0: 2020 movs r0, #32 12a2: 0019 movs r1, r3 12a4: 4001 ands r1, r0 12a6: 4203 tst r3, r0 12a8: d001 beq.n 12ae _usb_d_dev_handle_stall(ept, 0); 12aa: 2100 movs r1, #0 12ac: e7d5 b.n 125a } else if (flags & USB_DEVICE_EPINTFLAG_TRFAIL0) { 12ae: 0758 lsls r0, r3, #29 12b0: d4de bmi.n 1270 } else if (flags & USB_DEVICE_EPINTFLAG_TRCPT0) { 12b2: 422b tst r3, r5 12b4: d003 beq.n 12be _usb_d_dev_out_next(ept, true); 12b6: 0029 movs r1, r5 12b8: 0020 movs r0, r4 12ba: 4b11 ldr r3, [pc, #68] ; (1300 ) 12bc: e7da b.n 1274 } else if (_usb_d_dev_ep_is_ctrl(ept)) { 12be: 2107 movs r1, #7 12c0: 400a ands r2, r1 12c2: 2a01 cmp r2, #1 12c4: d1d7 bne.n 1276 if (flags & USB_DEVICE_EPINTFLAG_TRFAIL1) { 12c6: 071a lsls r2, r3, #28 12c8: d5e7 bpl.n 129a 12ca: e7d0 b.n 126e 12cc: 41005000 .word 0x41005000 12d0: 20000170 .word 0x20000170 12d4: 00000201 .word 0x00000201 12d8: 20000110 .word 0x20000110 12dc: 000004f9 .word 0x000004f9 12e0: 410050ff .word 0x410050ff 12e4: 0000074d .word 0x0000074d 12e8: 20000184 .word 0x20000184 12ec: 41005107 .word 0x41005107 12f0: 00000539 .word 0x00000539 12f4: 000005b5 .word 0x000005b5 12f8: 00000669 .word 0x00000669 12fc: 0000078d .word 0x0000078d 1300: 000008f1 .word 0x000008f1 00001304 : /** * \brief Initialize Delay driver */ void delay_init(void *const hw) { 1304: b510 push {r4, lr} _delay_init(hardware = hw); 1306: 4b02 ldr r3, [pc, #8] ; (1310 ) 1308: 6018 str r0, [r3, #0] 130a: 4b02 ldr r3, [pc, #8] ; (1314 ) 130c: 4798 blx r3 } 130e: bd10 pop {r4, pc} 1310: 20000460 .word 0x20000460 1314: 000000fd .word 0x000000fd 00001318 : /** * \brief Perform delay in ms */ void delay_ms(const uint16_t ms) { _delay_cycles(hardware, _get_cycles_for_ms(ms)); 1318: 4b04 ldr r3, [pc, #16] ; (132c ) { 131a: b510 push {r4, lr} _delay_cycles(hardware, _get_cycles_for_ms(ms)); 131c: 681c ldr r4, [r3, #0] 131e: 4b04 ldr r3, [pc, #16] ; (1330 ) 1320: 4798 blx r3 1322: 0001 movs r1, r0 1324: 4b03 ldr r3, [pc, #12] ; (1334 ) 1326: 0020 movs r0, r4 1328: 4798 blx r3 } 132a: bd10 pop {r4, pc} 132c: 20000460 .word 0x20000460 1330: 000013d9 .word 0x000013d9 1334: 00000111 .word 0x00000111 00001338 <_pm_init>: } static inline void hri_pm_set_CPUSEL_CPUDIV_bf(const void *const hw, hri_pm_cpusel_reg_t mask) { PM_CRITICAL_SECTION_ENTER(); ((Pm *)hw)->CPUSEL.reg |= PM_CPUSEL_CPUDIV(mask); 1338: 4b06 ldr r3, [pc, #24] ; (1354 <_pm_init+0x1c>) 133a: 7a1a ldrb r2, [r3, #8] 133c: b2d2 uxtb r2, r2 133e: 721a strb r2, [r3, #8] } static inline void hri_pm_set_APBASEL_APBADIV_bf(const void *const hw, hri_pm_apbasel_reg_t mask) { PM_CRITICAL_SECTION_ENTER(); ((Pm *)hw)->APBASEL.reg |= PM_APBASEL_APBADIV(mask); 1340: 7a5a ldrb r2, [r3, #9] 1342: b2d2 uxtb r2, r2 1344: 725a strb r2, [r3, #9] } static inline void hri_pm_set_APBBSEL_APBBDIV_bf(const void *const hw, hri_pm_apbbsel_reg_t mask) { PM_CRITICAL_SECTION_ENTER(); ((Pm *)hw)->APBBSEL.reg |= PM_APBBSEL_APBBDIV(mask); 1346: 7a9a ldrb r2, [r3, #10] 1348: b2d2 uxtb r2, r2 134a: 729a strb r2, [r3, #10] } static inline void hri_pm_set_APBCSEL_APBCDIV_bf(const void *const hw, hri_pm_apbcsel_reg_t mask) { PM_CRITICAL_SECTION_ENTER(); ((Pm *)hw)->APBCSEL.reg |= PM_APBCSEL_APBCDIV(mask); 134c: 7ada ldrb r2, [r3, #11] 134e: b2d2 uxtb r2, r2 1350: 72da strb r2, [r3, #11] { hri_pm_set_CPUSEL_CPUDIV_bf(PM, CONF_CPU_DIV); hri_pm_set_APBASEL_APBADIV_bf(PM, CONF_APBA_DIV); hri_pm_set_APBBSEL_APBBDIV_bf(PM, CONF_APBB_DIV); hri_pm_set_APBCSEL_APBCDIV_bf(PM, CONF_APBC_DIV); } 1352: 4770 bx lr 1354: 40000400 .word 0x40000400 00001358 <_init_chip>: } static inline void hri_nvmctrl_set_CTRLB_RWS_bf(const void *const hw, hri_nvmctrl_ctrlb_reg_t mask) { NVMCTRL_CRITICAL_SECTION_ENTER(); ((Nvmctrl *)hw)->CTRLB.reg |= NVMCTRL_CTRLB_RWS(mask); 1358: 4b06 ldr r3, [pc, #24] ; (1374 <_init_chip+0x1c>) /** * \brief Initialize the hardware abstraction layer */ void _init_chip(void) { 135a: b510 push {r4, lr} 135c: 685a ldr r2, [r3, #4] 135e: 605a str r2, [r3, #4] hri_nvmctrl_set_CTRLB_RWS_bf(NVMCTRL, CONF_NVM_WAIT_STATE); _pm_init(); 1360: 4b05 ldr r3, [pc, #20] ; (1378 <_init_chip+0x20>) 1362: 4798 blx r3 _sysctrl_init_sources(); 1364: 4b05 ldr r3, [pc, #20] ; (137c <_init_chip+0x24>) 1366: 4798 blx r3 #if _GCLK_INIT_1ST _gclk_init_generators_by_fref(_GCLK_INIT_1ST); #endif _sysctrl_init_referenced_generators(); 1368: 4b05 ldr r3, [pc, #20] ; (1380 <_init_chip+0x28>) 136a: 4798 blx r3 _gclk_init_generators_by_fref(_GCLK_INIT_LAST); 136c: 20ff movs r0, #255 ; 0xff 136e: 4b05 ldr r3, [pc, #20] ; (1384 <_init_chip+0x2c>) 1370: 4798 blx r3 #if CONF_DMAC_ENABLE _pm_enable_bus_clock(PM_BUS_AHB, DMAC); _pm_enable_bus_clock(PM_BUS_APBB, DMAC); _dma_init(); #endif } 1372: bd10 pop {r4, pc} 1374: 41004000 .word 0x41004000 1378: 00001339 .word 0x00001339 137c: 00001425 .word 0x00001425 1380: 00001465 .word 0x00001465 1384: 000015d9 .word 0x000015d9 00001388 : * \brief Check whether element belongs to list */ bool is_list_element(const struct list_descriptor *const list, const void *const element) { struct list_element *it; for (it = list->head; it; it = it->next) { 1388: 6800 ldr r0, [r0, #0] 138a: 2800 cmp r0, #0 138c: d100 bne.n 1390 return true; } } return false; } 138e: 4770 bx lr if (it == element) { 1390: 4288 cmp r0, r1 1392: d1f9 bne.n 1388 return true; 1394: 2001 movs r0, #1 1396: e7fa b.n 138e 00001398 : /** * \brief Insert an element at list end */ void list_insert_at_end(struct list_descriptor *const list, void *const element) { 1398: b570 push {r4, r5, r6, lr} struct list_element *it = list->head; ASSERT(!is_list_element(list, element)); 139a: 4b0c ldr r3, [pc, #48] ; (13cc ) { 139c: 0005 movs r5, r0 139e: 000c movs r4, r1 struct list_element *it = list->head; 13a0: 6806 ldr r6, [r0, #0] ASSERT(!is_list_element(list, element)); 13a2: 4798 blx r3 13a4: 2301 movs r3, #1 13a6: 4058 eors r0, r3 13a8: 224f movs r2, #79 ; 0x4f 13aa: 4b09 ldr r3, [pc, #36] ; (13d0 ) 13ac: 4909 ldr r1, [pc, #36] ; (13d4 ) 13ae: b2c0 uxtb r0, r0 13b0: 4798 blx r3 if (!list->head) { 13b2: 682b ldr r3, [r5, #0] 13b4: 2b00 cmp r3, #0 13b6: d102 bne.n 13be list->head = (struct list_element *)element; 13b8: 602c str r4, [r5, #0] ((struct list_element *)element)->next = NULL; 13ba: 6023 str r3, [r4, #0] while (it->next) { it = it->next; } it->next = (struct list_element *)element; ((struct list_element *)element)->next = NULL; } 13bc: bd70 pop {r4, r5, r6, pc} while (it->next) { 13be: 0033 movs r3, r6 13c0: 6836 ldr r6, [r6, #0] 13c2: 2e00 cmp r6, #0 13c4: d1fb bne.n 13be it->next = (struct list_element *)element; 13c6: 601c str r4, [r3, #0] ((struct list_element *)element)->next = NULL; 13c8: 6026 str r6, [r4, #0] 13ca: e7f7 b.n 13bc 13cc: 00001389 .word 0x00001389 13d0: 000013e1 .word 0x000013e1 13d4: 00002eac .word 0x00002eac 000013d8 <_get_cycles_for_ms>: { switch (power) { case 8: return (ms * (freq / 100000)) * 100; case 7: return (ms * (freq / 10000)) * 10; 13d8: 23fa movs r3, #250 ; 0xfa 13da: 015b lsls r3, r3, #5 13dc: 4358 muls r0, r3 * \brief Retrieve the amount of cycles to delay for the given amount of ms */ uint32_t _get_cycles_for_ms(const uint16_t ms) { return _get_cycles_for_ms_internal(ms, CONF_CPU_FREQUENCY, CPU_FREQ_POWER); } 13de: 4770 bx lr 000013e0 : /** * \brief Assert function */ void assert(const bool condition, const char *const file, const int line) { if (!(condition)) { 13e0: 2800 cmp r0, #0 13e2: d100 bne.n 13e6 __asm("BKPT #0"); 13e4: be00 bkpt 0x0000 } (void)file; (void)line; } 13e6: 4770 bx lr 000013e8 : /** * \brief CDC ACM Init */ void cdc_device_acm_init(void) { 13e8: b510 push {r4, lr} /* usb stack init */ usbdc_init(ctrl_buffer); 13ea: 4b05 ldr r3, [pc, #20] ; (1400 ) 13ec: 4805 ldr r0, [pc, #20] ; (1404 ) 13ee: 4798 blx r3 /* usbdc_register_funcion inside */ cdcdf_acm_init(); 13f0: 4b05 ldr r3, [pc, #20] ; (1408 ) 13f2: 4798 blx r3 usbdc_start(single_desc); 13f4: 4b05 ldr r3, [pc, #20] ; (140c ) 13f6: 4806 ldr r0, [pc, #24] ; (1410 ) 13f8: 4798 blx r3 usbdc_attach(); 13fa: 4b06 ldr r3, [pc, #24] ; (1414 ) 13fc: 4798 blx r3 } 13fe: bd10 pop {r4, pc} 1400: 00002371 .word 0x00002371 1404: 20000464 .word 0x20000464 1408: 00000425 .word 0x00000425 140c: 000023e9 .word 0x000023e9 1410: 20000008 .word 0x20000008 1414: 0000241d .word 0x0000241d 00001418 : cdcdf_acm_register_callback(CDCDF_ACM_CB_STATE_C, (FUNC_PTR)usb_device_cb_state_c); } void usb_init(void) { 1418: b510 push {r4, lr} cdc_device_acm_init(); 141a: 4b01 ldr r3, [pc, #4] ; (1420 ) 141c: 4798 blx r3 } 141e: bd10 pop {r4, pc} 1420: 000013e9 .word 0x000013e9 00001424 <_sysctrl_init_sources>: } static inline hri_sysctrl_osc8m_reg_t hri_sysctrl_read_OSC8M_CALIB_bf(const void *const hw) { uint32_t tmp; tmp = ((Sysctrl *)hw)->OSC8M.reg; 1424: 4b0d ldr r3, [pc, #52] ; (145c <_sysctrl_init_sources+0x38>) 1426: 6a18 ldr r0, [r3, #32] } static inline hri_sysctrl_osc8m_reg_t hri_sysctrl_read_OSC8M_FRANGE_bf(const void *const hw) { uint32_t tmp; tmp = ((Sysctrl *)hw)->OSC8M.reg; 1428: 6a19 ldr r1, [r3, #32] #if CONF_OSC8M_CONFIG == 1 calib = hri_sysctrl_read_OSC8M_CALIB_bf(hw); hri_sysctrl_write_OSC8M_reg(hw, SYSCTRL_OSC8M_FRANGE(hri_sysctrl_read_OSC8M_FRANGE_bf(hw)) | 142a: 0f89 lsrs r1, r1, #30 142c: 078a lsls r2, r1, #30 #if CONF_OSC8M_OVERWRITE_CALIBRATION == 1 SYSCTRL_OSC8M_CALIB(CONF_OSC8M_CALIB) | #else SYSCTRL_OSC8M_CALIB(calib) | 142e: 490c ldr r1, [pc, #48] ; (1460 <_sysctrl_init_sources+0x3c>) 1430: 4001 ands r1, r0 #endif SYSCTRL_OSC8M_PRESC(CONF_OSC8M_PRESC) | (CONF_OSC8M_RUNSTDBY << SYSCTRL_OSC8M_RUNSTDBY_Pos) 1432: 430a orrs r2, r1 hri_sysctrl_write_OSC8M_reg(hw, 1434: 2102 movs r1, #2 1436: 430a orrs r2, r1 } static inline void hri_sysctrl_write_OSC8M_reg(const void *const hw, hri_sysctrl_osc8m_reg_t data) { SYSCTRL_CRITICAL_SECTION_ENTER(); ((Sysctrl *)hw)->OSC8M.reg = data; 1438: 621a str r2, [r3, #32] ((Sysctrl *)hw)->OSC32K.reg |= SYSCTRL_OSC32K_ENABLE; 143a: 699a ldr r2, [r3, #24] 143c: 4311 orrs r1, r2 143e: 6199 str r1, [r3, #24] tmp = (tmp & SYSCTRL_OSCULP32K_CALIB_Msk) >> SYSCTRL_OSCULP32K_CALIB_Pos; 1440: 211f movs r1, #31 tmp = ((Sysctrl *)hw)->OSCULP32K.reg; 1442: 7f1a ldrb r2, [r3, #28] tmp = (tmp & SYSCTRL_OSCULP32K_CALIB_Msk) >> SYSCTRL_OSCULP32K_CALIB_Pos; 1444: 400a ands r2, r1 ((Sysctrl *)hw)->OSCULP32K.reg = data; 1446: 771a strb r2, [r3, #28] return (((Sysctrl *)hw)->PCLKSR.reg & SYSCTRL_PCLKSR_OSC8MRDY) >> SYSCTRL_PCLKSR_OSC8MRDY_Pos; 1448: 391e subs r1, #30 144a: 68da ldr r2, [r3, #12] 144c: 08d2 lsrs r2, r2, #3 #endif #endif #if CONF_OSC8M_CONFIG == 1 #if CONF_OSC8M_ENABLE == 1 while (!hri_sysctrl_get_PCLKSR_OSC8MRDY_bit(hw)) 144e: 420a tst r2, r1 1450: d0fb beq.n 144a <_sysctrl_init_sources+0x26> ((Sysctrl *)hw)->OSC8M.reg |= SYSCTRL_OSC8M_ONDEMAND; 1452: 2280 movs r2, #128 ; 0x80 1454: 6a19 ldr r1, [r3, #32] 1456: 430a orrs r2, r1 1458: 621a str r2, [r3, #32] hri_sysctrl_set_OSC8M_ONDEMAND_bit(hw); #endif #endif (void)calib, (void)hw; } 145a: 4770 bx lr 145c: 40000800 .word 0x40000800 1460: 0fff0000 .word 0x0fff0000 00001464 <_sysctrl_init_referenced_generators>: } static inline void hri_sysctrl_write_DFLLCTRL_reg(const void *const hw, hri_sysctrl_dfllctrl_reg_t data) { SYSCTRL_CRITICAL_SECTION_ENTER(); ((Sysctrl *)hw)->DFLLCTRL.reg = data; 1464: 2202 movs r2, #2 return (((Sysctrl *)hw)->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) >> SYSCTRL_PCLKSR_DFLLRDY_Pos; 1466: 2101 movs r1, #1 ((Sysctrl *)hw)->DFLLCTRL.reg = data; 1468: 4b14 ldr r3, [pc, #80] ; (14bc <_sysctrl_init_referenced_generators+0x58>) 146a: 849a strh r2, [r3, #36] ; 0x24 return (((Sysctrl *)hw)->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) >> SYSCTRL_PCLKSR_DFLLRDY_Pos; 146c: 68da ldr r2, [r3, #12] 146e: 0912 lsrs r2, r2, #4 hri_gclk_write_CLKCTRL_reg(GCLK, GCLK_CLKCTRL_ID(0) | GCLK_CLKCTRL_GEN(CONF_DFLL_GCLK) | (1 << GCLK_CLKCTRL_CLKEN_Pos)); #endif hri_sysctrl_write_DFLLCTRL_reg(hw, SYSCTRL_DFLLCTRL_ENABLE); while (!hri_sysctrl_get_PCLKSR_DFLLRDY_bit(hw)) 1470: 420a tst r2, r1 1472: d0fb beq.n 146c <_sysctrl_init_referenced_generators+0x8> } static inline void hri_sysctrl_write_DFLLMUL_reg(const void *const hw, hri_sysctrl_dfllmul_reg_t data) { SYSCTRL_CRITICAL_SECTION_ENTER(); ((Sysctrl *)hw)->DFLLMUL.reg = data; 1474: 4a12 ldr r2, [pc, #72] ; (14c0 <_sysctrl_init_referenced_generators+0x5c>) 1476: 62da str r2, [r3, #44] ; 0x2c ((Sysctrl *)hw)->DFLLVAL.reg = data; 1478: 22fc movs r2, #252 ; 0xfc 147a: 01d2 lsls r2, r2, #7 147c: 629a str r2, [r3, #40] ; 0x28 ((Sysctrl *)hw)->DFLLCTRL.reg = data; 147e: 229b movs r2, #155 ; 0x9b 1480: 0052 lsls r2, r2, #1 1482: 849a strh r2, [r3, #36] ; 0x24 tmp = ((Sysctrl *)hw)->DFLLCTRL.reg; 1484: 8c9a ldrh r2, [r3, #36] ; 0x24 tmp = (tmp & SYSCTRL_DFLLCTRL_MODE) >> SYSCTRL_DFLLCTRL_MODE_Pos; 1486: 0892 lsrs r2, r2, #2 | SYSCTRL_DPLLCTRLB_FILTER(CONF_DPLL_FILTER)); #endif #if CONF_DFLL_CONFIG == 1 #if CONF_DFLL_ENABLE == 1 if (hri_sysctrl_get_DFLLCTRL_MODE_bit(hw)) { 1488: 420a tst r2, r1 148a: d010 beq.n 14ae <_sysctrl_init_referenced_generators+0x4a> tmp &= mask; 148c: 2210 movs r2, #16 tmp = ((Sysctrl *)hw)->PCLKSR.reg; 148e: 68d9 ldr r1, [r3, #12] = SYSCTRL_PCLKSR_DFLLRDY | SYSCTRL_PCLKSR_DFLLLCKF | SYSCTRL_PCLKSR_DFLLLCKC; #else hri_sysctrl_pclksr_reg_t status_mask = SYSCTRL_PCLKSR_DFLLRDY; #endif while (hri_sysctrl_get_PCLKSR_reg(hw, status_mask) != status_mask) 1490: 4211 tst r1, r2 1492: d0fc beq.n 148e <_sysctrl_init_referenced_generators+0x2a> ((Sysctrl *)hw)->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_ONDEMAND; 1494: 2280 movs r2, #128 ; 0x80 1496: 8c99 ldrh r1, [r3, #36] ; 0x24 1498: 430a orrs r2, r1 return ((const Gclk *)hw)->STATUS.bit.SYNCBUSY; } static inline bool hri_gclk_get_STATUS_SYNCBUSY_bit(const void *const hw) { return (((Gclk *)hw)->STATUS.reg & GCLK_STATUS_SYNCBUSY) >> GCLK_STATUS_SYNCBUSY_Pos; 149a: 490a ldr r1, [pc, #40] ; (14c4 <_sysctrl_init_referenced_generators+0x60>) 149c: 849a strh r2, [r3, #36] ; 0x24 149e: 784a ldrb r2, [r1, #1] 14a0: 09d2 lsrs r2, r2, #7 hri_sysctrl_set_DPLLCTRLA_ONDEMAND_bit(hw); #endif #endif #if CONF_DFLL_CONFIG == 1 while (hri_gclk_get_STATUS_SYNCBUSY_bit(GCLK)) 14a2: d1fc bne.n 149e <_sysctrl_init_referenced_generators+0x3a> ((Sysctrl *)hw)->OSC32K.reg &= ~SYSCTRL_OSC32K_ENABLE; 14a4: 2102 movs r1, #2 14a6: 699a ldr r2, [r3, #24] 14a8: 438a bics r2, r1 14aa: 619a str r2, [r3, #24] /* Disable after all possible configurations needs sync written. */ hri_sysctrl_clear_OSC32K_ENABLE_bit(hw); #endif (void)hw; } 14ac: 4770 bx lr return (((Sysctrl *)hw)->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) >> SYSCTRL_PCLKSR_DFLLRDY_Pos; 14ae: 2101 movs r1, #1 14b0: 68da ldr r2, [r3, #12] 14b2: 0912 lsrs r2, r2, #4 while (!hri_sysctrl_get_PCLKSR_DFLLRDY_bit(hw)) 14b4: 420a tst r2, r1 14b6: d0fb beq.n 14b0 <_sysctrl_init_referenced_generators+0x4c> 14b8: e7ec b.n 1494 <_sysctrl_init_referenced_generators+0x30> 14ba: 46c0 nop ; (mov r8, r8) 14bc: 40000800 .word 0x40000800 14c0: 0401bb80 .word 0x0401bb80 14c4: 40000c00 .word 0x40000c00 000014c8 : * \param[in] length The number of bytes to write * * \return The number of bytes written. */ static int32_t usart_sync_write(struct io_descriptor *const io_descr, const uint8_t *const buf, const uint16_t length) { 14c8: b5f8 push {r3, r4, r5, r6, r7, lr} 14ca: 0006 movs r6, r0 14cc: 000d movs r5, r1 14ce: 0014 movs r4, r2 uint32_t offset = 0; struct usart_sync_descriptor *descr = CONTAINER_OF(io_descr, struct usart_sync_descriptor, io); ASSERT(io_descr && buf && length); 14d0: 2800 cmp r0, #0 14d2: d004 beq.n 14de 14d4: 1e08 subs r0, r1, #0 14d6: d002 beq.n 14de 14d8: 0010 movs r0, r2 14da: 1e43 subs r3, r0, #1 14dc: 4198 sbcs r0, r3 14de: 22f1 movs r2, #241 ; 0xf1 14e0: 4910 ldr r1, [pc, #64] ; (1524 ) 14e2: 4b11 ldr r3, [pc, #68] ; (1528 ) 14e4: 4798 blx r3 while (!_usart_sync_is_ready_to_send(&descr->device)) 14e6: 0037 movs r7, r6 14e8: 3708 adds r7, #8 14ea: 0038 movs r0, r7 14ec: 4b0f ldr r3, [pc, #60] ; (152c ) 14ee: 4798 blx r3 14f0: 2800 cmp r0, #0 14f2: d0f8 beq.n 14e6 uint32_t offset = 0; 14f4: 2600 movs r6, #0 ; do { _usart_sync_write_byte(&descr->device, buf[offset]); 14f6: 0038 movs r0, r7 14f8: 5da9 ldrb r1, [r5, r6] 14fa: 4b0d ldr r3, [pc, #52] ; (1530 ) 14fc: 4798 blx r3 while (!_usart_sync_is_ready_to_send(&descr->device)) 14fe: 0038 movs r0, r7 1500: 4b0a ldr r3, [pc, #40] ; (152c ) 1502: 4798 blx r3 1504: 2800 cmp r0, #0 1506: d0fa beq.n 14fe ; } while (++offset < length); 1508: 3601 adds r6, #1 150a: 42b4 cmp r4, r6 150c: d8f3 bhi.n 14f6 150e: 2501 movs r5, #1 1510: 2c00 cmp r4, #0 1512: d000 beq.n 1516 1514: 0025 movs r5, r4 while (!_usart_sync_is_transmit_done(&descr->device)) 1516: 0038 movs r0, r7 1518: 4b06 ldr r3, [pc, #24] ; (1534 ) 151a: 4798 blx r3 151c: 2800 cmp r0, #0 151e: d0fa beq.n 1516 ; return (int32_t)offset; } 1520: 0028 movs r0, r5 1522: bdf8 pop {r3, r4, r5, r6, r7, pc} 1524: 00002eca .word 0x00002eca 1528: 000013e1 .word 0x000013e1 152c: 00001e4b .word 0x00001e4b 1530: 00001e3d .word 0x00001e3d 1534: 00001e55 .word 0x00001e55 00001538 : * \param[in] length The size of a buffer * * \return The number of bytes read. */ static int32_t usart_sync_read(struct io_descriptor *const io_descr, uint8_t *const buf, const uint16_t length) { 1538: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} 153a: 0005 movs r5, r0 153c: 0014 movs r4, r2 153e: 9101 str r1, [sp, #4] uint32_t offset = 0; struct usart_sync_descriptor *descr = CONTAINER_OF(io_descr, struct usart_sync_descriptor, io); ASSERT(io_descr && buf && length); 1540: 2800 cmp r0, #0 1542: d004 beq.n 154e 1544: 1e08 subs r0, r1, #0 1546: d002 beq.n 154e 1548: 0010 movs r0, r2 154a: 1e43 subs r3, r0, #1 154c: 4198 sbcs r0, r3 154e: 2286 movs r2, #134 ; 0x86 1550: 490c ldr r1, [pc, #48] ; (1584 ) 1552: 4b0d ldr r3, [pc, #52] ; (1588 ) 1554: 0052 lsls r2, r2, #1 1556: 4798 blx r3 uint32_t offset = 0; 1558: 2600 movs r6, #0 do { while (!_usart_sync_is_byte_received(&descr->device)) 155a: 002f movs r7, r5 155c: 3708 adds r7, #8 155e: 0038 movs r0, r7 1560: 4b0a ldr r3, [pc, #40] ; (158c ) 1562: 4798 blx r3 1564: 2800 cmp r0, #0 1566: d0f8 beq.n 155a ; buf[offset] = _usart_sync_read_byte(&descr->device); 1568: 4b09 ldr r3, [pc, #36] ; (1590 ) 156a: 0038 movs r0, r7 156c: 4798 blx r3 156e: 9b01 ldr r3, [sp, #4] 1570: 5598 strb r0, [r3, r6] } while (++offset < length); 1572: 3601 adds r6, #1 1574: 42b4 cmp r4, r6 1576: d8f0 bhi.n 155a 1578: 2001 movs r0, #1 157a: 2c00 cmp r4, #0 157c: d000 beq.n 1580 157e: 0020 movs r0, r4 return (int32_t)offset; } 1580: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc} 1582: 46c0 nop ; (mov r8, r8) 1584: 00002eca .word 0x00002eca 1588: 000013e1 .word 0x000013e1 158c: 00001e5f .word 0x00001e5f 1590: 00001e43 .word 0x00001e43 00001594 : { 1594: b570 push {r4, r5, r6, lr} 1596: 0004 movs r4, r0 1598: 000d movs r5, r1 ASSERT(descr && hw); 159a: 2800 cmp r0, #0 159c: d002 beq.n 15a4 159e: 0008 movs r0, r1 15a0: 1e43 subs r3, r0, #1 15a2: 4198 sbcs r0, r3 15a4: 4907 ldr r1, [pc, #28] ; (15c4 ) 15a6: 4b08 ldr r3, [pc, #32] ; (15c8 ) 15a8: 2234 movs r2, #52 ; 0x34 15aa: 4798 blx r3 init_status = _usart_sync_init(&descr->device, hw); 15ac: 0020 movs r0, r4 15ae: 0029 movs r1, r5 15b0: 4b06 ldr r3, [pc, #24] ; (15cc ) 15b2: 3008 adds r0, #8 15b4: 4798 blx r3 if (init_status) { 15b6: 2800 cmp r0, #0 15b8: d103 bne.n 15c2 descr->io.read = usart_sync_read; 15ba: 4b05 ldr r3, [pc, #20] ; (15d0 ) 15bc: 6063 str r3, [r4, #4] descr->io.write = usart_sync_write; 15be: 4b05 ldr r3, [pc, #20] ; (15d4 ) 15c0: 6023 str r3, [r4, #0] } 15c2: bd70 pop {r4, r5, r6, pc} 15c4: 00002eca .word 0x00002eca 15c8: 000013e1 .word 0x000013e1 15cc: 00001e11 .word 0x00001e11 15d0: 00001539 .word 0x00001539 15d4: 000014c9 .word 0x000014c9 000015d8 <_gclk_init_generators_by_fref>: void _gclk_init_generators_by_fref(uint32_t bm) { #if CONF_GCLK_GENERATOR_0_CONFIG == 1 if (bm & (1ul << 0)) { 15d8: 07c3 lsls r3, r0, #31 15da: d509 bpl.n 15f0 <_gclk_init_generators_by_fref+0x18> } static inline void hri_gclk_write_GENDIV_reg(const void *const hw, hri_gclk_gendiv_reg_t data) { GCLK_CRITICAL_SECTION_ENTER(); ((Gclk *)hw)->GENDIV.reg = data; 15dc: 2380 movs r3, #128 ; 0x80 15de: 4a10 ldr r2, [pc, #64] ; (1620 <_gclk_init_generators_by_fref+0x48>) 15e0: 005b lsls r3, r3, #1 15e2: 6093 str r3, [r2, #8] ((Gclk *)hw)->GENCTRL.reg = data; 15e4: 2383 movs r3, #131 ; 0x83 15e6: 025b lsls r3, r3, #9 15e8: 6053 str r3, [r2, #4] while (((const Gclk *)hw)->STATUS.bit.SYNCBUSY) 15ea: 7853 ldrb r3, [r2, #1] 15ec: 09db lsrs r3, r3, #7 15ee: d1fc bne.n 15ea <_gclk_init_generators_by_fref+0x12> | (CONF_GCLK_GENERATOR_2_CONFIG << GCLK_GENCTRL_GENEN_Pos) | CONF_GCLK_GEN_2_SRC | GCLK_GENCTRL_ID(2)); } #endif #if CONF_GCLK_GENERATOR_3_CONFIG == 1 if (bm & (1ul << 3)) { 15f0: 0703 lsls r3, r0, #28 15f2: d508 bpl.n 1606 <_gclk_init_generators_by_fref+0x2e> ((Gclk *)hw)->GENDIV.reg = data; 15f4: 2304 movs r3, #4 15f6: 4a0a ldr r2, [pc, #40] ; (1620 <_gclk_init_generators_by_fref+0x48>) 15f8: 33ff adds r3, #255 ; 0xff 15fa: 6093 str r3, [r2, #8] ((Gclk *)hw)->GENCTRL.reg = data; 15fc: 4b09 ldr r3, [pc, #36] ; (1624 <_gclk_init_generators_by_fref+0x4c>) 15fe: 6053 str r3, [r2, #4] while (((const Gclk *)hw)->STATUS.bit.SYNCBUSY) 1600: 7853 ldrb r3, [r2, #1] 1602: 09db lsrs r3, r3, #7 1604: d1fc bne.n 1600 <_gclk_init_generators_by_fref+0x28> | (CONF_GCLK_GENERATOR_6_CONFIG << GCLK_GENCTRL_GENEN_Pos) | CONF_GCLK_GEN_6_SRC | GCLK_GENCTRL_ID(6)); } #endif #if CONF_GCLK_GENERATOR_7_CONFIG == 1 if (bm & (1ul << 7)) { 1606: 0603 lsls r3, r0, #24 1608: d508 bpl.n 161c <_gclk_init_generators_by_fref+0x44> ((Gclk *)hw)->GENDIV.reg = data; 160a: 2308 movs r3, #8 160c: 4a04 ldr r2, [pc, #16] ; (1620 <_gclk_init_generators_by_fref+0x48>) 160e: 33ff adds r3, #255 ; 0xff 1610: 6093 str r3, [r2, #8] ((Gclk *)hw)->GENCTRL.reg = data; 1612: 4b05 ldr r3, [pc, #20] ; (1628 <_gclk_init_generators_by_fref+0x50>) 1614: 6053 str r3, [r2, #4] while (((const Gclk *)hw)->STATUS.bit.SYNCBUSY) 1616: 7853 ldrb r3, [r2, #1] 1618: 09db lsrs r3, r3, #7 161a: d1fc bne.n 1616 <_gclk_init_generators_by_fref+0x3e> | (CONF_GCLK_GEN_8_DIVSEL << GCLK_GENCTRL_DIVSEL_Pos) | (CONF_GCLK_GEN_8_OE << GCLK_GENCTRL_OE_Pos) | (CONF_GCLK_GEN_8_OOV << GCLK_GENCTRL_OOV_Pos) | (CONF_GCLK_GEN_8_IDC << GCLK_GENCTRL_IDC_Pos) | (CONF_GCLK_GENERATOR_8_CONFIG << GCLK_GENCTRL_GENEN_Pos) | CONF_GCLK_GEN_8_SRC | GCLK_GENCTRL_ID(8)); } #endif } 161c: 4770 bx lr 161e: 46c0 nop ; (mov r8, r8) 1620: 40000c00 .word 0x40000c00 1624: 00010303 .word 0x00010303 1628: 00210707 .word 0x00210707 0000162c : #define _param_error_check(cond) ASSERT(cond) #define _desc_len_check() ASSERT(usb_desc_len(desc) >= 2) #endif uint8_t *usb_find_desc(uint8_t *desc, uint8_t *eof, uint8_t type) { 162c: b510 push {r4, lr} _param_error_check(desc && eof && (desc < eof)); while (desc < eof) { 162e: 4288 cmp r0, r1 1630: d301 bcc.n 1636 _desc_len_check(); 1632: 2000 movs r0, #0 return desc; } desc = usb_desc_next(desc); } return NULL; } 1634: bd10 pop {r4, pc} return desc[0]; 1636: 7803 ldrb r3, [r0, #0] _desc_len_check(); 1638: 2b01 cmp r3, #1 163a: d9fa bls.n 1632 if (type == usb_desc_type(desc)) { 163c: 7844 ldrb r4, [r0, #1] 163e: 4294 cmp r4, r2 1640: d0f8 beq.n 1634 return (desc + usb_desc_len(desc)); 1642: 18c0 adds r0, r0, r3 1644: e7f3 b.n 162e 00001646 : uint8_t *usb_find_ep_desc(uint8_t *desc, uint8_t *eof) { _param_error_check(desc && eof && (desc < eof)); while (desc < eof) { 1646: 4288 cmp r0, r1 1648: d301 bcc.n 164e _desc_len_check(); 164a: 2000 movs r0, #0 return desc; } desc = usb_desc_next(desc); } return NULL; } 164c: 4770 bx lr return desc[0]; 164e: 7803 ldrb r3, [r0, #0] _desc_len_check(); 1650: 2b01 cmp r3, #1 1652: d9fa bls.n 164a return desc[1]; 1654: 7842 ldrb r2, [r0, #1] if (USB_DT_INTERFACE == usb_desc_type(desc)) { 1656: 2a04 cmp r2, #4 1658: d0f7 beq.n 164a if (USB_DT_ENDPOINT == usb_desc_type(desc)) { 165a: 2a05 cmp r2, #5 165c: d0f6 beq.n 164c return (desc + usb_desc_len(desc)); 165e: 18c0 adds r0, r0, r3 1660: e7f1 b.n 1646 ... 00001664 : uint8_t *usb_find_cfg_desc(uint8_t *desc, uint8_t *eof, uint8_t cfg_value) { 1664: b570 push {r4, r5, r6, lr} _param_error_check(desc && eof && (desc < eof)); desc = usb_find_desc(desc, eof, USB_DT_CONFIG); 1666: 4b0d ldr r3, [pc, #52] ; (169c ) { 1668: 0015 movs r5, r2 desc = usb_find_desc(desc, eof, USB_DT_CONFIG); 166a: 2202 movs r2, #2 { 166c: 000c movs r4, r1 desc = usb_find_desc(desc, eof, USB_DT_CONFIG); 166e: 4798 blx r3 if (!desc) { 1670: 2800 cmp r0, #0 1672: d10f bne.n 1694 return desc; } desc = usb_cfg_desc_next(desc); } return NULL; } 1674: bd70 pop {r4, r5, r6, pc} _desc_len_check(); 1676: 7803 ldrb r3, [r0, #0] 1678: 2b01 cmp r3, #1 167a: d90d bls.n 1698 if (desc[1] != USB_DT_CONFIG) { 167c: 7843 ldrb r3, [r0, #1] 167e: 2b02 cmp r3, #2 1680: d10a bne.n 1698 if (desc[5] == cfg_value) { 1682: 7943 ldrb r3, [r0, #5] 1684: 42ab cmp r3, r5 1686: d0f5 beq.n 1674 return (ptr[0] + (ptr[1] << 8)); 1688: 78c2 ldrb r2, [r0, #3] 168a: 7883 ldrb r3, [r0, #2] 168c: 0212 lsls r2, r2, #8 168e: 189b adds r3, r3, r2 * \param[in] cfg_desc Byte pointer to the descriptor start address * \return Byte pointer to descriptor after configuration end */ static inline uint8_t *usb_cfg_desc_next(uint8_t *cfg_desc) { return (cfg_desc + usb_cfg_desc_total_len(cfg_desc)); 1690: b29b uxth r3, r3 1692: 18c0 adds r0, r0, r3 while (desc < eof) { 1694: 42a0 cmp r0, r4 1696: d3ee bcc.n 1676 return NULL; 1698: 2000 movs r0, #0 169a: e7eb b.n 1674 169c: 0000162d .word 0x0000162d 000016a0 : } return NULL; } uint8_t *usb_find_str_desc(uint8_t *desc, uint8_t *eof, uint8_t str_index) { 16a0: b570 push {r4, r5, r6, lr} 16a2: 000c movs r4, r1 16a4: 0016 movs r6, r2 uint8_t i; _param_error_check(desc && eof && (desc < eof)); for (i = 0; desc < eof;) { 16a6: 2500 movs r5, #0 16a8: 42a0 cmp r0, r4 16aa: d301 bcc.n 16b0 return desc; } i++; desc = usb_desc_next(desc); } else { return NULL; 16ac: 2000 movs r0, #0 } } return NULL; } 16ae: bd70 pop {r4, r5, r6, pc} desc = usb_find_desc(desc, eof, USB_DT_STRING); 16b0: 2203 movs r2, #3 16b2: 0021 movs r1, r4 16b4: 4b05 ldr r3, [pc, #20] ; (16cc ) 16b6: 4798 blx r3 if (desc) { 16b8: 2800 cmp r0, #0 16ba: d0f8 beq.n 16ae return desc[0]; 16bc: 7803 ldrb r3, [r0, #0] _desc_len_check(); 16be: 2b01 cmp r3, #1 16c0: d9f4 bls.n 16ac if (i == str_index) { 16c2: 42b5 cmp r5, r6 16c4: d0f3 beq.n 16ae return (desc + usb_desc_len(desc)); 16c6: 18c0 adds r0, r0, r3 16c8: 3501 adds r5, #1 16ca: e7ed b.n 16a8 16cc: 0000162d .word 0x0000162d 000016d0 <_usb_d_find_ep>: * \return Index of endpoint descriptor. * \retval >=0 The index. * \retval <0 Not found (endpoint is not initialized). */ static int8_t _usb_d_find_ep(const uint8_t ep) { 16d0: 0002 movs r2, r0 for (i = 0; i < CONF_USB_D_NUM_EP_SP; i++) { if (usb_d_inst.ep[i].xfer.hdr.ep == ep) { return i; } if (usb_d_inst.ep[i].xfer.hdr.type == USB_EP_XTYPE_CTRL && (ep & USB_EP_N_MASK) == usb_d_inst.ep[i].xfer.hdr.ep) { 16d2: 210f movs r1, #15 for (i = 0; i < CONF_USB_D_NUM_EP_SP; i++) { 16d4: 2000 movs r0, #0 { 16d6: b530 push {r4, r5, lr} 16d8: 4b09 ldr r3, [pc, #36] ; (1700 <_usb_d_find_ep+0x30>) && (ep & USB_EP_N_MASK) == usb_d_inst.ep[i].xfer.hdr.ep) { 16da: 4011 ands r1, r2 if (usb_d_inst.ep[i].xfer.hdr.ep == ep) { 16dc: 785c ldrb r4, [r3, #1] 16de: 4294 cmp r4, r2 16e0: d00c beq.n 16fc <_usb_d_find_ep+0x2c> if (usb_d_inst.ep[i].xfer.hdr.type == USB_EP_XTYPE_CTRL 16e2: 781d ldrb r5, [r3, #0] 16e4: 2d00 cmp r5, #0 16e6: d101 bne.n 16ec <_usb_d_find_ep+0x1c> && (ep & USB_EP_N_MASK) == usb_d_inst.ep[i].xfer.hdr.ep) { 16e8: 428c cmp r4, r1 16ea: d007 beq.n 16fc <_usb_d_find_ep+0x2c> for (i = 0; i < CONF_USB_D_NUM_EP_SP; i++) { 16ec: 3001 adds r0, #1 16ee: b2c4 uxtb r4, r0 16f0: 3320 adds r3, #32 16f2: b240 sxtb r0, r0 16f4: 2c0d cmp r4, #13 16f6: d1f1 bne.n 16dc <_usb_d_find_ep+0xc> return i; } } return -1; 16f8: 2001 movs r0, #1 16fa: 4240 negs r0, r0 } 16fc: bd30 pop {r4, r5, pc} 16fe: 46c0 nop ; (mov r8, r8) 1700: 200004a4 .word 0x200004a4 00001704 : { (void)unused0; (void)unused1; (void)unused2; return false; } 1704: 2000 movs r0, #0 1706: 4770 bx lr 00001708 : * \brief Callback invoked when request more data * \param[in] ep Endpoint number with transfer direction on bit 8. * \param[in] transfered Number of bytes transfered. */ static bool usb_d_cb_trans_more(const uint8_t ep, const uint32_t transfered) { 1708: b570 push {r4, r5, r6, lr} int8_t ep_index = _usb_d_find_ep(ep); 170a: 4b08 ldr r3, [pc, #32] ; (172c ) { 170c: 0004 movs r4, r0 170e: 000d movs r5, r1 int8_t ep_index = _usb_d_find_ep(ep); 1710: 4798 blx r3 struct usb_d_ep *ept = &usb_d_inst.ep[ep_index]; if (ept->xfer.hdr.state == USB_EP_S_X_DATA) { 1712: 4b07 ldr r3, [pc, #28] ; (1730 ) 1714: 0140 lsls r0, r0, #5 1716: 181b adds r3, r3, r0 1718: 789a ldrb r2, [r3, #2] return ept->callbacks.more(ep, transfered); } return false; 171a: 2000 movs r0, #0 if (ept->xfer.hdr.state == USB_EP_S_X_DATA) { 171c: 2a03 cmp r2, #3 171e: d103 bne.n 1728 return ept->callbacks.more(ep, transfered); 1720: 0029 movs r1, r5 1722: 0020 movs r0, r4 1724: 699b ldr r3, [r3, #24] 1726: 4798 blx r3 } 1728: bd70 pop {r4, r5, r6, pc} 172a: 46c0 nop ; (mov r8, r8) 172c: 000016d1 .word 0x000016d1 1730: 200004a4 .word 0x200004a4 00001734 <_usb_d_cb_trans_done>: /** * Callback when USB transactions are finished. */ static void _usb_d_cb_trans_done(const uint8_t ep, const int32_t code, const uint32_t transferred) { 1734: b5f0 push {r4, r5, r6, r7, lr} int8_t ep_index = _usb_d_find_ep(ep); 1736: 4b37 ldr r3, [pc, #220] ; (1814 <_usb_d_cb_trans_done+0xe0>) { 1738: b087 sub sp, #28 173a: 000f movs r7, r1 173c: 9000 str r0, [sp, #0] 173e: 9201 str r2, [sp, #4] int8_t ep_index = _usb_d_find_ep(ep); 1740: 4798 blx r3 struct usb_d_ep *ept = &usb_d_inst.ep[ep_index]; if (code == USB_TRANS_DONE) { 1742: 4d35 ldr r5, [pc, #212] ; (1818 <_usb_d_cb_trans_done+0xe4>) 1744: 0144 lsls r4, r0, #5 1746: 2f00 cmp r7, #0 1748: d141 bne.n 17ce <_usb_d_cb_trans_done+0x9a> ept->xfer.hdr.status = USB_XFER_DONE; 174a: 192e adds r6, r5, r4 174c: 70f7 strb r7, [r6, #3] if (ept->xfer.hdr.type == USB_EP_XTYPE_CTRL) { 174e: 5d29 ldrb r1, [r5, r4] 1750: 2900 cmp r1, #0 1752: d133 bne.n 17bc <_usb_d_cb_trans_done+0x88> bool err = ept->callbacks.xfer(ept->xfer.hdr.ep, USB_XFER_DATA, ept->xfer.req); 1754: 0022 movs r2, r4 if (state == USB_EP_S_X_DATA) { 1756: 78b4 ldrb r4, [r6, #2] bool err = ept->callbacks.xfer(ept->xfer.hdr.ep, USB_XFER_DATA, ept->xfer.req); 1758: 320c adds r2, #12 175a: 7870 ldrb r0, [r6, #1] 175c: 69f3 ldr r3, [r6, #28] 175e: 18aa adds r2, r5, r2 if (state == USB_EP_S_X_DATA) { 1760: 2c03 cmp r4, #3 1762: d127 bne.n 17b4 <_usb_d_cb_trans_done+0x80> 1764: 270c movs r7, #12 bool err = ept->callbacks.xfer(ept->xfer.hdr.ep, USB_XFER_DATA, ept->xfer.req); 1766: 3101 adds r1, #1 1768: 57f7 ldrsb r7, [r6, r7] 176a: 4798 blx r3 176c: 0003 movs r3, r0 if (err) { 176e: 7870 ldrb r0, [r6, #1] 1770: 2b00 cmp r3, #0 1772: d00b beq.n 178c <_usb_d_cb_trans_done+0x58> ept->xfer.hdr.state = USB_EP_S_HALTED; 1774: 4b29 ldr r3, [pc, #164] ; (181c <_usb_d_cb_trans_done+0xe8>) 1776: 8073 strh r3, [r6, #2] _usb_d_dev_ep_stall(req_dir ? ept->xfer.hdr.ep : (ept->xfer.hdr.ep | USB_EP_DIR), USB_EP_STALL_SET); 1778: 2f00 cmp r7, #0 177a: db02 blt.n 1782 <_usb_d_cb_trans_done+0x4e> 177c: 3b86 subs r3, #134 ; 0x86 177e: 3bff subs r3, #255 ; 0xff 1780: 4318 orrs r0, r3 1782: 2101 movs r1, #1 1784: 4b26 ldr r3, [pc, #152] ; (1820 <_usb_d_cb_trans_done+0xec>) 1786: 4798 blx r3 ept->xfer.hdr.state = USB_EP_S_ERROR; ept->xfer.hdr.status = USB_XFER_ERROR; } ept->callbacks.xfer(ep, (enum usb_xfer_code)ept->xfer.hdr.status, (void *)transferred); } 1788: b007 add sp, #28 178a: bdf0 pop {r4, r5, r6, r7, pc} ept->xfer.hdr.state = USB_EP_S_X_STATUS; 178c: 2204 movs r2, #4 struct usb_d_transfer trans 178e: 9303 str r3, [sp, #12] ept->xfer.hdr.state = USB_EP_S_X_STATUS; 1790: 70b2 strb r2, [r6, #2] struct usb_d_transfer trans 1792: 9304 str r3, [sp, #16] 1794: 2f00 cmp r7, #0 1796: db0a blt.n 17ae <_usb_d_cb_trans_done+0x7a> 1798: 2380 movs r3, #128 ; 0x80 179a: 4318 orrs r0, r3 179c: ab02 add r3, sp, #8 179e: 7318 strb r0, [r3, #12] 17a0: 2301 movs r3, #1 17a2: aa02 add r2, sp, #8 17a4: 7353 strb r3, [r2, #13] return _usb_d_dev_ep_trans(&trans); 17a6: a803 add r0, sp, #12 17a8: 4b1e ldr r3, [pc, #120] ; (1824 <_usb_d_cb_trans_done+0xf0>) 17aa: 4798 blx r3 17ac: e7ec b.n 1788 <_usb_d_cb_trans_done+0x54> struct usb_d_transfer trans 17ae: 230f movs r3, #15 17b0: 4018 ands r0, r3 17b2: e7f3 b.n 179c <_usb_d_cb_trans_done+0x68> ept->callbacks.xfer(ept->xfer.hdr.ep, USB_XFER_DONE, ept->xfer.req); 17b4: 4798 blx r3 ept->xfer.hdr.state = USB_EP_S_X_SETUP; 17b6: 2302 movs r3, #2 17b8: 70b3 strb r3, [r6, #2] 17ba: e7e5 b.n 1788 <_usb_d_cb_trans_done+0x54> ept->xfer.hdr.state = USB_EP_S_IDLE; 17bc: 2301 movs r3, #1 17be: 70b3 strb r3, [r6, #2] ept->callbacks.xfer(ep, (enum usb_xfer_code)ept->xfer.hdr.status, (void *)transferred); 17c0: 192c adds r4, r5, r4 17c2: 78e1 ldrb r1, [r4, #3] 17c4: 69e3 ldr r3, [r4, #28] 17c6: 9a01 ldr r2, [sp, #4] 17c8: 9800 ldr r0, [sp, #0] 17ca: 4798 blx r3 17cc: e7dc b.n 1788 <_usb_d_cb_trans_done+0x54> ept->xfer.hdr.status = USB_XFER_HALT; 17ce: 192b adds r3, r5, r4 } else if (code == USB_TRANS_STALL) { 17d0: 2f01 cmp r7, #1 17d2: d10c bne.n 17ee <_usb_d_cb_trans_done+0xba> ept->xfer.hdr.status = USB_XFER_HALT; 17d4: 2202 movs r2, #2 17d6: 70da strb r2, [r3, #3] if (ept->xfer.hdr.type == USB_EP_XTYPE_CTRL) { 17d8: 5d29 ldrb r1, [r5, r4] 17da: 2900 cmp r1, #0 17dc: d104 bne.n 17e8 <_usb_d_cb_trans_done+0xb4> ept->xfer.hdr.state = USB_EP_S_X_SETUP; 17de: 709a strb r2, [r3, #2] _usb_d_dev_ep_stall(ep, USB_EP_STALL_CLR); 17e0: 9800 ldr r0, [sp, #0] 17e2: 4b0f ldr r3, [pc, #60] ; (1820 <_usb_d_cb_trans_done+0xec>) 17e4: 4798 blx r3 17e6: e7eb b.n 17c0 <_usb_d_cb_trans_done+0x8c> ept->xfer.hdr.state = USB_EP_S_HALTED; 17e8: 2205 movs r2, #5 ept->xfer.hdr.state = USB_EP_S_IDLE; 17ea: 709a strb r2, [r3, #2] 17ec: e7e8 b.n 17c0 <_usb_d_cb_trans_done+0x8c> } else if (code == USB_TRANS_ABORT) { 17ee: 2f02 cmp r7, #2 17f0: d108 bne.n 1804 <_usb_d_cb_trans_done+0xd0> ept->xfer.hdr.status = USB_XFER_ABORT; 17f2: 2204 movs r2, #4 17f4: 70da strb r2, [r3, #3] if (ept->xfer.hdr.type == USB_EP_XTYPE_CTRL) { 17f6: 5d2a ldrb r2, [r5, r4] 17f8: 2a00 cmp r2, #0 17fa: d101 bne.n 1800 <_usb_d_cb_trans_done+0xcc> ept->xfer.hdr.state = USB_EP_S_X_SETUP; 17fc: 709f strb r7, [r3, #2] return; 17fe: e7c3 b.n 1788 <_usb_d_cb_trans_done+0x54> ept->xfer.hdr.state = USB_EP_S_IDLE; 1800: 2201 movs r2, #1 1802: e7f2 b.n 17ea <_usb_d_cb_trans_done+0xb6> } else if (code == USB_TRANS_RESET) { 1804: 2f03 cmp r7, #3 1806: d103 bne.n 1810 <_usb_d_cb_trans_done+0xdc> ept->xfer.hdr.state = USB_EP_S_DISABLED; 1808: 22a0 movs r2, #160 ; 0xa0 180a: 00d2 lsls r2, r2, #3 ept->xfer.hdr.state = USB_EP_S_ERROR; 180c: 805a strh r2, [r3, #2] 180e: e7d7 b.n 17c0 <_usb_d_cb_trans_done+0x8c> 1810: 4a05 ldr r2, [pc, #20] ; (1828 <_usb_d_cb_trans_done+0xf4>) 1812: e7fb b.n 180c <_usb_d_cb_trans_done+0xd8> 1814: 000016d1 .word 0x000016d1 1818: 200004a4 .word 0x200004a4 181c: 00000205 .word 0x00000205 1820: 00000e8d .word 0x00000e8d 1824: 00000fad .word 0x00000fad 1828: 00000606 .word 0x00000606 0000182c : { 182c: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} int8_t ep_index = _usb_d_find_ep(ep); 182e: 4b18 ldr r3, [pc, #96] ; (1890 ) { 1830: 0004 movs r4, r0 int8_t ep_index = _usb_d_find_ep(ep); 1832: 4798 blx r3 uint8_t * req = ept->xfer.req; 1834: 0147 lsls r7, r0, #5 1836: 003b movs r3, r7 1838: 4d16 ldr r5, [pc, #88] ; (1894 ) 183a: 330c adds r3, #12 183c: 195b adds r3, r3, r5 uint8_t n = _usb_d_dev_ep_read_req(ep, req); 183e: 0019 movs r1, r3 uint8_t * req = ept->xfer.req; 1840: 9301 str r3, [sp, #4] uint8_t n = _usb_d_dev_ep_read_req(ep, req); 1842: 0020 movs r0, r4 1844: 4b14 ldr r3, [pc, #80] ; (1898 ) 1846: 4798 blx r3 _usb_d_dev_ep_stall(ep | USB_EP_DIR, USB_EP_STALL_SET); 1848: 2680 movs r6, #128 ; 0x80 if (n != 8) { 184a: b2c0 uxtb r0, r0 _usb_d_dev_ep_stall(ep | USB_EP_DIR, USB_EP_STALL_SET); 184c: 4326 orrs r6, r4 184e: 9600 str r6, [sp, #0] 1850: 4e12 ldr r6, [pc, #72] ; (189c ) if (n != 8) { 1852: 2808 cmp r0, #8 1854: d006 beq.n 1864 _usb_d_dev_ep_stall(ep, USB_EP_STALL_SET); 1856: 2101 movs r1, #1 1858: 0020 movs r0, r4 185a: 47b0 blx r6 _usb_d_dev_ep_stall(ep | USB_EP_DIR, USB_EP_STALL_SET); 185c: 2101 movs r1, #1 _usb_d_dev_ep_stall(ep | USB_EP_DIR, USB_EP_STALL_SET); 185e: 9800 ldr r0, [sp, #0] 1860: 47b0 blx r6 } 1862: bdf7 pop {r0, r1, r2, r4, r5, r6, r7, pc} ept->xfer.hdr.state = USB_EP_S_IDLE; 1864: 19ed adds r5, r5, r7 1866: 2701 movs r7, #1 _usb_d_dev_ep_stall(ep, USB_EP_STALL_CLR); 1868: 2100 movs r1, #0 186a: 0020 movs r0, r4 186c: 47b0 blx r6 _usb_d_dev_ep_stall(ep | USB_EP_DIR, USB_EP_STALL_CLR); 186e: 2100 movs r1, #0 1870: 9800 ldr r0, [sp, #0] 1872: 47b0 blx r6 if (!ept->callbacks.req(ep, req)) { 1874: 0020 movs r0, r4 1876: 9901 ldr r1, [sp, #4] 1878: 696b ldr r3, [r5, #20] ept->xfer.hdr.state = USB_EP_S_IDLE; 187a: 70af strb r7, [r5, #2] if (!ept->callbacks.req(ep, req)) { 187c: 4798 blx r3 187e: 2800 cmp r0, #0 1880: d1ef bne.n 1862 ept->xfer.hdr.state = USB_EP_S_HALTED; 1882: 2305 movs r3, #5 _usb_d_dev_ep_stall(ep, USB_EP_STALL_SET); 1884: 0039 movs r1, r7 1886: 0020 movs r0, r4 ept->xfer.hdr.state = USB_EP_S_HALTED; 1888: 70ab strb r3, [r5, #2] _usb_d_dev_ep_stall(ep, USB_EP_STALL_SET); 188a: 47b0 blx r6 _usb_d_dev_ep_stall(ep | USB_EP_DIR, USB_EP_STALL_SET); 188c: 0039 movs r1, r7 188e: e7e6 b.n 185e 1890: 000016d1 .word 0x000016d1 1894: 200004a4 .word 0x200004a4 1898: 00000f55 .word 0x00000f55 189c: 00000e8d .word 0x00000e8d 000018a0 : int32_t usb_d_init(void) { 18a0: b570 push {r4, r5, r6, lr} int32_t rc = _usb_d_dev_init(); 18a2: 4b12 ldr r3, [pc, #72] ; (18ec ) 18a4: 4798 blx r3 uint8_t i; if (rc < 0) { 18a6: 2800 cmp r0, #0 18a8: db1e blt.n 18e8 return rc; } memset(usb_d_inst.ep, 0x00, sizeof(struct usb_d_ep) * CONF_USB_D_NUM_EP_SP); 18aa: 22d0 movs r2, #208 ; 0xd0 18ac: 4c10 ldr r4, [pc, #64] ; (18f0 ) 18ae: 2100 movs r1, #0 18b0: 0020 movs r0, r4 18b2: 4b10 ldr r3, [pc, #64] ; (18f4 ) 18b4: 0052 lsls r2, r2, #1 18b6: 4798 blx r3 for (i = 0; i < CONF_USB_D_NUM_EP_SP; i++) { 18b8: 0023 movs r3, r4 usb_d_inst.ep[i].xfer.hdr.ep = 0xFF; 18ba: 21ff movs r1, #255 ; 0xff memset(usb_d_inst.ep, 0x00, sizeof(struct usb_d_ep) * CONF_USB_D_NUM_EP_SP); 18bc: 240d movs r4, #13 usb_d_inst.ep[i].callbacks.req = (usb_d_ep_cb_setup_t)usb_d_dummy_cb_false; 18be: 4a0e ldr r2, [pc, #56] ; (18f8 ) for (i = 0; i < CONF_USB_D_NUM_EP_SP; i++) { 18c0: 3c01 subs r4, #1 18c2: b2e4 uxtb r4, r4 usb_d_inst.ep[i].xfer.hdr.ep = 0xFF; 18c4: 7059 strb r1, [r3, #1] usb_d_inst.ep[i].callbacks.req = (usb_d_ep_cb_setup_t)usb_d_dummy_cb_false; 18c6: 615a str r2, [r3, #20] usb_d_inst.ep[i].callbacks.more = (usb_d_ep_cb_more_t)usb_d_dummy_cb_false; 18c8: 619a str r2, [r3, #24] usb_d_inst.ep[i].callbacks.xfer = (usb_d_ep_cb_xfer_t)usb_d_dummy_cb_false; 18ca: 61da str r2, [r3, #28] for (i = 0; i < CONF_USB_D_NUM_EP_SP; i++) { 18cc: 3320 adds r3, #32 18ce: 2c00 cmp r4, #0 18d0: d1f6 bne.n 18c0 } /* Handles device driver endpoint callbacks to build transfer. */ _usb_d_dev_register_ep_callback(USB_D_DEV_EP_CB_SETUP, (FUNC_PTR)usb_d_cb_trans_setup); 18d2: 4d0a ldr r5, [pc, #40] ; (18fc ) 18d4: 0020 movs r0, r4 18d6: 490a ldr r1, [pc, #40] ; (1900 ) 18d8: 47a8 blx r5 _usb_d_dev_register_ep_callback(USB_D_DEV_EP_CB_MORE, (FUNC_PTR)usb_d_cb_trans_more); 18da: 2001 movs r0, #1 18dc: 4909 ldr r1, [pc, #36] ; (1904 ) 18de: 47a8 blx r5 _usb_d_dev_register_ep_callback(USB_D_DEV_EP_CB_DONE, (FUNC_PTR)_usb_d_cb_trans_done); 18e0: 2002 movs r0, #2 18e2: 4909 ldr r1, [pc, #36] ; (1908 ) 18e4: 47a8 blx r5 return ERR_NONE; 18e6: 0020 movs r0, r4 } 18e8: bd70 pop {r4, r5, r6, pc} 18ea: 46c0 nop ; (mov r8, r8) 18ec: 00000ae1 .word 0x00000ae1 18f0: 200004a4 .word 0x200004a4 18f4: 0000262f .word 0x0000262f 18f8: 00001705 .word 0x00001705 18fc: 000010ed .word 0x000010ed 1900: 0000182d .word 0x0000182d 1904: 00001709 .word 0x00001709 1908: 00001735 .word 0x00001735 0000190c : { _usb_d_dev_deinit(); } void usb_d_register_callback(const enum usb_d_cb_type type, const FUNC_PTR func) { 190c: b510 push {r4, lr} /* Directly uses device driver callback. */ _usb_d_dev_register_callback(type, func); 190e: 4b01 ldr r3, [pc, #4] ; (1914 ) 1910: 4798 blx r3 } 1912: bd10 pop {r4, pc} 1914: 000010c9 .word 0x000010c9 00001918 : int32_t usb_d_enable(void) { 1918: b510 push {r4, lr} return _usb_d_dev_enable(); 191a: 4b01 ldr r3, [pc, #4] ; (1920 ) 191c: 4798 blx r3 } 191e: bd10 pop {r4, pc} 1920: 00000ba5 .word 0x00000ba5 00001924 : { _usb_d_dev_disable(); } void usb_d_attach(void) { 1924: b510 push {r4, lr} _usb_d_dev_attach(); 1926: 4b01 ldr r3, [pc, #4] ; (192c ) 1928: 4798 blx r3 } 192a: bd10 pop {r4, pc} 192c: 00000bed .word 0x00000bed 00001930 : { return _usb_d_dev_get_uframe_n(); } void usb_d_set_address(const uint8_t addr) { 1930: b510 push {r4, lr} _usb_d_dev_set_address(addr); 1932: 4b01 ldr r3, [pc, #4] ; (1938 ) 1934: 4798 blx r3 } 1936: bd10 pop {r4, pc} 1938: 00000bfd .word 0x00000bfd 0000193c : { return usb_d_ep_init(0, USB_EP_XTYPE_CTRL, max_pkt_size); } int32_t usb_d_ep_init(const uint8_t ep, const uint8_t attr, const uint16_t max_pkt_size) { 193c: b5f8 push {r3, r4, r5, r6, r7, lr} int32_t rc; int8_t ep_index = _usb_d_find_ep(ep); 193e: 4c10 ldr r4, [pc, #64] ; (1980 ) { 1940: 0006 movs r6, r0 1942: 000d movs r5, r1 1944: 0017 movs r7, r2 int8_t ep_index = _usb_d_find_ep(ep); 1946: 47a0 blx r4 struct usb_d_ep *ept = &usb_d_inst.ep[ep_index]; if (ep_index >= 0) { 1948: 2800 cmp r0, #0 194a: da13 bge.n 1974 return -USB_ERR_REDO; } else { ep_index = _usb_d_find_ep(0xFF); 194c: 20ff movs r0, #255 ; 0xff 194e: 47a0 blx r4 1950: 1e04 subs r4, r0, #0 if (ep_index < 0) { 1952: db12 blt.n 197a return -USB_ERR_ALLOC_FAIL; } ept = &usb_d_inst.ep[ep_index]; } rc = _usb_d_dev_ep_init(ep, attr, max_pkt_size); 1954: 003a movs r2, r7 1956: 0029 movs r1, r5 1958: 0030 movs r0, r6 195a: 4b0a ldr r3, [pc, #40] ; (1984 ) 195c: 4798 blx r3 if (rc < 0) { 195e: 2800 cmp r0, #0 1960: db07 blt.n 1972 return rc; } ept->xfer.hdr.ep = ep; ept->xfer.hdr.type = attr & USB_EP_XTYPE_MASK; 1962: 2103 movs r1, #3 return ERR_NONE; 1964: 2000 movs r0, #0 ept->xfer.hdr.ep = ep; 1966: 4b08 ldr r3, [pc, #32] ; (1988 ) 1968: 0164 lsls r4, r4, #5 196a: 191a adds r2, r3, r4 ept->xfer.hdr.type = attr & USB_EP_XTYPE_MASK; 196c: 400d ands r5, r1 ept->xfer.hdr.ep = ep; 196e: 7056 strb r6, [r2, #1] ept->xfer.hdr.type = attr & USB_EP_XTYPE_MASK; 1970: 54e5 strb r5, [r4, r3] } 1972: bdf8 pop {r3, r4, r5, r6, r7, pc} return -USB_ERR_REDO; 1974: 2014 movs r0, #20 return -USB_ERR_ALLOC_FAIL; 1976: 4240 negs r0, r0 1978: e7fb b.n 1972 197a: 2015 movs r0, #21 197c: e7fb b.n 1976 197e: 46c0 nop ; (mov r8, r8) 1980: 000016d1 .word 0x000016d1 1984: 00000c0d .word 0x00000c0d 1988: 200004a4 .word 0x200004a4 0000198c : return usb_d_ep_init(0, USB_EP_XTYPE_CTRL, max_pkt_size); 198c: 2100 movs r1, #0 { 198e: b510 push {r4, lr} return usb_d_ep_init(0, USB_EP_XTYPE_CTRL, max_pkt_size); 1990: 0002 movs r2, r0 1992: 0008 movs r0, r1 1994: 4b01 ldr r3, [pc, #4] ; (199c ) 1996: 4798 blx r3 } 1998: bd10 pop {r4, pc} 199a: 46c0 nop ; (mov r8, r8) 199c: 0000193d .word 0x0000193d 000019a0 : void usb_d_ep_deinit(const uint8_t ep) { 19a0: b570 push {r4, r5, r6, lr} int8_t ep_index = _usb_d_find_ep(ep); 19a2: 4b07 ldr r3, [pc, #28] ; (19c0 ) { 19a4: 0005 movs r5, r0 int8_t ep_index = _usb_d_find_ep(ep); 19a6: 4798 blx r3 19a8: 1e04 subs r4, r0, #0 struct usb_d_ep *ept = &usb_d_inst.ep[ep_index]; if (ep_index < 0) { 19aa: db07 blt.n 19bc return; } _usb_d_dev_ep_deinit(ep); 19ac: 0028 movs r0, r5 19ae: 4b05 ldr r3, [pc, #20] ; (19c4 ) 19b0: 4798 blx r3 ept->xfer.hdr.ep = 0xFF; 19b2: 23ff movs r3, #255 ; 0xff 19b4: 4804 ldr r0, [pc, #16] ; (19c8 ) 19b6: 0164 lsls r4, r4, #5 19b8: 1904 adds r4, r0, r4 19ba: 7063 strb r3, [r4, #1] } 19bc: bd70 pop {r4, r5, r6, pc} 19be: 46c0 nop ; (mov r8, r8) 19c0: 000016d1 .word 0x000016d1 19c4: 00000cd5 .word 0x00000cd5 19c8: 200004a4 .word 0x200004a4 000019cc : int32_t usb_d_ep_enable(const uint8_t ep) { 19cc: b570 push {r4, r5, r6, lr} int8_t ep_index = _usb_d_find_ep(ep); 19ce: 4b0c ldr r3, [pc, #48] ; (1a00 ) { 19d0: 0004 movs r4, r0 int8_t ep_index = _usb_d_find_ep(ep); 19d2: 4798 blx r3 struct usb_d_ep *ept = &usb_d_inst.ep[ep_index]; int32_t rc; if (ep_index < 0) { 19d4: 2800 cmp r0, #0 19d6: db0f blt.n 19f8 return -USB_ERR_PARAM; } ept->xfer.hdr.state = (ept->xfer.hdr.type == USB_EP_XTYPE_CTRL) ? USB_EP_S_X_SETUP : USB_EP_S_IDLE; 19d8: 4d0a ldr r5, [pc, #40] ; (1a04 ) 19da: 0140 lsls r0, r0, #5 19dc: 5d42 ldrb r2, [r0, r5] 19de: 182d adds r5, r5, r0 19e0: 4251 negs r1, r2 19e2: 414a adcs r2, r1 19e4: 3201 adds r2, #1 rc = _usb_d_dev_ep_enable(ep); 19e6: 0020 movs r0, r4 19e8: 4b07 ldr r3, [pc, #28] ; (1a08 ) ept->xfer.hdr.state = (ept->xfer.hdr.type == USB_EP_XTYPE_CTRL) ? USB_EP_S_X_SETUP : USB_EP_S_IDLE; 19ea: 70aa strb r2, [r5, #2] rc = _usb_d_dev_ep_enable(ep); 19ec: 4798 blx r3 if (rc < 0) { 19ee: 2800 cmp r0, #0 19f0: da01 bge.n 19f6 ept->xfer.hdr.state = USB_EP_S_DISABLED; 19f2: 2300 movs r3, #0 19f4: 70ab strb r3, [r5, #2] } return rc; } 19f6: bd70 pop {r4, r5, r6, pc} return -USB_ERR_PARAM; 19f8: 2012 movs r0, #18 19fa: 4240 negs r0, r0 19fc: e7fb b.n 19f6 19fe: 46c0 nop ; (mov r8, r8) 1a00: 000016d1 .word 0x000016d1 1a04: 200004a4 .word 0x200004a4 1a08: 00000d4d .word 0x00000d4d 00001a0c : } return usb_d_inst.ep[ep_index].xfer.req; } int32_t usb_d_ep_transfer(const struct usb_d_transfer *xfer) { 1a0c: b5f0 push {r4, r5, r6, r7, lr} int8_t ep_index = _usb_d_find_ep(xfer->ep); 1a0e: 7a03 ldrb r3, [r0, #8] { 1a10: 0004 movs r4, r0 1a12: b08b sub sp, #44 ; 0x2c int8_t ep_index = _usb_d_find_ep(xfer->ep); 1a14: 0018 movs r0, r3 1a16: 9301 str r3, [sp, #4] 1a18: 4b32 ldr r3, [pc, #200] ; (1ae4 ) 1a1a: 4798 blx r3 struct usb_d_ep * ept = &usb_d_inst.ep[ep_index]; bool dir = USB_EP_GET_DIR(xfer->ep), zlp = xfer->zlp; 1a1c: 7a63 ldrb r3, [r4, #9] int8_t ep_index = _usb_d_find_ep(xfer->ep); 1a1e: 1e06 subs r6, r0, #0 uint32_t len = xfer->size; 1a20: 6865 ldr r5, [r4, #4] bool dir = USB_EP_GET_DIR(xfer->ep), zlp = xfer->zlp; 1a22: 9302 str r3, [sp, #8] int32_t rc; volatile uint8_t state; volatile hal_atomic_t flags; if (ep_index < 0) { 1a24: db5b blt.n 1ade return -USB_ERR_PARAM; } atomic_enter_critical(&flags); 1a26: 4b30 ldr r3, [pc, #192] ; (1ae8 ) 1a28: a806 add r0, sp, #24 1a2a: 4798 blx r3 state = ept->xfer.hdr.state; 1a2c: 0173 lsls r3, r6, #5 1a2e: 9300 str r3, [sp, #0] 1a30: 9a00 ldr r2, [sp, #0] 1a32: 4b2e ldr r3, [pc, #184] ; (1aec ) 1a34: 189e adds r6, r3, r2 1a36: 78b3 ldrb r3, [r6, #2] 1a38: aa04 add r2, sp, #16 1a3a: 1dd7 adds r7, r2, #7 1a3c: 703b strb r3, [r7, #0] if (state == USB_EP_S_IDLE) { 1a3e: 783a ldrb r2, [r7, #0] 1a40: b2d3 uxtb r3, r2 1a42: 9303 str r3, [sp, #12] 1a44: 4b2a ldr r3, [pc, #168] ; (1af0 ) 1a46: 2a01 cmp r2, #1 1a48: d11d bne.n 1a86 ept->xfer.hdr.state = USB_EP_S_X_DATA; 1a4a: 3202 adds r2, #2 1a4c: 70b2 strb r2, [r6, #2] atomic_leave_critical(&flags); 1a4e: a806 add r0, sp, #24 1a50: 4798 blx r3 default: /* USB_EP_S_X_xxxx */ return USB_BUSY; } } if (ept->xfer.hdr.type == USB_EP_XTYPE_CTRL) { 1a52: 4b26 ldr r3, [pc, #152] ; (1aec ) 1a54: 9a00 ldr r2, [sp, #0] 1a56: 5cd3 ldrb r3, [r2, r3] 1a58: 2b00 cmp r3, #0 1a5a: d01f beq.n 1a9c bool dir = USB_EP_GET_DIR(xfer->ep), zlp = xfer->zlp; 1a5c: 9802 ldr r0, [sp, #8] 1a5e: 9b01 ldr r3, [sp, #4] 1a60: 1e42 subs r2, r0, #1 1a62: 4190 sbcs r0, r2 1a64: 09d9 lsrs r1, r3, #7 1a66: b2c0 uxtb r0, r0 struct usb_d_transfer trans 1a68: 6823 ldr r3, [r4, #0] zlp = false; } } } rc = _usb_d_trans(xfer->ep, dir, xfer->buf, len, zlp); 1a6a: 7a22 ldrb r2, [r4, #8] struct usb_d_transfer trans 1a6c: 9307 str r3, [sp, #28] 1a6e: 9508 str r5, [sp, #32] 1a70: 2900 cmp r1, #0 1a72: d031 beq.n 1ad8 1a74: 2380 movs r3, #128 ; 0x80 1a76: 431a orrs r2, r3 1a78: ab04 add r3, sp, #16 1a7a: 751a strb r2, [r3, #20] 1a7c: 7558 strb r0, [r3, #21] return _usb_d_dev_ep_trans(&trans); 1a7e: 4b1d ldr r3, [pc, #116] ; (1af4 ) 1a80: a807 add r0, sp, #28 1a82: 4798 blx r3 return rc; 1a84: e008 b.n 1a98 atomic_leave_critical(&flags); 1a86: a806 add r0, sp, #24 1a88: 4798 blx r3 switch (state) { 1a8a: 783b ldrb r3, [r7, #0] 1a8c: 2001 movs r0, #1 1a8e: b2da uxtb r2, r3 1a90: 2b06 cmp r3, #6 1a92: d801 bhi.n 1a98 1a94: 4b18 ldr r3, [pc, #96] ; (1af8 ) 1a96: 5698 ldrsb r0, [r3, r2] } 1a98: b00b add sp, #44 ; 0x2c 1a9a: bdf0 pop {r4, r5, r6, r7, pc} uint16_t req_len = USB_GET_wLength(ept->xfer.req); 1a9c: 7cf2 ldrb r2, [r6, #19] 1a9e: 7cb3 ldrb r3, [r6, #18] 1aa0: 0212 lsls r2, r2, #8 1aa2: 189b adds r3, r3, r2 1aa4: b29b uxth r3, r3 if (req_len == 0) { 1aa6: 2b00 cmp r3, #0 1aa8: d105 bne.n 1ab6 ept->xfer.hdr.state = USB_EP_S_X_STATUS; 1aaa: 2204 movs r2, #4 zlp = true; 1aac: 9803 ldr r0, [sp, #12] len = 0; 1aae: 001d movs r5, r3 dir = true; 1ab0: 0001 movs r1, r0 ept->xfer.hdr.state = USB_EP_S_X_STATUS; 1ab2: 70b2 strb r2, [r6, #2] 1ab4: e7d8 b.n 1a68 if (len > req_len) { 1ab6: 429d cmp r5, r3 1ab8: d900 bls.n 1abc 1aba: 001d movs r5, r3 dir = (USB_GET_bmRequestType(ept->xfer.req) & USB_REQ_TYPE_IN); 1abc: 490b ldr r1, [pc, #44] ; (1aec ) zlp = false; 1abe: 2000 movs r0, #0 dir = (USB_GET_bmRequestType(ept->xfer.req) & USB_REQ_TYPE_IN); 1ac0: 468c mov ip, r1 1ac2: 9a00 ldr r2, [sp, #0] 1ac4: 0001 movs r1, r0 1ac6: 4462 add r2, ip if (dir) { 1ac8: 7b12 ldrb r2, [r2, #12] 1aca: 2a7f cmp r2, #127 ; 0x7f 1acc: d9cc bls.n 1a68 zlp = (req_len > len); 1ace: 429d cmp r5, r3 1ad0: 419b sbcs r3, r3 dir = (USB_GET_bmRequestType(ept->xfer.req) & USB_REQ_TYPE_IN); 1ad2: 3101 adds r1, #1 zlp = (req_len > len); 1ad4: 4258 negs r0, r3 1ad6: e7c7 b.n 1a68 struct usb_d_transfer trans 1ad8: 230f movs r3, #15 1ada: 401a ands r2, r3 1adc: e7cc b.n 1a78 return -USB_ERR_PARAM; 1ade: 2012 movs r0, #18 1ae0: 4240 negs r0, r0 1ae2: e7d9 b.n 1a98 1ae4: 000016d1 .word 0x000016d1 1ae8: 00002449 .word 0x00002449 1aec: 200004a4 .word 0x200004a4 1af0: 00002457 .word 0x00002457 1af4: 00000fad .word 0x00000fad 1af8: 00002ee6 .word 0x00002ee6 00001afc : } return ERR_NONE; } int32_t usb_d_ep_halt(const uint8_t ep, const enum usb_ep_halt_ctrl ctrl) { 1afc: b5f8 push {r3, r4, r5, r6, r7, lr} 1afe: 0005 movs r5, r0 1b00: 1e0e subs r6, r1, #0 if (ctrl == USB_EP_HALT_CLR) { 1b02: d11a bne.n 1b3a int8_t ep_index = _usb_d_find_ep(ep); 1b04: 4b12 ldr r3, [pc, #72] ; (1b50 ) 1b06: 4798 blx r3 1b08: 1e04 subs r4, r0, #0 if (ep_index < 0) { 1b0a: db1d blt.n 1b48 if (_usb_d_dev_ep_stall(ep, USB_EP_STALL_GET)) { 1b0c: 2102 movs r1, #2 1b0e: 0028 movs r0, r5 1b10: 4f10 ldr r7, [pc, #64] ; (1b54 ) 1b12: 47b8 blx r7 1b14: 2800 cmp r0, #0 1b16: d00f beq.n 1b38 rc = _usb_d_dev_ep_stall(ep, USB_EP_STALL_CLR); 1b18: 0031 movs r1, r6 1b1a: 0028 movs r0, r5 1b1c: 47b8 blx r7 if (rc < 0) { 1b1e: 2800 cmp r0, #0 1b20: db0a blt.n 1b38 ept->xfer.hdr.state = USB_EP_S_IDLE; 1b22: 480d ldr r0, [pc, #52] ; (1b58 ) 1b24: 4b0d ldr r3, [pc, #52] ; (1b5c ) 1b26: 0164 lsls r4, r4, #5 1b28: 1824 adds r4, r4, r0 1b2a: 8063 strh r3, [r4, #2] ept->callbacks.xfer(ep, USB_XFER_UNHALT, NULL); 1b2c: 0032 movs r2, r6 1b2e: 2103 movs r1, #3 1b30: 0028 movs r0, r5 1b32: 69e3 ldr r3, [r4, #28] 1b34: 4798 blx r3 return ERR_NONE; 1b36: 0030 movs r0, r6 } else if (ctrl == USB_EP_HALT_SET) { return _usb_d_dev_ep_stall(ep, USB_EP_STALL_SET); } else { return _usb_d_dev_ep_stall(ep, USB_EP_STALL_GET); } } 1b38: bdf8 pop {r3, r4, r5, r6, r7, pc} } else if (ctrl == USB_EP_HALT_SET) { 1b3a: 4b06 ldr r3, [pc, #24] ; (1b54 ) 1b3c: 2901 cmp r1, #1 1b3e: d000 beq.n 1b42 return _usb_d_dev_ep_stall(ep, USB_EP_STALL_GET); 1b40: 2102 movs r1, #2 1b42: 0028 movs r0, r5 1b44: 4798 blx r3 1b46: e7f7 b.n 1b38 return -USB_ERR_PARAM; 1b48: 2012 movs r0, #18 1b4a: 4240 negs r0, r0 1b4c: e7f4 b.n 1b38 1b4e: 46c0 nop ; (mov r8, r8) 1b50: 000016d1 .word 0x000016d1 1b54: 00000e8d .word 0x00000e8d 1b58: 200004a4 .word 0x200004a4 1b5c: 00000301 .word 0x00000301 00001b60 : void usb_d_ep_register_callback(const uint8_t ep, const enum usb_d_ep_cb_type type, const FUNC_PTR func) { 1b60: b570 push {r4, r5, r6, lr} int8_t ep_index = _usb_d_find_ep(ep); 1b62: 4b0f ldr r3, [pc, #60] ; (1ba0 ) { 1b64: 0014 movs r4, r2 1b66: 000d movs r5, r1 int8_t ep_index = _usb_d_find_ep(ep); 1b68: 4798 blx r3 struct usb_d_ep *ept = &usb_d_inst.ep[ep_index]; FUNC_PTR f = func ? (FUNC_PTR)func : (FUNC_PTR)usb_d_dummy_cb_false; 1b6a: 2c00 cmp r4, #0 1b6c: d100 bne.n 1b70 1b6e: 4c0d ldr r4, [pc, #52] ; (1ba4 ) if (ep_index < 0) { 1b70: 2800 cmp r0, #0 1b72: db09 blt.n 1b88 return; } switch (type) { 1b74: 2d01 cmp r5, #1 1b76: d008 beq.n 1b8a 1b78: 2d02 cmp r5, #2 1b7a: d00b beq.n 1b94 1b7c: 2d00 cmp r5, #0 1b7e: d103 bne.n 1b88 case USB_D_EP_CB_SETUP: ept->callbacks.req = (usb_d_ep_cb_setup_t)f; 1b80: 4b09 ldr r3, [pc, #36] ; (1ba8 ) 1b82: 0140 lsls r0, r0, #5 1b84: 1818 adds r0, r3, r0 1b86: 6144 str r4, [r0, #20] ept->callbacks.xfer = (usb_d_ep_cb_xfer_t)f; break; default: break; } } 1b88: bd70 pop {r4, r5, r6, pc} ept->callbacks.more = (usb_d_ep_cb_more_t)f; 1b8a: 4b07 ldr r3, [pc, #28] ; (1ba8 ) 1b8c: 0140 lsls r0, r0, #5 1b8e: 1818 adds r0, r3, r0 1b90: 6184 str r4, [r0, #24] break; 1b92: e7f9 b.n 1b88 ept->callbacks.xfer = (usb_d_ep_cb_xfer_t)f; 1b94: 4b04 ldr r3, [pc, #16] ; (1ba8 ) 1b96: 0140 lsls r0, r0, #5 1b98: 1818 adds r0, r3, r0 1b9a: 61c4 str r4, [r0, #28] break; 1b9c: e7f4 b.n 1b88 1b9e: 46c0 nop ; (mov r8, r8) 1ba0: 000016d1 .word 0x000016d1 1ba4: 00001705 .word 0x00001705 1ba8: 200004a4 .word 0x200004a4 00001bac
: #include #include "serial.h" int main(void) { 1bac: b510 push {r4, lr} /* Initializes MCU, drivers and middleware */ atmel_start_init(); 1bae: 4b04 ldr r3, [pc, #16] ; (1bc0 ) 1bb0: 4798 blx r3 arc_serial_init(); 1bb2: 4b04 ldr r3, [pc, #16] ; (1bc4 ) 1bb4: 4798 blx r3 arc_printf("Hello World"); 1bb6: 4804 ldr r0, [pc, #16] ; (1bc8 ) 1bb8: 4b04 ldr r3, [pc, #16] ; (1bcc ) 1bba: 4798 blx r3 /* Replace with your application code */ while (1) { 1bbc: e7fe b.n 1bbc 1bbe: 46c0 nop ; (mov r8, r8) 1bc0: 00001e69 .word 0x00001e69 1bc4: 0000247d .word 0x0000247d 1bc8: 00002ef4 .word 0x00002ef4 1bcc: 000024c9 .word 0x000024c9 00001bd0 <_gpio_set_pin_function>: /** * \brief Set gpio pin function */ static inline void _gpio_set_pin_function(const uint32_t gpio, const uint32_t function) { 1bd0: b530 push {r4, r5, lr} bool value) { uint8_t tmp; PORT_CRITICAL_SECTION_ENTER(); tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg; tmp &= ~PORT_PINCFG_PMUXEN; 1bd2: 2401 movs r4, #1 tmp = ((Port *)hw)->Group[submodule_index].PINCFG[index].reg; 1bd4: 4b0c ldr r3, [pc, #48] ; (1c08 <_gpio_set_pin_function+0x38>) uint8_t port = GPIO_PORT(gpio); uint8_t pin = GPIO_PIN(gpio); 1bd6: b2c5 uxtb r5, r0 1bd8: 18c0 adds r0, r0, r3 1bda: 7803 ldrb r3, [r0, #0] } else { hri_port_write_PINCFG_PMUXEN_bit(PORT, port, pin, true); if (pin & 1) { // Odd numbered pin hri_port_write_PMUX_PMUXO_bf(PORT, port, pin >> 1, function & 0xffff); 1bdc: b2ca uxtb r2, r1 tmp &= ~PORT_PINCFG_PMUXEN; 1bde: 43a3 bics r3, r4 tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg; 1be0: 490a ldr r1, [pc, #40] ; (1c0c <_gpio_set_pin_function+0x3c>) tmp |= value << PORT_PINCFG_PMUXEN_Pos; 1be2: 4323 orrs r3, r4 ((Port *)hw)->Group[submodule_index].PINCFG[index].reg = tmp; 1be4: 7003 strb r3, [r0, #0] tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg; 1be6: 086b lsrs r3, r5, #1 1be8: 185b adds r3, r3, r1 tmp &= ~PORT_PMUX_PMUXO_Msk; 1bea: 200f movs r0, #15 tmp = ((Port *)hw)->Group[submodule_index].PMUX[index].reg; 1bec: 7819 ldrb r1, [r3, #0] if (pin & 1) { 1bee: 4225 tst r5, r4 1bf0: d005 beq.n 1bfe <_gpio_set_pin_function+0x2e> tmp &= ~PORT_PMUX_PMUXO_Msk; 1bf2: 4001 ands r1, r0 tmp |= PORT_PMUX_PMUXO(data); 1bf4: 0112 lsls r2, r2, #4 1bf6: 4311 orrs r1, r2 1bf8: b2c9 uxtb r1, r1 ((Port *)hw)->Group[submodule_index].PMUX[index].reg = tmp; 1bfa: 7019 strb r1, [r3, #0] } else { // Even numbered pin hri_port_write_PMUX_PMUXE_bf(PORT, port, pin >> 1, function & 0xffff); } } } 1bfc: bd30 pop {r4, r5, pc} tmp &= ~PORT_PMUX_PMUXE_Msk; 1bfe: 4381 bics r1, r0 tmp |= PORT_PMUX_PMUXE(data); 1c00: 430a orrs r2, r1 ((Port *)hw)->Group[submodule_index].PMUX[index].reg = tmp; 1c02: 701a strb r2, [r3, #0] 1c04: e7fa b.n 1bfc <_gpio_set_pin_function+0x2c> 1c06: 46c0 nop ; (mov r8, r8) 1c08: 41004440 .word 0x41004440 1c0c: 41004430 .word 0x41004430 00001c10 : #include struct usart_sync_descriptor USART_0; void USART_0_PORT_init(void) { 1c10: b510 push {r4, lr} * found in the header files for the device * */ static inline void gpio_set_pin_function(const uint32_t pin, uint32_t function) { _gpio_set_pin_function(pin, function); 1c12: 2016 movs r0, #22 1c14: 4c03 ldr r4, [pc, #12] ; (1c24 ) 1c16: 4904 ldr r1, [pc, #16] ; (1c28 ) 1c18: 47a0 blx r4 1c1a: 2017 movs r0, #23 1c1c: 4903 ldr r1, [pc, #12] ; (1c2c ) 1c1e: 47a0 blx r4 gpio_set_pin_function(PA22, PINMUX_PA22C_SERCOM3_PAD0); gpio_set_pin_function(PA23, PINMUX_PA23C_SERCOM3_PAD1); } 1c20: bd10 pop {r4, pc} 1c22: 46c0 nop ; (mov r8, r8) 1c24: 00001bd1 .word 0x00001bd1 1c28: 00160002 .word 0x00160002 1c2c: 00170002 .word 0x00170002 00001c30 : peripheral = (uint32_t)_pm_get_apbb_index(module); PM->APBBMASK.reg |= 1 << peripheral; } break; case PM_BUS_APBC: PM->APBCMASK.reg |= 1 << peripheral; 1c30: 2320 movs r3, #32 1c32: 4a04 ldr r2, [pc, #16] ; (1c44 ) 1c34: 6a11 ldr r1, [r2, #32] 1c36: 430b orrs r3, r1 1c38: 6213 str r3, [r2, #32] ((Gclk *)hw)->CLKCTRL.reg = data; 1c3a: 4b03 ldr r3, [pc, #12] ; (1c48 ) 1c3c: 4a03 ldr r2, [pc, #12] ; (1c4c ) 1c3e: 805a strh r2, [r3, #2] void USART_0_CLOCK_init(void) { _pm_enable_bus_clock(PM_BUS_APBC, SERCOM3); _gclk_enable_channel(SERCOM3_GCLK_ID_CORE, CONF_GCLK_SERCOM3_CORE_SRC); } 1c40: 4770 bx lr 1c42: 46c0 nop ; (mov r8, r8) 1c44: 40000400 .word 0x40000400 1c48: 40000c00 .word 0x40000c00 1c4c: 00004017 .word 0x00004017 00001c50 : void USART_0_init(void) { 1c50: b510 push {r4, lr} USART_0_CLOCK_init(); 1c52: 4b05 ldr r3, [pc, #20] ; (1c68 ) 1c54: 4798 blx r3 usart_sync_init(&USART_0, SERCOM3, (void *)NULL); 1c56: 2200 movs r2, #0 1c58: 4904 ldr r1, [pc, #16] ; (1c6c ) 1c5a: 4b05 ldr r3, [pc, #20] ; (1c70 ) 1c5c: 4805 ldr r0, [pc, #20] ; (1c74 ) 1c5e: 4798 blx r3 USART_0_PORT_init(); 1c60: 4b05 ldr r3, [pc, #20] ; (1c78 ) 1c62: 4798 blx r3 } 1c64: bd10 pop {r4, pc} 1c66: 46c0 nop ; (mov r8, r8) 1c68: 00001c31 .word 0x00001c31 1c6c: 42001400 .word 0x42001400 1c70: 00001595 .word 0x00001595 1c74: 20000644 .word 0x20000644 1c78: 00001c11 .word 0x00001c11 00001c7c : void delay_driver_init(void) { 1c7c: b510 push {r4, lr} delay_init(SysTick); 1c7e: 4802 ldr r0, [pc, #8] ; (1c88 ) 1c80: 4b02 ldr r3, [pc, #8] ; (1c8c ) 1c82: 4798 blx r3 } 1c84: bd10 pop {r4, pc} 1c86: 46c0 nop ; (mov r8, r8) 1c88: e000e010 .word 0xe000e010 1c8c: 00001305 .word 0x00001305 00001c90 : void USB_DEVICE_INSTANCE_PORT_init(void) { 1c90: b5f8 push {r3, r4, r5, r6, r7, lr} ((Port *)hw)->Group[submodule_index].DIRSET.reg = mask; 1c92: 25c0 movs r5, #192 ; 0xc0 1c94: 2380 movs r3, #128 ; 0x80 static inline void hri_port_write_WRCONFIG_reg(const void *const hw, uint8_t submodule_index, hri_port_wrconfig_reg_t data) { PORT_CRITICAL_SECTION_ENTER(); ((Port *)hw)->Group[submodule_index].WRCONFIG.reg = data; 1c96: 2780 movs r7, #128 ; 0x80 1c98: 4c11 ldr r4, [pc, #68] ; (1ce0 ) 1c9a: 4a12 ldr r2, [pc, #72] ; (1ce4 ) ((Port *)hw)->Group[submodule_index].DIRSET.reg = mask; 1c9c: 05ed lsls r5, r5, #23 ((Port *)hw)->Group[submodule_index].WRCONFIG.reg = data; 1c9e: 05ff lsls r7, r7, #23 ((Port *)hw)->Group[submodule_index].DIRSET.reg = mask; 1ca0: 045b lsls r3, r3, #17 1ca2: 60ab str r3, [r5, #8] ((Port *)hw)->Group[submodule_index].WRCONFIG.reg = data; 1ca4: 62a7 str r7, [r4, #40] ; 0x28 1ca6: 62a2 str r2, [r4, #40] ; 0x28 ((Port *)hw)->Group[submodule_index].PINCFG[index].reg &= ~PORT_PINCFG_PULLEN; 1ca8: 0022 movs r2, r4 1caa: 2604 movs r6, #4 ((Port *)hw)->Group[submodule_index].OUTCLR.reg = mask; 1cac: 616b str r3, [r5, #20] ((Port *)hw)->Group[submodule_index].PINCFG[index].reg &= ~PORT_PINCFG_PULLEN; 1cae: 3258 adds r2, #88 ; 0x58 1cb0: 7813 ldrb r3, [r2, #0] 1cb2: 2018 movs r0, #24 1cb4: 43b3 bics r3, r6 1cb6: 7013 strb r3, [r2, #0] 1cb8: 490b ldr r1, [pc, #44] ; (1ce8 ) 1cba: 4b0c ldr r3, [pc, #48] ; (1cec ) 1cbc: 4798 blx r3 ((Port *)hw)->Group[submodule_index].DIRSET.reg = mask; 1cbe: 2380 movs r3, #128 ; 0x80 ((Port *)hw)->Group[submodule_index].WRCONFIG.reg = data; 1cc0: 4a0b ldr r2, [pc, #44] ; (1cf0 ) ((Port *)hw)->Group[submodule_index].DIRSET.reg = mask; 1cc2: 049b lsls r3, r3, #18 1cc4: 60ab str r3, [r5, #8] ((Port *)hw)->Group[submodule_index].WRCONFIG.reg = data; 1cc6: 62a7 str r7, [r4, #40] ; 0x28 1cc8: 62a2 str r2, [r4, #40] ; 0x28 ((Port *)hw)->Group[submodule_index].OUTCLR.reg = mask; 1cca: 616b str r3, [r5, #20] ((Port *)hw)->Group[submodule_index].PINCFG[index].reg &= ~PORT_PINCFG_PULLEN; 1ccc: 3459 adds r4, #89 ; 0x59 1cce: 7823 ldrb r3, [r4, #0] 1cd0: 2019 movs r0, #25 1cd2: 43b3 bics r3, r6 1cd4: 7023 strb r3, [r4, #0] 1cd6: 4907 ldr r1, [pc, #28] ; (1cf4 ) 1cd8: 4b04 ldr r3, [pc, #16] ; (1cec ) 1cda: 4798 blx r3 // E // F // G // H PINMUX_PA25G_USB_DP); } 1cdc: bdf8 pop {r3, r4, r5, r6, r7, pc} 1cde: 46c0 nop ; (mov r8, r8) 1ce0: 41004400 .word 0x41004400 1ce4: c0000100 .word 0xc0000100 1ce8: 00180006 .word 0x00180006 1cec: 00001bd1 .word 0x00001bd1 1cf0: c0000200 .word 0xc0000200 1cf4: 00190006 .word 0x00190006 00001cf8 : PM->APBBMASK.reg |= 1 << peripheral; 1cf8: 2220 movs r2, #32 1cfa: 4b06 ldr r3, [pc, #24] ; (1d14 ) 1cfc: 69d9 ldr r1, [r3, #28] 1cfe: 430a orrs r2, r1 1d00: 61da str r2, [r3, #28] PM->AHBMASK.reg |= 1 << peripheral; 1d02: 2240 movs r2, #64 ; 0x40 1d04: 6959 ldr r1, [r3, #20] 1d06: 430a orrs r2, r1 1d08: 615a str r2, [r3, #20] 1d0a: 4b03 ldr r3, [pc, #12] ; (1d18 ) 1d0c: 4a03 ldr r2, [pc, #12] ; (1d1c ) 1d0e: 805a strh r2, [r3, #2] { _pm_enable_bus_clock(PM_BUS_APBB, USB); _pm_enable_bus_clock(PM_BUS_AHB, USB); _gclk_enable_channel(USB_GCLK_ID, CONF_GCLK_USB_SRC); } 1d10: 4770 bx lr 1d12: 46c0 nop ; (mov r8, r8) 1d14: 40000400 .word 0x40000400 1d18: 40000c00 .word 0x40000c00 1d1c: 00004706 .word 0x00004706 00001d20 : void USB_DEVICE_INSTANCE_init(void) { 1d20: b510 push {r4, lr} USB_DEVICE_INSTANCE_CLOCK_init(); 1d22: 4b03 ldr r3, [pc, #12] ; (1d30 ) 1d24: 4798 blx r3 usb_d_init(); 1d26: 4b03 ldr r3, [pc, #12] ; (1d34 ) 1d28: 4798 blx r3 USB_DEVICE_INSTANCE_PORT_init(); 1d2a: 4b03 ldr r3, [pc, #12] ; (1d38 ) 1d2c: 4798 blx r3 } 1d2e: bd10 pop {r4, pc} 1d30: 00001cf9 .word 0x00001cf9 1d34: 000018a1 .word 0x000018a1 1d38: 00001c91 .word 0x00001c91 00001d3c : void system_init(void) { 1d3c: b510 push {r4, lr} * Currently the following initialization functions are supported: * - System clock initialization */ static inline void init_mcu(void) { _init_chip(); 1d3e: 4b04 ldr r3, [pc, #16] ; (1d50 ) 1d40: 4798 blx r3 init_mcu(); USART_0_init(); 1d42: 4b04 ldr r3, [pc, #16] ; (1d54 ) 1d44: 4798 blx r3 delay_driver_init(); 1d46: 4b04 ldr r3, [pc, #16] ; (1d58 ) 1d48: 4798 blx r3 USB_DEVICE_INSTANCE_init(); 1d4a: 4b04 ldr r3, [pc, #16] ; (1d5c ) 1d4c: 4798 blx r3 } 1d4e: bd10 pop {r4, pc} 1d50: 00001359 .word 0x00001359 1d54: 00001c51 .word 0x00001c51 1d58: 00001c7d .word 0x00001c7d 1d5c: 00001d21 .word 0x00001d21 00001d60 : return ((Sercom *)hw)->SPI.SYNCBUSY.reg & reg; } static inline void hri_sercomusart_wait_for_sync(const void *const hw, hri_sercomusart_syncbusy_reg_t reg) { while (((Sercom *)hw)->USART.SYNCBUSY.reg & reg) { 1d60: 69c3 ldr r3, [r0, #28] 1d62: 4219 tst r1, r3 1d64: d1fc bne.n 1d60 }; } 1d66: 4770 bx lr 00001d68 : } static inline void hri_sercomusart_clear_CTRLA_ENABLE_bit(const void *const hw) { SERCOM_CRITICAL_SECTION_ENTER(); ((Sercom *)hw)->USART.CTRLA.reg &= ~SERCOM_USART_CTRLA_ENABLE; 1d68: 2202 movs r2, #2 { 1d6a: b510 push {r4, lr} ((Sercom *)hw)->USART.CTRLA.reg &= ~SERCOM_USART_CTRLA_ENABLE; 1d6c: 6803 ldr r3, [r0, #0] hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST | SERCOM_USART_SYNCBUSY_ENABLE); 1d6e: 2103 movs r1, #3 ((Sercom *)hw)->USART.CTRLA.reg &= ~SERCOM_USART_CTRLA_ENABLE; 1d70: 4393 bics r3, r2 1d72: 6003 str r3, [r0, #0] hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST | SERCOM_USART_SYNCBUSY_ENABLE); 1d74: 4b01 ldr r3, [pc, #4] ; (1d7c ) 1d76: 4798 blx r3 SERCOM_CRITICAL_SECTION_LEAVE(); } 1d78: bd10 pop {r4, pc} 1d7a: 46c0 nop ; (mov r8, r8) 1d7c: 00001d61 .word 0x00001d61 00001d80 <_usart_init>: { #ifdef _UNIT_TEST_ return ((uint32_t)hw - (uint32_t)SERCOM0) / sizeof(Sercom); #endif return ((uint32_t)hw - (uint32_t)SERCOM0) >> 10; 1d80: 4b1b ldr r3, [pc, #108] ; (1df0 <_usart_init+0x70>) * \param[in] hw The pointer to hardware instance * * \return The status of initialization */ static int32_t _usart_init(void *const hw) { 1d82: b570 push {r4, r5, r6, lr} return ((uint32_t)hw - (uint32_t)SERCOM0) >> 10; 1d84: 18c3 adds r3, r0, r3 1d86: 0a9b lsrs r3, r3, #10 if (_usarts[i].number == sercom_offset) { 1d88: b2db uxtb r3, r3 { 1d8a: 0004 movs r4, r0 if (_usarts[i].number == sercom_offset) { 1d8c: 2b03 cmp r3, #3 1d8e: d004 beq.n 1d9a <_usart_init+0x1a> ASSERT(false); 1d90: 2000 movs r0, #0 1d92: 4a18 ldr r2, [pc, #96] ; (1df4 <_usart_init+0x74>) 1d94: 4918 ldr r1, [pc, #96] ; (1df8 <_usart_init+0x78>) 1d96: 4b19 ldr r3, [pc, #100] ; (1dfc <_usart_init+0x7c>) 1d98: 4798 blx r3 return ((Sercom *)hw)->USART.SYNCBUSY.reg & reg; 1d9a: 69e3 ldr r3, [r4, #28] 1d9c: 4d18 ldr r5, [pc, #96] ; (1e00 <_usart_init+0x80>) uint8_t i = _get_sercom_index(hw); if (!hri_sercomusart_is_syncing(hw, SERCOM_USART_SYNCBUSY_SWRST)) { 1d9e: 07db lsls r3, r3, #31 1da0: d411 bmi.n 1dc6 <_usart_init+0x46> hri_sercomusart_ctrla_reg_t mask) { uint32_t tmp; hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST | SERCOM_USART_SYNCBUSY_ENABLE); tmp = ((Sercom *)hw)->USART.CTRLA.reg; tmp &= mask; 1da2: 2602 movs r6, #2 hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST | SERCOM_USART_SYNCBUSY_ENABLE); 1da4: 2103 movs r1, #3 1da6: 0020 movs r0, r4 1da8: 47a8 blx r5 tmp = ((Sercom *)hw)->USART.CTRLA.reg; 1daa: 6823 ldr r3, [r4, #0] uint32_t mode = _usarts[i].ctrl_a & SERCOM_USART_CTRLA_MODE_Msk; if (hri_sercomusart_get_CTRLA_reg(hw, SERCOM_USART_CTRLA_ENABLE)) { 1dac: 4233 tst r3, r6 1dae: d005 beq.n 1dbc <_usart_init+0x3c> hri_sercomusart_clear_CTRLA_ENABLE_bit(hw); 1db0: 0020 movs r0, r4 1db2: 4b14 ldr r3, [pc, #80] ; (1e04 <_usart_init+0x84>) 1db4: 4798 blx r3 hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_ENABLE); 1db6: 0031 movs r1, r6 1db8: 0020 movs r0, r4 1dba: 47a8 blx r5 } static inline void hri_sercomusart_write_CTRLA_reg(const void *const hw, hri_sercomusart_ctrla_reg_t data) { SERCOM_CRITICAL_SECTION_ENTER(); ((Sercom *)hw)->USART.CTRLA.reg = data; 1dbc: 2305 movs r3, #5 hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST | SERCOM_USART_SYNCBUSY_ENABLE); 1dbe: 2103 movs r1, #3 1dc0: 0020 movs r0, r4 ((Sercom *)hw)->USART.CTRLA.reg = data; 1dc2: 6023 str r3, [r4, #0] hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST | SERCOM_USART_SYNCBUSY_ENABLE); 1dc4: 47a8 blx r5 } hri_sercomusart_write_CTRLA_reg(hw, SERCOM_USART_CTRLA_SWRST | mode); } hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST); 1dc6: 0020 movs r0, r4 1dc8: 2101 movs r1, #1 1dca: 47a8 blx r5 ((Sercom *)hw)->USART.CTRLA.reg = data; 1dcc: 4b0e ldr r3, [pc, #56] ; (1e08 <_usart_init+0x88>) hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST | SERCOM_USART_SYNCBUSY_ENABLE); 1dce: 0020 movs r0, r4 ((Sercom *)hw)->USART.CTRLA.reg = data; 1dd0: 6023 str r3, [r4, #0] hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_SWRST | SERCOM_USART_SYNCBUSY_ENABLE); 1dd2: 2103 movs r1, #3 1dd4: 47a8 blx r5 } static inline void hri_sercomusart_write_CTRLB_reg(const void *const hw, hri_sercomusart_ctrlb_reg_t data) { SERCOM_CRITICAL_SECTION_ENTER(); ((Sercom *)hw)->USART.CTRLB.reg = data; 1dd6: 23c0 movs r3, #192 ; 0xc0 1dd8: 029b lsls r3, r3, #10 hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_MASK); 1dda: 0020 movs r0, r4 ((Sercom *)hw)->USART.CTRLB.reg = data; 1ddc: 6063 str r3, [r4, #4] hri_sercomusart_wait_for_sync(hw, SERCOM_USART_SYNCBUSY_MASK); 1dde: 2107 movs r1, #7 1de0: 47a8 blx r5 } static inline void hri_sercomusart_write_RXPL_reg(const void *const hw, hri_sercomusart_rxpl_reg_t data) { SERCOM_CRITICAL_SECTION_ENTER(); ((Sercom *)hw)->USART.RXPL.reg = data; 1de2: 2000 movs r0, #0 ((Sercom *)hw)->USART.BAUD.reg = data; 1de4: 4b09 ldr r3, [pc, #36] ; (1e0c <_usart_init+0x8c>) 1de6: 81a3 strh r3, [r4, #12] ((Sercom *)hw)->USART.RXPL.reg = data; 1de8: 73a0 strb r0, [r4, #14] } static inline void hri_sercomusart_write_DBGCTRL_reg(const void *const hw, hri_sercomusart_dbgctrl_reg_t data) { SERCOM_CRITICAL_SECTION_ENTER(); ((Sercom *)hw)->USART.DBGCTRL.reg = data; 1dea: 3430 adds r4, #48 ; 0x30 1dec: 7020 strb r0, [r4, #0] hri_sercomusart_write_RXPL_reg(hw, _usarts[i].rxpl); hri_sercomusart_write_DBGCTRL_reg(hw, _usarts[i].debug_ctrl); return ERR_NONE; } 1dee: bd70 pop {r4, r5, r6, pc} 1df0: bdfff800 .word 0xbdfff800 1df4: 0000023a .word 0x0000023a 1df8: 00002f00 .word 0x00002f00 1dfc: 000013e1 .word 0x000013e1 1e00: 00001d61 .word 0x00001d61 1e04: 00001d69 .word 0x00001d69 1e08: 40100004 .word 0x40100004 1e0c: ffffc504 .word 0xffffc504 00001e10 <_usart_sync_init>: { 1e10: b570 push {r4, r5, r6, lr} 1e12: 0005 movs r5, r0 ASSERT(device); 1e14: 1e43 subs r3, r0, #1 1e16: 4198 sbcs r0, r3 { 1e18: 000c movs r4, r1 ASSERT(device); 1e1a: 22b4 movs r2, #180 ; 0xb4 1e1c: 4904 ldr r1, [pc, #16] ; (1e30 <_usart_sync_init+0x20>) 1e1e: 4b05 ldr r3, [pc, #20] ; (1e34 <_usart_sync_init+0x24>) 1e20: b2c0 uxtb r0, r0 1e22: 4798 blx r3 device->hw = hw; 1e24: 602c str r4, [r5, #0] return _usart_init(hw); 1e26: 0020 movs r0, r4 1e28: 4b03 ldr r3, [pc, #12] ; (1e38 <_usart_sync_init+0x28>) 1e2a: 4798 blx r3 } 1e2c: bd70 pop {r4, r5, r6, pc} 1e2e: 46c0 nop ; (mov r8, r8) 1e30: 00002f00 .word 0x00002f00 1e34: 000013e1 .word 0x000013e1 1e38: 00001d81 .word 0x00001d81 00001e3c <_usart_sync_write_byte>: hri_sercomusart_write_DATA_reg(device->hw, data); 1e3c: 6803 ldr r3, [r0, #0] ((Sercom *)hw)->USART.DATA.reg = data; 1e3e: 8519 strh r1, [r3, #40] ; 0x28 } 1e40: 4770 bx lr 00001e42 <_usart_sync_read_byte>: return hri_sercomusart_read_DATA_reg(device->hw); 1e42: 6803 ldr r3, [r0, #0] return ((Sercom *)hw)->USART.DATA.reg; 1e44: 8d18 ldrh r0, [r3, #40] ; 0x28 1e46: b2c0 uxtb r0, r0 } 1e48: 4770 bx lr 00001e4a <_usart_sync_is_ready_to_send>: return hri_sercomusart_get_interrupt_DRE_bit(device->hw); 1e4a: 6803 ldr r3, [r0, #0] return (((Sercom *)hw)->USART.INTFLAG.reg & SERCOM_USART_INTFLAG_DRE) >> SERCOM_USART_INTFLAG_DRE_Pos; 1e4c: 7e18 ldrb r0, [r3, #24] 1e4e: 2301 movs r3, #1 1e50: 4018 ands r0, r3 } 1e52: 4770 bx lr 00001e54 <_usart_sync_is_transmit_done>: return hri_sercomusart_get_interrupt_TXC_bit(device->hw); 1e54: 6803 ldr r3, [r0, #0] return (((Sercom *)hw)->USART.INTFLAG.reg & SERCOM_USART_INTFLAG_TXC) >> SERCOM_USART_INTFLAG_TXC_Pos; 1e56: 7e18 ldrb r0, [r3, #24] 1e58: 0780 lsls r0, r0, #30 1e5a: 0fc0 lsrs r0, r0, #31 } 1e5c: 4770 bx lr 00001e5e <_usart_sync_is_byte_received>: return hri_sercomusart_get_interrupt_RXC_bit(device->hw); 1e5e: 6803 ldr r3, [r0, #0] return (((Sercom *)hw)->USART.INTFLAG.reg & SERCOM_USART_INTFLAG_RXC) >> SERCOM_USART_INTFLAG_RXC_Pos; 1e60: 7e18 ldrb r0, [r3, #24] 1e62: 0740 lsls r0, r0, #29 1e64: 0fc0 lsrs r0, r0, #31 } 1e66: 4770 bx lr 00001e68 : /** * Initializes MCU, drivers and middleware in the project **/ void atmel_start_init(void) { 1e68: b510 push {r4, lr} system_init(); 1e6a: 4b02 ldr r3, [pc, #8] ; (1e74 ) 1e6c: 4798 blx r3 usb_init(); 1e6e: 4b02 ldr r3, [pc, #8] ; (1e78 ) 1e70: 4798 blx r3 } 1e72: bd10 pop {r4, pc} 1e74: 00001d3d .word 0x00001d3d 1e78: 00001419 .word 0x00001419 00001e7c : /** * \brief Unconfig, close all interfaces */ static void usbdc_unconfig(void) { struct usbdf_driver *func = (struct usbdf_driver *)usbdc.func_list.head; 1e7c: 4b06 ldr r3, [pc, #24] ; (1e98 ) { 1e7e: b510 push {r4, lr} struct usbdf_driver *func = (struct usbdf_driver *)usbdc.func_list.head; 1e80: 691c ldr r4, [r3, #16] while (NULL != func) { 1e82: 2c00 cmp r4, #0 1e84: d100 bne.n 1e88 func->ctrl(func, USBDF_DISABLE, NULL); func = func->next; } } 1e86: bd10 pop {r4, pc} func->ctrl(func, USBDF_DISABLE, NULL); 1e88: 0020 movs r0, r4 1e8a: 6863 ldr r3, [r4, #4] 1e8c: 2200 movs r2, #0 1e8e: 2101 movs r1, #1 1e90: 4798 blx r3 func = func->next; 1e92: 6824 ldr r4, [r4, #0] 1e94: e7f5 b.n 1e82 1e96: 46c0 nop ; (mov r8, r8) 1e98: 20000650 .word 0x20000650 00001e9c : } } /** Invoke all registered Change notification callbacks. */ static void usbdc_change_notify(enum usbdc_change_type change, uint32_t value) { 1e9c: b570 push {r4, r5, r6, lr} 1e9e: 0005 movs r5, r0 1ea0: 000e movs r6, r1 struct usbdc_change_handler *cg = (struct usbdc_change_handler *)usbdc.handlers.change_list.head; 1ea2: 4b06 ldr r3, [pc, #24] ; (1ebc ) 1ea4: 68dc ldr r4, [r3, #12] while (cg != NULL) { 1ea6: 2c00 cmp r4, #0 1ea8: d100 bne.n 1eac if (NULL != cg->cb) { cg->cb(change, value); } cg = cg->next; } } 1eaa: bd70 pop {r4, r5, r6, pc} if (NULL != cg->cb) { 1eac: 6863 ldr r3, [r4, #4] 1eae: 2b00 cmp r3, #0 1eb0: d002 beq.n 1eb8 cg->cb(change, value); 1eb2: 0031 movs r1, r6 1eb4: 0028 movs r0, r5 1eb6: 4798 blx r3 cg = cg->next; 1eb8: 6824 ldr r4, [r4, #0] 1eba: e7f4 b.n 1ea6 1ebc: 20000650 .word 0x20000650 00001ec0 : /** Invoke all registered request callbacks until request handled. */ static int32_t usbdc_request_handler(uint8_t ep, struct usb_req *req, enum usb_ctrl_stage stage) { 1ec0: b5f8 push {r3, r4, r5, r6, r7, lr} 1ec2: 0005 movs r5, r0 1ec4: 000e movs r6, r1 1ec6: 0017 movs r7, r2 struct usbdc_req_handler *h = (struct usbdc_req_handler *)usbdc.handlers.req_list.head; 1ec8: 4b0b ldr r3, [pc, #44] ; (1ef8 ) 1eca: 689c ldr r4, [r3, #8] int32_t rc; while (h != NULL) { 1ecc: 2c00 cmp r4, #0 1ece: d101 bne.n 1ed4 return -1; } } h = h->next; } return false; 1ed0: 0020 movs r0, r4 } 1ed2: bdf8 pop {r3, r4, r5, r6, r7, pc} if (NULL != h->cb) { 1ed4: 6863 ldr r3, [r4, #4] 1ed6: 2b00 cmp r3, #0 1ed8: d101 bne.n 1ede h = h->next; 1eda: 6824 ldr r4, [r4, #0] 1edc: e7f6 b.n 1ecc rc = h->cb(ep, req, stage); 1ede: 003a movs r2, r7 1ee0: 0031 movs r1, r6 1ee2: 0028 movs r0, r5 1ee4: 4798 blx r3 if (0 == rc) { 1ee6: 2800 cmp r0, #0 1ee8: d004 beq.n 1ef4 } else if (ERR_NOT_FOUND != rc) { 1eea: 300a adds r0, #10 1eec: d0f5 beq.n 1eda return -1; 1eee: 2001 movs r0, #1 1ef0: 4240 negs r0, r0 1ef2: e7ee b.n 1ed2 return true; 1ef4: 2001 movs r0, #1 1ef6: e7ec b.n 1ed2 1ef8: 20000650 .word 0x20000650 00001efc : struct usbdc_sof_handler *sof = (struct usbdc_sof_handler *)usbdc.handlers.sof_list.head; 1efc: 4b05 ldr r3, [pc, #20] ; (1f14 ) /** * \brief Callback invoked on USB device SOF */ static void usbd_sof_cb(void) { 1efe: b510 push {r4, lr} struct usbdc_sof_handler *sof = (struct usbdc_sof_handler *)usbdc.handlers.sof_list.head; 1f00: 685c ldr r4, [r3, #4] while (sof != NULL) { 1f02: 2c00 cmp r4, #0 1f04: d100 bne.n 1f08 usbdc_sof_notify(); } 1f06: bd10 pop {r4, pc} if (NULL != sof->cb) { 1f08: 6863 ldr r3, [r4, #4] 1f0a: 2b00 cmp r3, #0 1f0c: d000 beq.n 1f10 sof->cb(); 1f0e: 4798 blx r3 sof = sof->next; 1f10: 6824 ldr r4, [r4, #0] 1f12: e7f6 b.n 1f02 1f14: 20000650 .word 0x20000650 00001f18 : * \return Data has error or not. * \retval true There is data error, protocol error. * \retval false There is no data error. */ static bool usbdc_cb_ctl_done(const uint8_t ep, const enum usb_xfer_code code, struct usb_req *req) { 1f18: b510 push {r4, lr} 1f1a: 0014 movs r4, r2 (void)ep; switch (code) { 1f1c: 2900 cmp r1, #0 1f1e: d003 beq.n 1f28 1f20: 2901 cmp r1, #1 1f22: d023 beq.n 1f6c return usbdc_ctrl_data_end(req); default: break; } return false; } 1f24: 2000 movs r0, #0 1f26: bd10 pop {r4, pc} if (req->bmRequestType != USB_REQT_TYPE_STANDARD) { 1f28: 7813 ldrb r3, [r2, #0] 1f2a: 2b00 cmp r3, #0 1f2c: d1fa bne.n 1f24 switch (req->bRequest) { 1f2e: 7853 ldrb r3, [r2, #1] 1f30: 2b05 cmp r3, #5 1f32: d00f beq.n 1f54 1f34: 2b09 cmp r3, #9 1f36: d1f5 bne.n 1f24 usbdc.cfg_value = req->wValue; 1f38: 78e1 ldrb r1, [r4, #3] 1f3a: 7892 ldrb r2, [r2, #2] 1f3c: 4b0e ldr r3, [pc, #56] ; (1f78 ) 1f3e: 0209 lsls r1, r1, #8 1f40: 4311 orrs r1, r2 1f42: 76d9 strb r1, [r3, #27] usbdc.state = req->wValue ? USBD_S_CONFIG : USBD_S_ADDRESS; 1f44: 1e4a subs r2, r1, #1 1f46: 4191 sbcs r1, r2 1f48: 3103 adds r1, #3 usbdc.state = req->wValue ? USBD_S_ADDRESS : USBD_S_DEFAULT; 1f4a: 7699 strb r1, [r3, #26] usbdc_change_notify(USBDC_C_STATE, usbdc.state); 1f4c: 2001 movs r0, #1 1f4e: 4b0b ldr r3, [pc, #44] ; (1f7c ) 1f50: 4798 blx r3 break; 1f52: e7e7 b.n 1f24 usb_d_set_address(addr); 1f54: 4b0a ldr r3, [pc, #40] ; (1f80 ) 1f56: 7890 ldrb r0, [r2, #2] 1f58: 4798 blx r3 usbdc.state = req->wValue ? USBD_S_ADDRESS : USBD_S_DEFAULT; 1f5a: 78e1 ldrb r1, [r4, #3] 1f5c: 78a2 ldrb r2, [r4, #2] 1f5e: 0209 lsls r1, r1, #8 1f60: 4311 orrs r1, r2 1f62: 1e4b subs r3, r1, #1 1f64: 4199 sbcs r1, r3 1f66: 4b04 ldr r3, [pc, #16] ; (1f78 ) 1f68: 3102 adds r1, #2 1f6a: e7ee b.n 1f4a usbdc_request_handler(0, req, USB_DATA_STAGE); 1f6c: 000a movs r2, r1 1f6e: 4b05 ldr r3, [pc, #20] ; (1f84 ) 1f70: 0021 movs r1, r4 1f72: 2000 movs r0, #0 1f74: 4798 blx r3 return usbdc_ctrl_data_end(req); 1f76: e7d5 b.n 1f24 1f78: 20000650 .word 0x20000650 1f7c: 00001e9d .word 0x00001e9d 1f80: 00001931 .word 0x00001931 1f84: 00001ec1 .word 0x00001ec1 00001f88 : /** * \brief USB Device Core Reset */ void usbdc_reset(void) { 1f88: b570 push {r4, r5, r6, lr} usbdc_unconfig(); usbdc.state = USBD_S_DEFAULT; usbdc.cfg_value = 0; usbdc.ifc_alt_map = 0; 1f8a: 2400 movs r4, #0 usbdc.state = USBD_S_DEFAULT; 1f8c: 2602 movs r6, #2 usbdc_unconfig(); 1f8e: 4b0c ldr r3, [pc, #48] ; (1fc0 ) 1f90: 4798 blx r3 usbdc.state = USBD_S_DEFAULT; 1f92: 4d0c ldr r5, [pc, #48] ; (1fc4 ) // Setup EP0 usb_d_ep_deinit(0); 1f94: 0020 movs r0, r4 usbdc.state = USBD_S_DEFAULT; 1f96: 836e strh r6, [r5, #26] usb_d_ep_deinit(0); 1f98: 4b0b ldr r3, [pc, #44] ; (1fc8 ) usbdc.ifc_alt_map = 0; 1f9a: 776c strb r4, [r5, #29] usb_d_ep_deinit(0); 1f9c: 4798 blx r3 usb_d_ep0_init(usbdc.ctrl_size); 1f9e: 4b0b ldr r3, [pc, #44] ; (1fcc ) 1fa0: 7f28 ldrb r0, [r5, #28] 1fa2: 4798 blx r3 usb_d_ep_register_callback(0, USB_D_EP_CB_SETUP, (FUNC_PTR)usbdc_cb_ctl_req); 1fa4: 4d0a ldr r5, [pc, #40] ; (1fd0 ) 1fa6: 0021 movs r1, r4 1fa8: 0020 movs r0, r4 1faa: 4a0a ldr r2, [pc, #40] ; (1fd4 ) 1fac: 47a8 blx r5 usb_d_ep_register_callback(0, USB_D_EP_CB_XFER, (FUNC_PTR)usbdc_cb_ctl_done); 1fae: 0031 movs r1, r6 1fb0: 0020 movs r0, r4 1fb2: 4a09 ldr r2, [pc, #36] ; (1fd8 ) 1fb4: 47a8 blx r5 usb_d_ep_enable(0); 1fb6: 0020 movs r0, r4 1fb8: 4b08 ldr r3, [pc, #32] ; (1fdc ) 1fba: 4798 blx r3 } 1fbc: bd70 pop {r4, r5, r6, pc} 1fbe: 46c0 nop ; (mov r8, r8) 1fc0: 00001e7d .word 0x00001e7d 1fc4: 20000650 .word 0x20000650 1fc8: 000019a1 .word 0x000019a1 1fcc: 0000198d .word 0x0000198d 1fd0: 00001b61 .word 0x00001b61 1fd4: 0000201d .word 0x0000201d 1fd8: 00001f19 .word 0x00001f19 1fdc: 000019cd .word 0x000019cd 00001fe0 : * \brief Callback invoked on USB device events * \param[in] ev Event code. * \param[in] param Event parameter for event handling. */ static void usbd_event_cb(const enum usb_event ev, const uint32_t param) { 1fe0: b510 push {r4, lr} (void)param; switch (ev) { 1fe2: 2800 cmp r0, #0 1fe4: d002 beq.n 1fec 1fe6: 2801 cmp r0, #1 1fe8: d003 beq.n 1ff2 break; default: break; } } 1fea: bd10 pop {r4, pc} usbdc_change_notify(USBDC_C_CONN, param); 1fec: 4b02 ldr r3, [pc, #8] ; (1ff8 ) 1fee: 4798 blx r3 break; 1ff0: e7fb b.n 1fea usbdc_reset(); 1ff2: 4b02 ldr r3, [pc, #8] ; (1ffc ) 1ff4: 4798 blx r3 } 1ff6: e7f8 b.n 1fea 1ff8: 00001e9d .word 0x00001e9d 1ffc: 00001f89 .word 0x00001f89 00002000 : /** * \brief Issue USB device transfer */ int32_t usbdc_xfer(uint8_t ep, uint8_t *buf, uint32_t size, bool zlp) { 2000: b51f push {r0, r1, r2, r3, r4, lr} struct usb_d_transfer xfer = {(uint8_t *)buf, size, ep, zlp}; 2002: 9202 str r2, [sp, #8] 2004: 466a mov r2, sp 2006: 7310 strb r0, [r2, #12] 2008: 7353 strb r3, [r2, #13] return usb_d_ep_transfer(&xfer); 200a: a801 add r0, sp, #4 200c: 4b02 ldr r3, [pc, #8] ; (2018 ) struct usb_d_transfer xfer = {(uint8_t *)buf, size, ep, zlp}; 200e: 9101 str r1, [sp, #4] return usb_d_ep_transfer(&xfer); 2010: 4798 blx r3 } 2012: b005 add sp, #20 2014: bd00 pop {pc} 2016: 46c0 nop ; (mov r8, r8) 2018: 00001a0d .word 0x00001a0d 0000201c : { 201c: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} switch (usbdc_request_handler(ep, req, USB_SETUP_STAGE)) { 201e: 4bb7 ldr r3, [pc, #732] ; (22fc ) 2020: 2200 movs r2, #0 { 2022: 0004 movs r4, r0 2024: 000d movs r5, r1 switch (usbdc_request_handler(ep, req, USB_SETUP_STAGE)) { 2026: 4798 blx r3 2028: 0003 movs r3, r0 return false; 202a: 2000 movs r0, #0 switch (usbdc_request_handler(ep, req, USB_SETUP_STAGE)) { 202c: 1c5a adds r2, r3, #1 202e: d100 bne.n 2032 2030: e0c1 b.n 21b6 2032: 3001 adds r0, #1 2034: 4283 cmp r3, r0 2036: d100 bne.n 203a 2038: e0bd b.n 21b6 switch (req->bmRequestType & (USB_REQT_TYPE_MASK | USB_REQT_DIR_IN)) { 203a: 782b ldrb r3, [r5, #0] 203c: 221f movs r2, #31 203e: 0019 movs r1, r3 2040: 4391 bics r1, r2 2042: d004 beq.n 204e 2044: 2980 cmp r1, #128 ; 0x80 2046: d100 bne.n 204a 2048: e0b6 b.n 21b8 switch (req->bRequest) { 204a: 2000 movs r0, #0 204c: e0b3 b.n 21b6 switch (req->bRequest) { 204e: 7868 ldrb r0, [r5, #1] 2050: 3801 subs r0, #1 2052: 280a cmp r0, #10 2054: d8f9 bhi.n 204a 2056: f000 fa57 bl 2508 <__gnu_thumb1_case_sqi> 205a: f846 .short 0xf846 205c: f80bf856 .word 0xf80bf856 2060: f806f8f8 .word 0xf806f8f8 2064: 60 .byte 0x60 2065: 00 .byte 0x00 if (!usbdc_set_config(req->wValue)) { 2066: 78aa ldrb r2, [r5, #2] if (cfg_value == 0) { 2068: 2a00 cmp r2, #0 206a: d10b bne.n 2084 usbdc_unconfig(); 206c: 4ba4 ldr r3, [pc, #656] ; (2300 ) 206e: 4798 blx r3 return (ERR_NONE == usbdc_xfer(ep, NULL, 0, true)); 2070: 2200 movs r2, #0 2072: 2301 movs r3, #1 2074: 0011 movs r1, r2 if (ERR_NONE != usbdc_xfer(ep, str_desc, length, need_zlp)) { 2076: 0020 movs r0, r4 2078: 4ca2 ldr r4, [pc, #648] ; (2304 ) 207a: 47a0 blx r4 207c: 4243 negs r3, r0 207e: 4158 adcs r0, r3 2080: b2c0 uxtb r0, r0 2082: e098 b.n 21b6 cfg_desc = usb_find_cfg_desc(usbdc.desces.ls_fs->sod, usbdc.desces.ls_fs->eod, cfg_value); 2084: 4da0 ldr r5, [pc, #640] ; (2308 ) 2086: 682b ldr r3, [r5, #0] 2088: cb03 ldmia r3!, {r0, r1} 208a: 4ba0 ldr r3, [pc, #640] ; (230c ) 208c: 4798 blx r3 if (NULL == cfg_desc) { 208e: 2800 cmp r0, #0 2090: d100 bne.n 2094 2092: e090 b.n 21b6 return (ptr[0] + (ptr[1] << 8)); 2094: 78c3 ldrb r3, [r0, #3] 2096: 7881 ldrb r1, [r0, #2] 2098: 021b lsls r3, r3, #8 209a: 18c9 adds r1, r1, r3 desc.eod = cfg_desc + total_len; 209c: b289 uxth r1, r1 209e: 1841 adds r1, r0, r1 desc.sod = usb_find_desc(cfg_desc, desc.eod, USB_DT_INTERFACE); 20a0: 2204 movs r2, #4 20a2: 4b9b ldr r3, [pc, #620] ; (2310 ) desc.eod = cfg_desc + total_len; 20a4: 9101 str r1, [sp, #4] desc.sod = usb_find_desc(cfg_desc, desc.eod, USB_DT_INTERFACE); 20a6: 4798 blx r3 uint8_t last_iface = 0xFF; 20a8: 22ff movs r2, #255 ; 0xff desc.sod = usb_find_desc(cfg_desc, desc.eod, USB_DT_INTERFACE); 20aa: 9000 str r0, [sp, #0] while (NULL != desc.sod) { 20ac: 9b00 ldr r3, [sp, #0] 20ae: 2b00 cmp r3, #0 20b0: d0de beq.n 2070 if (last_iface != desc.sod[2] /* bInterfaceNumber */) { 20b2: 789e ldrb r6, [r3, #2] 20b4: 4296 cmp r6, r2 20b6: d002 beq.n 20be func = (struct usbdf_driver *)usbdc.func_list.head; 20b8: 692f ldr r7, [r5, #16] while (NULL != func) { 20ba: 2f00 cmp r7, #0 20bc: d10a bne.n 20d4 desc.sod = usb_desc_next(desc.sod); 20be: 9800 ldr r0, [sp, #0] desc.sod = usb_find_desc(desc.sod, desc.eod, USB_DT_INTERFACE); 20c0: 2204 movs r2, #4 return (desc + usb_desc_len(desc)); 20c2: 7803 ldrb r3, [r0, #0] 20c4: 9901 ldr r1, [sp, #4] 20c6: 18c0 adds r0, r0, r3 desc.sod = usb_desc_next(desc.sod); 20c8: 9000 str r0, [sp, #0] desc.sod = usb_find_desc(desc.sod, desc.eod, USB_DT_INTERFACE); 20ca: 4b91 ldr r3, [pc, #580] ; (2310 ) 20cc: 4798 blx r3 20ce: 0032 movs r2, r6 20d0: 9000 str r0, [sp, #0] 20d2: e7eb b.n 20ac if (func->ctrl(func, USBDF_ENABLE, &desc)) { 20d4: 466a mov r2, sp 20d6: 2100 movs r1, #0 20d8: 0038 movs r0, r7 20da: 687b ldr r3, [r7, #4] 20dc: 4798 blx r3 20de: 2800 cmp r0, #0 20e0: d0ed beq.n 20be func = func->next; 20e2: 683f ldr r7, [r7, #0] 20e4: e7e9 b.n 20ba switch (req->bmRequestType & USB_REQT_RECIP_MASK) { 20e6: 2b02 cmp r3, #2 20e8: d1af bne.n 204a if (req->wLength != 0) { 20ea: 79ee ldrb r6, [r5, #7] 20ec: 79ab ldrb r3, [r5, #6] 20ee: 0236 lsls r6, r6, #8 20f0: 431e orrs r6, r3 20f2: d1aa bne.n 204a usb_d_ep_halt(req->wIndex & 0xFF, USB_EP_HALT_CLR); 20f4: 0031 movs r1, r6 20f6: 7928 ldrb r0, [r5, #4] usb_d_ep_halt(req->wIndex & 0xFF, USB_EP_HALT_SET); 20f8: 4b86 ldr r3, [pc, #536] ; (2314 ) 20fa: 4798 blx r3 usbdc_xfer(ep, NULL, 0, true); 20fc: 2301 movs r3, #1 20fe: 0032 movs r2, r6 2100: 0031 movs r1, r6 usbdc_xfer(ep, usbdc.ctrl_buf, 1, false); 2102: 0020 movs r0, r4 2104: e054 b.n 21b0 switch (req->bmRequestType & USB_REQT_RECIP_MASK) { 2106: 2b02 cmp r3, #2 2108: d19f bne.n 204a if (req->wLength != 0) { 210a: 79eb ldrb r3, [r5, #7] 210c: 79ae ldrb r6, [r5, #6] 210e: 021b lsls r3, r3, #8 2110: 431e orrs r6, r3 2112: d19a bne.n 204a usb_d_ep_halt(req->wIndex & 0xFF, USB_EP_HALT_SET); 2114: 2101 movs r1, #1 2116: 7928 ldrb r0, [r5, #4] 2118: e7ee b.n 20f8 return usbdc_set_interface(req->wValue, req->wIndex); 211a: 78ec ldrb r4, [r5, #3] 211c: 78ab ldrb r3, [r5, #2] 211e: 0224 lsls r4, r4, #8 2120: 431c orrs r4, r3 2122: 792b ldrb r3, [r5, #4] 2124: 796d ldrb r5, [r5, #5] ifc = usb_find_cfg_desc(usbdc.desces.ls_fs->sod, usbdc.desces.ls_fs->eod, usbdc.cfg_value); 2126: 4e78 ldr r6, [pc, #480] ; (2308 ) return usbdc_set_interface(req->wValue, req->wIndex); 2128: 022d lsls r5, r5, #8 212a: 431d orrs r5, r3 ifc = usb_find_cfg_desc(usbdc.desces.ls_fs->sod, usbdc.desces.ls_fs->eod, usbdc.cfg_value); 212c: 6833 ldr r3, [r6, #0] 212e: 7ef2 ldrb r2, [r6, #27] 2130: cb03 ldmia r3!, {r0, r1} 2132: 4b76 ldr r3, [pc, #472] ; (230c ) 2134: 4798 blx r3 if (NULL == ifc) { 2136: 2800 cmp r0, #0 2138: d087 beq.n 204a if (NULL == (ifc = usb_find_desc(desc.sod, desc.eod, USB_DT_INTERFACE))) { 213a: 2204 movs r2, #4 desc.sod = ifc; 213c: 9000 str r0, [sp, #0] return (ptr[0] + (ptr[1] << 8)); 213e: 78c3 ldrb r3, [r0, #3] 2140: 7881 ldrb r1, [r0, #2] 2142: 021b lsls r3, r3, #8 2144: 18c9 adds r1, r1, r3 desc.eod = ifc + usb_cfg_desc_total_len(ifc); 2146: b289 uxth r1, r1 2148: 1841 adds r1, r0, r1 if (NULL == (ifc = usb_find_desc(desc.sod, desc.eod, USB_DT_INTERFACE))) { 214a: 4f71 ldr r7, [pc, #452] ; (2310 ) desc.eod = ifc + usb_cfg_desc_total_len(ifc); 214c: 9101 str r1, [sp, #4] ifc = usb_find_desc(desc.sod, desc.eod, USB_DT_INTERFACE); 214e: 47b8 blx r7 if (NULL == ifc) { 2150: 2800 cmp r0, #0 2152: d100 bne.n 2156 2154: e779 b.n 204a while (ifc[2] != ifc_id || ifc[3] != alt_set) { 2156: 7883 ldrb r3, [r0, #2] 2158: 42ab cmp r3, r5 215a: d110 bne.n 217e 215c: 78c3 ldrb r3, [r0, #3] 215e: 42a3 cmp r3, r4 2160: d10d bne.n 217e func = (struct usbdf_driver *)usbdc.func_list.head; 2162: 6937 ldr r7, [r6, #16] desc.sod = ifc; 2164: 9000 str r0, [sp, #0] while (NULL != func) { 2166: 2f00 cmp r7, #0 2168: d100 bne.n 216c 216a: e76e b.n 204a if (func->ctrl(func, USBDF_DISABLE, &desc)) { 216c: 2101 movs r1, #1 216e: 466a mov r2, sp 2170: 0038 movs r0, r7 2172: 687b ldr r3, [r7, #4] 2174: 4798 blx r3 2176: 1e01 subs r1, r0, #0 2178: d008 beq.n 218c func = func->next; 217a: 683f ldr r7, [r7, #0] 217c: e7f3 b.n 2166 desc.sod = usb_desc_next(desc.sod); 217e: 9800 ldr r0, [sp, #0] ifc = usb_find_desc(desc.sod, desc.eod, USB_DT_INTERFACE); 2180: 2204 movs r2, #4 return (desc + usb_desc_len(desc)); 2182: 7803 ldrb r3, [r0, #0] 2184: 9901 ldr r1, [sp, #4] 2186: 18c0 adds r0, r0, r3 desc.sod = usb_desc_next(desc.sod); 2188: 9000 str r0, [sp, #0] ifc = usb_find_desc(desc.sod, desc.eod, USB_DT_INTERFACE); 218a: e7e0 b.n 214e } else if (ERR_NONE == func->ctrl(func, USBDF_ENABLE, &desc)) { 218c: 466a mov r2, sp 218e: 0038 movs r0, r7 2190: 687b ldr r3, [r7, #4] 2192: 4798 blx r3 2194: 2800 cmp r0, #0 2196: d000 beq.n 219a 2198: e757 b.n 204a if (alt_set) { 219a: 2c00 cmp r4, #0 219c: d004 beq.n 21a8 usbdc.ifc_alt_map |= 1 << ifc_id; 219e: 2201 movs r2, #1 21a0: 40aa lsls r2, r5 21a2: 7f73 ldrb r3, [r6, #29] 21a4: 4313 orrs r3, r2 21a6: 7773 strb r3, [r6, #29] usbdc_xfer(0, NULL, 0, 0); 21a8: 2300 movs r3, #0 21aa: 001a movs r2, r3 21ac: 0019 movs r1, r3 21ae: 0018 movs r0, r3 21b0: 4c54 ldr r4, [pc, #336] ; (2304 ) 21b2: 47a0 blx r4 return true; 21b4: 2001 movs r0, #1 } 21b6: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc} switch (req->bRequest) { 21b8: 7868 ldrb r0, [r5, #1] 21ba: 280a cmp r0, #10 21bc: d900 bls.n 21c0 21be: e744 b.n 204a 21c0: f000 f9b6 bl 2530 <__gnu_thumb1_case_shi> 21c4: ff430062 .word 0xff430062 21c8: ff43ff43 .word 0xff43ff43 21cc: ff43ff43 .word 0xff43ff43 21d0: ff43000b .word 0xff43000b 21d4: ff43005a .word 0xff43005a 21d8: 0083 .short 0x0083 uint8_t type = (uint8_t)(req->wValue >> 8); 21da: 78e9 ldrb r1, [r5, #3] 21dc: 78ab ldrb r3, [r5, #2] 21de: 0209 lsls r1, r1, #8 21e0: 430b orrs r3, r1 21e2: 0a09 lsrs r1, r1, #8 21e4: b2ca uxtb r2, r1 switch (type) { 21e6: 2902 cmp r1, #2 21e8: d017 beq.n 221a 21ea: 2a03 cmp r2, #3 21ec: d034 beq.n 2258 21ee: 2000 movs r0, #0 21f0: 2a01 cmp r2, #1 21f2: d1e0 bne.n 21b6 uint16_t length = req->wLength; 21f4: 79ab ldrb r3, [r5, #6] 21f6: 79ed ldrb r5, [r5, #7] 21f8: 022d lsls r5, r5, #8 21fa: 431d orrs r5, r3 dev_desc = usb_find_desc(usbdc.desces.ls_fs->sod, usbdc.desces.ls_fs->eod, USB_DT_DEVICE); 21fc: 4b42 ldr r3, [pc, #264] ; (2308 ) 21fe: 681b ldr r3, [r3, #0] 2200: cb03 ldmia r3!, {r0, r1} 2202: 4b43 ldr r3, [pc, #268] ; (2310 ) 2204: 4798 blx r3 2206: 1e01 subs r1, r0, #0 if (!dev_desc) { 2208: d100 bne.n 220c 220a: e71e b.n 204a if (ERR_NONE != usbdc_xfer(ep, dev_desc, length, false)) { 220c: 1c2a adds r2, r5, #0 220e: 2d12 cmp r5, #18 2210: d900 bls.n 2214 2212: 2212 movs r2, #18 2214: 2300 movs r3, #0 2216: b292 uxth r2, r2 2218: e72d b.n 2076 uint16_t length = req->wLength; 221a: 79aa ldrb r2, [r5, #6] 221c: 79ed ldrb r5, [r5, #7] cfg_desc = usb_find_cfg_desc(usbdc.desces.ls_fs->sod, usbdc.desces.ls_fs->eod, index + 1); 221e: 3301 adds r3, #1 uint16_t length = req->wLength; 2220: 022d lsls r5, r5, #8 2222: 4315 orrs r5, r2 bool need_zlp = !(length & (usbdc.ctrl_size - 1)); 2224: 4a38 ldr r2, [pc, #224] ; (2308 ) cfg_desc = usb_find_cfg_desc(usbdc.desces.ls_fs->sod, usbdc.desces.ls_fs->eod, index + 1); 2226: 6810 ldr r0, [r2, #0] bool need_zlp = !(length & (usbdc.ctrl_size - 1)); 2228: 7f16 ldrb r6, [r2, #28] cfg_desc = usb_find_cfg_desc(usbdc.desces.ls_fs->sod, usbdc.desces.ls_fs->eod, index + 1); 222a: c803 ldmia r0, {r0, r1} 222c: b2da uxtb r2, r3 222e: 4b37 ldr r3, [pc, #220] ; (230c ) 2230: 4798 blx r3 2232: 1e01 subs r1, r0, #0 if (NULL == cfg_desc) { 2234: d100 bne.n 2238 2236: e708 b.n 204a return (ptr[0] + (ptr[1] << 8)); 2238: 78c3 ldrb r3, [r0, #3] 223a: 7882 ldrb r2, [r0, #2] 223c: 021b lsls r3, r3, #8 223e: 18d2 adds r2, r2, r3 2240: b292 uxth r2, r2 need_zlp = false; 2242: 2300 movs r3, #0 if (length <= str_desc[0]) { 2244: 4295 cmp r5, r2 2246: d905 bls.n 2254 bool need_zlp = !(length & (usbdc.ctrl_size - 1)); 2248: 3e01 subs r6, #1 224a: 4035 ands r5, r6 224c: 426b negs r3, r5 224e: 415d adcs r5, r3 2250: b2eb uxtb r3, r5 2252: 0015 movs r5, r2 if (ERR_NONE != usbdc_xfer(ep, str_desc, length, need_zlp)) { 2254: 002a movs r2, r5 2256: e70e b.n 2076 uint16_t length = req->wLength; 2258: 79aa ldrb r2, [r5, #6] 225a: 79ed ldrb r5, [r5, #7] 225c: 022d lsls r5, r5, #8 225e: 4315 orrs r5, r2 bool need_zlp = !(length & (usbdc.ctrl_size - 1)); 2260: 4a29 ldr r2, [pc, #164] ; (2308 ) str_desc = usb_find_str_desc(usbdc.desces.ls_fs->sod, usbdc.desces.ls_fs->eod, index); 2262: 6810 ldr r0, [r2, #0] bool need_zlp = !(length & (usbdc.ctrl_size - 1)); 2264: 7f16 ldrb r6, [r2, #28] str_desc = usb_find_str_desc(usbdc.desces.ls_fs->sod, usbdc.desces.ls_fs->eod, index); 2266: c803 ldmia r0, {r0, r1} 2268: b2da uxtb r2, r3 226a: 4b2b ldr r3, [pc, #172] ; (2318 ) 226c: 4798 blx r3 226e: 1e01 subs r1, r0, #0 if (NULL == str_desc) { 2270: d100 bne.n 2274 2272: e6ea b.n 204a if (length <= str_desc[0]) { 2274: 7802 ldrb r2, [r0, #0] 2276: e7e4 b.n 2242 *(uint8_t *)usbdc.ctrl_buf = usbdc.cfg_value; 2278: 4923 ldr r1, [pc, #140] ; (2308 ) 227a: 7ecb ldrb r3, [r1, #27] 227c: 694a ldr r2, [r1, #20] 227e: 7013 strb r3, [r2, #0] usbdc_xfer(ep, usbdc.ctrl_buf, 1, false); 2280: 6949 ldr r1, [r1, #20] 2282: 2300 movs r3, #0 2284: 2201 movs r2, #1 2286: e73c b.n 2102 switch (req->bmRequestType & USB_REQT_RECIP_MASK) { 2288: 211f movs r1, #31 228a: 221e movs r2, #30 228c: 0018 movs r0, r3 228e: 4019 ands r1, r3 2290: 4010 ands r0, r2 2292: 4213 tst r3, r2 2294: d00e beq.n 22b4 2296: 2902 cmp r1, #2 2298: d000 beq.n 229c 229a: e6d6 b.n 204a st = usb_d_ep_halt(req->wIndex & 0xFF, USB_EP_HALT_GET); 229c: 4b1d ldr r3, [pc, #116] ; (2314 ) 229e: 7928 ldrb r0, [r5, #4] 22a0: 4798 blx r3 22a2: 0003 movs r3, r0 return false; 22a4: 2000 movs r0, #0 if (st < 0) { 22a6: 4283 cmp r3, r0 22a8: da00 bge.n 22ac 22aa: e784 b.n 21b6 st = st & 0x1; 22ac: 3001 adds r0, #1 22ae: 4003 ands r3, r0 22b0: 9300 str r3, [sp, #0] break; 22b2: e000 b.n 22b6 st = 0; 22b4: 9000 str r0, [sp, #0] memcpy(usbdc.ctrl_buf, &st, 2); 22b6: 4d14 ldr r5, [pc, #80] ; (2308 ) 22b8: 2202 movs r2, #2 22ba: 4669 mov r1, sp 22bc: 4b17 ldr r3, [pc, #92] ; (231c ) 22be: 6968 ldr r0, [r5, #20] 22c0: 4798 blx r3 usbdc_xfer(ep, usbdc.ctrl_buf, 2, false); 22c2: 2300 movs r3, #0 22c4: 2202 movs r2, #2 22c6: 6969 ldr r1, [r5, #20] 22c8: e71b b.n 2102 if (!(usbdc.ifc_alt_map & (1 << req->wIndex))) { 22ca: 4e0f ldr r6, [pc, #60] ; (2308 ) 22cc: 796b ldrb r3, [r5, #5] 22ce: 7929 ldrb r1, [r5, #4] 22d0: 7f72 ldrb r2, [r6, #29] 22d2: 021b lsls r3, r3, #8 22d4: 430b orrs r3, r1 22d6: 411a asrs r2, r3 22d8: 2401 movs r4, #1 22da: 0010 movs r0, r2 22dc: 4020 ands r0, r4 22de: 4222 tst r2, r4 22e0: d01e beq.n 2320 struct usbdf_driver *func = (struct usbdf_driver *)usbdc.func_list.head; 22e2: 6934 ldr r4, [r6, #16] while (NULL != func) { 22e4: 2c00 cmp r4, #0 22e6: d100 bne.n 22ea 22e8: e6af b.n 204a if (0 > (rc = func->ctrl(func, USBDF_GET_IFACE, req))) { 22ea: 002a movs r2, r5 22ec: 2102 movs r1, #2 22ee: 0020 movs r0, r4 22f0: 6863 ldr r3, [r4, #4] 22f2: 4798 blx r3 22f4: 2800 cmp r0, #0 22f6: da1b bge.n 2330 func = func->next; 22f8: 6824 ldr r4, [r4, #0] 22fa: e7f3 b.n 22e4 22fc: 00001ec1 .word 0x00001ec1 2300: 00001e7d .word 0x00001e7d 2304: 00002001 .word 0x00002001 2308: 20000650 .word 0x20000650 230c: 00001665 .word 0x00001665 2310: 0000162d .word 0x0000162d 2314: 00001afd .word 0x00001afd 2318: 000016a1 .word 0x000016a1 231c: 0000261d .word 0x0000261d usbdc.ctrl_buf[0] = 0; 2320: 6973 ldr r3, [r6, #20] usbdc_xfer(0, usbdc.ctrl_buf, 1, false); 2322: 0022 movs r2, r4 usbdc.ctrl_buf[0] = 0; 2324: 7018 strb r0, [r3, #0] usbdc_xfer(0, usbdc.ctrl_buf, 1, false); 2326: 6971 ldr r1, [r6, #20] 2328: 0003 movs r3, r0 232a: 4d05 ldr r5, [pc, #20] ; (2340 ) 232c: 47a8 blx r5 return true; 232e: e741 b.n 21b4 usbdc.ctrl_buf[0] = (uint8_t)rc; 2330: 6973 ldr r3, [r6, #20] usbdc_xfer(0, usbdc.ctrl_buf, 1, false); 2332: 2201 movs r2, #1 usbdc.ctrl_buf[0] = (uint8_t)rc; 2334: 7018 strb r0, [r3, #0] usbdc_xfer(0, usbdc.ctrl_buf, 1, false); 2336: 2300 movs r3, #0 2338: 6971 ldr r1, [r6, #20] 233a: 0018 movs r0, r3 233c: e738 b.n 21b0 233e: 46c0 nop ; (mov r8, r8) 2340: 00002001 .word 0x00002001 00002344 : /** * \brief Register the handler */ void usbdc_register_handler(enum usbdc_handler_type type, const struct usbdc_handler *h) { 2344: b510 push {r4, lr} switch (type) { 2346: 2801 cmp r0, #1 2348: d008 beq.n 235c 234a: 2802 cmp r0, #2 234c: d009 beq.n 2362 234e: 2800 cmp r0, #0 2350: d103 bne.n 235a case USBDC_HDL_SOF: list_insert_at_end(&usbdc.handlers.sof_list, (void *)h); 2352: 4805 ldr r0, [pc, #20] ; (2368 ) 2354: 3004 adds r0, #4 break; case USBDC_HDL_REQ: list_insert_at_end(&usbdc.handlers.req_list, (void *)h); break; case USBDC_HDL_CHANGE: list_insert_at_end(&usbdc.handlers.change_list, (void *)h); 2356: 4b05 ldr r3, [pc, #20] ; (236c ) 2358: 4798 blx r3 break; default: break; } } 235a: bd10 pop {r4, pc} list_insert_at_end(&usbdc.handlers.req_list, (void *)h); 235c: 4802 ldr r0, [pc, #8] ; (2368 ) 235e: 3008 adds r0, #8 2360: e7f9 b.n 2356 list_insert_at_end(&usbdc.handlers.change_list, (void *)h); 2362: 4801 ldr r0, [pc, #4] ; (2368 ) 2364: 300c adds r0, #12 2366: e7f6 b.n 2356 2368: 20000650 .word 0x20000650 236c: 00001399 .word 0x00001399 00002370 : /** * \brief Initialize the USB device core driver */ int32_t usbdc_init(uint8_t *ctrl_buf) { 2370: b570 push {r4, r5, r6, lr} 2372: 0004 movs r4, r0 ASSERT(ctrl_buf); 2374: 1e43 subs r3, r0, #1 2376: 4198 sbcs r0, r3 2378: 4a0c ldr r2, [pc, #48] ; (23ac ) 237a: 4b0d ldr r3, [pc, #52] ; (23b0 ) 237c: 490d ldr r1, [pc, #52] ; (23b4 ) 237e: b2c0 uxtb r0, r0 2380: 4798 blx r3 int32_t rc; rc = usb_d_init(); 2382: 4b0d ldr r3, [pc, #52] ; (23b8 ) 2384: 4798 blx r3 if (rc < 0) { 2386: 2800 cmp r0, #0 2388: db0e blt.n 23a8 return rc; } memset(&usbdc, 0, sizeof(usbdc)); 238a: 4d0c ldr r5, [pc, #48] ; (23bc ) 238c: 2220 movs r2, #32 238e: 4b0c ldr r3, [pc, #48] ; (23c0 ) 2390: 2100 movs r1, #0 2392: 0028 movs r0, r5 2394: 4798 blx r3 usbdc.ctrl_buf = ctrl_buf; usb_d_register_callback(USB_D_CB_SOF, (FUNC_PTR)usbd_sof_cb); 2396: 2000 movs r0, #0 2398: 490a ldr r1, [pc, #40] ; (23c4 ) usbdc.ctrl_buf = ctrl_buf; 239a: 616c str r4, [r5, #20] usb_d_register_callback(USB_D_CB_SOF, (FUNC_PTR)usbd_sof_cb); 239c: 4c0a ldr r4, [pc, #40] ; (23c8 ) 239e: 47a0 blx r4 usb_d_register_callback(USB_D_CB_EVENT, (FUNC_PTR)usbd_event_cb); 23a0: 2001 movs r0, #1 23a2: 490a ldr r1, [pc, #40] ; (23cc ) 23a4: 47a0 blx r4 return 0; 23a6: 2000 movs r0, #0 } 23a8: bd70 pop {r4, r5, r6, pc} 23aa: 46c0 nop ; (mov r8, r8) 23ac: 00000355 .word 0x00000355 23b0: 000013e1 .word 0x000013e1 23b4: 00002f1b .word 0x00002f1b 23b8: 000018a1 .word 0x000018a1 23bc: 20000650 .word 0x20000650 23c0: 0000262f .word 0x0000262f 23c4: 00001efd .word 0x00001efd 23c8: 0000190d .word 0x0000190d 23cc: 00001fe1 .word 0x00001fe1 000023d0 : * \brief Register/unregister function support of a USB device function * * Must be invoked when USB device is stopped. */ void usbdc_register_function(struct usbdf_driver *func) { 23d0: b510 push {r4, lr} 23d2: 0001 movs r1, r0 list_insert_at_end(&usbdc.func_list, func); 23d4: 4802 ldr r0, [pc, #8] ; (23e0 ) 23d6: 4b03 ldr r3, [pc, #12] ; (23e4 ) 23d8: 3010 adds r0, #16 23da: 4798 blx r3 } 23dc: bd10 pop {r4, pc} 23de: 46c0 nop ; (mov r8, r8) 23e0: 20000650 .word 0x20000650 23e4: 00001399 .word 0x00001399 000023e8 : /** * \brief Start the USB device driver with specific descriptors set */ int32_t usbdc_start(struct usbd_descriptors *desces) { 23e8: b510 push {r4, lr} if (usbdc.state >= USBD_S_POWER) { 23ea: 4b0a ldr r3, [pc, #40] ; (2414 ) 23ec: 7e9c ldrb r4, [r3, #26] 23ee: 2c00 cmp r4, #0 23f0: d10b bne.n 240a return ERR_BUSY; } if (desces) { 23f2: 2800 cmp r0, #0 23f4: d00c beq.n 2410 #endif } else { return ERR_BAD_DATA; } usbdc.ctrl_size = desces->sod[7]; 23f6: 6802 ldr r2, [r0, #0] usbdc.desces.ls_fs = desces; 23f8: 6018 str r0, [r3, #0] usbdc.ctrl_size = desces->sod[7]; 23fa: 79d2 ldrb r2, [r2, #7] 23fc: 771a strb r2, [r3, #28] usbdc.state = USBD_S_POWER; 23fe: 2201 movs r2, #1 2400: 769a strb r2, [r3, #26] usb_d_enable(); 2402: 4b05 ldr r3, [pc, #20] ; (2418 ) 2404: 4798 blx r3 return ERR_NONE; 2406: 0020 movs r0, r4 } 2408: bd10 pop {r4, pc} return ERR_BUSY; 240a: 2004 movs r0, #4 return ERR_BAD_DATA; 240c: 4240 negs r0, r0 240e: e7fb b.n 2408 2410: 2009 movs r0, #9 2412: e7fb b.n 240c 2414: 20000650 .word 0x20000650 2418: 00001919 .word 0x00001919 0000241c : /** * \brief Attach the USB device to host */ void usbdc_attach(void) { 241c: b510 push {r4, lr} usb_d_attach(); 241e: 4b01 ldr r3, [pc, #4] ; (2424 ) 2420: 4798 blx r3 } 2422: bd10 pop {r4, pc} 2424: 00001925 .word 0x00001925 00002428 : /** * \brief Return USB Device endpoint0 buffer */ uint8_t *usbdc_get_ctrl_buffer(void) { return usbdc.ctrl_buf; 2428: 4b01 ldr r3, [pc, #4] ; (2430 ) 242a: 6958 ldr r0, [r3, #20] } 242c: 4770 bx lr 242e: 46c0 nop ; (mov r8, r8) 2430: 20000650 .word 0x20000650 00002434 : /** * \brief Return current USB state */ uint8_t usbdc_get_state(void) { if (usbdc.state & USBD_S_SUSPEND) { 2434: 4b03 ldr r3, [pc, #12] ; (2444 ) 2436: 7e98 ldrb r0, [r3, #26] 2438: 2310 movs r3, #16 243a: 4218 tst r0, r3 243c: d000 beq.n 2440 return USBD_S_SUSPEND; 243e: 0018 movs r0, r3 } return usbdc.state; } 2440: 4770 bx lr 2442: 46c0 nop ; (mov r8, r8) 2444: 20000650 .word 0x20000650 00002448 : */ __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) { uint32_t result; __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); 2448: f3ef 8310 mrs r3, PRIMASK /** * \brief Disable interrupts, enter critical section */ void atomic_enter_critical(hal_atomic_t volatile *atomic) { *atomic = __get_PRIMASK(); 244c: 6003 str r3, [r0, #0] __ASM volatile ("cpsid i" : : : "memory"); 244e: b672 cpsid i \details Ensures the apparent order of the explicit memory operations before and after the instruction, without ensuring their completion. */ __STATIC_FORCEINLINE void __DMB(void) { __ASM volatile ("dmb 0xF":::"memory"); 2450: f3bf 8f5f dmb sy __disable_irq(); __DMB(); } 2454: 4770 bx lr 00002456 : 2456: f3bf 8f5f dmb sy * \brief Exit atomic section */ void atomic_leave_critical(hal_atomic_t volatile *atomic) { __DMB(); __set_PRIMASK(*atomic); 245a: 6803 ldr r3, [r0, #0] __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); 245c: f383 8810 msr PRIMASK, r3 } 2460: 4770 bx lr ... 00002464 : static uint32_t printf_buffer[MAX_PRINTF_BUFFER / 4]; static volatile bool b_usb_ready = false; static bool usb_cb_state_c(usb_cdc_control_signal_t state) { if(state.rs232.DTR) 2464: 2301 movs r3, #1 { 2466: b082 sub sp, #8 if(state.rs232.DTR) 2468: 4203 tst r3, r0 246a: d001 beq.n 2470 { b_usb_ready = true; 246c: 4a02 ldr r2, [pc, #8] ; (2478 ) 246e: 7013 strb r3, [r2, #0] } return false; } 2470: 2000 movs r0, #0 2472: b002 add sp, #8 2474: 4770 bx lr 2476: 46c0 nop ; (mov r8, r8) 2478: 20000670 .word 0x20000670 0000247c : void arc_serial_init() { 247c: b510 push {r4, lr} memset(printf_buffer, '\0', MAX_PRINTF_BUFFER); 247e: 4c0b ldr r4, [pc, #44] ; (24ac ) 2480: 4b0b ldr r3, [pc, #44] ; (24b0 ) 2482: 2240 movs r2, #64 ; 0x40 2484: 2100 movs r1, #0 2486: 1d20 adds r0, r4, #4 2488: 4798 blx r3 usb_init(); 248a: 4b0a ldr r3, [pc, #40] ; (24b4 ) 248c: 4798 blx r3 while(!cdcdf_acm_is_enabled()){} 248e: 4b0a ldr r3, [pc, #40] ; (24b8 ) 2490: 4798 blx r3 2492: 2800 cmp r0, #0 2494: d0fb beq.n 248e cdcdf_acm_register_callback(CDCDF_ACM_CB_STATE_C, (FUNC_PTR)usb_cb_state_c); 2496: 2003 movs r0, #3 2498: 4908 ldr r1, [pc, #32] ; (24bc ) 249a: 4b09 ldr r3, [pc, #36] ; (24c0 ) 249c: 4798 blx r3 while(!b_usb_ready){} 249e: 7823 ldrb r3, [r4, #0] 24a0: 2b00 cmp r3, #0 24a2: d0fc beq.n 249e delay_ms(100); 24a4: 4b07 ldr r3, [pc, #28] ; (24c4 ) 24a6: 2064 movs r0, #100 ; 0x64 24a8: 4798 blx r3 } 24aa: bd10 pop {r4, pc} 24ac: 20000670 .word 0x20000670 24b0: 0000262f .word 0x0000262f 24b4: 00001419 .word 0x00001419 24b8: 000004c9 .word 0x000004c9 24bc: 00002465 .word 0x00002465 24c0: 00000491 .word 0x00000491 24c4: 00001319 .word 0x00001319 000024c8 : uint8_t arc_printf(const char* fmt, ...) { 24c8: b40f push {r0, r1, r2, r3} 24ca: b513 push {r0, r1, r4, lr} va_list args; va_start(args, fmt); vsprintf((uint8_t*)printf_buffer, fmt, args); 24cc: 4c0a ldr r4, [pc, #40] ; (24f8 ) { 24ce: aa04 add r2, sp, #16 24d0: ca02 ldmia r2!, {r1} vsprintf((uint8_t*)printf_buffer, fmt, args); 24d2: 3404 adds r4, #4 va_start(args, fmt); 24d4: 9200 str r2, [sp, #0] vsprintf((uint8_t*)printf_buffer, fmt, args); 24d6: 0020 movs r0, r4 24d8: 4b08 ldr r3, [pc, #32] ; (24fc ) 24da: 4798 blx r3 va_end(args); volatile int32_t ret = cdcdf_acm_write((uint8_t*)printf_buffer, strlen((const char*)printf_buffer)); 24dc: 4b08 ldr r3, [pc, #32] ; (2500 ) 24de: 0020 movs r0, r4 24e0: 4798 blx r3 24e2: 4b08 ldr r3, [pc, #32] ; (2504 ) 24e4: 0001 movs r1, r0 24e6: 0020 movs r0, r4 24e8: 4798 blx r3 24ea: 9001 str r0, [sp, #4] return 0; } 24ec: 2000 movs r0, #0 24ee: bc16 pop {r1, r2, r4} 24f0: bc08 pop {r3} 24f2: b004 add sp, #16 24f4: 4718 bx r3 24f6: 46c0 nop ; (mov r8, r8) 24f8: 20000670 .word 0x20000670 24fc: 00002679 .word 0x00002679 2500: 0000263f .word 0x0000263f 2504: 00000469 .word 0x00000469 00002508 <__gnu_thumb1_case_sqi>: 2508: b402 push {r1} 250a: 4671 mov r1, lr 250c: 0849 lsrs r1, r1, #1 250e: 0049 lsls r1, r1, #1 2510: 5609 ldrsb r1, [r1, r0] 2512: 0049 lsls r1, r1, #1 2514: 448e add lr, r1 2516: bc02 pop {r1} 2518: 4770 bx lr 251a: 46c0 nop ; (mov r8, r8) 0000251c <__gnu_thumb1_case_uqi>: 251c: b402 push {r1} 251e: 4671 mov r1, lr 2520: 0849 lsrs r1, r1, #1 2522: 0049 lsls r1, r1, #1 2524: 5c09 ldrb r1, [r1, r0] 2526: 0049 lsls r1, r1, #1 2528: 448e add lr, r1 252a: bc02 pop {r1} 252c: 4770 bx lr 252e: 46c0 nop ; (mov r8, r8) 00002530 <__gnu_thumb1_case_shi>: 2530: b403 push {r0, r1} 2532: 4671 mov r1, lr 2534: 0849 lsrs r1, r1, #1 2536: 0040 lsls r0, r0, #1 2538: 0049 lsls r1, r1, #1 253a: 5e09 ldrsh r1, [r1, r0] 253c: 0049 lsls r1, r1, #1 253e: 448e add lr, r1 2540: bc03 pop {r0, r1} 2542: 4770 bx lr 00002544 <__udivsi3>: 2544: 2900 cmp r1, #0 2546: d034 beq.n 25b2 <.udivsi3_skip_div0_test+0x6a> 00002548 <.udivsi3_skip_div0_test>: 2548: 2301 movs r3, #1 254a: 2200 movs r2, #0 254c: b410 push {r4} 254e: 4288 cmp r0, r1 2550: d32c bcc.n 25ac <.udivsi3_skip_div0_test+0x64> 2552: 2401 movs r4, #1 2554: 0724 lsls r4, r4, #28 2556: 42a1 cmp r1, r4 2558: d204 bcs.n 2564 <.udivsi3_skip_div0_test+0x1c> 255a: 4281 cmp r1, r0 255c: d202 bcs.n 2564 <.udivsi3_skip_div0_test+0x1c> 255e: 0109 lsls r1, r1, #4 2560: 011b lsls r3, r3, #4 2562: e7f8 b.n 2556 <.udivsi3_skip_div0_test+0xe> 2564: 00e4 lsls r4, r4, #3 2566: 42a1 cmp r1, r4 2568: d204 bcs.n 2574 <.udivsi3_skip_div0_test+0x2c> 256a: 4281 cmp r1, r0 256c: d202 bcs.n 2574 <.udivsi3_skip_div0_test+0x2c> 256e: 0049 lsls r1, r1, #1 2570: 005b lsls r3, r3, #1 2572: e7f8 b.n 2566 <.udivsi3_skip_div0_test+0x1e> 2574: 4288 cmp r0, r1 2576: d301 bcc.n 257c <.udivsi3_skip_div0_test+0x34> 2578: 1a40 subs r0, r0, r1 257a: 431a orrs r2, r3 257c: 084c lsrs r4, r1, #1 257e: 42a0 cmp r0, r4 2580: d302 bcc.n 2588 <.udivsi3_skip_div0_test+0x40> 2582: 1b00 subs r0, r0, r4 2584: 085c lsrs r4, r3, #1 2586: 4322 orrs r2, r4 2588: 088c lsrs r4, r1, #2 258a: 42a0 cmp r0, r4 258c: d302 bcc.n 2594 <.udivsi3_skip_div0_test+0x4c> 258e: 1b00 subs r0, r0, r4 2590: 089c lsrs r4, r3, #2 2592: 4322 orrs r2, r4 2594: 08cc lsrs r4, r1, #3 2596: 42a0 cmp r0, r4 2598: d302 bcc.n 25a0 <.udivsi3_skip_div0_test+0x58> 259a: 1b00 subs r0, r0, r4 259c: 08dc lsrs r4, r3, #3 259e: 4322 orrs r2, r4 25a0: 2800 cmp r0, #0 25a2: d003 beq.n 25ac <.udivsi3_skip_div0_test+0x64> 25a4: 091b lsrs r3, r3, #4 25a6: d001 beq.n 25ac <.udivsi3_skip_div0_test+0x64> 25a8: 0909 lsrs r1, r1, #4 25aa: e7e3 b.n 2574 <.udivsi3_skip_div0_test+0x2c> 25ac: 0010 movs r0, r2 25ae: bc10 pop {r4} 25b0: 4770 bx lr 25b2: b501 push {r0, lr} 25b4: 2000 movs r0, #0 25b6: f000 f80b bl 25d0 <__aeabi_idiv0> 25ba: bd02 pop {r1, pc} 000025bc <__aeabi_uidivmod>: 25bc: 2900 cmp r1, #0 25be: d0f8 beq.n 25b2 <.udivsi3_skip_div0_test+0x6a> 25c0: b503 push {r0, r1, lr} 25c2: f7ff ffc1 bl 2548 <.udivsi3_skip_div0_test> 25c6: bc0e pop {r1, r2, r3} 25c8: 4342 muls r2, r0 25ca: 1a89 subs r1, r1, r2 25cc: 4718 bx r3 25ce: 46c0 nop ; (mov r8, r8) 000025d0 <__aeabi_idiv0>: 25d0: 4770 bx lr 25d2: 46c0 nop ; (mov r8, r8) 000025d4 <__libc_init_array>: 25d4: b570 push {r4, r5, r6, lr} 25d6: 2600 movs r6, #0 25d8: 4d0c ldr r5, [pc, #48] ; (260c <__libc_init_array+0x38>) 25da: 4c0d ldr r4, [pc, #52] ; (2610 <__libc_init_array+0x3c>) 25dc: 1b64 subs r4, r4, r5 25de: 10a4 asrs r4, r4, #2 25e0: 42a6 cmp r6, r4 25e2: d109 bne.n 25f8 <__libc_init_array+0x24> 25e4: 2600 movs r6, #0 25e6: f000 fcef bl 2fc8 <_init> 25ea: 4d0a ldr r5, [pc, #40] ; (2614 <__libc_init_array+0x40>) 25ec: 4c0a ldr r4, [pc, #40] ; (2618 <__libc_init_array+0x44>) 25ee: 1b64 subs r4, r4, r5 25f0: 10a4 asrs r4, r4, #2 25f2: 42a6 cmp r6, r4 25f4: d105 bne.n 2602 <__libc_init_array+0x2e> 25f6: bd70 pop {r4, r5, r6, pc} 25f8: 00b3 lsls r3, r6, #2 25fa: 58eb ldr r3, [r5, r3] 25fc: 4798 blx r3 25fe: 3601 adds r6, #1 2600: e7ee b.n 25e0 <__libc_init_array+0xc> 2602: 00b3 lsls r3, r6, #2 2604: 58eb ldr r3, [r5, r3] 2606: 4798 blx r3 2608: 3601 adds r6, #1 260a: e7f2 b.n 25f2 <__libc_init_array+0x1e> 260c: 00002fd4 .word 0x00002fd4 2610: 00002fd4 .word 0x00002fd4 2614: 00002fd4 .word 0x00002fd4 2618: 00002fd8 .word 0x00002fd8 0000261c : 261c: 2300 movs r3, #0 261e: b510 push {r4, lr} 2620: 429a cmp r2, r3 2622: d100 bne.n 2626 2624: bd10 pop {r4, pc} 2626: 5ccc ldrb r4, [r1, r3] 2628: 54c4 strb r4, [r0, r3] 262a: 3301 adds r3, #1 262c: e7f8 b.n 2620 0000262e : 262e: 0003 movs r3, r0 2630: 1882 adds r2, r0, r2 2632: 4293 cmp r3, r2 2634: d100 bne.n 2638 2636: 4770 bx lr 2638: 7019 strb r1, [r3, #0] 263a: 3301 adds r3, #1 263c: e7f9 b.n 2632 0000263e : 263e: 2300 movs r3, #0 2640: 5cc2 ldrb r2, [r0, r3] 2642: 3301 adds r3, #1 2644: 2a00 cmp r2, #0 2646: d1fb bne.n 2640 2648: 1e58 subs r0, r3, #1 264a: 4770 bx lr 0000264c <_vsiprintf_r>: 264c: b500 push {lr} 264e: b09b sub sp, #108 ; 0x6c 2650: 9100 str r1, [sp, #0] 2652: 9104 str r1, [sp, #16] 2654: 4906 ldr r1, [pc, #24] ; (2670 <_vsiprintf_r+0x24>) 2656: 9105 str r1, [sp, #20] 2658: 9102 str r1, [sp, #8] 265a: 4906 ldr r1, [pc, #24] ; (2674 <_vsiprintf_r+0x28>) 265c: 9103 str r1, [sp, #12] 265e: 4669 mov r1, sp 2660: f000 f8d8 bl 2814 <_svfiprintf_r> 2664: 2300 movs r3, #0 2666: 9a00 ldr r2, [sp, #0] 2668: 7013 strb r3, [r2, #0] 266a: b01b add sp, #108 ; 0x6c 266c: bd00 pop {pc} 266e: 46c0 nop ; (mov r8, r8) 2670: 7fffffff .word 0x7fffffff 2674: ffff0208 .word 0xffff0208 00002678 : 2678: b510 push {r4, lr} 267a: 0013 movs r3, r2 267c: 000a movs r2, r1 267e: 0001 movs r1, r0 2680: 4802 ldr r0, [pc, #8] ; (268c ) 2682: 6800 ldr r0, [r0, #0] 2684: f7ff ffe2 bl 264c <_vsiprintf_r> 2688: bd10 pop {r4, pc} 268a: 46c0 nop ; (mov r8, r8) 268c: 20000068 .word 0x20000068 00002690 <__retarget_lock_acquire_recursive>: 2690: 4770 bx lr 00002692 <__retarget_lock_release_recursive>: 2692: 4770 bx lr 00002694 <_malloc_r>: 2694: b5f8 push {r3, r4, r5, r6, r7, lr} 2696: 2303 movs r3, #3 2698: 1ccd adds r5, r1, #3 269a: 439d bics r5, r3 269c: 3508 adds r5, #8 269e: 0006 movs r6, r0 26a0: 2d0c cmp r5, #12 26a2: d21f bcs.n 26e4 <_malloc_r+0x50> 26a4: 250c movs r5, #12 26a6: 42a9 cmp r1, r5 26a8: d81e bhi.n 26e8 <_malloc_r+0x54> 26aa: 0030 movs r0, r6 26ac: f000 fb64 bl 2d78 <__malloc_lock> 26b0: 4925 ldr r1, [pc, #148] ; (2748 <_malloc_r+0xb4>) 26b2: 680a ldr r2, [r1, #0] 26b4: 0014 movs r4, r2 26b6: 2c00 cmp r4, #0 26b8: d11a bne.n 26f0 <_malloc_r+0x5c> 26ba: 4f24 ldr r7, [pc, #144] ; (274c <_malloc_r+0xb8>) 26bc: 683b ldr r3, [r7, #0] 26be: 2b00 cmp r3, #0 26c0: d104 bne.n 26cc <_malloc_r+0x38> 26c2: 0021 movs r1, r4 26c4: 0030 movs r0, r6 26c6: f000 fb27 bl 2d18 <_sbrk_r> 26ca: 6038 str r0, [r7, #0] 26cc: 0029 movs r1, r5 26ce: 0030 movs r0, r6 26d0: f000 fb22 bl 2d18 <_sbrk_r> 26d4: 1c43 adds r3, r0, #1 26d6: d12b bne.n 2730 <_malloc_r+0x9c> 26d8: 230c movs r3, #12 26da: 0030 movs r0, r6 26dc: 6033 str r3, [r6, #0] 26de: f000 fb53 bl 2d88 <__malloc_unlock> 26e2: e003 b.n 26ec <_malloc_r+0x58> 26e4: 2d00 cmp r5, #0 26e6: dade bge.n 26a6 <_malloc_r+0x12> 26e8: 230c movs r3, #12 26ea: 6033 str r3, [r6, #0] 26ec: 2000 movs r0, #0 26ee: bdf8 pop {r3, r4, r5, r6, r7, pc} 26f0: 6823 ldr r3, [r4, #0] 26f2: 1b5b subs r3, r3, r5 26f4: d419 bmi.n 272a <_malloc_r+0x96> 26f6: 2b0b cmp r3, #11 26f8: d903 bls.n 2702 <_malloc_r+0x6e> 26fa: 6023 str r3, [r4, #0] 26fc: 18e4 adds r4, r4, r3 26fe: 6025 str r5, [r4, #0] 2700: e003 b.n 270a <_malloc_r+0x76> 2702: 6863 ldr r3, [r4, #4] 2704: 42a2 cmp r2, r4 2706: d10e bne.n 2726 <_malloc_r+0x92> 2708: 600b str r3, [r1, #0] 270a: 0030 movs r0, r6 270c: f000 fb3c bl 2d88 <__malloc_unlock> 2710: 0020 movs r0, r4 2712: 2207 movs r2, #7 2714: 300b adds r0, #11 2716: 1d23 adds r3, r4, #4 2718: 4390 bics r0, r2 271a: 1ac2 subs r2, r0, r3 271c: 4298 cmp r0, r3 271e: d0e6 beq.n 26ee <_malloc_r+0x5a> 2720: 1a1b subs r3, r3, r0 2722: 50a3 str r3, [r4, r2] 2724: e7e3 b.n 26ee <_malloc_r+0x5a> 2726: 6053 str r3, [r2, #4] 2728: e7ef b.n 270a <_malloc_r+0x76> 272a: 0022 movs r2, r4 272c: 6864 ldr r4, [r4, #4] 272e: e7c2 b.n 26b6 <_malloc_r+0x22> 2730: 2303 movs r3, #3 2732: 1cc4 adds r4, r0, #3 2734: 439c bics r4, r3 2736: 42a0 cmp r0, r4 2738: d0e1 beq.n 26fe <_malloc_r+0x6a> 273a: 1a21 subs r1, r4, r0 273c: 0030 movs r0, r6 273e: f000 faeb bl 2d18 <_sbrk_r> 2742: 1c43 adds r3, r0, #1 2744: d1db bne.n 26fe <_malloc_r+0x6a> 2746: e7c7 b.n 26d8 <_malloc_r+0x44> 2748: 200006b4 .word 0x200006b4 274c: 200006b8 .word 0x200006b8 00002750 <__ssputs_r>: 2750: b5f0 push {r4, r5, r6, r7, lr} 2752: 688e ldr r6, [r1, #8] 2754: b085 sub sp, #20 2756: 0007 movs r7, r0 2758: 000c movs r4, r1 275a: 9203 str r2, [sp, #12] 275c: 9301 str r3, [sp, #4] 275e: 429e cmp r6, r3 2760: d83c bhi.n 27dc <__ssputs_r+0x8c> 2762: 2390 movs r3, #144 ; 0x90 2764: 898a ldrh r2, [r1, #12] 2766: 00db lsls r3, r3, #3 2768: 421a tst r2, r3 276a: d034 beq.n 27d6 <__ssputs_r+0x86> 276c: 2503 movs r5, #3 276e: 6909 ldr r1, [r1, #16] 2770: 6823 ldr r3, [r4, #0] 2772: 1a5b subs r3, r3, r1 2774: 9302 str r3, [sp, #8] 2776: 6963 ldr r3, [r4, #20] 2778: 9802 ldr r0, [sp, #8] 277a: 435d muls r5, r3 277c: 0feb lsrs r3, r5, #31 277e: 195d adds r5, r3, r5 2780: 9b01 ldr r3, [sp, #4] 2782: 106d asrs r5, r5, #1 2784: 3301 adds r3, #1 2786: 181b adds r3, r3, r0 2788: 42ab cmp r3, r5 278a: d900 bls.n 278e <__ssputs_r+0x3e> 278c: 001d movs r5, r3 278e: 0553 lsls r3, r2, #21 2790: d532 bpl.n 27f8 <__ssputs_r+0xa8> 2792: 0029 movs r1, r5 2794: 0038 movs r0, r7 2796: f7ff ff7d bl 2694 <_malloc_r> 279a: 1e06 subs r6, r0, #0 279c: d109 bne.n 27b2 <__ssputs_r+0x62> 279e: 230c movs r3, #12 27a0: 603b str r3, [r7, #0] 27a2: 2340 movs r3, #64 ; 0x40 27a4: 2001 movs r0, #1 27a6: 89a2 ldrh r2, [r4, #12] 27a8: 4240 negs r0, r0 27aa: 4313 orrs r3, r2 27ac: 81a3 strh r3, [r4, #12] 27ae: b005 add sp, #20 27b0: bdf0 pop {r4, r5, r6, r7, pc} 27b2: 9a02 ldr r2, [sp, #8] 27b4: 6921 ldr r1, [r4, #16] 27b6: f7ff ff31 bl 261c 27ba: 89a3 ldrh r3, [r4, #12] 27bc: 4a14 ldr r2, [pc, #80] ; (2810 <__ssputs_r+0xc0>) 27be: 401a ands r2, r3 27c0: 2380 movs r3, #128 ; 0x80 27c2: 4313 orrs r3, r2 27c4: 81a3 strh r3, [r4, #12] 27c6: 9b02 ldr r3, [sp, #8] 27c8: 6126 str r6, [r4, #16] 27ca: 18f6 adds r6, r6, r3 27cc: 6026 str r6, [r4, #0] 27ce: 6165 str r5, [r4, #20] 27d0: 9e01 ldr r6, [sp, #4] 27d2: 1aed subs r5, r5, r3 27d4: 60a5 str r5, [r4, #8] 27d6: 9b01 ldr r3, [sp, #4] 27d8: 429e cmp r6, r3 27da: d900 bls.n 27de <__ssputs_r+0x8e> 27dc: 9e01 ldr r6, [sp, #4] 27de: 0032 movs r2, r6 27e0: 9903 ldr r1, [sp, #12] 27e2: 6820 ldr r0, [r4, #0] 27e4: f000 fab5 bl 2d52 27e8: 68a3 ldr r3, [r4, #8] 27ea: 2000 movs r0, #0 27ec: 1b9b subs r3, r3, r6 27ee: 60a3 str r3, [r4, #8] 27f0: 6823 ldr r3, [r4, #0] 27f2: 199e adds r6, r3, r6 27f4: 6026 str r6, [r4, #0] 27f6: e7da b.n 27ae <__ssputs_r+0x5e> 27f8: 002a movs r2, r5 27fa: 0038 movs r0, r7 27fc: f000 fb16 bl 2e2c <_realloc_r> 2800: 1e06 subs r6, r0, #0 2802: d1e0 bne.n 27c6 <__ssputs_r+0x76> 2804: 0038 movs r0, r7 2806: 6921 ldr r1, [r4, #16] 2808: f000 fac6 bl 2d98 <_free_r> 280c: e7c7 b.n 279e <__ssputs_r+0x4e> 280e: 46c0 nop ; (mov r8, r8) 2810: fffffb7f .word 0xfffffb7f 00002814 <_svfiprintf_r>: 2814: b5f0 push {r4, r5, r6, r7, lr} 2816: b0a1 sub sp, #132 ; 0x84 2818: 9003 str r0, [sp, #12] 281a: 001d movs r5, r3 281c: 898b ldrh r3, [r1, #12] 281e: 000f movs r7, r1 2820: 0016 movs r6, r2 2822: 061b lsls r3, r3, #24 2824: d511 bpl.n 284a <_svfiprintf_r+0x36> 2826: 690b ldr r3, [r1, #16] 2828: 2b00 cmp r3, #0 282a: d10e bne.n 284a <_svfiprintf_r+0x36> 282c: 2140 movs r1, #64 ; 0x40 282e: f7ff ff31 bl 2694 <_malloc_r> 2832: 6038 str r0, [r7, #0] 2834: 6138 str r0, [r7, #16] 2836: 2800 cmp r0, #0 2838: d105 bne.n 2846 <_svfiprintf_r+0x32> 283a: 230c movs r3, #12 283c: 9a03 ldr r2, [sp, #12] 283e: 3801 subs r0, #1 2840: 6013 str r3, [r2, #0] 2842: b021 add sp, #132 ; 0x84 2844: bdf0 pop {r4, r5, r6, r7, pc} 2846: 2340 movs r3, #64 ; 0x40 2848: 617b str r3, [r7, #20] 284a: 2300 movs r3, #0 284c: ac08 add r4, sp, #32 284e: 6163 str r3, [r4, #20] 2850: 3320 adds r3, #32 2852: 7663 strb r3, [r4, #25] 2854: 3310 adds r3, #16 2856: 76a3 strb r3, [r4, #26] 2858: 9507 str r5, [sp, #28] 285a: 0035 movs r5, r6 285c: 782b ldrb r3, [r5, #0] 285e: 2b00 cmp r3, #0 2860: d001 beq.n 2866 <_svfiprintf_r+0x52> 2862: 2b25 cmp r3, #37 ; 0x25 2864: d147 bne.n 28f6 <_svfiprintf_r+0xe2> 2866: 1bab subs r3, r5, r6 2868: 9305 str r3, [sp, #20] 286a: 42b5 cmp r5, r6 286c: d00c beq.n 2888 <_svfiprintf_r+0x74> 286e: 0032 movs r2, r6 2870: 0039 movs r1, r7 2872: 9803 ldr r0, [sp, #12] 2874: f7ff ff6c bl 2750 <__ssputs_r> 2878: 1c43 adds r3, r0, #1 287a: d100 bne.n 287e <_svfiprintf_r+0x6a> 287c: e0ae b.n 29dc <_svfiprintf_r+0x1c8> 287e: 6962 ldr r2, [r4, #20] 2880: 9b05 ldr r3, [sp, #20] 2882: 4694 mov ip, r2 2884: 4463 add r3, ip 2886: 6163 str r3, [r4, #20] 2888: 782b ldrb r3, [r5, #0] 288a: 2b00 cmp r3, #0 288c: d100 bne.n 2890 <_svfiprintf_r+0x7c> 288e: e0a5 b.n 29dc <_svfiprintf_r+0x1c8> 2890: 2201 movs r2, #1 2892: 2300 movs r3, #0 2894: 4252 negs r2, r2 2896: 6062 str r2, [r4, #4] 2898: a904 add r1, sp, #16 289a: 3254 adds r2, #84 ; 0x54 289c: 1852 adds r2, r2, r1 289e: 1c6e adds r6, r5, #1 28a0: 6023 str r3, [r4, #0] 28a2: 60e3 str r3, [r4, #12] 28a4: 60a3 str r3, [r4, #8] 28a6: 7013 strb r3, [r2, #0] 28a8: 65a3 str r3, [r4, #88] ; 0x58 28aa: 2205 movs r2, #5 28ac: 7831 ldrb r1, [r6, #0] 28ae: 4854 ldr r0, [pc, #336] ; (2a00 <_svfiprintf_r+0x1ec>) 28b0: f000 fa44 bl 2d3c 28b4: 1c75 adds r5, r6, #1 28b6: 2800 cmp r0, #0 28b8: d11f bne.n 28fa <_svfiprintf_r+0xe6> 28ba: 6822 ldr r2, [r4, #0] 28bc: 06d3 lsls r3, r2, #27 28be: d504 bpl.n 28ca <_svfiprintf_r+0xb6> 28c0: 2353 movs r3, #83 ; 0x53 28c2: a904 add r1, sp, #16 28c4: 185b adds r3, r3, r1 28c6: 2120 movs r1, #32 28c8: 7019 strb r1, [r3, #0] 28ca: 0713 lsls r3, r2, #28 28cc: d504 bpl.n 28d8 <_svfiprintf_r+0xc4> 28ce: 2353 movs r3, #83 ; 0x53 28d0: a904 add r1, sp, #16 28d2: 185b adds r3, r3, r1 28d4: 212b movs r1, #43 ; 0x2b 28d6: 7019 strb r1, [r3, #0] 28d8: 7833 ldrb r3, [r6, #0] 28da: 2b2a cmp r3, #42 ; 0x2a 28dc: d016 beq.n 290c <_svfiprintf_r+0xf8> 28de: 0035 movs r5, r6 28e0: 2100 movs r1, #0 28e2: 200a movs r0, #10 28e4: 68e3 ldr r3, [r4, #12] 28e6: 782a ldrb r2, [r5, #0] 28e8: 1c6e adds r6, r5, #1 28ea: 3a30 subs r2, #48 ; 0x30 28ec: 2a09 cmp r2, #9 28ee: d94e bls.n 298e <_svfiprintf_r+0x17a> 28f0: 2900 cmp r1, #0 28f2: d111 bne.n 2918 <_svfiprintf_r+0x104> 28f4: e017 b.n 2926 <_svfiprintf_r+0x112> 28f6: 3501 adds r5, #1 28f8: e7b0 b.n 285c <_svfiprintf_r+0x48> 28fa: 4b41 ldr r3, [pc, #260] ; (2a00 <_svfiprintf_r+0x1ec>) 28fc: 6822 ldr r2, [r4, #0] 28fe: 1ac0 subs r0, r0, r3 2900: 2301 movs r3, #1 2902: 4083 lsls r3, r0 2904: 4313 orrs r3, r2 2906: 002e movs r6, r5 2908: 6023 str r3, [r4, #0] 290a: e7ce b.n 28aa <_svfiprintf_r+0x96> 290c: 9b07 ldr r3, [sp, #28] 290e: 1d19 adds r1, r3, #4 2910: 681b ldr r3, [r3, #0] 2912: 9107 str r1, [sp, #28] 2914: 2b00 cmp r3, #0 2916: db01 blt.n 291c <_svfiprintf_r+0x108> 2918: 930b str r3, [sp, #44] ; 0x2c 291a: e004 b.n 2926 <_svfiprintf_r+0x112> 291c: 425b negs r3, r3 291e: 60e3 str r3, [r4, #12] 2920: 2302 movs r3, #2 2922: 4313 orrs r3, r2 2924: 6023 str r3, [r4, #0] 2926: 782b ldrb r3, [r5, #0] 2928: 2b2e cmp r3, #46 ; 0x2e 292a: d10a bne.n 2942 <_svfiprintf_r+0x12e> 292c: 786b ldrb r3, [r5, #1] 292e: 2b2a cmp r3, #42 ; 0x2a 2930: d135 bne.n 299e <_svfiprintf_r+0x18a> 2932: 9b07 ldr r3, [sp, #28] 2934: 3502 adds r5, #2 2936: 1d1a adds r2, r3, #4 2938: 681b ldr r3, [r3, #0] 293a: 9207 str r2, [sp, #28] 293c: 2b00 cmp r3, #0 293e: db2b blt.n 2998 <_svfiprintf_r+0x184> 2940: 9309 str r3, [sp, #36] ; 0x24 2942: 4e30 ldr r6, [pc, #192] ; (2a04 <_svfiprintf_r+0x1f0>) 2944: 2203 movs r2, #3 2946: 0030 movs r0, r6 2948: 7829 ldrb r1, [r5, #0] 294a: f000 f9f7 bl 2d3c 294e: 2800 cmp r0, #0 2950: d006 beq.n 2960 <_svfiprintf_r+0x14c> 2952: 2340 movs r3, #64 ; 0x40 2954: 1b80 subs r0, r0, r6 2956: 4083 lsls r3, r0 2958: 6822 ldr r2, [r4, #0] 295a: 3501 adds r5, #1 295c: 4313 orrs r3, r2 295e: 6023 str r3, [r4, #0] 2960: 7829 ldrb r1, [r5, #0] 2962: 2206 movs r2, #6 2964: 4828 ldr r0, [pc, #160] ; (2a08 <_svfiprintf_r+0x1f4>) 2966: 1c6e adds r6, r5, #1 2968: 7621 strb r1, [r4, #24] 296a: f000 f9e7 bl 2d3c 296e: 2800 cmp r0, #0 2970: d03c beq.n 29ec <_svfiprintf_r+0x1d8> 2972: 4b26 ldr r3, [pc, #152] ; (2a0c <_svfiprintf_r+0x1f8>) 2974: 2b00 cmp r3, #0 2976: d125 bne.n 29c4 <_svfiprintf_r+0x1b0> 2978: 2207 movs r2, #7 297a: 9b07 ldr r3, [sp, #28] 297c: 3307 adds r3, #7 297e: 4393 bics r3, r2 2980: 3308 adds r3, #8 2982: 9307 str r3, [sp, #28] 2984: 6963 ldr r3, [r4, #20] 2986: 9a04 ldr r2, [sp, #16] 2988: 189b adds r3, r3, r2 298a: 6163 str r3, [r4, #20] 298c: e765 b.n 285a <_svfiprintf_r+0x46> 298e: 4343 muls r3, r0 2990: 0035 movs r5, r6 2992: 2101 movs r1, #1 2994: 189b adds r3, r3, r2 2996: e7a6 b.n 28e6 <_svfiprintf_r+0xd2> 2998: 2301 movs r3, #1 299a: 425b negs r3, r3 299c: e7d0 b.n 2940 <_svfiprintf_r+0x12c> 299e: 2300 movs r3, #0 29a0: 200a movs r0, #10 29a2: 001a movs r2, r3 29a4: 3501 adds r5, #1 29a6: 6063 str r3, [r4, #4] 29a8: 7829 ldrb r1, [r5, #0] 29aa: 1c6e adds r6, r5, #1 29ac: 3930 subs r1, #48 ; 0x30 29ae: 2909 cmp r1, #9 29b0: d903 bls.n 29ba <_svfiprintf_r+0x1a6> 29b2: 2b00 cmp r3, #0 29b4: d0c5 beq.n 2942 <_svfiprintf_r+0x12e> 29b6: 9209 str r2, [sp, #36] ; 0x24 29b8: e7c3 b.n 2942 <_svfiprintf_r+0x12e> 29ba: 4342 muls r2, r0 29bc: 0035 movs r5, r6 29be: 2301 movs r3, #1 29c0: 1852 adds r2, r2, r1 29c2: e7f1 b.n 29a8 <_svfiprintf_r+0x194> 29c4: ab07 add r3, sp, #28 29c6: 9300 str r3, [sp, #0] 29c8: 003a movs r2, r7 29ca: 0021 movs r1, r4 29cc: 4b10 ldr r3, [pc, #64] ; (2a10 <_svfiprintf_r+0x1fc>) 29ce: 9803 ldr r0, [sp, #12] 29d0: e000 b.n 29d4 <_svfiprintf_r+0x1c0> 29d2: bf00 nop 29d4: 9004 str r0, [sp, #16] 29d6: 9b04 ldr r3, [sp, #16] 29d8: 3301 adds r3, #1 29da: d1d3 bne.n 2984 <_svfiprintf_r+0x170> 29dc: 89bb ldrh r3, [r7, #12] 29de: 980d ldr r0, [sp, #52] ; 0x34 29e0: 065b lsls r3, r3, #25 29e2: d400 bmi.n 29e6 <_svfiprintf_r+0x1d2> 29e4: e72d b.n 2842 <_svfiprintf_r+0x2e> 29e6: 2001 movs r0, #1 29e8: 4240 negs r0, r0 29ea: e72a b.n 2842 <_svfiprintf_r+0x2e> 29ec: ab07 add r3, sp, #28 29ee: 9300 str r3, [sp, #0] 29f0: 003a movs r2, r7 29f2: 0021 movs r1, r4 29f4: 4b06 ldr r3, [pc, #24] ; (2a10 <_svfiprintf_r+0x1fc>) 29f6: 9803 ldr r0, [sp, #12] 29f8: f000 f87c bl 2af4 <_printf_i> 29fc: e7ea b.n 29d4 <_svfiprintf_r+0x1c0> 29fe: 46c0 nop ; (mov r8, r8) 2a00: 00002f94 .word 0x00002f94 2a04: 00002f9a .word 0x00002f9a 2a08: 00002f9e .word 0x00002f9e 2a0c: 00000000 .word 0x00000000 2a10: 00002751 .word 0x00002751 00002a14 <_printf_common>: 2a14: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr} 2a16: 0015 movs r5, r2 2a18: 9301 str r3, [sp, #4] 2a1a: 688a ldr r2, [r1, #8] 2a1c: 690b ldr r3, [r1, #16] 2a1e: 000c movs r4, r1 2a20: 9000 str r0, [sp, #0] 2a22: 4293 cmp r3, r2 2a24: da00 bge.n 2a28 <_printf_common+0x14> 2a26: 0013 movs r3, r2 2a28: 0022 movs r2, r4 2a2a: 602b str r3, [r5, #0] 2a2c: 3243 adds r2, #67 ; 0x43 2a2e: 7812 ldrb r2, [r2, #0] 2a30: 2a00 cmp r2, #0 2a32: d001 beq.n 2a38 <_printf_common+0x24> 2a34: 3301 adds r3, #1 2a36: 602b str r3, [r5, #0] 2a38: 6823 ldr r3, [r4, #0] 2a3a: 069b lsls r3, r3, #26 2a3c: d502 bpl.n 2a44 <_printf_common+0x30> 2a3e: 682b ldr r3, [r5, #0] 2a40: 3302 adds r3, #2 2a42: 602b str r3, [r5, #0] 2a44: 6822 ldr r2, [r4, #0] 2a46: 2306 movs r3, #6 2a48: 0017 movs r7, r2 2a4a: 401f ands r7, r3 2a4c: 421a tst r2, r3 2a4e: d027 beq.n 2aa0 <_printf_common+0x8c> 2a50: 0023 movs r3, r4 2a52: 3343 adds r3, #67 ; 0x43 2a54: 781b ldrb r3, [r3, #0] 2a56: 1e5a subs r2, r3, #1 2a58: 4193 sbcs r3, r2 2a5a: 6822 ldr r2, [r4, #0] 2a5c: 0692 lsls r2, r2, #26 2a5e: d430 bmi.n 2ac2 <_printf_common+0xae> 2a60: 0022 movs r2, r4 2a62: 9901 ldr r1, [sp, #4] 2a64: 9800 ldr r0, [sp, #0] 2a66: 9e08 ldr r6, [sp, #32] 2a68: 3243 adds r2, #67 ; 0x43 2a6a: 47b0 blx r6 2a6c: 1c43 adds r3, r0, #1 2a6e: d025 beq.n 2abc <_printf_common+0xa8> 2a70: 2306 movs r3, #6 2a72: 6820 ldr r0, [r4, #0] 2a74: 682a ldr r2, [r5, #0] 2a76: 68e1 ldr r1, [r4, #12] 2a78: 2500 movs r5, #0 2a7a: 4003 ands r3, r0 2a7c: 2b04 cmp r3, #4 2a7e: d103 bne.n 2a88 <_printf_common+0x74> 2a80: 1a8d subs r5, r1, r2 2a82: 43eb mvns r3, r5 2a84: 17db asrs r3, r3, #31 2a86: 401d ands r5, r3 2a88: 68a3 ldr r3, [r4, #8] 2a8a: 6922 ldr r2, [r4, #16] 2a8c: 4293 cmp r3, r2 2a8e: dd01 ble.n 2a94 <_printf_common+0x80> 2a90: 1a9b subs r3, r3, r2 2a92: 18ed adds r5, r5, r3 2a94: 2700 movs r7, #0 2a96: 42bd cmp r5, r7 2a98: d120 bne.n 2adc <_printf_common+0xc8> 2a9a: 2000 movs r0, #0 2a9c: e010 b.n 2ac0 <_printf_common+0xac> 2a9e: 3701 adds r7, #1 2aa0: 68e3 ldr r3, [r4, #12] 2aa2: 682a ldr r2, [r5, #0] 2aa4: 1a9b subs r3, r3, r2 2aa6: 42bb cmp r3, r7 2aa8: ddd2 ble.n 2a50 <_printf_common+0x3c> 2aaa: 0022 movs r2, r4 2aac: 2301 movs r3, #1 2aae: 9901 ldr r1, [sp, #4] 2ab0: 9800 ldr r0, [sp, #0] 2ab2: 9e08 ldr r6, [sp, #32] 2ab4: 3219 adds r2, #25 2ab6: 47b0 blx r6 2ab8: 1c43 adds r3, r0, #1 2aba: d1f0 bne.n 2a9e <_printf_common+0x8a> 2abc: 2001 movs r0, #1 2abe: 4240 negs r0, r0 2ac0: bdfe pop {r1, r2, r3, r4, r5, r6, r7, pc} 2ac2: 2030 movs r0, #48 ; 0x30 2ac4: 18e1 adds r1, r4, r3 2ac6: 3143 adds r1, #67 ; 0x43 2ac8: 7008 strb r0, [r1, #0] 2aca: 0021 movs r1, r4 2acc: 1c5a adds r2, r3, #1 2ace: 3145 adds r1, #69 ; 0x45 2ad0: 7809 ldrb r1, [r1, #0] 2ad2: 18a2 adds r2, r4, r2 2ad4: 3243 adds r2, #67 ; 0x43 2ad6: 3302 adds r3, #2 2ad8: 7011 strb r1, [r2, #0] 2ada: e7c1 b.n 2a60 <_printf_common+0x4c> 2adc: 0022 movs r2, r4 2ade: 2301 movs r3, #1 2ae0: 9901 ldr r1, [sp, #4] 2ae2: 9800 ldr r0, [sp, #0] 2ae4: 9e08 ldr r6, [sp, #32] 2ae6: 321a adds r2, #26 2ae8: 47b0 blx r6 2aea: 1c43 adds r3, r0, #1 2aec: d0e6 beq.n 2abc <_printf_common+0xa8> 2aee: 3701 adds r7, #1 2af0: e7d1 b.n 2a96 <_printf_common+0x82> ... 00002af4 <_printf_i>: 2af4: b5f0 push {r4, r5, r6, r7, lr} 2af6: b08b sub sp, #44 ; 0x2c 2af8: 9206 str r2, [sp, #24] 2afa: 000a movs r2, r1 2afc: 3243 adds r2, #67 ; 0x43 2afe: 9307 str r3, [sp, #28] 2b00: 9005 str r0, [sp, #20] 2b02: 9204 str r2, [sp, #16] 2b04: 7e0a ldrb r2, [r1, #24] 2b06: 000c movs r4, r1 2b08: 9b10 ldr r3, [sp, #64] ; 0x40 2b0a: 2a78 cmp r2, #120 ; 0x78 2b0c: d806 bhi.n 2b1c <_printf_i+0x28> 2b0e: 2a62 cmp r2, #98 ; 0x62 2b10: d808 bhi.n 2b24 <_printf_i+0x30> 2b12: 2a00 cmp r2, #0 2b14: d100 bne.n 2b18 <_printf_i+0x24> 2b16: e0c0 b.n 2c9a <_printf_i+0x1a6> 2b18: 2a58 cmp r2, #88 ; 0x58 2b1a: d052 beq.n 2bc2 <_printf_i+0xce> 2b1c: 0026 movs r6, r4 2b1e: 3642 adds r6, #66 ; 0x42 2b20: 7032 strb r2, [r6, #0] 2b22: e022 b.n 2b6a <_printf_i+0x76> 2b24: 0010 movs r0, r2 2b26: 3863 subs r0, #99 ; 0x63 2b28: 2815 cmp r0, #21 2b2a: d8f7 bhi.n 2b1c <_printf_i+0x28> 2b2c: f7ff fd00 bl 2530 <__gnu_thumb1_case_shi> 2b30: 001f0016 .word 0x001f0016 2b34: fff6fff6 .word 0xfff6fff6 2b38: fff6fff6 .word 0xfff6fff6 2b3c: fff6001f .word 0xfff6001f 2b40: fff6fff6 .word 0xfff6fff6 2b44: 00a8fff6 .word 0x00a8fff6 2b48: 009a0036 .word 0x009a0036 2b4c: fff6fff6 .word 0xfff6fff6 2b50: fff600b9 .word 0xfff600b9 2b54: fff60036 .word 0xfff60036 2b58: 009efff6 .word 0x009efff6 2b5c: 0026 movs r6, r4 2b5e: 681a ldr r2, [r3, #0] 2b60: 3642 adds r6, #66 ; 0x42 2b62: 1d11 adds r1, r2, #4 2b64: 6019 str r1, [r3, #0] 2b66: 6813 ldr r3, [r2, #0] 2b68: 7033 strb r3, [r6, #0] 2b6a: 2301 movs r3, #1 2b6c: e0a7 b.n 2cbe <_printf_i+0x1ca> 2b6e: 6808 ldr r0, [r1, #0] 2b70: 6819 ldr r1, [r3, #0] 2b72: 1d0a adds r2, r1, #4 2b74: 0605 lsls r5, r0, #24 2b76: d50b bpl.n 2b90 <_printf_i+0x9c> 2b78: 680d ldr r5, [r1, #0] 2b7a: 601a str r2, [r3, #0] 2b7c: 2d00 cmp r5, #0 2b7e: da03 bge.n 2b88 <_printf_i+0x94> 2b80: 232d movs r3, #45 ; 0x2d 2b82: 9a04 ldr r2, [sp, #16] 2b84: 426d negs r5, r5 2b86: 7013 strb r3, [r2, #0] 2b88: 4b61 ldr r3, [pc, #388] ; (2d10 <_printf_i+0x21c>) 2b8a: 270a movs r7, #10 2b8c: 9303 str r3, [sp, #12] 2b8e: e032 b.n 2bf6 <_printf_i+0x102> 2b90: 680d ldr r5, [r1, #0] 2b92: 601a str r2, [r3, #0] 2b94: 0641 lsls r1, r0, #25 2b96: d5f1 bpl.n 2b7c <_printf_i+0x88> 2b98: b22d sxth r5, r5 2b9a: e7ef b.n 2b7c <_printf_i+0x88> 2b9c: 680d ldr r5, [r1, #0] 2b9e: 6819 ldr r1, [r3, #0] 2ba0: 1d08 adds r0, r1, #4 2ba2: 6018 str r0, [r3, #0] 2ba4: 062e lsls r6, r5, #24 2ba6: d501 bpl.n 2bac <_printf_i+0xb8> 2ba8: 680d ldr r5, [r1, #0] 2baa: e003 b.n 2bb4 <_printf_i+0xc0> 2bac: 066d lsls r5, r5, #25 2bae: d5fb bpl.n 2ba8 <_printf_i+0xb4> 2bb0: 680d ldr r5, [r1, #0] 2bb2: b2ad uxth r5, r5 2bb4: 4b56 ldr r3, [pc, #344] ; (2d10 <_printf_i+0x21c>) 2bb6: 270a movs r7, #10 2bb8: 9303 str r3, [sp, #12] 2bba: 2a6f cmp r2, #111 ; 0x6f 2bbc: d117 bne.n 2bee <_printf_i+0xfa> 2bbe: 2708 movs r7, #8 2bc0: e015 b.n 2bee <_printf_i+0xfa> 2bc2: 3145 adds r1, #69 ; 0x45 2bc4: 700a strb r2, [r1, #0] 2bc6: 4a52 ldr r2, [pc, #328] ; (2d10 <_printf_i+0x21c>) 2bc8: 9203 str r2, [sp, #12] 2bca: 681a ldr r2, [r3, #0] 2bcc: 6821 ldr r1, [r4, #0] 2bce: ca20 ldmia r2!, {r5} 2bd0: 601a str r2, [r3, #0] 2bd2: 0608 lsls r0, r1, #24 2bd4: d550 bpl.n 2c78 <_printf_i+0x184> 2bd6: 07cb lsls r3, r1, #31 2bd8: d502 bpl.n 2be0 <_printf_i+0xec> 2bda: 2320 movs r3, #32 2bdc: 4319 orrs r1, r3 2bde: 6021 str r1, [r4, #0] 2be0: 2710 movs r7, #16 2be2: 2d00 cmp r5, #0 2be4: d103 bne.n 2bee <_printf_i+0xfa> 2be6: 2320 movs r3, #32 2be8: 6822 ldr r2, [r4, #0] 2bea: 439a bics r2, r3 2bec: 6022 str r2, [r4, #0] 2bee: 0023 movs r3, r4 2bf0: 2200 movs r2, #0 2bf2: 3343 adds r3, #67 ; 0x43 2bf4: 701a strb r2, [r3, #0] 2bf6: 6863 ldr r3, [r4, #4] 2bf8: 60a3 str r3, [r4, #8] 2bfa: 2b00 cmp r3, #0 2bfc: db03 blt.n 2c06 <_printf_i+0x112> 2bfe: 2204 movs r2, #4 2c00: 6821 ldr r1, [r4, #0] 2c02: 4391 bics r1, r2 2c04: 6021 str r1, [r4, #0] 2c06: 2d00 cmp r5, #0 2c08: d102 bne.n 2c10 <_printf_i+0x11c> 2c0a: 9e04 ldr r6, [sp, #16] 2c0c: 2b00 cmp r3, #0 2c0e: d00c beq.n 2c2a <_printf_i+0x136> 2c10: 9e04 ldr r6, [sp, #16] 2c12: 0028 movs r0, r5 2c14: 0039 movs r1, r7 2c16: f7ff fcd1 bl 25bc <__aeabi_uidivmod> 2c1a: 9b03 ldr r3, [sp, #12] 2c1c: 3e01 subs r6, #1 2c1e: 5c5b ldrb r3, [r3, r1] 2c20: 7033 strb r3, [r6, #0] 2c22: 002b movs r3, r5 2c24: 0005 movs r5, r0 2c26: 429f cmp r7, r3 2c28: d9f3 bls.n 2c12 <_printf_i+0x11e> 2c2a: 2f08 cmp r7, #8 2c2c: d109 bne.n 2c42 <_printf_i+0x14e> 2c2e: 6823 ldr r3, [r4, #0] 2c30: 07db lsls r3, r3, #31 2c32: d506 bpl.n 2c42 <_printf_i+0x14e> 2c34: 6863 ldr r3, [r4, #4] 2c36: 6922 ldr r2, [r4, #16] 2c38: 4293 cmp r3, r2 2c3a: dc02 bgt.n 2c42 <_printf_i+0x14e> 2c3c: 2330 movs r3, #48 ; 0x30 2c3e: 3e01 subs r6, #1 2c40: 7033 strb r3, [r6, #0] 2c42: 9b04 ldr r3, [sp, #16] 2c44: 1b9b subs r3, r3, r6 2c46: 6123 str r3, [r4, #16] 2c48: 9b07 ldr r3, [sp, #28] 2c4a: 0021 movs r1, r4 2c4c: 9300 str r3, [sp, #0] 2c4e: 9805 ldr r0, [sp, #20] 2c50: 9b06 ldr r3, [sp, #24] 2c52: aa09 add r2, sp, #36 ; 0x24 2c54: f7ff fede bl 2a14 <_printf_common> 2c58: 1c43 adds r3, r0, #1 2c5a: d135 bne.n 2cc8 <_printf_i+0x1d4> 2c5c: 2001 movs r0, #1 2c5e: 4240 negs r0, r0 2c60: b00b add sp, #44 ; 0x2c 2c62: bdf0 pop {r4, r5, r6, r7, pc} 2c64: 2220 movs r2, #32 2c66: 6809 ldr r1, [r1, #0] 2c68: 430a orrs r2, r1 2c6a: 6022 str r2, [r4, #0] 2c6c: 0022 movs r2, r4 2c6e: 2178 movs r1, #120 ; 0x78 2c70: 3245 adds r2, #69 ; 0x45 2c72: 7011 strb r1, [r2, #0] 2c74: 4a27 ldr r2, [pc, #156] ; (2d14 <_printf_i+0x220>) 2c76: e7a7 b.n 2bc8 <_printf_i+0xd4> 2c78: 0648 lsls r0, r1, #25 2c7a: d5ac bpl.n 2bd6 <_printf_i+0xe2> 2c7c: b2ad uxth r5, r5 2c7e: e7aa b.n 2bd6 <_printf_i+0xe2> 2c80: 681a ldr r2, [r3, #0] 2c82: 680d ldr r5, [r1, #0] 2c84: 1d10 adds r0, r2, #4 2c86: 6949 ldr r1, [r1, #20] 2c88: 6018 str r0, [r3, #0] 2c8a: 6813 ldr r3, [r2, #0] 2c8c: 062e lsls r6, r5, #24 2c8e: d501 bpl.n 2c94 <_printf_i+0x1a0> 2c90: 6019 str r1, [r3, #0] 2c92: e002 b.n 2c9a <_printf_i+0x1a6> 2c94: 066d lsls r5, r5, #25 2c96: d5fb bpl.n 2c90 <_printf_i+0x19c> 2c98: 8019 strh r1, [r3, #0] 2c9a: 2300 movs r3, #0 2c9c: 9e04 ldr r6, [sp, #16] 2c9e: 6123 str r3, [r4, #16] 2ca0: e7d2 b.n 2c48 <_printf_i+0x154> 2ca2: 681a ldr r2, [r3, #0] 2ca4: 1d11 adds r1, r2, #4 2ca6: 6019 str r1, [r3, #0] 2ca8: 6816 ldr r6, [r2, #0] 2caa: 2100 movs r1, #0 2cac: 0030 movs r0, r6 2cae: 6862 ldr r2, [r4, #4] 2cb0: f000 f844 bl 2d3c 2cb4: 2800 cmp r0, #0 2cb6: d001 beq.n 2cbc <_printf_i+0x1c8> 2cb8: 1b80 subs r0, r0, r6 2cba: 6060 str r0, [r4, #4] 2cbc: 6863 ldr r3, [r4, #4] 2cbe: 6123 str r3, [r4, #16] 2cc0: 2300 movs r3, #0 2cc2: 9a04 ldr r2, [sp, #16] 2cc4: 7013 strb r3, [r2, #0] 2cc6: e7bf b.n 2c48 <_printf_i+0x154> 2cc8: 6923 ldr r3, [r4, #16] 2cca: 0032 movs r2, r6 2ccc: 9906 ldr r1, [sp, #24] 2cce: 9805 ldr r0, [sp, #20] 2cd0: 9d07 ldr r5, [sp, #28] 2cd2: 47a8 blx r5 2cd4: 1c43 adds r3, r0, #1 2cd6: d0c1 beq.n 2c5c <_printf_i+0x168> 2cd8: 6823 ldr r3, [r4, #0] 2cda: 079b lsls r3, r3, #30 2cdc: d415 bmi.n 2d0a <_printf_i+0x216> 2cde: 9b09 ldr r3, [sp, #36] ; 0x24 2ce0: 68e0 ldr r0, [r4, #12] 2ce2: 4298 cmp r0, r3 2ce4: dabc bge.n 2c60 <_printf_i+0x16c> 2ce6: 0018 movs r0, r3 2ce8: e7ba b.n 2c60 <_printf_i+0x16c> 2cea: 0022 movs r2, r4 2cec: 2301 movs r3, #1 2cee: 9906 ldr r1, [sp, #24] 2cf0: 9805 ldr r0, [sp, #20] 2cf2: 9e07 ldr r6, [sp, #28] 2cf4: 3219 adds r2, #25 2cf6: 47b0 blx r6 2cf8: 1c43 adds r3, r0, #1 2cfa: d0af beq.n 2c5c <_printf_i+0x168> 2cfc: 3501 adds r5, #1 2cfe: 68e3 ldr r3, [r4, #12] 2d00: 9a09 ldr r2, [sp, #36] ; 0x24 2d02: 1a9b subs r3, r3, r2 2d04: 42ab cmp r3, r5 2d06: dcf0 bgt.n 2cea <_printf_i+0x1f6> 2d08: e7e9 b.n 2cde <_printf_i+0x1ea> 2d0a: 2500 movs r5, #0 2d0c: e7f7 b.n 2cfe <_printf_i+0x20a> 2d0e: 46c0 nop ; (mov r8, r8) 2d10: 00002fa5 .word 0x00002fa5 2d14: 00002fb6 .word 0x00002fb6 00002d18 <_sbrk_r>: 2d18: 2300 movs r3, #0 2d1a: b570 push {r4, r5, r6, lr} 2d1c: 4d06 ldr r5, [pc, #24] ; (2d38 <_sbrk_r+0x20>) 2d1e: 0004 movs r4, r0 2d20: 0008 movs r0, r1 2d22: 602b str r3, [r5, #0] 2d24: f7fd fbd6 bl 4d4 <_sbrk> 2d28: 1c43 adds r3, r0, #1 2d2a: d103 bne.n 2d34 <_sbrk_r+0x1c> 2d2c: 682b ldr r3, [r5, #0] 2d2e: 2b00 cmp r3, #0 2d30: d000 beq.n 2d34 <_sbrk_r+0x1c> 2d32: 6023 str r3, [r4, #0] 2d34: bd70 pop {r4, r5, r6, pc} 2d36: 46c0 nop ; (mov r8, r8) 2d38: 200006c8 .word 0x200006c8 00002d3c : 2d3c: b2c9 uxtb r1, r1 2d3e: 1882 adds r2, r0, r2 2d40: 4290 cmp r0, r2 2d42: d101 bne.n 2d48 2d44: 2000 movs r0, #0 2d46: 4770 bx lr 2d48: 7803 ldrb r3, [r0, #0] 2d4a: 428b cmp r3, r1 2d4c: d0fb beq.n 2d46 2d4e: 3001 adds r0, #1 2d50: e7f6 b.n 2d40 00002d52 : 2d52: b510 push {r4, lr} 2d54: 4288 cmp r0, r1 2d56: d902 bls.n 2d5e 2d58: 188b adds r3, r1, r2 2d5a: 4298 cmp r0, r3 2d5c: d303 bcc.n 2d66 2d5e: 2300 movs r3, #0 2d60: e007 b.n 2d72 2d62: 5c8b ldrb r3, [r1, r2] 2d64: 5483 strb r3, [r0, r2] 2d66: 3a01 subs r2, #1 2d68: d2fb bcs.n 2d62 2d6a: bd10 pop {r4, pc} 2d6c: 5ccc ldrb r4, [r1, r3] 2d6e: 54c4 strb r4, [r0, r3] 2d70: 3301 adds r3, #1 2d72: 429a cmp r2, r3 2d74: d1fa bne.n 2d6c 2d76: e7f8 b.n 2d6a 00002d78 <__malloc_lock>: 2d78: b510 push {r4, lr} 2d7a: 4802 ldr r0, [pc, #8] ; (2d84 <__malloc_lock+0xc>) 2d7c: f7ff fc88 bl 2690 <__retarget_lock_acquire_recursive> 2d80: bd10 pop {r4, pc} 2d82: 46c0 nop ; (mov r8, r8) 2d84: 200006c0 .word 0x200006c0 00002d88 <__malloc_unlock>: 2d88: b510 push {r4, lr} 2d8a: 4802 ldr r0, [pc, #8] ; (2d94 <__malloc_unlock+0xc>) 2d8c: f7ff fc81 bl 2692 <__retarget_lock_release_recursive> 2d90: bd10 pop {r4, pc} 2d92: 46c0 nop ; (mov r8, r8) 2d94: 200006c0 .word 0x200006c0 00002d98 <_free_r>: 2d98: b570 push {r4, r5, r6, lr} 2d9a: 0005 movs r5, r0 2d9c: 2900 cmp r1, #0 2d9e: d010 beq.n 2dc2 <_free_r+0x2a> 2da0: 1f0c subs r4, r1, #4 2da2: 6823 ldr r3, [r4, #0] 2da4: 2b00 cmp r3, #0 2da6: da00 bge.n 2daa <_free_r+0x12> 2da8: 18e4 adds r4, r4, r3 2daa: 0028 movs r0, r5 2dac: f7ff ffe4 bl 2d78 <__malloc_lock> 2db0: 4a1d ldr r2, [pc, #116] ; (2e28 <_free_r+0x90>) 2db2: 6813 ldr r3, [r2, #0] 2db4: 2b00 cmp r3, #0 2db6: d105 bne.n 2dc4 <_free_r+0x2c> 2db8: 6063 str r3, [r4, #4] 2dba: 6014 str r4, [r2, #0] 2dbc: 0028 movs r0, r5 2dbe: f7ff ffe3 bl 2d88 <__malloc_unlock> 2dc2: bd70 pop {r4, r5, r6, pc} 2dc4: 42a3 cmp r3, r4 2dc6: d908 bls.n 2dda <_free_r+0x42> 2dc8: 6821 ldr r1, [r4, #0] 2dca: 1860 adds r0, r4, r1 2dcc: 4283 cmp r3, r0 2dce: d1f3 bne.n 2db8 <_free_r+0x20> 2dd0: 6818 ldr r0, [r3, #0] 2dd2: 685b ldr r3, [r3, #4] 2dd4: 1841 adds r1, r0, r1 2dd6: 6021 str r1, [r4, #0] 2dd8: e7ee b.n 2db8 <_free_r+0x20> 2dda: 001a movs r2, r3 2ddc: 685b ldr r3, [r3, #4] 2dde: 2b00 cmp r3, #0 2de0: d001 beq.n 2de6 <_free_r+0x4e> 2de2: 42a3 cmp r3, r4 2de4: d9f9 bls.n 2dda <_free_r+0x42> 2de6: 6811 ldr r1, [r2, #0] 2de8: 1850 adds r0, r2, r1 2dea: 42a0 cmp r0, r4 2dec: d10b bne.n 2e06 <_free_r+0x6e> 2dee: 6820 ldr r0, [r4, #0] 2df0: 1809 adds r1, r1, r0 2df2: 1850 adds r0, r2, r1 2df4: 6011 str r1, [r2, #0] 2df6: 4283 cmp r3, r0 2df8: d1e0 bne.n 2dbc <_free_r+0x24> 2dfa: 6818 ldr r0, [r3, #0] 2dfc: 685b ldr r3, [r3, #4] 2dfe: 1841 adds r1, r0, r1 2e00: 6011 str r1, [r2, #0] 2e02: 6053 str r3, [r2, #4] 2e04: e7da b.n 2dbc <_free_r+0x24> 2e06: 42a0 cmp r0, r4 2e08: d902 bls.n 2e10 <_free_r+0x78> 2e0a: 230c movs r3, #12 2e0c: 602b str r3, [r5, #0] 2e0e: e7d5 b.n 2dbc <_free_r+0x24> 2e10: 6821 ldr r1, [r4, #0] 2e12: 1860 adds r0, r4, r1 2e14: 4283 cmp r3, r0 2e16: d103 bne.n 2e20 <_free_r+0x88> 2e18: 6818 ldr r0, [r3, #0] 2e1a: 685b ldr r3, [r3, #4] 2e1c: 1841 adds r1, r0, r1 2e1e: 6021 str r1, [r4, #0] 2e20: 6063 str r3, [r4, #4] 2e22: 6054 str r4, [r2, #4] 2e24: e7ca b.n 2dbc <_free_r+0x24> 2e26: 46c0 nop ; (mov r8, r8) 2e28: 200006b4 .word 0x200006b4 00002e2c <_realloc_r>: 2e2c: b5f8 push {r3, r4, r5, r6, r7, lr} 2e2e: 0007 movs r7, r0 2e30: 000d movs r5, r1 2e32: 0016 movs r6, r2 2e34: 2900 cmp r1, #0 2e36: d105 bne.n 2e44 <_realloc_r+0x18> 2e38: 0011 movs r1, r2 2e3a: f7ff fc2b bl 2694 <_malloc_r> 2e3e: 0004 movs r4, r0 2e40: 0020 movs r0, r4 2e42: bdf8 pop {r3, r4, r5, r6, r7, pc} 2e44: 2a00 cmp r2, #0 2e46: d103 bne.n 2e50 <_realloc_r+0x24> 2e48: f7ff ffa6 bl 2d98 <_free_r> 2e4c: 0034 movs r4, r6 2e4e: e7f7 b.n 2e40 <_realloc_r+0x14> 2e50: f000 f812 bl 2e78 <_malloc_usable_size_r> 2e54: 002c movs r4, r5 2e56: 42b0 cmp r0, r6 2e58: d2f2 bcs.n 2e40 <_realloc_r+0x14> 2e5a: 0031 movs r1, r6 2e5c: 0038 movs r0, r7 2e5e: f7ff fc19 bl 2694 <_malloc_r> 2e62: 1e04 subs r4, r0, #0 2e64: d0ec beq.n 2e40 <_realloc_r+0x14> 2e66: 0029 movs r1, r5 2e68: 0032 movs r2, r6 2e6a: f7ff fbd7 bl 261c 2e6e: 0029 movs r1, r5 2e70: 0038 movs r0, r7 2e72: f7ff ff91 bl 2d98 <_free_r> 2e76: e7e3 b.n 2e40 <_realloc_r+0x14> 00002e78 <_malloc_usable_size_r>: 2e78: 1f0b subs r3, r1, #4 2e7a: 681b ldr r3, [r3, #0] 2e7c: 1f18 subs r0, r3, #4 2e7e: 2b00 cmp r3, #0 2e80: da01 bge.n 2e86 <_malloc_usable_size_r+0xe> 2e82: 580b ldr r3, [r1, r0] 2e84: 18c0 adds r0, r0, r3 2e86: 4770 bx lr 00002e88 <_usb_ep_cfgs>: 2e88: 0420 2000 0000 0000 0040 0000 03e0 2000 .. ....@...... 2e98: 0000 0000 0040 0000 03a0 2000 0000 0000 ....@...... .... 2ea8: 0040 0000 2e2e 682f 6c61 752f 6974 736c @...../hal/utils 2eb8: 732f 6372 752f 6974 736c 6c5f 7369 2e74 /src/utils_list. 2ec8: 0063 2e2e 682f 6c61 732f 6372 682f 6c61 c.../hal/src/hal 2ed8: 755f 6173 7472 735f 6e79 2e63 0063 _usart_sync.c. 00002ee6 : 2ee6: 01ed 0101 0201 ....... 00002eed : 2eed: 00ed 0101 0201 48f0 6c65 6f6c 5720 726f .......Hello Wor 2efd: 646c 2e00 2f2e 7068 2f6c 6573 6372 6d6f ld.../hpl/sercom 2f0d: 682f 6c70 735f 7265 6f63 2e6d 0063 2e2e /hpl_sercom.c... 2f1d: 752f 6273 642f 7665 6369 2f65 7375 6462 /usb/device/usbd 2f2d: 2e63 0063 0000 c.c.... 00002f34 <__sf_fake_stderr>: ... 00002f54 <__sf_fake_stdin>: ... 00002f74 <__sf_fake_stdout>: ... 2f94: 2d23 2b30 0020 6c68 004c 6665 4567 4746 #-0+ .hlL.efgEFG 2fa4: 3000 3231 3433 3635 3837 4139 4342 4544 .0123456789ABCDE 2fb4: 0046 3130 3332 3534 3736 3938 6261 6463 F.0123456789abcd 2fc4: 6665 0000 ef.. 00002fc8 <_init>: 2fc8: b5f8 push {r3, r4, r5, r6, r7, lr} 2fca: 46c0 nop ; (mov r8, r8) 2fcc: bcf8 pop {r3, r4, r5, r6, r7} 2fce: bc08 pop {r3} 2fd0: 469e mov lr, r3 2fd2: 4770 bx lr 00002fd4 <__frame_dummy_init_array_entry>: 2fd4: 00dd 0000 .... 00002fd8 <_fini>: 2fd8: b5f8 push {r3, r4, r5, r6, r7, lr} 2fda: 46c0 nop ; (mov r8, r8) 2fdc: bcf8 pop {r3, r4, r5, r6, r7} 2fde: bc08 pop {r3} 2fe0: 469e mov lr, r3 2fe2: 4770 bx lr 00002fe4 <__do_global_dtors_aux_fini_array_entry>: 2fe4: 00b5 0000 ....