⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 console.c

📁 启动代码
💻 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 + -