mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 02:27:39 -04:00
rk27xx: support entering rkusb mode on rk2706A
We know about two different bootroms. First can be found in rk2706A, the second in rk2706B and rk2705. This two versions are very similar but memory addresses are different. It seems it is possible to distinguish bootrom version by reading SCU_ID register. Change-Id: I01681b5e3a82930ae74a5cce6ab0244d7cd333d2
This commit is contained in:
parent
fa5d22584a
commit
b43171dcdf
1 changed files with 36 additions and 9 deletions
|
@ -37,42 +37,69 @@ extern void show_logo( void );
|
||||||
static void enter_rkusb(void)
|
static void enter_rkusb(void)
|
||||||
{
|
{
|
||||||
asm volatile (
|
asm volatile (
|
||||||
/* turn off cache */
|
/* Turn off cache */
|
||||||
"ldr r0, =0xefff0000 \n"
|
"ldr r0, =0xefff0000 \n"
|
||||||
"ldrh r1, [r0] \n"
|
"ldrh r1, [r0] \n"
|
||||||
"strh r1, [r0] \n"
|
"strh r1, [r0] \n"
|
||||||
|
|
||||||
/* turn off interrupts */
|
/* Turn off interrupts */
|
||||||
"mrs r0, cpsr \n"
|
"mrs r0, cpsr \n"
|
||||||
"bic r0, r0, #0x1f \n"
|
"bic r0, r0, #0x1f \n"
|
||||||
"orr r0, r0, #0xd3 \n"
|
"orr r0, r0, #0xd3 \n"
|
||||||
"msr cpsr, r0 \n"
|
"msr cpsr, r0 \n"
|
||||||
|
|
||||||
/* disable iram remap */
|
/* Disable iram remap */
|
||||||
"mov r0, #0x18000000 \n"
|
"mov r0, #0x18000000 \n"
|
||||||
"add r0, r0, #0x1c000 \n"
|
"add r0, r0, #0x1c000 \n"
|
||||||
"mov r1, #0 \n"
|
"mov r1, #0 \n"
|
||||||
"str r1, [r0, #4] \n"
|
"str r1, [r0, #4] \n"
|
||||||
|
|
||||||
/* setup stacks in unmapped
|
/* Ungate all clocks */
|
||||||
* iram just as rom will do
|
"str r1, [r0, #0x18] \n"
|
||||||
|
|
||||||
|
/* Read SCU_ID to determine
|
||||||
|
* which version of bootrom we have
|
||||||
|
* 2706A has ID 0xa1000604
|
||||||
|
* 2706B and 2705 have ID 0xa10002b7
|
||||||
*/
|
*/
|
||||||
"msr cpsr, #0xd2 \n"
|
"ldr r1, [r0] \n"
|
||||||
|
"ldr r2, =0xa1000604 \n"
|
||||||
|
"cmp r1, r2 \n"
|
||||||
|
"bne rk27xx_new \n"
|
||||||
|
|
||||||
|
/* Setup stacks in unmapped
|
||||||
|
* iram just as rom will do.
|
||||||
|
*
|
||||||
|
* We know about two versions
|
||||||
|
* of bootrom which are very similar
|
||||||
|
* but memory addresses are slightly
|
||||||
|
* different.
|
||||||
|
*/
|
||||||
|
"rk27xx_old: \n"
|
||||||
|
"ldr r1, =0x18200258 \n"
|
||||||
|
"ldr r0, =0xaf0 \n"
|
||||||
|
"b jump_to_rom \n"
|
||||||
|
|
||||||
|
"rk27xx_new: \n"
|
||||||
"ldr r1, =0x18200274 \n"
|
"ldr r1, =0x18200274 \n"
|
||||||
|
"ldr r0, =0xec0 \n"
|
||||||
|
|
||||||
|
"jump_to_rom: \n"
|
||||||
|
"msr cpsr, #0xd2 \n"
|
||||||
"add r1, r1, #0x200 \n"
|
"add r1, r1, #0x200 \n"
|
||||||
"mov sp, r1 \n"
|
"mov sp, r1 \n"
|
||||||
"msr cpsr, #0xd3 \n"
|
"msr cpsr, #0xd3 \n"
|
||||||
"add r1, r1, #0x400 \n"
|
"add r1, r1, #0x400 \n"
|
||||||
"mov sp, r1 \n"
|
"mov sp, r1 \n"
|
||||||
|
|
||||||
/* jump to main() in rom
|
/* Finaly jump to rkusb handler
|
||||||
* just before dfu handler
|
* in bootrom.
|
||||||
*/
|
*/
|
||||||
"ldr r0, =0xec0 \n"
|
|
||||||
"bx r0 \n"
|
"bx r0 \n"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void main(void) NORETURN_ATTR;
|
void main(void) NORETURN_ATTR;
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue