📄 fdc37c935a.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 * 2003 by Advanced Data Controls, Corp * * 惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation * によって给山されている GNU General Public License の Version 2 に淡 * 揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア * を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 * 涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 * スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 * 脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 * 荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 * の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 * 脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ * とˉ * (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 * 侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに * 鼠桂することˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 * 巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ * * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お * よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も * 崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 * 儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ * * @(#) $Id: fdc37c935a.c,v 1.4 2003/12/24 08:00:42 honda Exp $ *//* * ス〖パI/O FDC37C935A 脱ドライバ */#include <s_services.h>#include "fdc37c935a.h"/* * 介袋步 */voidsmsc_init(void){ /* * Enter Config mode */ sil_wrh_mem((VP)SMSC_CONFIG_PORT, (0x55 << 8)); sil_wrh_mem((VP)SMSC_CONFIG_PORT, (0x55 << 8)); /* * Init SCI0 */ /* Power on */ smsc_config_write(0x22, (smsc_config_read(0x22) | 0x10)); /* Select SCI0 */ smsc_config_write(0x07, 0x04); /* Enable SCI0 */ smsc_config_write(0x30, 0x01); /* Set SCI0 Base Address */ smsc_config_write(0x60, (SMSC_SCI0_BASE_ADDR & 0xff00) >> 8); smsc_config_write(0x61, (SMSC_SCI0_BASE_ADDR & 0xff)); /* IRQ4 */ smsc_config_write(0x70, 0x04); /* * Exit Config mode */ sil_wrh_mem((VP)SMSC_CONFIG_PORT, (0xAA << 8));}/* * ス〖パ〖I/O(FDC37C935A)脱 词白SIOドライバ *//* * シリアルI/Oポ〖ト介袋步ブロック */typedef struct sio_port_initialization_block { char dummy;} SIOPINIB;/* * シリアルI/Oポ〖ト瓷妄ブロック */struct sio_port_control_block { const SIOPINIB *siopinib; /* シリアルI/Oポ〖ト介袋步ブロック */ VP_INT exinf; /* 橙磨攫鼠 */ BOOL openflag; /* オ〖プン貉みフラグ */ BOOL sendflag; /* 流慨充哈みイネ〖ブルフラグ */ BOOL getready; /* 矢机を减慨した觉轮 */ BOOL putready; /* 矢机を流慨できる觉轮 */};/* * シリアルI/Oポ〖ト介袋步ブロック */const SIOPINIB siopinib_table[TNUM_SIOP]= {{0}};/* * シリアルI/Oポ〖ト瓷妄ブロックのエリア */SIOPCB siopcb_table[TNUM_SIOP];/* * シリアルI/Oポ〖トIDから瓷妄ブロックを艰り叫すためのマクロ */#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))/* * 矢机を减慨したか? */ Inline BOOLsmsc_sci0_getready(SIOPCB *siopcb){ return(((sil_reh_mem((VP)SMSC_SCI0_LSR) >> 8) & 0x01) != 0);}/* * 矢机を流慨できるか? */Inline BOOLsmsc_sci0_putready(SIOPCB *siopcb){ return(((sil_reh_mem((VP)SMSC_SCI0_LSR) >> 8) & 0x60) != 0);}/* * 减慨した矢机の艰り叫し */Inline charsmsc_sci0_getchar(SIOPCB *siopcb){ return (sil_reh_mem((VP)SMSC_SCI0_RBR) >> 8);}/* * 流慨する矢机の今き哈み */Inline voidsmsc_sci0_putchar(SIOPCB *siopcb, char c){ sil_wrh_mem((VP)SMSC_SCI0_THR, c << 8);}/* * 流慨充哈み钓材 */Inline voidsmsc_sci0_enable_send(SIOPCB *siopcb){ sil_wrh_mem((VP)SMSC_SCI0_IER, (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) | 0x02) << 8)); }/* * 流慨充哈み敦贿 */Inline voidsmsc_sci0_disable_send(SIOPCB *siopcb){ sil_wrh_mem((VP)SMSC_SCI0_IER, (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) & ~0x02) << 8)); }/* * 减慨充哈み钓材 */Inline voidsmsc_sci0_enable_rcv(SIOPCB *siopcb){ sil_wrh_mem((VP)SMSC_SCI0_IER, (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) | 0x01) << 8)); }/* * 减慨充哈み敦贿 */Inline voidsmsc_sci0_disable_rcv(SIOPCB *siopcb){ sil_wrh_mem((VP)SMSC_SCI0_IER, (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) & ~0x01) << 8)); }/* * SIOドライバの介袋步ル〖チン * 1ポ〖トしかないため·あまり罢蹋はない */voidsmsc_sci0_initialize(){ SIOPCB *siopcb; UINT i; /* * シルアルI/Oポ〖ト瓷妄ブロックの介袋步 */ for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) { siopcb->siopinib = &(siopinib_table[i]); siopcb->openflag = FALSE; siopcb->sendflag = FALSE; }}/* * 充哈み笆嘲の介袋步 */voidfdc37c935a_init(void){ volatile UH dummy; /* BIT7 = 1 */ sil_wrh_mem((VP)SMSC_SCI0_LCR, 0x83 << 8); /* Set BPS */ sil_wrh_mem((VP)SMSC_SCI0_DLL, ((SMSC_SCI0_BPS & 0x00ff) << 8)); sil_wrh_mem((VP)SMSC_SCI0_DLM, ((SMSC_SCI0_BPS >> 8) << 8)); /* BIT7 = 0 Divisor Latch BIT6 = 0 No Break : BIT3 = 0 NoParity : BIT2 = 0 1Stopbit : BIT1,0 = {1.1} 8bitData */ sil_wrh_mem((VP)SMSC_SCI0_LCR, 0x03 << 8); /* Do not use FIFO */ sil_wrh_mem((VP)SMSC_SCI0_FCR, 0x0000); /* Clear Status */ dummy = sil_reh_mem((VP)SMSC_SCI0_RBR); dummy = sil_reh_mem((VP)SMSC_SCI0_LSR); }/* * オ〖プンしているポ〖トがあるか */BOOLsmsc_sci0_openflag(void){ return(siopcb_table[0].openflag);}/* * シリアルI/Oポ〖トのオ〖プン */SIOPCB *smsc_sci0_opn_por(ID siopid, VP_INT exinf){ SIOPCB *siopcb; const SIOPINIB *siopinib; siopcb = get_siopcb(siopid); siopinib = siopcb->siopinib; fdc37c935a_init(); /* Enable Receive Data Interrupt */ sil_wrh_mem((VP)SMSC_SCI0_IER, (0x01 << 8)); sil_wrh_mem((VP)SMSC_SCI0_MCR, 0x08 << 8); /* * MS7729RSE01では·办刨流慨充哈みを券栏させておかないと充哈み * レベル16の充哈みが券栏してしまい赖しく瓢侯しないˉ */ /* 流慨充り哈み妥滇を钓材 */ sil_wrh_mem((VP)SMSC_SCI0_IER, (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) | 0x02) << 8)); /* 流慨充り哈み妥滇を敦贿 */ sil_wrh_mem((VP)SMSC_SCI0_IER, (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) & ~0x02) << 8)); siopcb->exinf = exinf; siopcb->getready = siopcb->putready = FALSE; siopcb->openflag = TRUE; return(siopcb);}/* * シリアルI/Oポ〖トのクロ〖ズ */voidsmsc_sci0_cls_por(SIOPCB *siopcb){ sil_wrh_mem((VP)SMSC_SCI0_IER, 0x00); /* 充哈みの敦贿 */ siopcb->openflag = FALSE;}/* * シリアルI/Oポ〖トへのポ〖リングでの叫蜗 */voidfdc37c935a_pol_putc(char c){ while(((sil_reh_mem((VP)SMSC_SCI0_LSR) >> 8) & 0x60) == 0) ; sil_wrh_mem((VP)SMSC_SCI0_THR, c << 8);}/* * シリアルI/Oポ〖トへの矢机流慨 */BOOLsmsc_sci0_snd_chr(SIOPCB *siopcb, char c){ if (smsc_sci0_putready(siopcb)){ smsc_sci0_putchar(siopcb, c); return(TRUE); } return(FALSE);}/* * シリアルI/Oポ〖トからの矢机减慨 */INTsmsc_sci0_rcv_chr(SIOPCB *siopcb){ if (smsc_sci0_getready(siopcb)) { return((INT)(UB) smsc_sci0_getchar(siopcb)); } return(-1);}/* * シリアルI/Oポ〖トからのコ〖ルバックの钓材 */voidsmsc_sci0_ena_cbr(SIOPCB *siopcb, UINT cbrtn){ switch (cbrtn) { case SIO_ERDY_SND: smsc_sci0_enable_send(siopcb); break; case SIO_ERDY_RCV: smsc_sci0_enable_rcv(siopcb); break; }}/* * シリアルI/Oポ〖トからのコ〖ルバックの敦贿 */voidsmsc_sci0_dis_cbr(SIOPCB *siopcb, UINT cbrtn){ switch (cbrtn) { case SIO_ERDY_SND: smsc_sci0_disable_send(siopcb); break; case SIO_ERDY_RCV: smsc_sci0_disable_rcv(siopcb); break; }}/* * シリアルI/Oポ〖トに滦する充哈み借妄 */static voidsmsc_sci0_isr_siop(SIOPCB *siopcb){ if (smsc_sci0_getready(siopcb)) { /* * 减慨奶梦コ〖ルバックル〖チンを钙び叫すˉ */ smsc_sci0_ierdy_rcv(siopcb->exinf); } if (smsc_sci0_putready(siopcb)) { /* * 流慨材墙コ〖ルバックル〖チンを钙び叫すˉ */ smsc_sci0_ierdy_snd(siopcb->exinf); }}/* * SIOの充哈みサ〖ビスル〖チン */voidsmsc_sci0_isr(){ smsc_sci0_isr_siop(&(siopcb_table[0]));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -