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

📄 mpc860_smc.c

📁 符合日本著名的ITRON规范的开源操作系统。 TOPPERS/JSP内核就是TOPPERS工程按μITRON4.0研发的第一个 软件
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *  TOPPERS/JSP Kernel *      Toyohashi Open Platform for Embedded Real-Time Systems/ *      Just Standard Profile Kernel *  *  Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory *                              Toyohashi Univ. of Technology, JAPAN *  Copyright (C) 2001-2004 by Industrial Technology Institute, *                              Miyagi Prefectural Government, JAPAN *  *  惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation  *  によって给山されている GNU General Public License の Version 2 に淡 *  揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア *  を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· *  网脱と钙ぶ∷することを痰浸で钓满するˉ *  (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 *      涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 *      スコ〖ド面に崔まれていることˉ *  (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 *      脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 *      荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 *      の痰瘦沮惮年を非很することˉ *  (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 *      脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ *      とˉ *    (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 *        侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *    (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに *        鼠桂することˉ *  (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 *      巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ *  *  塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お *  よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も *  崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 *  儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ *  *  @(#) $Id: mpc860_smc.c,v 1.2 2004/10/07 17:10:56 honda Exp $ *//* *   MPC860柒垄シリアルˇマネ〖ジメントコントロ〖ラSMC1脱 词白ドライバ *     *    SMC1のみをサポ〖トしている * *    smc.{c,h}とhw_serial.hの尸充の答洁 *      ˇsmc.{c,h}¨シリアルデバイスに巴赂する婶尸のみ淡揭 *      ˇhw_serial.h¨充哈みコントロ〖ラ巴赂 *       *      ˇクロック件侨眶巴赂について *        ˇデバイス巴赂のパラメ〖タはmpc860_smc.c柒で脱罢する。 *        ˇ络傅のクロック件侨眶はコンパイルオプションとして涂える */#include <s_services.h>#include <mpc860_smc.h>/* *  コントロ〖ルレジスタの年盗 *//*  SMCモ〖ドレジスタ  */#define SMCMR1          (VH *)(IMMR_BASE + 0xa82)#define SMCMR_SM_UART   BIT10_16    /*  SMCモ〖ド¨UART  */#define SMCMR_TEN       BIT14_16    /*  SMC流慨イネ〖ブル  */#define SMCMR_REN       BIT15_16    /*  SMC减慨イネ〖ブル  *//* *  30.2.3 パラメ〖タRAM *//*  バッファˇディスクリプタBDの黎片アドレス  */#define BD1_BASE    (IMMR_BASE + 0x3e80)#define RBASE1      (VH *)BD1_BASE          /*  RxBDベ〖スアドレス  */#define TBASE1      (VH *)(BD1_BASE+2)      /*  TxBDベ〖スアドレス  */#define RFCR1       (VB *)(BD1_BASE+4)      /*  减慨ファンクションコ〖ド  */					    /*  バイト界∈减慨∷  */#if SIL_ENDIAN == SIL_ENDIAN_BIG	    /* ビッグエンディアン */#define RFCR_BO     0x10#else /* SIL_ENDIAN == SIL_ENDIAN_BIG */    /* リトルエンディアン */#define RFCR_BO	    0x08#endif /* SIL_ENDIAN == SIL_ENDIAN_BIG */#define TFCR1       (VB *)(BD1_BASE+5)      /*  流慨ファンクションコ〖ド  */					    /*  バイト界∈流慨∷  */#if SIL_ENDIAN == SIL_ENDIAN_BIG	    /* ビッグエンディアン */#define TFCR_BO     0x10#else /* SIL_ENDIAN == SIL_ENDIAN_BIG */    /* リトルエンディアン */#define TFCR_BO	    0x08#endif /* SIL_ENDIAN == SIL_ENDIAN_BIG *//* *  30.3.2 UARTの眷圭のパラメ〖タRAM */#define MRBLR1      (VH *)(BD1_BASE+6)      /*  呵络减慨バッファ墓  */#define RBPTR1      (VH *)(BD1_BASE+0x10)   /*  RxBDポインタ  */#define TBPTR1      (VH *)(BD1_BASE+0x20)   /*  TxBDポインタ  */                                            /*  呵络アイドルキャラクタ眶  */#define MAX_IDL1    (VH *)(BD1_BASE+0x28)#define IDLC1       (VH *)(BD1_BASE+0x2a)   /*  办箕アイドルˇカウンタ  */#define BRKLN1      (VH *)(BD1_BASE+0x2c)   /*  呵姜减慨ブレ〖ク墓  */                                            /*  减慨ブレ〖ク掘凤カウンタ  */#define BRKEC1      (VH *)(BD1_BASE+0x2e)                                    /*  ブレ〖クカウントレジスタ∈流慨∷  */#define BRKCR1      (VH *)(BD1_BASE+0x30)#define R_MASK1     (VH *)(BD1_BASE+0x32)   /*  办箕ビットˇマスク  *//* *  デュアルポ〖トˇメモリ惧に澄瘦する挝拌 *//* *  バッファˇディスクリプタBDのベ〖スアドレス */#define RxBD_BASE_ADDRESS   0x0     /*  RxBDベ〖スアドレス  */#define TxBD_BASE_ADDRESS   0x8     /*  TxBDベ〖スアドレス  *//*  30.3.10 减慨脱バッファディスクリプタRxBD  */#define RxBD        (DUAL_PORT_RAM + RxBD_BASE_ADDRESS)#define RxBD_STATUS (VH *)RxBD     	/*  ステ〖タスと扩告  */#define RxBD_LENGTH (VH *)(RxBD+2) 	/*  デ〖タ墓  */#define RxBD_BUFFP  (VW *)(RxBD+4) 	/*  减慨バッファポインタ  *//*  30.3.11 流慨脱バッファディスクリプタTxBD  */#define TxBD        (DUAL_PORT_RAM + TxBD_BASE_ADDRESS)#define TxBD_STATUS (VH *)TxBD     	/*  ステ〖タスと扩告  */#define TxBD_LENGTH (VH *)(TxBD+2) 	/*  デ〖タ墓  */#define TxBD_BUFFP  (VW *)(TxBD+4) 	/*  流慨バッファポインタ  *//*  减慨脱バッファディスクリプタRxBD  *//*   ≈ステ〖タスと扩告∽フィ〖ルドの年眶  */#define RxBD_STATUS_E       BIT0_16     /*  鄂球  */#define RxBD_STATUS_W       BIT2_16     /*  ラップ  */#define RxBD_STATUS_I       BIT3_16     /*  充哈み  */#define RxBD_STATUS_CM      BIT6_16     /*  费鲁モ〖ド  */#define RxBD_STATUS_ID      BIT7_16     /*  アイドル减慨  */#define RxBD_STATUS_BR      BIT10_16    /*  ブレ〖ク减慨  */#define RxBD_STATUS_FR      BIT11_16    /*  フレ〖ミングˇエラ〖  */#define RxBD_STATUS_PR      BIT12_16    /*  パリティˇエラ〖  */#define RxBD_STATUS_OV      BIT14_16    /*  オ〖バ〖ラン  *//* 流慨脱バッファディスクリプタTxBD  *//*   ≈ステ〖タスと扩告∽フィ〖ルドの年眶  */#define TxBD_STATUS_R       BIT0_16     /*  レディ  */#define TxBD_STATUS_W       BIT2_16     /*  ラップ  */#define TxBD_STATUS_I       BIT3_16     /*  充哈み  */#define TxBD_STATUS_CM      BIT6_16     /*  费鲁モ〖ド  */#define TxBD_STATUS_P       BIT7_16     /*  プリアンブル  *//*  30.3.12 SMC UARTイベントレジスタ  */#define SMCE1           (VB *)(IMMR_BASE + 0xa86)#define SMCE_BRKE       BIT1_8      /*  ブレ〖ク呵姜  */#define SMCE_BRK        BIT3_8      /*  ブレ〖クキャラクタ减慨  */#define SMCE_BSY        BIT5_8      /*  ビジ〖掘凤  */#define SMCE_TX         BIT6_8      /*  流慨バッファ  */#define SMCE_RX         BIT7_8      /*  减慨バッファ  *//*  SMC UARTマスクレジスタ  */#define SMCM1           (VB *)(IMMR_BASE + 0xa8a)#define SMCM_BRKE       BIT1_8      /*  ブレ〖ク呵姜  */#define SMCM_BRK        BIT3_8      /*  ブレ〖クキャラクタ减慨  */#define SMCM_BSY        BIT5_8      /*  ビジ〖掘凤  */#define SMCM_TX         BIT6_8      /*  流慨バッファ  */#define SMCM_RX         BIT7_8      /*  减慨バッファ  */#define PIC_BUFFER_SIZE     1      		/*  バッファサイズ  */volatile static UB Rx_buffer[PIC_BUFFER_SIZE];	/*  减慨バッファ  */volatile static UB Tx_buffer[PIC_BUFFER_SIZE];	/*  流慨バッファ  *//* *  ボ〖レ〖ト肋年脱年眶 *   *   润票袋の眷圭は∵16クロックを脱いるので16で充っている *  ∈ユ〖ザ〖の肋年で16尸件しているわけではない∷ *   */#define MHZ		1000000#define BRGC1_CD_VAL		\	(((SYSTEM_CLOCK * MHZ * 10 + 10) / (16 * BAUD_RATE * 10)) - 1) /*  BRGC1レジスタのCDフィ〖ルドは20ビットに扩嘎されている  */#if (BRGC1_CD_VAL & ~0xfffff) != 0 ここでコンパイルエラ〖#endif/* *  尸件孺とビットレ〖トの肋年 * *//* *  ボ〖レ〖ト肋年稿、クロックが奥年するまでの略ち箕粗 *   ∈呵介の1ビット尸∷  *  BPS=9600bpsの眷圭 *   t = 1 / BPS = 104,167 = 105,000[nsec] */#define SMC_1BIT_TIME 	105000/* *  シリアルI/Oポ〖ト瓷妄ブロックの年盗 *   2chサポ〖トに橙磨する眷圭は介袋猛脱のデ〖タも崔める */struct sio_port_control_block {	VP_INT		exinf;		/* 橙磨攫鼠 */	BOOL		openflag;	/* オ〖プン貉みフラグ */};/* *  シリアルI/Oポ〖ト瓷妄ブロックのエリア *    ID = 1 をSMC1に滦炳させているˉ */static SIOPCB	siopcb_table[TNUM_SIOP];/* *  シリアルI/Oポ〖トIDから瓷妄ブロックを艰り叫すためのマクロ */#define INDEX_SIOP(siopid)	((UINT)((siopid) - 1))#define get_siopcb(siopid)	(&(siopcb_table[INDEX_SIOP(siopid)]))#define	CODE_LF		0x0a		/*  猖乖コ〖ド  *//*  キャラクタ流慨稿の略ち箕粗  */#ifdef DOWNLOAD_TO_RAM      /*  デバッグ脱  */#define	DELAY_CH	      0		/*  奶撅のキャラクタ  */#define	DELAY_LF	5000000		/*  猖乖コ〖ド  */#else /* DOWNLOAD_TO_RAM */ /*  ROM步  */#define	DELAY_CH	4000000		/*  奶撅のキャラクタ  */#define	DELAY_LF	1000000		/*  猖乖コ〖ド  */#endif /* DOWNLOAD_TO_RAM *//* *  矢机を减慨できるか々 */Inline BOOLsmc_getready(SIOPCB *siopcb){	VH status;		status = mpc860_reh_mem(RxBD_STATUS);	return(!(status & RxBD_STATUS_E));}/* *  矢机を流慨できるか々 */Inline BOOLsmc_putready(SIOPCB *siopcb){	VH status;	status = mpc860_reh_mem(TxBD_STATUS);	return(!(status & TxBD_STATUS_R));}/* *  减慨した矢机の艰叫し */Inline charsmc_getchar(SIOPCB *siopcb){	char c;	SIL_PRE_LOC;		SIL_LOC_INT();		/*  充哈み敦贿  */    	c = Rx_buffer[0];    	    	/*  庙罢¨减慨バッファサイズが1の眷圭のみ铜跟  */    	mpc860_orh_mem(RxBD_STATUS, RxBD_STATUS_E);    	SIL_UNL_INT();		/*  充哈み钓材  */    	return(c);}/* *  流慨する矢机の今哈み */Inline voidsmc_putchar(SIOPCB *siopcb, char c){	SIL_PRE_LOC;	SIL_LOC_INT();		/*  充哈み敦贿  */    	Tx_buffer[0] = c;    	    	/*  庙罢¨流慨バッファサイズが1の眷圭のみ铜跟  */    	mpc860_orh_mem(TxBD_STATUS, TxBD_STATUS_R);    	    	SIL_UNL_INT();		/*  充哈み钓材  */	/*	 *  矢机步けを松ぐため、略ち箕粗を掐れる	 */	sil_dly_nse(DELAY_CH);    	/*  猖乖コ〖ドの眷圭  */    	if (c == CODE_LF) {		sil_dly_nse(DELAY_LF);	}}/* *  SIOドライバの介袋步ル〖チン */voidsmc_initialize(){	SIOPCB	*siopcb;	UINT	i;	/*	 *  シリアルI/Oポ〖ト瓷妄ブロックの介袋步	 */	for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {		siopcb->openflag = FALSE;	}}/* *  オ〖プンしているポ〖トがあるか々 */BOOLsmc_openflag(void){	return(siopcb_table[0].openflag);}/* *  シリアルI/Oポ〖トのオ〖プン */

⌨️ 快捷键说明

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