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

Last change on this file was 429, checked in by coas-nagasima, 4 years ago

ASP3, TINET, mbed を更新

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