Kernel/armv7 - Added debug serial input
authorJohn Hodge <[email protected]>
Sun, 22 Sep 2013 11:12:18 +0000 (19:12 +0800)
committerJohn Hodge <[email protected]>
Sun, 22 Sep 2013 11:12:18 +0000 (19:12 +0800)
KernelLand/Kernel/arch/armv7/debug.c

index 7b9e55d..dd87e7e 100644 (file)
@@ -5,14 +5,17 @@
  * arch/arm7/debug.c
  * - ARM7 Debug output
  * NOTE: Currently designed for the realview-pb-a8 emulated by Qemu
+ * - PL011
  */
 #include <acess.h>
+#include <drv_serial.h>
 
 // === CONSTANTS ===
 //#define UART0_BASE   0x10009000
 #define UART0_BASE     0xF1000000      // Boot time mapped
 
 // === PROTOTYPES ===
+void   Debug_int_SerialIRQHandler(int IRQ, void *unused);
 void   KernelPanic_SetMode(void);
 void   KernelPanic_PutChar(char Ch);
 void   StartupPrint(const char *str);
@@ -21,19 +24,39 @@ void        StartupPrint(const char *str);
  int   giDebug_SerialInitialised = 0;
 
 // === CODE ===
+void Debug_int_SerialIRQHandler(int IRQ, void *unused)
+{
+       volatile Uint32 *regs = (void*)UART0_BASE;
+       if( !(regs[15] & 0x10) ) {
+               // RX Int hadn't fired
+               Debug("No IRQ %x %x", regs[15], regs[0]);
+               return ;
+       }
+       char ch = regs[0];
+       Serial_ByteReceived(gSerial_KernelDebugPort, ch);
+}
+
 void Debug_PutCharDebug(char ch)
 {
        if(ch == '\n')
                Debug_PutCharDebug('\r');
+       
+       volatile Uint32 *regs = (void*)UART0_BASE;
+       
+       if( !giDebug_SerialInitialised ) {
+               regs[14] = 0x10;        // Enable RX interrupt
+               regs[13] = (1<<1);      // Set RX trigger to 1 byte
+               giDebug_SerialInitialised = 1;
+       }
 
        #if PLATFORM_is_tegra2
        // Tegra2
-       while( !(*(volatile Uint32*)(UART0_BASE + 0x14) & (1 << 5)) )
+       while( !(regs[5] & (1 << 5)) )
                ;
        #endif
        
 //     *(volatile Uint32*)(SERIAL_BASE + SERIAL_REG_DATA) = ch;
-       *(volatile Uint32*)(UART0_BASE) = ch;
+       regs[0] = ch;
 }
 
 void Debug_PutStringDebug(const char *str)

UCC git Repository :: git.ucc.asn.au