1 2/* 3 * Debug routines which directly access the uart. 4 */ 5 6#include <linux/types.h> 7#include <asm/galileo-boards/ev96100.h> 8 9 10//#define SERIAL_BASE EV96100_UART0_REGS_BASE 11#define SERIAL_BASE 0xBD000020 12#define NS16550_BASE SERIAL_BASE 13 14#define SERA_CMD 0x0D 15#define SERA_DATA 0x08 16//#define SERB_CMD 0x05 17#define SERB_CMD 20 18#define SERB_DATA 0x00 19#define TX_BUSY 0x20 20 21#define TIMEOUT 0xffff 22#undef SLOW_DOWN 23 24static const char digits[16] = "0123456789abcdef"; 25static volatile unsigned char * const com1 = (unsigned char *)SERIAL_BASE; 26 27 28#ifdef SLOW_DOWN 29static inline void slow_down() 30{ 31 int k; 32 for (k=0; k<10000; k++); 33} 34#else 35#define slow_down() 36#endif 37 38void 39putch(const unsigned char c) 40{ 41 unsigned char ch; 42 int i = 0; 43 44 do { 45 ch = com1[SERB_CMD]; 46 slow_down(); 47 i++; 48 if (i>TIMEOUT) { 49 break; 50 } 51 } while (0 == (ch & TX_BUSY)); 52 com1[SERB_DATA] = c; 53} 54 55void 56putchar(const unsigned char c) 57{ 58 unsigned char ch; 59 int i = 0; 60 61 do { 62 ch = com1[SERB_CMD]; 63 slow_down(); 64 i++; 65 if (i>TIMEOUT) { 66 break; 67 } 68 } while (0 == (ch & TX_BUSY)); 69 com1[SERB_DATA] = c; 70} 71 72void 73puts(unsigned char *cp) 74{ 75 unsigned char ch; 76 int i = 0; 77 78 while (*cp) { 79 do { 80 ch = com1[SERB_CMD]; 81 slow_down(); 82 i++; 83 if (i>TIMEOUT) { 84 break; 85 } 86 } while (0 == (ch & TX_BUSY)); 87 com1[SERB_DATA] = *cp++; 88 } 89 putch('\r'); 90 putch('\n'); 91} 92 93void 94fputs(unsigned char *cp) 95{ 96 unsigned char ch; 97 int i = 0; 98 99 while (*cp) { 100 101 do { 102 ch = com1[SERB_CMD]; 103 slow_down(); 104 i++; 105 if (i>TIMEOUT) { 106 break; 107 } 108 } while (0 == (ch & TX_BUSY)); 109 com1[SERB_DATA] = *cp++; 110 } 111} 112 113 114void 115put64(uint64_t ul) 116{ 117 int cnt; 118 unsigned ch; 119 120 cnt = 16; /* 16 nibbles in a 64 bit long */ 121 putch('0'); 122 putch('x'); 123 do { 124 cnt--; 125 ch = (unsigned char)(ul >> cnt * 4) & 0x0F; 126 putch(digits[ch]); 127 } while (cnt > 0); 128} 129 130void 131put32(unsigned u) 132{ 133 int cnt; 134 unsigned ch; 135 136 cnt = 8; /* 8 nibbles in a 32 bit long */ 137 putch('0'); 138 putch('x'); 139 do { 140 cnt--; 141 ch = (unsigned char)(u >> cnt * 4) & 0x0F; 142 putch(digits[ch]); 143 } while (cnt > 0); 144} 145