?? console.c
字號:
#include <stdarg.h>
#include "anyka_types.h"
#include "anyka_cpu.h"
#include "system.h"
#include "console.h"
/* @brief 根據PLL的RATIO(跳頻)計算ASIC主頻.
*
* @note 外部晶振必須為24MHz!而Divider1[15:0]=0(復位值)
計算公式:
12MHz x (Ratio[2:0] + 2)
*/
unsigned int calculate_ASIC_clock(void)
{
unsigned int ratio;
unsigned int ASIC_clock;
HAL_READ_UINT32(0x20090030, ratio);
ratio >>= 29;
ratio &= 0x7;
if (ratio < 0x02)
ASIC_clock = 60 * 1000000; // 60MHz
else if (ratio > 0x04)
ASIC_clock = 84 * 1000000; // 84MHz
else
ASIC_clock = 72 * 1000000; // 72MHz
return (ASIC_clock);
}
int console_init(void)
{
unsigned int ASIC_clock, divider;
ASIC_clock = calculate_ASIC_clock();
divider = ASIC_clock/16/115200;
HAL_WRITE_UINT32(URT_SERIAL1_BASE+URT_BAUD_LO, divider & 0xff); // 84MHz, 115200
HAL_WRITE_UINT32(URT_SERIAL1_BASE+URT_BAUD_HI, (divider >> 8) & 0xff);
HAL_WRITE_UINT32(URT_SERIAL1_BASE+URT_STAT,0x0);
HAL_WRITE_UINT32(URT_SERIAL1_BASE+URT_INT_MODE,0x108);
HAL_WRITE_UINT32(URT_SERIAL1_BASE+URT_INT_ENA,0x0);
return 0;
}
int console_write(char c)
{
unsigned long status;
while(1){
HAL_READ_UINT32(URT_SERIAL1_BASE + URT_STAT,status);
if(status & XMIT_FIFO_FULL)
continue;
else
break;
}
HAL_WRITE_UINT8(URT_SERIAL1_BASE,c);
}
int putch(char ch)
{
return console_write(ch);
}
int puts(const char *s)
{
while (*s != 0) {
putch(*s++);
}
return 0;
}
/*
void gets(char *s, int n)
{
char *p;
int ch;
int i ;
p = s;
for(i = 0 ;; i ++) {
ch = getch();
if (ch == KEY_ENTER)
{
putch(LF);
putch(CR);
break;
}
if (ch == KEY_BACKSPACE)
{
if (i == 0 )
continue;
else
{
putch(ch);
i--;
}
if(p > s)
{
p--;
putch(ch);
continue;
}
}
if ((p - s) < (n - 1))
{
i++;
*p++ = (char)ch;
putch(ch);
}
}
*p = '\0';
return ;
}
*/
void print_0nx(char ch2, unsigned long l)
{
unsigned char ch;
int i;
ch2 = ch2 - '0';
for (i = ch2 - 1; i >= 0; i--) {
ch = (l >> (i * 4)) & 0x0f;
if (ch < 10)
putch(ch + '0');
else
putch(ch - 10 + 'a');
}
}
void print_d(unsigned long l)
{
unsigned long t;
unsigned char ch;
int i, j, k ;
char buf[8];
if (l == 0)
{
putch('0');
return;
}
memset(buf,'0',8);
t = l;
k = 7;
for(;;)
{
if (t > 9)
{
i = t % 10;
}else
i = t;
if (i < 10){
buf[k--] = i + '0';
}
if (t < 9)
break;
t /= 10;
}
j = 0;
for(i =0 ;i < 8 ; i ++)
{
if(buf[i] != '0')
j = 1;
if (j)
putch(buf[i]);
}
/* unsigned long prod, t;
int flag = 0;
unsigned char ch;
int i, j;
for (i = 15; i >= 0; i--) {
prod = 1;
t = l;
for (j = 0; j < i; j++) {
prod = prod * 10;
t = t / 10;
}
ch = t;
l -= prod * t;
if (ch == 0 && flag == 0)
continue;
if (ch < 10)
putch(ch + '0');
else
putch('?');
flag = 1;
}
*/
}
void print_x(unsigned long l)
{
unsigned long t;
unsigned char ch;
int i, j, k ;
char buf[8];
memset(buf,'0',8);
t = l;
k = 7;
for(;;)
{
if (t > 15)
{
i = t % 16;
}else
i = t;
if (i < 10){
buf[k--] = i + '0';
}
else
if(i < 16)
{
buf[k--] = i -10 +'a';
}
if (t < 15)
break;
t >>= 4;
}
for(i =0 ;i < 8 ; i ++)
putch(buf[i]);
}
int printf(const char *s, ...)
{
va_list ap;
unsigned long arg;
const char *str;
char ch1, ch2, ch3;
va_start(ap, s);
while (*s != 0) {
if (*s == '%') {
s++;
ch1 = *s++;
if (ch1 == 's') {
str = va_arg(ap, unsigned char *);
puts(str);
}else if (ch1 == 'd') {
arg = va_arg(ap, unsigned long);
print_d(arg);
}
else if (ch1 == 'x') {
arg = va_arg(ap, unsigned long);
print_x(arg);
}else {
ch2 = *s++;
ch3 = *s++;
arg = va_arg(ap, unsigned long);
print_0nx(ch2, arg);
}
} else
putch(*s++);
}
va_end(ap);
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -