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

📄 sh7615scif.c

📁 toppers操作系统源码
💻 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 *  Copyright (C) 2000-2003 by Industrial Technology Institute, *                              Miyagi Prefectural Government, JAPAN *  Copyright (C) 2002-2004 by Hokkaido Industrial Research Institute, JAPAN *  *  惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation  *  によって给山されている GNU General Public License の Version 2 に淡 *  揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア *  を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· *  网脱と钙ぶ∷することを痰浸で钓满するˉ *  (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 *      涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 *      スコ〖ド面に崔まれていることˉ *  (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 *      脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 *      荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 *      の痰瘦沮惮年を非很することˉ *  (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 *      脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ *      とˉ *    (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 *        侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *    (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに *        鼠桂することˉ *  (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 *      巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ *  *  塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お *  よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も *  崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 *  儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ *  *  @(#) $Id: sh7615scif.c,v 1.3 2005/07/06 00:45:07 honda Exp $ *//* *   SH2柒垄シリアルコミュニケ〖ションインタフェ〖スSCIF脱 词白ドライバ */#include <s_services.h>#include "sh7615scif.h"/* *  シリアルI/Oポ〖ト瓷妄ブロックの年盗 *//* 掐叫蜗ポ〖トの肋年はsys_config.c *//* 充哈みベクタ戎规の肋年はhw_serial.h *//* 瓷妄ブロックの肋年はsh7615scif.c */#ifndef GDB_STUBconst SIOPINIB siopinib_table[TNUM_PORT] = {	{0xfffffcc0, BRR9600, 0x0, 6}, /* SCIF1 */#if TNUM_PORT >= 2	{0xfffffce0, BRR9600, 0x0, 6}, /* SCIF2 */#endif /* TNUM_PORT >= 2 */};#else /* GDB_STUB */const SIOPINIB siopinib_table[TNUM_PORT] = {	{0xfffffce0, BRR9600, 0x0, 6}, /* SCIF2 */};#endif /* GDB_STUB */#if defined(TTM)/* *  シリアルI/Oポ〖ト瓷妄ブロックの年盗 *   2chサポ〖トに橙磨する眷圭は介袋猛脱のデ〖タも崔める */struct sio_port_control_block{	VP_INT exinf;				/* 橙磨攫鼠 */	BOOL openflag;				/* オ〖プン貉みフラグ */};#endif/* *  シリアルI/Oポ〖ト瓷妄ブロックのエリア */static SIOPCB siopcb_table[TNUM_PORT];/* *  シリアルI/Oポ〖トIDから瓷妄ブロックを艰り叫すためのマクロ */#define INDEX_SIOP(siopid)	((UINT)((siopid) - 1))#define get_siopcb(siopid)	(&(siopcb_table[INDEX_SIOP(siopid)]))/* *  矢机を减慨できるか々 */Inline BOOLsh2scif_getready (SIOPCB * siopcb){	/*  レシ〖ブデ〖タレジスタフルˇフラグのチェック  */	return (sil_reh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR)) &			SC1SSR_RDRF);}/* *  矢机を流慨できるか々 */Inline BOOLsh2scif_putready (SIOPCB * siopcb){	/*  トランスミットFIFOデ〖タレジスタエンプティˇフラグのチェック */	return (sil_reh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR)) &			SC1SSR_TDFE);}/* *  减慨した矢机の艰叫し */Inline charsh2scif_getchar (SIOPCB * siopcb){	VB data;	data = sil_reb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFRDR));	/*  レシ〖ブデ〖タレジスタフルˇフラグのクリア  */	sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR),				 sil_reh_mem ((VH *) (siopcb->siopinib->reg_base +									  SCIF_SC1SSR)) & ~SC1SSR_RDRF);	return data;}/* *  流慨する矢机の今哈み */Inline voidsh2scif_putchar (SIOPCB * siopcb, char c){	/*  トランスミットFIFOデ〖タレジスタエンプティˇフラグのクリア */	sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFTDR), c);	sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR),				 sil_reh_mem ((VH *) (siopcb->siopinib->reg_base +									  SCIF_SC1SSR)) & ~SC1SSR_TDFE);}/* *  SIOドライバの介袋步ル〖チン */voidsh2scif_initialize (){	SIOPCB *siopcb;	UINT i;	/*	 *  シルアルI/Oポ〖ト瓷妄ブロックの介袋步	 */	for (siopcb = siopcb_table, i = 0; i < TNUM_PORT; siopcb++, i++) {		siopcb->openflag = FALSE;		siopcb->siopinib = (&siopinib_table[i]);	}}/* *  オ〖プンしているポ〖トがあるか々 */BOOLsh2scif_openflag (ID siopid){	return (siopcb_table[siopid - 1].openflag);}/* *  シリアルI/Oポ〖トのオ〖プン */SIOPCB *sh2scif_opn_por (ID siopid, VP_INT exinf){	SIOPCB *siopcb;	siopcb = get_siopcb (siopid);	/*  流减慨匿贿  */	sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR),				 sil_reb_mem ((VB *) (siopcb->siopinib->reg_base +									  SCIF_SCSCR)) & ~(SCSCR_TE | SCSCR_RE));	/*  SCIデ〖タ掐叫蜗ポ〖トの肋年  */	/*  ピンアサイン */	/* sys_initializeで肋年 */	/*  FIFOの介袋步  */	sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFCR),				 (VB) (SCFCR_TFRST | SCFCR_RFRST));	/*  流减慨フォ〖マット  */	sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSMR), 0x00);	/*  拇殊票袋及  */	/*  8ビット、パリティなし  */	/*  ストップビットレングス¨1   */	/*  クロックセレクト */	sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCBRR), (VB) siopcb->siopinib->brr);	/* ボ〖レ〖ト肋年 */	/*	 * ボ〖レ〖トの肋年稿、1カウント尸略たなければならない。	 */	sil_dly_nse (sh2scif_DELAY);	/* 猛はsh1と票じ */	/*  FIFOの肋年  */	sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFCR), 0x00);	/* エラ〖フラグをクリア */	sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR),				 sil_reh_mem ((VH *) (siopcb->siopinib->reg_base +									  SCIF_SC1SSR)) & ~SC1SSR_ER);	sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR),				 (VB) (SCSCR_RIE | SCSCR_TE | SCSCR_RE));	siopcb->exinf = exinf;	siopcb->openflag = TRUE;	return (siopcb);}/* *  シリアルI/Oポ〖トのクロ〖ズ */voidsh2scif_cls_por (SIOPCB * siopcb){	/*  流减慨匿贿、充哈み敦贿  */	sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR),				 (VB) ~ (SCSCR_TIE | SCSCR_RIE | SCSCR_TE | SCSCR_RE));	siopcb->openflag = FALSE;}/* *  シリアルI/Oポ〖トへの矢机流慨 */BOOLsh2scif_snd_chr (SIOPCB * siopcb, char c){	if (sh2scif_putready (siopcb)) {		sh2scif_putchar (siopcb, c);		return (TRUE);	}	return (FALSE);}/* *  シリアルI/Oポ〖トからの矢机减慨 */INTsh2scif_rcv_chr (SIOPCB * siopcb){	if (sh2scif_getready (siopcb)) {		return ((INT) (UB) sh2scif_getchar (siopcb));	}	return (-1);}/* *  シリアルI/Oポ〖トからのコ〖ルバックの钓材 */voidsh2scif_ena_cbr (SIOPCB * siopcb, UINT cbrtn){	switch (cbrtn) {	case SIO_ERDY_SND:			/* 流慨充り哈み妥滇を钓材 */		sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR),					 sil_reb_mem ((VB *) (siopcb->siopinib->reg_base +										  SCIF_SCSCR)) | SCSCR_TIE);		break;	case SIO_ERDY_RCV:			/* 减慨充り哈み妥滇を钓材 */		sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR),					 sil_reb_mem ((VB *) (siopcb->siopinib->reg_base +										  SCIF_SCSCR)) | SCSCR_RIE);		break;	}}/* *  シリアルI/Oポ〖トからのコ〖ルバックの敦贿 */voidsh2scif_dis_cbr (SIOPCB * siopcb, UINT cbrtn){	switch (cbrtn) {	case SIO_ERDY_SND:			/* 流慨充り哈み妥滇を敦贿 */		sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR),					 sil_reb_mem ((VB *) (siopcb->siopinib->reg_base +										  SCIF_SCSCR)) & ~SCSCR_TIE);		break;	case SIO_ERDY_RCV:			/* 减慨充り哈み妥滇を敦贿 */		sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR),					 sil_reb_mem ((VB *) (siopcb->siopinib->reg_base +										  SCIF_SCSCR)) & ~SCSCR_RIE);		break;	}}/* *  シリアルI/Oポ〖トに滦する流慨充哈み借妄 */Inline voidsh2scif_isr_siop_out (SIOPCB * siopcb){	VB scr0 = sil_reb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR));	if ((scr0 & SCSCR_TIE) != 0 && sh2scif_putready (siopcb)) {		/*		 *  流慨奶梦コ〖ルバックル〖チンを钙び叫すˉ		 */		sh2scif_ierdy_snd (siopcb->exinf);	}}/* *  シリアルI/Oポ〖トに滦する减慨充哈み借妄 */Inline voidsh2scif_isr_siop_in (SIOPCB * siopcb){	VB scr0 = sil_reb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR));	if ((scr0 & SCSCR_RIE) != 0 && sh2scif_getready (siopcb)) {		/*		 *  减慨奶梦コ〖ルバックル〖チンを钙び叫すˉ		 */		sh2scif_ierdy_rcv (siopcb->exinf);	}}/* *  シリアルI/Oポ〖トに滦する减慨エラ〖充哈み借妄 */Inline voidsh2scif_isr_siop_err (SIOPCB * siopcb){	/* エラ〖フラグをクリア */	sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR),				 sil_reh_mem ((VH *) (siopcb->siopinib->reg_base +									  SCIF_SC1SSR)) & ~SC1SSR_ER);	/*  FIFOの介袋步  */	sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFCR),				 (VB) SCFCR_RFRST);	sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFCR), 0x30);}/* ブレ〖ク浮叫借妄 *//* フラグをリセットする */Inline voidsh2scif_isr_siop_brk (SIOPCB * siopcb){	/* フラグをクリア */	sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR),				 sil_reh_mem ((VH *) (siopcb->siopinib->reg_base +									  SCIF_SC1SSR)) & ~SC1SSR_BRK);}/* *  SCI流慨充哈みサ〖ビスル〖チン sh1と票じ *   *   SH1柒垄のSCIでは充哈み戎规が流减慨侍、チャネル侍に尸かれているので、 *   SCI0の流慨充哈み笆嘲でこのル〖チンが钙ばれることはない *   */voidsh2scif_isr_out (){	if (siopcb_table[0].openflag) {		sh2scif_isr_siop_out (get_siopcb (1));	}}/* *  SCI减慨充哈みサ〖ビスル〖チン sh1と票じ *   *   SH1柒垄のSCIでは充哈み戎规が流减慨侍、チャネル侍に尸かれているので、 *   SCI0の减慨充哈み笆嘲でこのル〖チンが钙ばれることはない *   */voidsh2scif_isr_in (){	if (siopcb_table[0].openflag) {		sh2scif_isr_siop_in (get_siopcb (1));	}}/* *  SIO减慨エラ〖充哈みサ〖ビスル〖チン sh1と票じ *   *   SH1柒垄のSCIでは充哈み戎规がチャネル侍に尸かれているので、 *   SCI0の减慨エラ〖充哈み笆嘲でこのル〖チンが钙ばれることはない *    *   エラ〖借妄极挛はエラ〖フラグのクリアのみにとどめている。 *     ˇオ〖バ〖ランエラ〖 *     ˇフレ〖ミングエラ〖 *     ˇパリティエラ〖 */voidsh2scif_isr_error (void){	if (siopcb_table[0].openflag) {		sh2scif_isr_siop_err (get_siopcb (1));	}}/* ブレ〖ク浮叫 */voidsh2scif_isr_brk (void){	if (siopcb_table[0].openflag) {		sh2scif_isr_siop_brk (get_siopcb (1));	}}/* * ポ〖リングによる矢机の流慨 */voidsh2scif_putc_pol (ID portid, char c){	while (!sh2scif_putready (&siopcb_table[portid - 1]));	sh2scif_putchar (&siopcb_table[portid - 1], c);}#if TNUM_PORT >= 2/* *  SCI减慨充哈みサ〖ビスル〖チン *   */voidsh2scif_isr2_in (void){	if (siopcb_table[1].openflag) {		sh2scif_isr_siop_in (get_siopcb (2));	}}/* *  SCI流慨充哈みサ〖ビスル〖チン *   */voidsh2scif_isr2_out (void){	if (siopcb_table[1].openflag) {		sh2scif_isr_siop_out (get_siopcb (2));	}}/* *  SCI减慨エラ〖充哈みサ〖ビスル〖チン */voidsh2scif_isr2_error (void){	if (siopcb_table[1].openflag) {		sh2scif_isr_siop_err (get_siopcb (2));	}}/* ブレ〖ク浮叫 */voidsh2scif_isr2_brk (void){	if (siopcb_table[1].openflag) {		sh2scif_isr_siop_brk (get_siopcb (2));	}}#endif /* of #if TNUM_PORT >= 2 */

⌨️ 快捷键说明

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