source: asp3_tinet_ecnl_rx/trunk/ntshell/fatfs/ffarch.c@ 364

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

TINETとSocket APIなどを更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 8.6 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2014-2017 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
7 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
8 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
9 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
10 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
11 * スコード中に含まれていること.
12 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
13 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
14 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
15 * の無保証規定を掲載すること.
16 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
17 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
18 * と.
19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
20 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
22 * 報告すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
26 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
27 * 免責すること.
28 *
29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
31 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
32 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
33 * の責任を負わない.
34 *
35 */
36
37/*
38 * サンプルプログラム(1)の本体
39 */
40
41#include "shellif.h"
42#include <kernel.h>
43#include <stdlib.h>
44#include <string.h>
45#include <stdbool.h>
46#include "t_stdlib.h"
47#include "syssvc/serial.h"
48#include "syssvc/syslog.h"
49#include "target_syssvc.h"
50#include "target_stddef.h"
51#include "kernel_cfg.h"
52#include "diskio.h"
53#include "mmc_rspi.h"
54#include "ff.h"
55#include "ffarch.h"
56#include "util/ntstdio.h"
57#include "mbed_api.h"
58
59extern ntstdio_t ntstdio;
60
61enum ffarch_state_t {
62 FFS_IDLE,
63 FFS_RETRY_WAIT,
64 FFS_DISABLE,
65};
66
67enum ffarch_state_t ffarch_state;
68volatile int ffarch_timer;
69int ffarch_retry_count;
70uint8_t mmc_rspi_prev_status;
71
72static void ffarch_initialize();
73
74/*
75 * FatFSタスク
76 */
77void ffarch_task(intptr_t exinf)
78{
79 ER ret, ret2;
80 SYSTIM prev, now;
81 int timer;
82
83 ffarch_initialize();
84
85 ret2 = get_tim(&now);
86 if (ret2 != E_OK){
87 ntstdio_printf(&ntstdio, "[ffarch] get_tim error: %s",
88 itron_strerror(ret2));
89 return;
90 }
91
92 for(;;){
93 prev = now;
94
95 /* タイマー取得 */
96 timer = ffarch_get_timer();
97
98 /* 待ち */
99 ret = tslp_tsk(timer);
100 if ((ret != E_OK) && (ret != E_TMOUT)) {
101 ntstdio_printf(&ntstdio, "[ffarch] tslp_tsk error: %s %d",
102 itron_strerror(ret), timer);
103 break;
104 }
105
106 ret2 = get_tim(&now);
107 if (ret2 != E_OK) {
108 ntstdio_printf(&ntstdio, "[ffarch] get_tim error: %s",
109 itron_strerror(ret2));
110 break;
111 }
112
113 /* 時間経過 */
114 int elapse = now - prev;
115 ffarch_progress(elapse);
116
117 /* タイムアウト処理 */
118 ffarch_timeout();
119 }
120}
121
122FATFS RomDisk;
123
124#define WP() false
125
126typedef struct SD {
127 DSTATUS dst;
128 BYTE type;
129 FATFS FatFs;
130} SD;
131SD Sd;
132
133bool_t romdisk_init();
134bool_t SD_begin();
135
136void ffarch_init(void)
137{
138#ifdef TOPPERS_GRCITRUS
139 ffarch_state = FFS_DISABLE;
140 ffarch_timer = TMO_FEVR;
141 mmc_rspi_prev_status = STA_NODISK;
142#else
143 ffarch_state = FFS_IDLE;
144 ffarch_timer = 0;
145 ffarch_retry_count = 3;
146 mmc_rspi_prev_status = STA_NODISK;
147
148 ffarch_timeout();
149
150 act_tsk(FFARCH_TASK);
151#endif
152 if (romdisk_init()) {
153 ntstdio_printf(&ntstdio, "ROM disk (0:) OK!\n");
154 }
155 else {
156 ntstdio_printf(&ntstdio, "ROM disk (0:) NG!\n");
157 }
158}
159
160void ffarch_initialize()
161{
162#ifdef TOPPERS_GRCITRUS
163 ffarch_state = FFS_DISABLE;
164 ffarch_timer = TMO_FEVR;
165 mmc_rspi_prev_status = STA_NODISK;
166#else
167 sta_cyc(MMC_RSPI_CYC);
168#endif
169}
170
171bool_t romdisk_init()
172{
173 DSTATUS dst;
174 FRESULT res;
175
176 if (RomDisk.fs_type != 0)
177 return true;
178
179 if ((dst = ramdisk_initialize()) != RES_OK) {
180 return false;
181 }
182
183 if ((res = f_mount(&RomDisk, "0:", 1)) != FR_OK) {
184 return false;
185 }
186
187 return true;
188}
189
190bool_t SD_begin()
191{
192 DSTATUS dst;
193 FRESULT res;
194 BYTE pdrv = 1, type;
195
196 if (Sd.FatFs.fs_type != 0)
197 return true;
198
199 if ((dst = disk_initialize(pdrv)) != RES_OK) {
200 return false;
201 }
202
203 if ((dst = disk_ioctl(pdrv, MMC_GET_TYPE, &type)) != RES_OK) {
204 Sd.dst = dst;
205 Sd.type = 0;
206 }
207 else {
208 Sd.dst = RES_OK;
209 Sd.type = type;
210 }
211
212 if ((res = f_mount(&Sd.FatFs, "1:", 1)) != FR_OK) {
213 return false;
214 }
215
216 return true;
217}
218
219DSTATUS disk_initialize(BYTE pdrv)
220{
221 switch (pdrv) {
222 case 0:
223 return ramdisk_initialize();
224 case 1:
225 return mmc_rspi_initialize();
226 }
227 return STA_NOINIT;
228}
229
230DSTATUS disk_status(BYTE pdrv)
231{
232 switch (pdrv) {
233 case 0:
234 return ramdisk_get_status();
235 case 1:
236 return mmc_rspi_status();
237 }
238 return STA_NOINIT;
239}
240
241DRESULT disk_read(BYTE pdrv, BYTE *buff, DWORD sector, UINT count)
242{
243 switch (pdrv) {
244 case 0:
245 return ramdisk_read(buff, sector, count);
246 case 1:
247 return mmc_rspi_read(buff, sector, count);
248 }
249 return RES_PARERR;
250}
251
252DRESULT disk_write(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count)
253{
254 switch (pdrv) {
255 case 0:
256 return ramdisk_write(buff, sector, count);
257 case 1:
258 return mmc_rspi_write(buff, sector, count);
259 }
260 return RES_PARERR;
261}
262
263DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff)
264{
265 switch (pdrv) {
266 case 0:
267 return RES_PARERR; /* ramdisk_ioctl(cmd, buff); */
268 case 1:
269 return mmc_rspi_ioctl(cmd, buff);
270 }
271 return RES_PARERR;
272}
273
274void mmc_rspi_status_changed(DSTATUS newst)
275{
276 if (ffarch_state == FFS_IDLE) {
277 mmc_rspi_prev_status = mmc_rspi_status();
278 ffarch_timer = 0;
279 wup_tsk(FFARCH_TASK);
280 }
281}
282
283int ffarch_get_timer(void)
284{
285 return ffarch_timer;
286}
287
288void ffarch_progress(int elapse)
289{
290 if (ffarch_timer != TMO_FEVR) {
291 ffarch_timer -= elapse;
292 if (ffarch_timer < 0) {
293 ffarch_timer = 0;
294 }
295 }
296}
297
298void ffarch_timeout(void)
299{
300 if (ffarch_timer != 0)
301 return;
302
303 switch (ffarch_state) {
304 case FFS_RETRY_WAIT:
305 if (ffarch_retry_count == 0) {
306 ntstdio_printf(&ntstdio, "SD card (1:) initialize tired...\n");
307
308 ffarch_state = FFS_IDLE;
309 ffarch_timer = TMO_FEVR;
310 ffarch_retry_count = 3;
311 break;
312 }
313 ffarch_retry_count--;
314 //goto case FFS_IDLE;
315 case FFS_IDLE:
316 /* SDカードが入れられた場合 */
317 if (((mmc_rspi_prev_status & STA_NODISK) != 0) && ((mmc_rspi_status() & STA_NODISK) == 0)) {
318 ntstdio_printf(&ntstdio, "SD card initializing ...\n");
319
320 Sd.FatFs.fs_type = 0;
321 if (SD_begin()) {
322 ntstdio_printf(&ntstdio, "SD card (1:) OK!\n");
323
324 /* uploadディレクトリを作成しておく */
325 f_mkdir("1:/upload");
326
327 ffarch_state = FFS_IDLE;
328 ffarch_timer = TMO_FEVR;
329 ffarch_retry_count = 3;
330 }
331 else {
332 ntstdio_printf(&ntstdio, "SD card (1:) NG!\n");
333 ffarch_state = FFS_RETRY_WAIT;
334 ffarch_timer = 1000 * 1000;
335 }
336 }
337 /* SDカードが抜かれた場合 */
338 else if (((mmc_rspi_prev_status & STA_NODISK) == 0) && ((mmc_rspi_status() & STA_NODISK) != 0)) {
339 ntstdio_printf(&ntstdio, "SD card unmount\n");
340
341 f_mount(&Sd.FatFs, "1:", 0);
342 ffarch_state = FFS_IDLE;
343 ffarch_timer = TMO_FEVR;
344 ffarch_retry_count = 3;
345 }
346 mmc_rspi_prev_status = mmc_rspi_status();
347 break;
348 }
349}
350
351int ff_cre_syncobj(BYTE vol, _SYNC_t* sobj)
352{
353 return 1;
354}
355
356int ff_req_grant(_SYNC_t sobj)
357{
358 ER ret;
359 ret = wai_sem(SEM_FILESYSTEM);
360 return ret == E_OK;
361}
362
363void ff_rel_grant(_SYNC_t sobj)
364{
365 sig_sem(SEM_FILESYSTEM);
366}
367
368int ff_del_syncobj(_SYNC_t sobj)
369{
370 return 1;
371}
372
373void* ff_memalloc (UINT msize)
374{
375 return malloc(msize);
376}
377
378void ff_memfree (void* mblock)
379{
380 free(mblock);
381}
382
383DWORD get_fattime(void)
384{
385 time_t temp;
386 struct tm _tm;
387
388 temp = rtc_read();
389 gmtime_r(&temp, &_tm);
390
391 return ((DWORD)(_tm.tm_year - 1980) << 25)
392 | ((DWORD)_tm.tm_mon << 21)
393 | ((DWORD)_tm.tm_mday << 16)
394 | ((DWORD)_tm.tm_hour << 11)
395 | ((DWORD)_tm.tm_min << 5)
396 | ((DWORD)_tm.tm_sec >> 1);
397}
Note: See TracBrowser for help on using the repository browser.