All pastes #370241 Raw Edit

Anonymous

public unlisted text v1 · immutable
#370241 ·published 2007-02-24 11:55 UTC
rendered paste body
diff --git a/apps/main.c b/apps/main.c
index a912e07..ed7ca29 100644
--- a/apps/main.c
+++ b/apps/main.c
@@ -550,9 +550,28 @@ void cop_main(void)
    platforms which support it.
 
    At present all we do is send the COP to sleep if anything wakes it. */
-    while(1) {
+    long i;
+    unsigned long* memmapregs = (unsigned long*)0xf000f000;
+
+    (*(volatile unsigned long*)(0x60004134)) |= 0x10; /* Set mailbox interrupt */
+
+    while(CPU_MESSAGE != COP_REBOOT) {
         COP_CTL = PROC_SLEEP;
     }
+    COP_REPLY = 1;
+    /* Invalidate cache */
+    outl(inl(0xf000f044) | 0x6, 0xf000f044);
+    while ((inl(0x6000c000) & 0x8000) != 0) {}
+    
+    /* Disable cache */
+    outl(0x0, 0x6000C000);
+
+
+    asm volatile(
+        "mov   r0, #0x10000000   \n"
+        "mov   pc, r0            \n"
+    );
+
 }
 #endif
 
diff --git a/firmware/export/config.h b/firmware/export/config.h
index 1a3e0be..ac2ee68 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -280,6 +280,8 @@
 
 #define NUM_CORES 1
 #define CURRENT_CORE 0
+
+#define COP_REBOOT 0x00000001
 #else
 #define NUM_CORES 1
 #define CURRENT_CORE 0
diff --git a/firmware/export/pp5020.h b/firmware/export/pp5020.h
index d304895..d9fd738 100644
--- a/firmware/export/pp5020.h
+++ b/firmware/export/pp5020.h
@@ -25,6 +25,15 @@
 #define CPU_CTL          (*(volatile unsigned long *)(0x60007000))
 #define COP_CTL          (*(volatile unsigned long *)(0x60007004))
 
+/* Mailboxes */
+/* Each processor has two mailboxes it can write to and two which
+   it can read from.  We define the first to be for sending messages
+   and the second for replying to messages */
+#define CPU_MESSAGE      (*(volatile unsigned long *)(0x60001000))
+#define COP_MESSAGE      (*(volatile unsigned long *)(0x60001004))
+#define CPU_REPLY        (*(volatile unsigned long *)(0x60001008))
+#define COP_REPLY        (*(volatile unsigned long *)(0x6000100c))
+
 #define GPIOA_ENABLE     (*(volatile unsigned long *)(0x6000d000))
 #define GPIOB_ENABLE     (*(volatile unsigned long *)(0x6000d004))
 #define GPIOC_ENABLE     (*(volatile unsigned long *)(0x6000d008))
diff --git a/firmware/rolo.c b/firmware/rolo.c
index 84b3280..05778da 100644
--- a/firmware/rolo.c
+++ b/firmware/rolo.c
@@ -78,6 +78,9 @@ void rolo_restart(const unsigned char* source, unsigned char* dest,
         : : "a"(dest)
     );
 #elif (CONFIG_CPU==PP5020) || (CONFIG_CPU==PP5024)
+
+    CPU_MESSAGE = COP_REBOOT;
+    while(COP_REPLY != 1) {}
     /* Flush cache */
     outl(inl(0xf000f044) | 0x2, 0xf000f044);
     while ((inl(0x6000c000) & 0x8000) != 0) {}
@@ -85,6 +88,7 @@ void rolo_restart(const unsigned char* source, unsigned char* dest,
     /* Disable cache */
     outl(0x0, 0x6000C000);
 
+    
     /* Reset the memory mapping registers to zero */
     for (i=0;i<8;i++)
         memmapregs[i]=0;