📄 serial_io.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 + -