139 строки
2.0 KiB
C
139 строки
2.0 KiB
C
|
|
/*
|
|
* 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);
|
|
}
|