source: EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/tUartPL011.c@ 270

Last change on this file since 270 was 270, checked in by coas-nagasima, 7 years ago

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 6.1 KB
RevLine 
[270]1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * 上記著作権者
10は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
11 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12 * 変・再é…
13å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再é…
19å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
20å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
21 * 者
22マニュアルなど)に,上記の著作権表示,この利用条件および下記
23 * の無保証規定を掲載すること.
24 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
25 * 用できない形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
27 * と.
28 * (a) 再é…
29å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
30マニュアルなど)に,上記の著
31 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
32 * (b) 再é…
33å¸ƒã®å½¢æ…
34‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
35 * 報告すること.
36 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
37 * 害からも,上記著作権者
38およびTOPPERSプロジェクトをå…
39è²¬ã™ã‚‹ã“と.
40 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
41 * 由に基づく請求からも,上記著作権者
42およびTOPPERSプロジェクトを
43 * å…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
49 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
50 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
51 * の責任を負わない.
52 *
53 * $Id: tUartPL011.c 270 2017-02-09 04:03:47Z coas-nagasima $
54 */
55
56/*
57 * ARM PrimCell UART(PL011)用 簡易SIOドライバ
58 */
59
60#include <sil.h>
61#include "tUartPL011_tecsgen.h"
62#include "uart_pl011.h"
63
64/*
65 * プリミティブな送信/受信関数
66 */
67
68/*
69 * 受信バッファに文字があるか?
70 */
71Inline bool_t
72uart_pl011_getready(CELLCB *p_cellcb)
73{
74 return((sil_rew_mem(UART_FR(ATTR_baseAddress)) & UART_FR_RXFE) == 0U);
75}
76
77/*
78 * 送信バッファに空きがあるか?
79 */
80Inline bool_t
81uart_pl011_putready(CELLCB *p_cellcb)
82{
83 return((sil_rew_mem(UART_FR(ATTR_baseAddress)) & UART_FR_TXFF) == 0U);
84}
85
86/*
87 * 受信した文字の取出し
88 */
89Inline char
90uart_pl011_getchar(CELLCB *p_cellcb)
91{
92 return((char) sil_rew_mem(UART_DR(ATTR_baseAddress)));
93}
94
95/*
96 * 送信する文字の書込み
97 */
98Inline void
99uart_pl011_putchar(CELLCB *p_cellcb, char c)
100{
101 sil_wrw_mem(UART_DR(ATTR_baseAddress), (uint32_t) c);
102}
103
104/*
105 * シリアルI/Oポートのオープン
106 */
107void
108eSIOPort_open(CELLIDX idx)
109{
110 CELLCB *p_cellcb = GET_CELLCB(idx);
111
112 /*
113 * UARTをディスエーブル
114 */
115 sil_wrw_mem(UART_CR(ATTR_baseAddress), 0U);
116
117 /*
118 * エラーフラグをクリア
119 */
120 sil_wrw_mem(UART_ECR(ATTR_baseAddress), 0U);
121
122 /*
123 * FIFOを空にする
124 */
125 while (uart_pl011_getready(p_cellcb)) {
126 (void) uart_pl011_getchar(p_cellcb);
127 }
128
129 /*
130 * ボーレートと通信規格を設定
131 */
132 sil_wrw_mem(UART_IBRD(ATTR_baseAddress), ATTR_ibrd);
133 sil_wrw_mem(UART_FBRD(ATTR_baseAddress), ATTR_fbrd);
134 sil_wrw_mem(UART_LCR_H(ATTR_baseAddress), ATTR_lcr_h);
135
136 /*
137 * UARTをイネーブル
138 */
139 sil_wrw_mem(UART_CR(ATTR_baseAddress),
140 UART_CR_UARTEN|UART_CR_TXE|UART_CR_RXE);
141}
142
143/*
144 * シリアルI/Oポートのクローズ
145 */
146void
147eSIOPort_close(CELLIDX idx)
148{
149 CELLCB *p_cellcb = GET_CELLCB(idx);
150
151 /*
152 * UARTをディスエーブル
153 */
154 sil_wrw_mem(UART_CR(ATTR_baseAddress), 0U);
155}
156
157/*
158 * シリアルI/Oポートへの文字送信
159 */
160bool_t
161eSIOPort_putChar(CELLIDX idx, char c)
162{
163 CELLCB *p_cellcb = GET_CELLCB(idx);
164
165 if (uart_pl011_putready(p_cellcb)){
166 uart_pl011_putchar(p_cellcb, c);
167 return(true);
168 }
169 return(false);
170}
171
172/*
173 * シリアルI/Oポートからの文字受信
174 */
175int_t
176eSIOPort_getChar(CELLIDX idx)
177{
178 CELLCB *p_cellcb = GET_CELLCB(idx);
179
180 if (uart_pl011_getready(p_cellcb)) {
181 return((int_t)(uint8_t) uart_pl011_getchar(p_cellcb));
182 }
183 return(-1);
184}
185
186/*
187 * シリアルI/Oポートからのコールバックの許可
188 */
189void
190eSIOPort_enableCBR(CELLIDX idx, uint_t cbrtn)
191{
192 CELLCB *p_cellcb = GET_CELLCB(idx);
193 uint32_t reg;
194
195 reg = sil_rew_mem(UART_IMSC(ATTR_baseAddress));
196 switch (cbrtn) {
197 case SIOSendReady:
198 reg |= UART_IMSC_TXIM;
199 break;
200 case SIOReceiveReady:
201 reg |= UART_IMSC_RXIM;
202 break;
203 }
204 sil_wrw_mem(UART_IMSC(ATTR_baseAddress), reg);
205}
206
207/*
208 * シリアルI/Oポートからのコールバックの禁止
209 */
210void
211eSIOPort_disableCBR(CELLIDX idx, uint_t cbrtn)
212{
213 CELLCB *p_cellcb = GET_CELLCB(idx);
214 uint32_t reg;
215
216 reg = sil_rew_mem(UART_IMSC(ATTR_baseAddress));
217 switch (cbrtn) {
218 case SIOSendReady:
219 reg &= ~UART_IMSC_TXIM;
220 break;
221 case SIOReceiveReady:
222 reg &= ~UART_IMSC_RXIM;
223 break;
224 }
225 sil_wrw_mem(UART_IMSC(ATTR_baseAddress), reg);
226}
227
228/*
229 * シリアルI/Oポートに対する割込み処理
230 */
231void
232eiISR_main(CELLIDX idx)
233{
234 CELLCB *p_cellcb = GET_CELLCB(idx);
235
236 if (uart_pl011_getready(p_cellcb)) {
237 /*
238 * 受信通知コールバックルーチンを呼び出す.
239 */
240 ciSIOCBR_readyReceive();
241 }
242 if (uart_pl011_putready(p_cellcb)) {
243 /*
244 * 送信可能コールバックルーチンを呼び出す.
245 */
246 ciSIOCBR_readySend();
247 }
248}
Note: See TracBrowser for help on using the repository browser.