📄 hw_serial.h
字号:
/* * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2002 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * * Copyright (C) 2005 by Freelines CO.,Ltd * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: hw_serial.h,v 1.2 2005/12/12 09:08:16 honda Exp $ *//* * タ〖ゲット巴赂シリアルI/Oモジュ〖ル∈V850/KJ1+ 柒垄润票袋シリアルch0/ch1脱∷ * ボ〖レ〖ト肋年はSERIAL_COMPAREVALUEを恃构する。 * デ〖タフォ〖マットは8bit data, non-parity, 1stop-bit盖年 */#ifndef _HW_SERIAL_H_#define _HW_SERIAL_H_#include <s_services.h>/* * シリアルポ〖トの介袋步ブロック */typedef struct sio_port_initialization_block {} SIOPINIB;/* * シリアルポ〖トの扩告ブロック */typedef struct sio_port_control_block { const SIOPINIB *inib; /* 介袋步ブロック */ VP_INT exinf; /* 橙磨攫鼠 */ BOOL openflag; /* オ〖プン貉みフラグ */ int port_id; /* ポ〖ト戎规(0×) */} SIOPCB;extern SIOPCB siopcb_table[TNUM_PORT];/* * SIO ID から瓷妄ブロックへの恃垂マクロ */#define INDEX_SIO(sioid) ((UINT)((sioid) - 1))#define get_siopcb(sioid) (&(siopcb_table[INDEX_SIO(sioid)]))/* * コ〖ルバックル〖チンの急侍戎规 */#define SIO_ERDY_SND 1u /* 流慨材墙コ〖ルバック */#define SIO_ERDY_RCV 2u /* 减慨奶梦コ〖ルバック *//* * シリアルポ〖トのハ〖ドウェア巴赂攫鼠の年盗 */#define SERIAL_PORT (CONSOLE_PORTID-1) /* システムのポ〖ト戎规 */#define SERIAL_INT_PRIORITY 1 /* 充り哈み庭黎刨 */#define SERIAL_CLKDIV 3 /* clk = fxx/8 */#define SERIAL_COMPAREVALUE 11 /* 9600bps=130, 19200bps=65, 38400bps=33, 57600bps=22, 115200bps=11 *//* シリアル簇息レジスタ */#define ASIM(x) (ASIM0 + ((x) * 0x10))#define ASIS(x) (ASIS0 + ((x) * 0x10))#define ASIF(x) (ASIF0 + ((x) * 0x10))#define RXB(x) (RXB0 + ((x) * 0x10))#define TXB(x) (TXB0 + ((x) * 0x10))#define CKSR(x) (CKSR0 + ((x) * 0x10))#define BRGC(x) (BRGC0 + ((x) * 0x10))#define SRIC(x) (SRIC0 + ((x) * 8))#define STIC(x) (STIC0 + ((x) * 8))#define FLG_RECEIVED 1static unsigned int _serial_flag[TNUM_PORT] = { 0 };/* * シリアルI/Oの充哈みハンドラのベクタ戎规 */#define INHNO_SERIAL_IN (0x19 + (SERIAL_PORT * 3))#define INHNO_SERIAL_OUT (0x1a + (SERIAL_PORT * 3))/* * 你レベルポ〖ト攫鼠瓷妄ブロックの介袋猛 */#define NUM_PORT 1 /* サポ〖トするシリアルポ〖トの眶 *//* * シリアルI/Oポ〖トの介袋步 */Inline BOOLhw_port_initialize(int port_id){ if( (sil_reb_mem((VP)ASIM(port_id)) & 0x80) == 0 ) { /* 润票袋シリアル奶慨烯の介袋步 */ /* ポ〖トを倡ける */ if (port_id == 0) { sil_wrh_mem((VP)PMC3, sil_reh_mem((VP)PMC3) | 0x0003); } else { sil_wrh_mem((VP)PFC8, 0); sil_wrh_mem((VP)PMC8, 3); } /* ボ〖レ〖ト券栏达の介袋步 */ sil_wrb_mem((VP)CKSR(port_id), SERIAL_CLKDIV); sil_wrb_mem((VP)BRGC(port_id), SERIAL_COMPAREVALUE); sil_wrb_mem((VP)ASIM(port_id), sil_reb_mem((VP)ASIM(port_id)) | 0x80); /* enable ASIO */ __asm("nop; nop"); sil_wrb_mem((VP)ASIM(port_id), sil_reb_mem((VP)ASIM(port_id)) | 0x04); /* 8bit length */ __asm("nop; nop"); sil_wrb_mem((VP)ASIM(port_id), sil_reb_mem((VP)ASIM(port_id)) | 0x60); /* Tx, Rx enable */ /* 充哈み扩告 */ sil_wrb_mem((VP)SRIC(port_id), SERIAL_INT_PRIORITY); sil_wrb_mem((VP)STIC(port_id), SERIAL_INT_PRIORITY); } return(FALSE);}/* * シリアルI/Oポ〖トの姜位 */Inline voidhw_port_terminate(int port_id){}/* * シリアルポ〖ト充哈みサ〖ビスル〖チン∈涟数徊救∷ */extern void serial_handler_in(int portid);extern void serial_handler_out(int portid);/* * 矢机を减慨したか々 */Inline BOOLhw_port_getready(int port_id){ return (_serial_flag[port_id] & FLG_RECEIVED) != 0 ? TRUE : FALSE;}/* * 矢机を流慨できるか々 */Inline BOOLhw_port_putready(int port_id){ return (sil_reb_mem((VP)ASIF(port_id)) & 0x2) != 0 ? FALSE : TRUE;}/* * 减慨した矢机の艰り叫し */Inline unsigned charhw_port_getchar(int port_id){ _serial_flag[port_id] &= FLG_RECEIVED; sil_wrb_mem((VP)SRIC(port_id), sil_reb_mem((VP)SRIC(port_id)) & 0x7f); return sil_reb_mem((VP)RXB(port_id));}/* * 流慨する矢机の今き哈み */Inline voidhw_port_putchar(int port_id, unsigned char c){ sil_wrb_mem((VP)TXB(port_id), c);}/* * 流慨する矢机の今き哈み∈流慨材墙になるまで略つ∷ */Inline voidhw_port_wait_putchar(int port_id, unsigned char c){ while( !hw_port_putready(port_id) ) ; hw_port_putchar(port_id, c);}/* * 流慨扩告簇眶 */Inline voidhw_port_sendstart(int port_id){}Inline voidhw_port_sendstop(int port_id){}extern void sio_ierdy_rcv(VP_INT exinf);extern void sio_ierdy_snd(VP_INT exinf);Inline voidhw_port_handler_in(int port_id){ _serial_flag[port_id] |= FLG_RECEIVED; sio_ierdy_rcv(siopcb_table[port_id].exinf);}Inline voidhw_port_handler_out(int port_id){ sio_ierdy_snd(siopcb_table[port_id].exinf);}/***********************************************************************************//* * sio_initialize -- シリアルポ〖トドライバの介袋步 */Inline voidsio_initialize (void){ int ix; /* SIO 瓷妄ブロックの介袋步 */ for (ix = TNUM_PORT; ix -- > 0; ) { siopcb_table[ix].openflag = FALSE; }}/* * sio_opn_por -- ポ〖トのオ〖プン */Inline SIOPCB *sio_opn_por(ID sioid, VP_INT exinf){ SIOPCB *pcb; pcb = get_siopcb(sioid); pcb->inib = NULL; pcb->exinf = exinf; pcb->openflag = TRUE; pcb->port_id = sioid-1; hw_port_initialize(pcb->port_id); return pcb;}/* * sio_snd_chr -- 矢机流慨 */Inline BOOLsio_snd_chr(SIOPCB *pcb, INT chr){ if (hw_port_putready(pcb->port_id)) { hw_port_putchar(pcb->port_id, (UB)chr); return TRUE; } else return FALSE;}/* * sio_rcv_chr -- 矢机减慨 */Inline INTsio_rcv_chr(SIOPCB *pcb){ if (hw_port_getready(pcb->port_id)) return hw_port_getchar(pcb->port_id); else return -1;}/* * sio_ena_cbr -- シリアル I/O からのコ〖ルバックの钓材 */Inline voidsio_ena_cbr(SIOPCB *pcb, UINT cbrtn){}/* * sio_dis_cbr -- シリアル I/O からのコ〖ルバックの敦贿 */Inline voidsio_dis_cbr(SIOPCB *pcb, UINT cbrtn){}/* * sio_cls_por -- ポ〖トのクロ〖ズ */Inline voidsio_cls_por(SIOPCB *pcb){ sio_dis_cbr(pcb, SIO_ERDY_SND); sio_dis_cbr(pcb, SIO_ERDY_RCV); pcb->openflag = FALSE;}Inline voidsio_in_handler(void){ hw_port_handler_in(0);}Inline voidsio_out_handler(void){ hw_port_handler_out(0);}#if TNUM_PORT > 1Inline voidsio_in_handler2(void){ hw_port_handler_in(1);}Inline voidsio_out_handler2(void){ hw_port_handler_out(1);}#endif#endif /* _HW_SERIAL_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -