| // Stub second stage which calls into USB bootcode, with parameters. |
| // USB boot takes two parameters: |
| // - A GPIO mask for activity LED -- if mask is 0, don't touch GPIOs at all |
| // - A mask of interfaces to disable. Bit 0 disables MSC, bit 1 disables PICOBoot |
| // The bootrom passes 0 for both of these parameters, but user code (or this |
| // second stage) can pass anything. |
| |
| #define USB_BOOT_MSD_AND_PICOBOOT 0x0 |
| #define USB_BOOT_MSD_ONLY 0x2 |
| #define USB_BOOT_PICOBOOT_ONLY 0x1 |
| |
| // Config |
| #define ACTIVITY_LED 0 |
| #define BOOT_MODE USB_BOOT_MSD_AND_PICOBOOT |
| |
| .cpu cortex-m0 |
| .thumb |
| |
| .section .text |
| |
| .global _stage2_boot |
| .type _stage2_boot,%function |
| |
| .thumb_func |
| _stage2_boot: |
| mov r7, #0x14 // Pointer to _well_known pointer table in ROM |
| ldrh r0, [r7, #0] // Offset 0 is 16 bit pointer to function table |
| ldrh r7, [r7, #4] // Offset 4 is 16 bit pointer to table lookup routine |
| ldr r1, =('U' | ('B' << 8)) // Symbol for USB Boot |
| blx r7 |
| cmp r0, #0 |
| beq dead |
| |
| mov r7, r0 |
| ldr r0, =(1u << ACTIVITY_LED) // Mask of which GPIO (or GPIOs) to use |
| mov r1, #BOOT_MODE |
| blx r7 |
| |
| dead: |
| wfi |
| b dead |
| |
| .global literals |
| literals: |
| .ltorg |
| |
| .end |