* 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);
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)