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

📄 serial_io.c

📁 T-kernel T-monitor Sample
💻 C
字号:
/******************************************************************************
*serial_io.c
*putstring services
*Copyright (C) 2004
*T-Engine Application Development Centre (TEADEC)
*License: T-License
*
*Update
*Rev.	Date			Reviser			Description
*1.0	2004/04/02		Jai/Rss/Sin		First release
******************************************************************************/
/*""FILE COMMENT""*************************************************************
*       System Name : RENESAS T-Engine, micro T-Engine
*       File Name   : serial_io.c
*       Version     : 1.00.00
*       Contents    : Monitor service function
*       Model       : SH7727 T-Engine
*       CPU         : SH7727
*       Compiler    : GNU
*       OS          : T-Kernel, T-Kernel/Standard Extension
*       note        : The Software is being delivered to you "AS IS" 
*                   : and Renesas,whether explicitly or implicitly makes  
*                   : no warranty as to its Use or performance. 
*                   : RENESAS AND ITS SUPPLIER DO NOT AND CANNOT WARRANT 
*                   : THE PERFORMANCE OR RESULTS YOU MAY OBTAIN  BY USING 
*                   : THE SOFTWARE. AS TO ANY MATTER INCLUDING WITHOUT 
*                   : LIMITATION NONINFRINGEMENT OF THIRD PARTY RIGHTS,
*                   : MERCHANTABILITY, INTEGRATION, SATISFACTORY QUALITY, 
*                   : OR FITNESS FOR ANY PARTICULAR PURPOSE.
*
*       Copyright (c) 2004 RENESAS TECHNOLOGY CORP. All Rights Reserved.
*       AND RENESAS SOLUTIONS CORP. All Rights Reserved.
*       history     : 2006.02.03 ver.1.00.00
*""FILE COMMENT END""*********************************************************/
#include <machine.h>
#include <tk/syslib.h>
#include <tm/tmonitor.h>
#include "tmonitor.h"
#include <device/clk.h>

#if USE_CONSOLE_DRIVER == 0

#define _USE_UART

#ifndef _USE_UART						// internal SCI
#define SCI_TDRE_CHECK	0x0080
#define SCI_TDRE_CLEAR	0x0078
#define SCBRR_VALUE		19

#define SCSCR_INIT 	0x0030 				// TIE=0,RIE=0,TE=1,RE=1

#define SCSMR	0xfffffe80
#define SCBRR	0xfffffe82
#define SCSCR	0xfffffe84
#define SCTDR	0xfffffe86
#define SCSSR	0xfffffe88
#define SCRDR	0xfffffe8a
#define SCPDR	0xa4000136
#define SCPCR	0xa4000116

#define RFCR    0xffffff74
#define WAIT_RFCR_COUNTER	500

#else	/* UART st16c2550 ch.B (EXAR) */

#define THR_EMPTY_CHECK	0x0020

#define RHR_THR	0xbb000000			// LCR[7] = 0
#define	DLL		0xbb000000			// LCR[7] = 1
#define	IER		0xbb000002			// LCR[7] = 0
#define	DLM		0xbb000002			// LCR[7] = 1
#define ISR_FCR	0xbb000004
#define LCR		0xbb000006
#define MCR		0xbb000008
#define LSR		0xbb00000A
#define MSR		0xbb00000C
#define SPR		0xbb00000E

#endif
#endif /* USE_CONSOLE_DRIVER */

#define	TM_MONITOR		0
#define	TM_GETCHAR		1
#define	TM_PUTCHAR		2
#define	TM_GETLINE		3
#define	TM_PUTSTRING	4
#define	TM_COMMAND		5
#define	TM_READDISK		6
#define	TM_WRITEDISK	7
#define	TM_INFODISK		8
#define	TM_EXIT			9

#define	TM_EXTSVC		255

#if USE_CONSOLE_DRIVER == 0
/******************************************************************************
******************************************************************************/
EXPORT int CheckTdre(void)
{
	unsigned short status;

#ifndef _USE_UART
	status = in_h(SCSSR);
	return (status & SCI_TDRE_CHECK);
#else	/*st16c2550 ch B (EXAR)*/
	status = in_h(LSR);
	return (status & THR_EMPTY_CHECK);
#endif
}


/******************************************************************************/
/*	_putChar		T-Monitor program service                                 */
/******************************************************************************/
void _putChar (char ch)
{
	unsigned short data = (unsigned short)ch;

	while (!CheckTdre());

#ifndef _USE_UART
	in_b(SCSSR);
	out_b(SCSSR, SCI_TDRE_CLEAR);
	out_b(SCTDR, ch);
#else	/*st16c2550 ch B (EXAR)*/
	out_h(RHR_THR, data);
#endif
}


/******************************************************************************/
/*	_putString		T-Monitor program service                                 */
/******************************************************************************/
EXPORT void _putString (char *str)
{
	char *p;

	out_h(LCR, 0x0003);		/*LCR[7] = 0*/
	for (p = str; *p; p++)
	{
		if (*p == '\n')
			_putChar('\r');
		_putChar(*p);
	}
}


/******************************************************************************/
/*	Serial initalization routine                                              */
/******************************************************************************/
EXPORT void init_serial(void)
{
#ifndef _USE_UART
	unsigned short data;

	out_h(SCSCR, 0x0000);	/* TE=0, RE=0, CKE1=0 */
	out_h(SCSMR, 0x0000);	/* CHR=0, PE=0, STOP=0, CKSx=00 */
	/* 8-data bit, non-parity, 1 stop bit, pf/1 clock */

	out_b(SCBRR, SCBRR_VALUE);

	out_h(RFCR, 0xa400);		/* Refresh counter clear */
	while(in_h(RFCR) < WAIT_RFCR_COUNTER);

	/* For SH7709, SH7709A, SH7729 */
    /* We need to set SCPCR to enable RTS/CTS */
    data = in_h(SCPCR);
    /* Clear out SCP7MD1, 0, SCP4MD1, 0, Set SCP6MD1,0 = {01} (output)*/
    out_h(SCPCR, (data & 0x0fcf) | 0x1000);

    data = in_b(SCPDR);
    /* Set /RTS2 (bit6) = 0 */
    out_b(SCPDR, data & 0xbf);

	out_h(SCSCR, SCSCR_INIT);

#else /*st16c2550 jai/Rss/Sin 06042004*/

	out_h(LCR, 0x0080);		/*LCR[7] = 1*/
	/*divisor (dec) = clk hz / (baud rate * 16)*/

	out_h(DLL, 0x0004);		/*LSByte*/
	out_h(DLM, 0x0000);		/*MSByte 115200 bps*/

	out_h(LCR, 0x0000);		/*LCR[7] = 0*/
	out_h(IER, 0x000d);

	out_h(ISR_FCR, 0x00c1);
	out_h(MCR, 0x000b);
	out_h(LCR, 0x0003);		/*8 data, no parity, 1 stop bit LCR[7] = 0*/
#endif

	/**/
	_putString ("\nRSS bootstrap Version 1.00.00\n\0"); // jai/RSS/Sin 05042004
	return;
}
#endif /* USE_CONSOLE_DRIVER */

/******************************************************************************/
/*	Extended SVC handler for T-Monitor program service                        */
/******************************************************************************/
EXPORT void tm_services(int r4, int fn_code)
{
ER	ercd;
W	size, asize;

	switch (fn_code)
	{
		case TM_MONITOR:
			while(1);
			break;
		
		case TM_GETCHAR:
			break;

		case TM_PUTCHAR:
#if USE_CONSOLE_DRIVER == 0
			_putChar((char)r4);
#else
			ercd = serial_out(0, (B *)r4, sizeof(char), &asize, TMO_FEVR);
#endif
			break;

		case TM_GETLINE:
			break;

		case TM_PUTSTRING:
#if USE_CONSOLE_DRIVER == 0
			_putString((char *)r4);
#else
			size = (W)strlen((B *)r4);
			ercd = serial_out(0, (B *)r4, size, &asize, TMO_FEVR);
#endif
			break;

		case TM_COMMAND:
			break;

		case TM_READDISK:
			break;

		case TM_WRITEDISK:
			break;

		case TM_INFODISK:
			break;

		case TM_EXIT:
			while(1);
			break;

		case TM_EXTSVC:
			break;
	}
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -