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

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

SDカードの挿抜を検知するよう更新

  • 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 "t_stdlib.h"
46#include "syssvc/serial.h"
47#include "syssvc/syslog.h"
48#include "target_syssvc.h"
49#include "kernel_cfg.h"
50#include "diskio.h"
51#include "mmc_rspi.h"
52#include "ff.h"
53#include "util/ntstdio.h"
54#include "mbed_api.h"
55
56extern ntstdio_t ntstdio;
57
58enum ffarch_state_t {
59 FFS_IDLE,
60 FFS_RETRY_WAIT,
61};
62
63enum ffarch_state_t ffarch_state;
64volatile int ffarch_timer;
65int ffarch_retry_count;
66uint8_t mmc_rspi_prev_status;
67
68static void ffarch_initialize();
69
70/*
71 * FatFSタスク
72 */
73void ffarch_task(intptr_t exinf)
74{
75 ER ret, ret2;
76 SYSTIM prev, now;
77 int timer;
78
79 ffarch_initialize();
80
81 ret2 = get_tim(&now);
82 if (ret2 != E_OK){
83 ntstdio_printf(&ntstdio, "[ffarch] get_tim error: %s",
84 itron_strerror(ret2));
85 return;
86 }
87
88 for(;;){
89 prev = now;
90
91 /* タイマー取得 */
92 timer = ffarch_get_timer();
93
94 /* 待ち */
95 ret = tslp_tsk(timer);
96 if ((ret != E_OK) && (ret != E_TMOUT)) {
97 ntstdio_printf(&ntstdio, "[ffarch] tslp_tsk error: %s %d",
98 itron_strerror(ret), timer);
99 break;
100 }
101
102 ret2 = get_tim(&now);
103 if (ret2 != E_OK) {
104 ntstdio_printf(&ntstdio, "[ffarch] get_tim error: %s",
105 itron_strerror(ret2));
106 break;
107 }
108
109 /* 時間経過 */
110 int elapse = now - prev;
111 ffarch_progress(elapse);
112
113 /* タイムアウト処理 */
114 ffarch_timeout();
115 }
116}
117
118FATFS RomDisk;
119
120//gpio_t ins;
121//sdfs_t sdfs;
122#define WP() false
123
124typedef struct SD {
125 DSTATUS dst;
126 BYTE type;
127 FATFS FatFs;
128} SD;
129SD Sd;
130
131bool_t romdisk_init();
132bool_t SD_begin();
133
134#define P7_8 1
135#define P8_5 2
136#define P8_6 3
137#define P8_3 4
138#define P8_4 5
139
140int ffarch_init()
141{
142 int result = -1;
143
144 /* SD_CD */
145 //gpio_init_in(&ins, P7_8);
146
147 /* SDカードを初期化 */
148 //sdfs_init(&sdfs, P8_5, P8_6, P8_3, P8_4, "sd");
149
150 ffarch_state = FFS_IDLE;
151 ffarch_timer = 0;
152 ffarch_retry_count = 3;
153 mmc_rspi_prev_status = STA_NODISK;
154
155 ffarch_timeout();
156
157 act_tsk(FFARCH_TASK);
158
159 if (romdisk_init()) {
160 ntstdio_printf(&ntstdio, "ROM disk (0:) OK!\n");
161 }
162 else {
163 ntstdio_printf(&ntstdio, "ROM disk (0:) NG!\n");
164 }
165
166 serial_ctl_por(SIO_PORTID, IOCTL_FCSND | IOCTL_FCRCV);
167}
168
169void ffarch_initialize()
170{
171 sta_cyc(MMC_RSPI_CYC);
172}
173
174bool_t romdisk_init()
175{
176 DSTATUS dst;
177 FRESULT res;
178
179 if (RomDisk.fs_type != 0)
180 return true;
181
182 if ((dst = ramdisk_initialize()) != RES_OK) {
183 return false;
184 }
185
186 if ((res = f_mount(&RomDisk, "0:", 1)) != FR_OK) {
187 return false;
188 }
189
190 return true;
191}
192
193bool_t SD_begin()
194{
195 DSTATUS dst;
196 FRESULT res;
197 BYTE pdrv = 1, type;
198
199 if (Sd.FatFs.fs_type != 0)
200 return true;
201
202 if ((dst = disk_initialize(pdrv)) != RES_OK) {
203 return false;
204 }
205
206 if ((dst = disk_ioctl(pdrv, MMC_GET_TYPE, &type)) != RES_OK) {
207 Sd.dst = dst;
208 Sd.type = 0;
209 }
210 else {
211 Sd.dst = RES_OK;
212 Sd.type = type;
213 }
214
215 if ((res = f_mount(&Sd.FatFs, "1:", 1)) != FR_OK) {
216 return false;
217 }
218
219 return true;
220}
221
222DSTATUS disk_initialize(BYTE pdrv)
223{
224 switch (pdrv) {
225 case 0:
226 return ramdisk_initialize();
227 case 1:
228 return mmc_rspi_initialize();
229 }
230 return STA_NOINIT;
231}
232
233DSTATUS disk_status(BYTE pdrv)
234{
235 switch (pdrv) {
236 case 0:
237 return ramdisk_get_status();
238 case 1:
239 return mmc_rspi_status();
240 }
241 return STA_NOINIT;
242}
243
244DRESULT disk_read(BYTE pdrv, BYTE *buff, DWORD sector, UINT count)
245{
246 switch (pdrv) {
247 case 0:
248 return ramdisk_read(buff, sector, count);
249 case 1:
250 return mmc_rspi_read(buff, sector, count);
251 }
252 return RES_PARERR;
253}
254
255DRESULT disk_write(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count)
256{
257 switch (pdrv) {
258 case 0:
259 return ramdisk_write(buff, sector, count);
260 case 1:
261 return mmc_rspi_write(buff, sector, count);
262 }
263 return RES_PARERR;
264}
265
266DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff)
267{
268 switch (pdrv) {
269 case 0:
270 return RES_PARERR; /* ramdisk_ioctl(cmd, buff); */
271 case 1:
272 return mmc_rspi_ioctl(cmd, buff);
273 }
274 return RES_PARERR;
275}
276
277void mmc_rspi_status_changed(DSTATUS newst)
278{
279 if (ffarch_state == FFS_IDLE) {
280 mmc_rspi_prev_status = mmc_rspi_status();
281 ffarch_timer = 0;
282 wup_tsk(FFARCH_TASK);
283 }
284}
285
286int ffarch_get_timer()
287{
288 return ffarch_timer;
289}
290
291void ffarch_progress(int elapse)
292{
293 if (ffarch_timer != TMO_FEVR) {
294 ffarch_timer -= elapse;
295 if (ffarch_timer < 0) {
296 ffarch_timer = 0;
297 }
298 }
299}
300
301void ffarch_timeout()
302{
303 if (ffarch_timer != 0)
304 return;
305
306 switch (ffarch_state) {
307 case FFS_RETRY_WAIT:
308 if (ffarch_retry_count == 0) {
309 ntstdio_printf(&ntstdio, "SD card (1:) initialize tired...\n");
310
311 ffarch_state = FFS_IDLE;
312 ffarch_timer = TMO_FEVR;
313 ffarch_retry_count = 3;
314 break;
315 }
316 ffarch_retry_count--;
317 //goto case FFS_IDLE;
318 case FFS_IDLE:
319 /* SDカードが入れられた場合 */
320 if (((mmc_rspi_prev_status & STA_NODISK) != 0) && ((mmc_rspi_status() & STA_NODISK) == 0)) {
321 ntstdio_printf(&ntstdio, "SD card initializing ...\n");
322
323 Sd.FatFs.fs_type = 0;
324 if (SD_begin()) {
325 ntstdio_printf(&ntstdio, "SD card (1:) OK!\n");
326
327 /* uploadディレクトリを作成しておく */
328 f_mkdir("1:/upload");
329
330 ffarch_state = FFS_IDLE;
331 ffarch_timer = TMO_FEVR;
332 ffarch_retry_count = 3;
333 }
334 else {
335 ntstdio_printf(&ntstdio, "SD card (1:) NG!\n");
336 ffarch_state = FFS_RETRY_WAIT;
337 ffarch_timer = 1000 * 1000;
338 }
339 }
340 /* SDカードが抜かれた場合 */
341 else if (((mmc_rspi_prev_status & STA_NODISK) == 0) && ((mmc_rspi_status() & STA_NODISK) != 0)) {
342 ntstdio_printf(&ntstdio, "SD card unmount\n");
343
344 f_mount(&Sd.FatFs, "1:", 0);
345 ffarch_state = FFS_IDLE;
346 ffarch_timer = TMO_FEVR;
347 ffarch_retry_count = 3;
348 }
349 mmc_rspi_prev_status = mmc_rspi_status();
350 break;
351 }
352}
353
354int ff_cre_syncobj(BYTE vol, _SYNC_t* sobj)
355{
356 return 1;
357}
358
359int ff_req_grant(_SYNC_t sobj)
360{
361 ER ret;
362 ret = wai_sem(SEM_FILESYSTEM);
363 return ret == E_OK;
364}
365
366void ff_rel_grant(_SYNC_t sobj)
367{
368 sig_sem(SEM_FILESYSTEM);
369}
370
371int ff_del_syncobj(_SYNC_t sobj)
372{
373 return 1;
374}
375
376void* ff_memalloc (UINT msize)
377{
378 return malloc(msize);
379}
380
381void ff_memfree (void* mblock)
382{
383 free(mblock);
384}
385
386DWORD get_fattime(void)
387{
388 time_t temp;
389 struct tm _tm;
390
391 temp = rtc_read();
392 gmtime_r(&temp, &_tm);
393
394 return ((DWORD)(_tm.tm_year - 1980) << 25)
395 | ((DWORD)_tm.tm_mon << 21)
396 | ((DWORD)_tm.tm_mday << 16)
397 | ((DWORD)_tm.tm_hour << 11)
398 | ((DWORD)_tm.tm_min << 5)
399 | ((DWORD)_tm.tm_sec >> 1);
400}
Note: See TracBrowser for help on using the repository browser.