📄 mpc860_smc.c
字号:
/* * 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 + -