--- ecos-2.0-orig/packages/redboot/v2_0/src/main.c	2008-06-30 22:37:39.000000000 +0200
+++ ecos-2.0/packages/redboot/v2_0/src/main.c	2008-06-30 22:51:52.000000000 +0200
@@ -209,9 +209,20 @@
     int Counter=0;
     int RUN=0;
     int BREAK=0;
-    
+    unsigned long reg;
+    int backup_key = 0;
+    int shutdown_key = 0;
+
     //RDC
     RDC_PCI_INIT();
+
+    /* init GPIO 0..5  (2 keys + 4 LEDs) */
+       HAL_WRITE_UINT32(0xCF8,0x8000384C);
+       HAL_WRITE_UINT32(0xCFC,0xFFFFFFDF);
+       HAL_WRITE_UINT32(0xCF8,0x80003848);
+       HAL_READ_UINT32(0xCFC,reg);
+       reg |= 0x3f;
+       HAL_WRITE_UINT32(0xCFC,reg);
     
     // Export version information
     CYGACC_CALL_IF_MONITOR_VERSION_SET(RedBoot_version);
@@ -322,9 +333,19 @@
 // ==> hlin
 #if 1
         res = _rb_gets(line, sizeof(line), CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT);     
-	
+        HAL_WRITE_UINT32(0xCF8,0x8000384C);
+        HAL_READ_UINT32(0xCFC,reg);
 	if(RUN)
 	{		
+          if (!(reg & 0x02))
+            backup_key = 1;
+          if (!(reg & 0x01))
+            shutdown_key = 1;
+          if (backup_key || shutdown_key)
+          {
+            HAL_WRITE_UINT32(0xCF8,0x8000384C);
+            HAL_WRITE_UINT32(0xCFC,0xFFFFFFCF);
+          }
 	  memcpy((char *)KERNEL_RAM_BASE,(char *)KERNEL_FLASH_BASE,KERNEL_LEN);
 	  memcpy((char *)INITRD_RAM_BASE,(char *)INITRD_FLASH_BASE,INITRD_LEN); 
 	  res = _GETS_OK ;
@@ -337,8 +358,12 @@
         cmd_history = false;  // Enable history collection
 #endif
 	
-	if (res == _GETS_CTRLC)
+	if (res == _GETS_CTRLC || (!(reg & 0x03)))
+	{
+	    HAL_WRITE_UINT32(0xCF8,0x8000384C);
+	    HAL_WRITE_UINT32(0xCFC,0xFFFFFFC3);
             BREAK=1;
+	}
 
         if (res == _GETS_TIMEOUT) {             	             	    	 	
 	    if(! BREAK)
@@ -682,17 +707,19 @@
 	HAL_WRITE_UINT16(0xCF8,0x2A);	
 	#endif
 	INIT_GPCS();
-	
-	INIT_SLOT1();
-	INIT_MINIPCI();
-	INIT_SLOT3();
+
+	//INIT_SLOT1();
+	//INIT_MINIPCI();
+	//INIT_SLOT3();
+	INIT_RT2560();
 	INIT_ITE8212();
 	INIT_USB();
 	
 	
 	//PCI Routing
 	HAL_WRITE_UINT32(0xCF8,0x80003858);
-	HAL_WRITE_UINT32(0xCFC,0xDF9311B7);
+	//HAL_WRITE_UINT32(0xCFC,0xDF9311B7);
+	HAL_WRITE_UINT32(0xCFC,0xDF93100B);
 	
 #elif defined(__R3231__)
 	INIT_GPCS();
@@ -822,6 +849,18 @@
 	    }
 }
 
+void INIT_RT2560(void)
+{
+       HAL_WRITE_UINT32(0xCF8,0x8000083C);             //IRQ C
+       HAL_WRITE_UINT32(0xCFC,0x0000000C);
+       HAL_WRITE_UINT32(0xCF8,0x80000810);
+       HAL_WRITE_UINT32(0xCFC,0x0000ea00);
+       HAL_WRITE_UINT32(0xCF8,0x80000814);
+       HAL_WRITE_UINT32(0xCFC,0xd3900000);
+       HAL_WRITE_UINT32(0xCF8,0x80000804);
+       HAL_WRITE_UINT16(0xCFC,0x0007);
+}
+
 void INIT_SLOT1(void)
 {
 	unsigned long base;
