source: ssp_qb_r5f100le_cs/trunk/target/qb_r5f100le_cs/target_serial.c

Last change on this file was 95, checked in by nmir-saito, 9 years ago

ファイルの mime-type 変更

  • Property svn:mime-type set to text/plain; charset=shift_jis
File size: 6.9 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2010 by Meika Sugimoto
9 * Copyright (C) 2011-2015 by Naoki Saito
10 * Nagoya Municipal Industrial Research Institute, JAPAN
11 *
12 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * の無保証規定を掲載すること.
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * と.
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * 報告すること.
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
32 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
33 * 免責すること.
34 *
35 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
36 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
37 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
38 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
39 * の責任を負わない.
40 *
41 */
42
43/*
44 * シリアルドライバ(QB-R5F100LE用)
45 */
46#pragma sfr
47#pragma NOP
48
49#include <kernel.h>
50#include "target_serial.h"
51#include "target_syssvc.h"
52
53/*
54 * シリアルI/Oポート管理ブロックエリア
55 */
56static SIOPCB siopcb_table[TNUM_SIOP];
57
58
59/*
60 * レジスタ設定値
61 */
62#define PORT2SIOPID(x) ((x) + 1)
63#define INDEX_PORT(x) ((x) - 1)
64#define GET_SIOPCB(x) (&siopcb_table[INDEX_PORT(x)])
65
66extern void x_clear_int(INTNO intno);
67
68/*
69 * 低レベルシリアル初期化
70 */
71void target_sau_init(ID siopid)
72{
73 /* 初期化済みの場合はすぐにリターン */
74 if(PER0 & TBIT_PER0_SAU0EN) {
75 return;
76 }
77
78 /* クロック供給許可 */
79 PER0 |= TBIT_PER0_SAU0EN;
80
81 // 少し待つ
82 NOP();
83 NOP();
84 NOP();
85
86 // CKm0 を選択.周波数は fclk/8 (=2.5MHz)
87 SPS0 = UINT16_C(0x0033);
88
89 // ユニット0,チャネル{0,1} の動作停止
90 ST0 |= UINT16_C(0x0003);
91
92 // モード設定
93 // 動作クロック:SPS0レジスタで設定した動作クロックのうち,CK00 の方を使う
94 // 転送クロック:CKS00, CKS01 ビットで指定した動作クロック(つまりCK00)の分周クロック
95 // スタートトリガ要因:送信-->ソフトウェアトリガのみ, 受信-->RxD0端子
96 // 立下りをスタートビットとして検出
97 // UARTモード,割り込みは転送完了割込み
98 SMR00 = UINT16_C(0x0022);
99 SMR01 = UINT16_C(0x0122);
100
101 // チャネル0: 送信のみ許可,チャネル1: 受信のみ許可
102 // エラー割込みINTSRExの発生を禁止
103 // パリティなし,LSBファースト,1ストップビット,8ビットデータ長
104 SCR00 = UINT16_C(0x8097);
105 SCR01 = UINT16_C(0x4097);
106
107 // [ビット15:9] = 0x40 --> 64
108 // シリアルへの供給クロックは 2.5MHz(=20/8)
109 // 分周比は (64+1)*2 = 130
110 // 2.5[MHz]/130 = 19.23[kHz]
111 SDR00 = UINT16_C(0x8000);
112 SDR01 = UINT16_C(0x8000);
113
114 // 受信ポートのノイズフィルタON
115 NFEN0 |= UINT8_C(0x01);
116
117 // エラーフラグのクリア(受信側のチャネル1のみ)
118 SIR01 |= UINT16_C(0x0007);
119
120 // シリアルデータ出力値をチャネル0のみ1とする.
121 SO0 |= UINT16_C(0x0001);
122
123 // 通信データは反転せずそのまま出力
124 SOL0 = UINT16_C(0x0000);
125
126 /*
127 * シリアルチャネル0開始
128 */
129 // シリアル出力許可
130 SOE0 |= UINT16_C(0x0001);
131
132 // チャネル{0,1}の開始
133 SS0 |= UINT16_C(0x0003);
134}
135
136/*
137 * SIO初期化
138 */
139void sio_initialize(intptr_t exinf)
140{
141}
142
143/*
144 * シリアルオープン
145 */
146SIOPCB *sio_opn_por(ID siopid, intptr_t exinf)
147{
148 int_t i;
149 SIOPCB* p_siopcb;
150
151 if (siopid > TNUM_PORT) {
152 return NULL;
153 }
154
155 p_siopcb = GET_SIOPCB(siopid);
156 p_siopcb->enacb &= ~TBIT_ENACB_SND;
157 p_siopcb->enacb &= ~TBIT_ENACB_RCV;
158 p_siopcb->exinf = exinf;
159
160 // 割込みのマスク
161 dis_int(INTNO_INTST0);
162 dis_int(INTNO_INTSR0);
163 // 割込み要求クリア
164 x_clear_int(INTNO_INTST0);
165 x_clear_int(INTNO_INTSR0);
166
167 // ハードウェアの初期化
168 target_sau_init(siopid);
169
170 return p_siopcb;
171}
172
173/*
174 * シリアルクローズ
175 */
176void sio_cls_por(SIOPCB *p_siopcb)
177{
178 /* 送受信禁止 */
179
180 // チャネル{0,1}の停止
181 ST0 |= UINT16_C(0x0003);
182
183 /* シリアルモジュールを無効にする */
184 PER0 &= ~TBIT_PER0_SAU0EN;
185}
186
187
188/*
189 * 1文字送信
190 */
191bool_t
192sio_snd_chr(SIOPCB *p_siopcb, char c)
193{
194 // 送信バッファが空ならば,1文字送信
195 if((SSR00L & TBIT_SSRmnL_TSF) == UINT16_C(0)) {
196 SDR00 = (uint16_t)c;
197
198 return true;
199 }
200
201 return false;
202}
203
204/*
205 * 1文字受信
206 */
207int_t
208sio_rcv_chr(SIOPCB *p_siopcb)
209{
210 int_t c = -1;
211
212 // 受信バッファにデータがあれば,1文字受信
213 if((SSR01L & TBIT_SSRmnL_BFF) != 0) {
214 c = (int_t)SDR01;
215 }
216
217 return c;
218}
219
220/*
221 * コールバックの許可
222 */
223void
224sio_ena_cbr(SIOPCB *p_siopcb, uint_t cbrtn)
225{
226 switch (cbrtn) {
227 case SIO_RDY_SND:
228 p_siopcb->enacb |= TBIT_ENACB_SND;
229 x_clear_int(INTNO_INTST0);
230 ena_int(INTNO_INTST0);
231 break;
232 case SIO_RDY_RCV:
233 p_siopcb->enacb |= TBIT_ENACB_RCV;
234 x_clear_int(INTNO_INTSR0);
235 ena_int(INTNO_INTSR0);
236 break;
237 default:
238 break;
239 }
240}
241
242/*
243 * コールバックの禁止
244 */
245void
246sio_dis_cbr(SIOPCB *p_siopcb, uint_t cbrtn)
247{
248 switch (cbrtn) {
249 case SIO_RDY_SND:
250 p_siopcb->enacb &= ~TBIT_ENACB_SND;
251 dis_int(INTNO_INTST0);
252 x_clear_int(INTNO_INTST0);
253 break;
254 case SIO_RDY_RCV:
255 p_siopcb->enacb &= ~TBIT_ENACB_RCV;
256 dis_int(INTNO_INTSR0);
257 x_clear_int(INTNO_INTSR0);
258 break;
259 default:
260 break;
261 }
262}
263
264
265/*
266 * 割込みサービスルーチン
267 */
268
269/*
270 * 受信割込み
271 */
272void
273sio_isr_rcv(intptr_t portid)
274{
275 SIOPCB *p_siopcb = GET_SIOPCB((ID)portid);
276
277 if((p_siopcb->enacb & TBIT_ENACB_RCV) != 0) {
278 /*
279 * 受信通知コールバックルーチンを呼び出す.
280 */
281 sio_irdy_rcv(p_siopcb->exinf);
282 }
283}
284
285/*
286 * 送信割込み
287 */
288void
289sio_isr_snd(intptr_t portid)
290{
291 SIOPCB *p_siopcb = GET_SIOPCB((ID)portid);
292
293 if((p_siopcb->enacb & TBIT_ENACB_SND) != 0) {
294 /*
295 * 送信通知コールバックルーチンを呼び出す.
296 */
297 sio_irdy_snd(p_siopcb->exinf);
298 }
299}
300
301/*
302 * 1文字出力(ポーリングでの出力)
303 */
304void
305sio_pol_snd_chr(char c, ID siopid)
306{
307 /* 送信バッファが空になるまで待つ(有限時間内の条件成立を仮定) */
308 while((SSR00L & TBIT_SSRmnL_TSF) != 0){}
309
310 // 1文字送信
311 SDR00 = (uint16_t)c;
312}
Note: See TracBrowser for help on using the repository browser.