| |
| /* |
| * Debug routines which directly access the uart. |
| */ |
| |
| #include <linux/types.h> |
| #include <asm/gt64120.h> |
| |
| |
| //#define SERIAL_BASE EV96100_UART0_REGS_BASE |
| #define SERIAL_BASE 0xBD000020 |
| #define NS16550_BASE SERIAL_BASE |
| |
| #define SERA_CMD 0x0D |
| #define SERA_DATA 0x08 |
| //#define SERB_CMD 0x05 |
| #define SERB_CMD 20 |
| #define SERB_DATA 0x00 |
| #define TX_BUSY 0x20 |
| |
| #define TIMEOUT 0xffff |
| #undef SLOW_DOWN |
| |
| static const char digits[16] = "0123456789abcdef"; |
| static volatile unsigned char *const com1 = (unsigned char *) SERIAL_BASE; |
| |
| |
| #ifdef SLOW_DOWN |
| static inline void slow_down() |
| { |
| int k; |
| for (k = 0; k < 10000; k++); |
| } |
| #else |
| #define slow_down() |
| #endif |
| |
| void putch(const unsigned char c) |
| { |
| unsigned char ch; |
| int i = 0; |
| |
| do { |
| ch = com1[SERB_CMD]; |
| slow_down(); |
| i++; |
| if (i > TIMEOUT) { |
| break; |
| } |
| } while (0 == (ch & TX_BUSY)); |
| com1[SERB_DATA] = c; |
| } |
| |
| void putchar(const unsigned char c) |
| { |
| unsigned char ch; |
| int i = 0; |
| |
| do { |
| ch = com1[SERB_CMD]; |
| slow_down(); |
| i++; |
| if (i > TIMEOUT) { |
| break; |
| } |
| } while (0 == (ch & TX_BUSY)); |
| com1[SERB_DATA] = c; |
| } |
| |
| void puts(unsigned char *cp) |
| { |
| unsigned char ch; |
| int i = 0; |
| |
| while (*cp) { |
| do { |
| ch = com1[SERB_CMD]; |
| slow_down(); |
| i++; |
| if (i > TIMEOUT) { |
| break; |
| } |
| } while (0 == (ch & TX_BUSY)); |
| com1[SERB_DATA] = *cp++; |
| } |
| putch('\r'); |
| putch('\n'); |
| } |
| |
| void fputs(unsigned char *cp) |
| { |
| unsigned char ch; |
| int i = 0; |
| |
| while (*cp) { |
| |
| do { |
| ch = com1[SERB_CMD]; |
| slow_down(); |
| i++; |
| if (i > TIMEOUT) { |
| break; |
| } |
| } while (0 == (ch & TX_BUSY)); |
| com1[SERB_DATA] = *cp++; |
| } |
| } |
| |
| |
| void put64(uint64_t ul) |
| { |
| int cnt; |
| unsigned ch; |
| |
| cnt = 16; /* 16 nibbles in a 64 bit long */ |
| putch('0'); |
| putch('x'); |
| do { |
| cnt--; |
| ch = (unsigned char) (ul >> cnt * 4) & 0x0F; |
| putch(digits[ch]); |
| } while (cnt > 0); |
| } |
| |
| void put32(unsigned u) |
| { |
| int cnt; |
| unsigned ch; |
| |
| cnt = 8; /* 8 nibbles in a 32 bit long */ |
| putch('0'); |
| putch('x'); |
| do { |
| cnt--; |
| ch = (unsigned char) (u >> cnt * 4) & 0x0F; |
| putch(digits[ch]); |
| } while (cnt > 0); |
| } |