source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/tUartPL011.c@ 352

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

arm向けASP3版ECNLを追加

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