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

📄 hw_serial.c

📁 符合日本著名的ITRON规范的开源操作系统。 TOPPERS/JSP内核就是TOPPERS工程按μITRON4.0研发的第一个 软件
💻 C
字号:
/* *  TOPPERS/JSP Kernel *      Toyohashi Open Platform for Embedded Real-Time Systems/ *      Just Standard Profile Kernel *  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory *                              Toyohashi Univ. of Technology, JAPAN *  *  惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation  *  によって给山されている GNU General Public License の Version 2 に淡 *  揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア *  を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· *  网脱と钙ぶ∷することを痰浸で钓满するˉ *  (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 *      涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 *      スコ〖ド面に崔まれていることˉ *  (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 *      脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 *      荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 *      の痰瘦沮惮年を非很することˉ *  (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 *      脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ *      とˉ *    (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 *        侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *    (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに *        鼠桂することˉ *  (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 *      巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ *  *  塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お *  よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も *  崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 *  儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ *  *  @(#) $Id: hw_serial.c,v 1.4 2003/12/15 05:41:20 takayuki Exp $ *//* *	シリアルI/Oデバイス∈SIO∷ドライバ∈M32102柒垄润票袋シリアル脱∷ */#include <sil.h>#include <hw_serial.h>#include <cpu_rename.h>#include <sys_rename.h>SIOPCB siopcb_table[TNUM_PORT];extern FP InterruptHandlerEntry[];	/* 侯度脱簇眶 */#define ID_PORT(x)		((x) + 1)#define INDEX_PORT(x)	((x) - 1)#define GET_SIOPCB(x)	(&siopcb_table[INDEX_PORT(x)])/* *  シリアルポ〖トの介袋步 */voidsio_initialize(void){	int i;	for(i=0;i<TNUM_PORT;i++)	{		siopcb_table[i].flags = SIO_TYP_M32RUART;		siopcb_table[i].port  = i;		siopcb_table[i].exinf = 0;		InterruptHandlerEntry[INT_SIO0RCV + (siopcb_table[i].port * 2) - 1] = sio_handler_in;		InterruptHandlerEntry[INT_SIO0XMT + (siopcb_table[i].port * 2) - 1] = sio_handler_out;	}}/* *  シリアルI/Oポ〖トのオ〖プン */SIOPCB *sio_opn_por(ID siopid, VP_INT exinf){	SIOPCB * siopcb = GET_SIOPCB(siopid);		//橙磨攫鼠の呈羌	siopcb->exinf = exinf;	switch(SIO_TYP(siopcb->flags))	{	case SIO_TYP_M32RUART:			/* UART介袋步 */		sil_wrb_mem((void *)(SIOCR(siopcb->port)+3), 0);			/* ポ〖トを倡く(UART0) */		sil_wrb_mem((void *)PDATA(5), 0);		sil_wrb_mem((void *)PDIR(5),  0x80);			/* UART, Non-parity, 1 stop-bit */		sil_wrb_mem((void *)(SIOMOD0(siopcb->port)+3), 0);			/* 8bit, internal clock */		sil_wrh_mem((void *)(SIOMOD1(siopcb->port)+2), 0x0800);			/* M32R(32102) - f(BLK)=16MHzで115200bps */		sil_wrh_mem((void *)(SIOBAUR(siopcb->port)+2), SERIAL_CLKDIV);		sil_wrb_mem((void *)(SIORBAUR(siopcb->port)+3), SERIAL_CLKCMP);			/* 流减慨充哈み券栏钓材 */		sil_wrh_mem((void *)(SIOTRCR(siopcb->port)+2), 0x0006);			/* ステ〖タスクリア, 流减慨瓢侯倡幌 */		sil_wrb_mem((void *)(SIOCR(siopcb->port)+2), 0x3);		sil_wrb_mem((void *)(SIOCR(siopcb->port)+3), 0x3);			/* 减慨充哈み减烧钓材 */		sil_wrh_mem((void *)(ICUCR(SIO,siopcb->port)+2), 0x1000);		sil_wrh_mem((void *)(ICUCR(SIO,siopcb->port)+6), 0x1000);			/* TxD,RxDピン铜跟(UART0) */		sil_wrh_mem((void *)PMOD(5), 0x5500);		break;	}	return siopcb;}/* *  シリアルI/Oポ〖トのクロ〖ズ */voidsio_cls_por(SIOPCB *siopcb){	switch(SIO_TYP(siopcb->flags))	{	case SIO_TYP_M32RUART:			/* 流减慨瓢侯を敦贿する */		sil_wrb_mem((void *)(SIOCR(siopcb->port)+3), 0);		break;	}}/* *  シリアルI/Oポ〖トからの矢机减慨 */INT sio_rcv_chr(SIOPCB * siopcb){	switch(SIO_TYP(siopcb->flags))	{	case SIO_TYP_M32RUART:		return sil_reb_mem((void *)(SIORXB(siopcb->port)+3));	}	return -1;}/* *  矢机を减慨したか々 */inline BOOLhw_port_getready(SIOPCB *p){	switch(SIO_TYP(p->flags))	{	case SIO_TYP_M32RUART:		return (sil_reb_mem((void *)(SIOSTS(p->port)+3)) & 0x4) != 0 ? TRUE : FALSE;	}	return FALSE;}/* *  シリアルI/Oポ〖トからのコ〖ルバック钓材 */void sio_ena_cbr(SIOPCB * siopcb, UINT cbrtn){}/* *  シリアルI/Oポ〖トからのコ〖ルバック敦贿 */void sio_dis_cbr(SIOPCB * siopcb, UINT cbrtn){}void sio_handler_in(void){	int port;	for(port = 0; port < TNUM_PORT; ++ port)	{		if( hw_port_getready(&siopcb_table[port]) == TRUE )			sio_ierdy_rcv(GET_SIOPCB(ID_PORT(port))->exinf);	}}void sio_handler_out(void){	int port;	for(port = 0; port < TNUM_PORT; ++ port)	{		if((siopcb_table[port].flags & SIO_STS_SENDING) != 0)		{				//流慨ステ〖タス介袋步			sil_wrb_mem((void *)(SIOCR(port)+2), 0x1);			siopcb_table[port].flags &= ~SIO_STS_SENDING;			sio_ierdy_snd(GET_SIOPCB(ID_PORT(port))->exinf);		}	}}

⌨️ 快捷键说明

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