Skip to content

Instantly share code, notes, and snippets.

@pixel-stuck
Last active June 25, 2019 19:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pixel-stuck/34366b7b66082a30f94d2bbdfff6a437 to your computer and use it in GitHub Desktop.
Save pixel-stuck/34366b7b66082a30f94d2bbdfff6a437 to your computer and use it in GitHub Desktop.
/*
* Copyright (c) 2018 Atmosphère-NX
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
.section .text.start
.align 4
.globl _start
_start:
bl restore_svc_vector
adr r0, (usb_init+1)
mov lr, pc
bx r0
b _crt0
.pool
.globl _crt0
.type _crt0,%function
_crt0:
ldr r0,=0x52425430 @ RBT0
mov r1, #0x0
mov r2, #0x0
mov r3, #0x0
mov r4, #0x0
mov r5, #0x0
mov r6, #0x0
mov r7, #0x0
mov r8, #0x0
mov r9, #0x0
mov r10,#0x0
mov r11,#0x0
mov r12,#0x0
mov lr, #0x0
ldr sp,=0x40010000
ldr pc,=0x40010000
restore_svc_vector:
ldr r0, =0x6000F208 /* SVC vector address */
ldr r1, =0x40004C30 /* original SVC handler address */
str r1, [r0]
bx lr
.thumb
usb_init:
push {lr} /* save return address on the stack */
adr r0, usb_mode
ldr r1, =0x1021B3
ldr r2, =(set_usb_ops+1)
mov lr, r2 /* required; early revision ARM does not have the ability to load directly into r8-r15 in thumb mode. */
bx r1 /* get_usb_mode(&usb_mode) */
set_usb_ops:
adr r0, usb_mode
ldr r0, [r0]
ldr r1, =0x102B75
ldr r2, =(usb_initialize+1)
mov lr, r2
bx r1 /* set_usb_ops(usb_mode) */
usb_initialize:
ldr r0, =0x40003114 /* r0 = &g_usb_ops */
ldr r0, [r0, #4] /* load usb_initialize func ptr from usb_ops */
ldr r1, =(charger_setup+1)
mov lr, r1
bx r0 /* usb_ops->usb_initialize() */
charger_setup:
ldr r0, =0x40003114 /* r0 = &g_usb_ops */
mov r1, #1
strb r1, [r0, #1] /* set is_initialized flag to 1 */
strb r1, [r0, #2] /* set buffer to 1; causes rcm_read_command_and_payload() to be called immediately */
ldr r0, =0x104283
ldr r1, =(handle_rcm+1)
mov lr, r1
bx r0
handle_rcm:
ldr r0, =0x40003114 /* r0 = &g_usb_ops */
pop {r1} /* set r1 to the return address */
str r1, [r0, #0x10] /* replace read_ep1_out_finish with a jump to return address */
mov r0, #0 /* this seems to be an "rcm reason" flag. Doesn't matter how it's set */
mov r1, r0 /* set other args to 0 as they are unused for our purposes. */
mov r2, r0
mov r3, r0
ldr r4, =0x102897 /* handle_rcm(0, 0, 0, 0) */
bx r4
.pool
usb_mode:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment