root/loader/a1200/main.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. my_restart
  2. shutdown
  3. panic

   1 #include "../generic/check_compat.c"
   2 
   3 static void __attribute__((noreturn)) shutdown();
   4 static void __attribute__((noreturn)) panic(int cnt);
   5 
   6 extern long *blob_chdk_core;
   7 extern long *blob_copy_and_reset;
   8 extern long blob_chdk_core_size;
   9 extern long blob_copy_and_reset_size;
  10 
  11 void __attribute__((noreturn)) my_restart() {
  12 
  13     {
  14         long *dst = (long*)MEMISOSTART;
  15         const long *src = blob_chdk_core;
  16         long length = (blob_chdk_core_size + 3) >> 2;
  17 
  18   core_copy(src, dst, length);
  19 
  20     }
  21 
  22     asm volatile (
  23         "LDR    R1, =0xC0200000 \n"
  24         "MOV    R0, #0 \n"
  25         "STR    R0, [R1,#0x10C] \n"
  26         "STR    R0, [R1,#0xC] \n"
  27         "STR    R0, [R1,#0x1C] \n"
  28         "STR    R0, [R1,#0x2C] \n"
  29         "STR    R0, [R1,#0x3C] \n"
  30         "STR    R0, [R1,#0x4C] \n"
  31         "STR    R0, [R1,#0x5C] \n"
  32         "STR    R0, [R1,#0x6C] \n"
  33         "STR    R0, [R1,#0x7C] \n"
  34         "STR    R0, [R1,#0x8C] \n"
  35         "STR    R0, [R1,#0x9C] \n"
  36         "STR    R0, [R1,#0xAC] \n"
  37         "STR    R0, [R1,#0xBC] \n"
  38         "STR    R0, [R1,#0xCC] \n"
  39         "STR    R0, [R1,#0xDC] \n"
  40         "STR    R0, [R1,#0xEC] \n"
  41         "CMP    R4, #7 \n"
  42         "STR    R0, [R1,#0xFC] \n"
  43         "LDMEQFD    SP!, {R4,PC} \n"
  44         "MOV    R0, #0x78 \n"
  45         "MCR    p15, 0, R0,c1,c0 \n"
  46         "MOV    R0, #0 \n"
  47         "MCR    p15, 0, R0,c7,c10, 4 \n"
  48         "MCR    p15, 0, R0,c7,c5 \n"
  49         "MCR    p15, 0, R0,c7,c6 \n"
  50         "MOV    R0, #0x80000006 \n"
  51         "MCR    p15, 0, R0,c9,c1 \n"
  52         "MCR    p15, 0, R0,c9,c1, 1 \n"
  53         "MRC    p15, 0, R0,c1,c0 \n"
  54         "ORR    R0, R0, #0x50000 \n"
  55         "MCR    p15, 0, R0,c1,c0 \n"
  56         "LDR    R0, =0x12345678 \n"
  57         "MOV    R1, #0x80000000 \n"
  58         "STR    R0, [R1,#0xFFC] \n"
  59         //"LDR  R0, =0xFF810000 \n"
  60         "LDMFD  SP!, {R4,LR} \n"
  61         "MOV    R0, %0 \n"  //new jump-vector
  62         "BX     R0 \n"
  63         : : "r"(MEMISOSTART) : "memory","r0","r1","r2","r3","r4"
  64     );
  65 
  66     while(1);
  67 
  68 }
  69 
  70 #define LED_GR  0xC0220014  // green
  71 #define LED_OR  0xC0220010  // orange
  72 #define LED_AF  0xC022000C  // autofocus (front)
  73 
  74 static void __attribute__((noreturn)) shutdown() {
  75 
  76     volatile long *p = (void*)LED_OR;       // turned off later
  77 
  78     asm(
  79          "MRS     R1, CPSR\n"
  80          "AND     R0, R1, #0x80\n"
  81          "ORR     R1, R1, #0x80\n"
  82          "MSR     CPSR_cf, R1\n"
  83          :::"r1","r0");
  84 
  85     *p = 0x44;  // led off.
  86 
  87     while(1);
  88 }
  89 
  90 static void __attribute__((noreturn)) panic(int cnt) {
  91 
  92     volatile long *p=(void*)LED_AF;
  93     int i;
  94 
  95     for(;cnt>0;cnt--) {
  96         p[0]=0x46;  // led on.
  97 
  98         for(i=0;i<0x200000;i++) {
  99             asm ("nop\n");
 100             asm ("nop\n");
 101         }
 102         p[0]=0x44;  // led off.
 103         for(i=0;i<0x200000;i++) {
 104             asm ("nop\n");
 105             asm ("nop\n");
 106         }
 107     }
 108     shutdown();
 109 }

/* [<][>][^][v][top][bottom][index][help] */