source: asp3_tinet_ecnl_arm/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: 10.0 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 "sdfs.h"
52#include "ff.h"
53#include "util/ntstdio.h"
54
55extern ntstdio_t ntstdio;
56
57enum ffarch_state_t {
58 FFS_IDLE,
59 FFS_RETRY_WAIT,
60};
61
62enum ffarch_state_t ffarch_state;
63volatile int ffarch_timer;
64int ffarch_retry_count;
65uint8_t sdfs_new_status, sdfs_prev_status;
66
67static void ffarch_initialize();
68
69/*
70 * FatFSタスク
71 */
72void ffarch_task(intptr_t exinf)
73{
74 ER ret, ret2;
75 SYSTIM prev, now;
76 int timer;
77
78 ffarch_initialize();
79
80 ret2 = get_tim(&now);
81 if (ret2 != E_OK){
82 ntstdio_printf(&ntstdio, "[ffarch] get_tim error: %s",
83 itron_strerror(ret2));
84 return;
85 }
86
87 for(;;){
88 prev = now;
89
90 /* タイマー取得 */
91 timer = ffarch_get_timer();
92
93 /* 待ち */
94 ret = tslp_tsk(timer);
95 if ((ret != E_OK) && (ret != E_TMOUT)) {
96 ntstdio_printf(&ntstdio, "[ffarch] tslp_tsk error: %s %d",
97 itron_strerror(ret), timer);
98 break;
99 }
100
101 ret2 = get_tim(&now);
102 if (ret2 != E_OK) {
103 ntstdio_printf(&ntstdio, "[ffarch] get_tim error: %s",
104 itron_strerror(ret2));
105 break;
106 }
107
108 /* 時間経過 */
109 int elapse = now - prev;
110 ffarch_progress(elapse);
111
112 /* タイムアウト処理 */
113 ffarch_timeout();
114 }
115}
116
117FATFS RomDisk;
118
119gpio_t ins;
120sdfs_t sdfs;
121#define WP() false
122
123typedef struct SD {
124 DSTATUS dst;
125 BYTE type;
126 FATFS FatFs;
127} SD;
128SD Sd;
129
130bool_t romdisk_init();
131bool_t SD_begin();
132
133void ffarch_init()
134{
135 /* SD_CD */
136 gpio_init_in(&ins, P7_8);
137
138 /* SDカードを初期化 */
139 sdfs_init(&sdfs, P8_5, P8_6, P8_3, P8_4, "sd");
140
141 ffarch_state = FFS_IDLE;
142 ffarch_timer = 0;
143 ffarch_retry_count = 3;
144 sdfs_new_status = 0;
145 sdfs_prev_status = STA_NODISK;
146
147 ffarch_timeout();
148
149 act_tsk(FFARCH_TASK);
150
151 if (romdisk_init()) {
152 ntstdio_printf(&ntstdio, "ROM disk (0:) OK!\n");
153 }
154 else {
155 ntstdio_printf(&ntstdio, "ROM disk (0:) NG!\n");
156 }
157
158 serial_ctl_por(SIO_PORTID, IOCTL_FCSND | IOCTL_FCRCV);
159}
160
161void ffarch_initialize()
162{
163 sta_cyc(SDFS_CYC);
164}
165
166bool_t romdisk_init()
167{
168 DSTATUS dst;
169 FRESULT res;
170
171 if (RomDisk.fs_type != 0)
172 return true;
173
174 if ((dst = ramdisk_initialize()) != RES_OK) {
175 return false;
176 }
177
178 if ((res = f_mount(&RomDisk, "0:", 1)) != FR_OK) {
179 return false;
180 }
181
182 return true;
183}
184
185bool_t SD_begin()
186{
187 DSTATUS dst;
188 FRESULT res;
189 BYTE pdrv = 1, type;
190
191 if (Sd.FatFs.fs_type != 0)
192 return true;
193
194 if ((dst = disk_initialize(pdrv)) != RES_OK) {
195 return false;
196 }
197
198 if ((dst = disk_ioctl(pdrv, MMC_GET_TYPE, &type)) != RES_OK) {
199 Sd.dst = dst;
200 Sd.type = 0;
201 }
202 else {
203 Sd.dst = RES_OK;
204 Sd.type = type;
205 }
206
207 if ((res = f_mount(&Sd.FatFs, "1:", 1)) != FR_OK) {
208 return false;
209 }
210
211 return true;
212}
213
214DSTATUS disk_initialize(BYTE pdrv)
215{
216 switch (pdrv) {
217 case 0:
218 return ramdisk_initialize();
219 case 1:
220 return sdfs_initialize(&sdfs);
221 }
222 return STA_NOINIT;
223}
224
225DSTATUS disk_status(BYTE pdrv)
226{
227 switch (pdrv) {
228 case 0:
229 return ramdisk_get_status();
230 case 1:
231 return sdfs._is_initialized;
232 }
233 return STA_NOINIT;
234}
235
236DRESULT disk_read(BYTE pdrv, BYTE *buff, DWORD sector, UINT count)
237{
238 switch (pdrv) {
239 case 0:
240 return ramdisk_read(buff, sector, count);
241 case 1:
242 return sdfs_read(&sdfs, buff, sector, count);
243 }
244 return RES_PARERR;
245}
246
247DRESULT disk_write(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count)
248{
249 switch (pdrv) {
250 case 0:
251 return ramdisk_write(buff, sector, count);
252 case 1:
253 return sdfs_write(&sdfs, buff, sector, count);
254 }
255 return RES_PARERR;
256}
257
258DRESULT sdfs_ioctl(BYTE ctrl, void *buff);
259
260DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff)
261{
262 switch (pdrv) {
263 case 0:
264 return RES_PARERR; /* ramdisk_ioctl(cmd, buff); */
265 case 1:
266 return sdfs_ioctl(cmd, buff);
267 }
268 return RES_PARERR;
269}
270
271DRESULT sdfs_ioctl(BYTE ctrl, void *buff)
272{
273 DRESULT res;
274 uint32_t *dp = (uint32_t *)buff, st, ed;
275 uint8_t *ptr = (uint8_t *)buff;
276
277 if (sdfs._is_initialized & STA_NOINIT)
278 return RES_NOTRDY;
279
280 res = RES_ERROR;
281
282 switch (ctrl) {
283 case CTRL_SYNC:
284 if (sdfs_sync(&sdfs) == 0) {
285 res = RES_OK;
286 }
287 break;
288 case GET_SECTOR_SIZE:
289 *(WORD*)buff = 512;
290 res = RES_OK;
291 break;
292 case GET_SECTOR_COUNT:
293 *(DWORD*)buff = sdfs._capacity / 512;
294 res = RES_OK;
295 break;
296 case GET_BLOCK_SIZE:
297 *(DWORD*)buff = sdfs._block_len;
298 res = RES_OK;
299 break;
300 case CTRL_TRIM:
301 res = sdfs_trim(&sdfs, dp[0], dp[1]);
302 break;
303 case MMC_GET_TYPE:
304 *ptr = sdfs._card_type;
305 res = RES_OK;
306 break;
307 case MMC_GET_CSD:
308 memcpy(ptr, sdfs._csd, sizeof(sdfs._csd));
309 res = RES_OK;
310 break;
311 case MMC_GET_CID:
312 memcpy(ptr, sdfs._cid, sizeof(sdfs._cid));
313 res = RES_OK;
314 break;
315 case MMC_GET_OCR:
316 if (sdfs_get_ocr(&sdfs, buff) == 0) {
317 res = RES_OK;
318 }
319 break;
320 case MMC_GET_SDSTAT:
321 if (sdfs_get_sdstat(&sdfs, buff) == 0) {
322 res = RES_OK;
323 }
324 break;
325 default:
326 res = RES_PARERR;
327 }
328
329 return res;
330}
331
332void sdfs_cychdr(intptr_t exinf)
333{
334 BYTE s = 0;
335
336 /* Write protected */
337 if (WP())
338 s |= STA_PROTECT;
339 else
340 s &= ~STA_PROTECT;
341
342 /* Card is in socket */
343 if (gpio_read(&ins))
344 s |= (STA_NODISK | STA_NOINIT);
345 else
346 s &= ~STA_NODISK;
347
348 sdfs_new_status = s;
349
350 if ((sdfs_prev_status != sdfs_new_status) && (ffarch_state == FFS_IDLE)) {
351 ffarch_timer = 0;
352 wup_tsk(FFARCH_TASK);
353 }
354}
355
356int ffarch_get_timer()
357{
358 return ffarch_timer;
359}
360
361void ffarch_progress(int elapse)
362{
363 if (ffarch_timer != TMO_FEVR) {
364 ffarch_timer -= elapse;
365 if (ffarch_timer < 0) {
366 ffarch_timer = 0;
367 }
368 }
369}
370
371void ffarch_timeout()
372{
373 if (ffarch_timer != 0)
374 return;
375
376 switch (ffarch_state) {
377 case FFS_RETRY_WAIT:
378 if (ffarch_retry_count == 0) {
379 ntstdio_printf(&ntstdio, "SD card (1:) initialize tired...\n");
380
381 ffarch_state = FFS_IDLE;
382 ffarch_timer = TMO_FEVR;
383 ffarch_retry_count = 3;
384 break;
385 }
386 ffarch_retry_count--;
387 //goto case FFS_IDLE;
388 case FFS_IDLE:
389 /* SDカードが入れられた場合 */
390 if ((sdfs._is_initialized & STA_NOINIT)
391 || (((sdfs_prev_status & STA_NODISK) != 0) && ((sdfs_new_status & STA_NODISK) == 0))) {
392 ntstdio_printf(&ntstdio, "SD card initializing ...\n");
393
394 if (SD_begin()) {
395 ntstdio_printf(&ntstdio, "SD card (1:) OK!\n");
396
397 /* uploadディレクトリを作成しておく */
398 f_mkdir("1:/upload");
399
400 ffarch_state = FFS_IDLE;
401 ffarch_timer = TMO_FEVR;
402 ffarch_retry_count = 3;
403 }
404 else {
405 ntstdio_printf(&ntstdio, "SD card (1:) NG!\n");
406 ffarch_state = FFS_RETRY_WAIT;
407 ffarch_timer = 1000 * 1000;
408 }
409 }
410 /* SDカードが抜かれた場合 */
411 else if (((sdfs_prev_status & STA_NODISK) == 0) && ((sdfs_new_status & STA_NODISK) != 0)) {
412 ntstdio_printf(&ntstdio, "SD card unmount\n");
413
414 f_mount(&Sd.FatFs, "1:", 0);
415 ffarch_state = FFS_IDLE;
416 ffarch_timer = TMO_FEVR;
417 ffarch_retry_count = 3;
418 }
419 if (((sdfs_prev_status ^ sdfs_new_status) & STA_PROTECT) != 0) {
420 if ((sdfs_new_status & STA_PROTECT) != 0)
421 sdfs._is_initialized |= STA_PROTECT;
422 else
423 sdfs._is_initialized &= ~STA_PROTECT;
424 }
425 sdfs_prev_status = sdfs_new_status;
426 break;
427 }
428}
429
430int ff_cre_syncobj(BYTE vol, _SYNC_t* sobj)
431{
432 return 1;
433}
434
435int ff_req_grant(_SYNC_t sobj)
436{
437 ER ret;
438 ret = wai_sem(SEM_FILESYSTEM);
439 return ret == E_OK;
440}
441
442void ff_rel_grant(_SYNC_t sobj)
443{
444 sig_sem(SEM_FILESYSTEM);
445}
446
447int ff_del_syncobj(_SYNC_t sobj)
448{
449 return 1;
450}
451
452void* ff_memalloc (UINT msize)
453{
454 return malloc(msize);
455}
456
457void ff_memfree (void* mblock)
458{
459 free(mblock);
460}
461
462DWORD get_fattime(void)
463{
464 time_t temp;
465 struct tm _tm;
466
467 temp = rtc_read();
468 gmtime_r(&temp, &_tm);
469
470 return ((DWORD)(_tm.tm_year - 1980) << 25)
471 | ((DWORD)_tm.tm_mon << 21)
472 | ((DWORD)_tm.tm_mday << 16)
473 | ((DWORD)_tm.tm_hour << 11)
474 | ((DWORD)_tm.tm_min << 5)
475 | ((DWORD)_tm.tm_sec >> 1);
476}
Note: See TracBrowser for help on using the repository browser.