source: EcnlProtoTool/trunk/ntshell/fatfs/ffarch.c@ 441

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

NTShellタスクを更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 10.1 KB
Line 
1/*
2 * TOPPERS PROJECT Home Network Working Group Software
3 *
4 * Copyright (C) 2014-2019 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 <stdio.h>
54#include "hal/rtc_api.h"
55#include "ffarch.h"
56
57#define SD_CARD_LOG_LEVEL LOG_INFO
58
59enum ffarch_state_t {
60 FFS_IDLE,
61 FFS_RETRY_WAIT,
62};
63
64enum ffarch_state_t ffarch_state;
65volatile int ffarch_timer;
66int ffarch_retry_count;
67uint8_t sdfs_new_status, sdfs_prev_status;
68
69static void ffarch_initialize();
70
71/*
72 * FatFSタスク
73 */
74void ffarch_task(intptr_t exinf)
75{
76 ER ret, ret2;
77 SYSTIM prev, now;
78 int timer;
79
80 ffarch_initialize();
81
82 ret2 = get_tim(&now);
83 if (ret2 != E_OK){
84 syslog(LOG_NOTICE, "[ffarch] get_tim error: %s",
85 itron_strerror(ret2));
86 return;
87 }
88
89 for(;;){
90 prev = now;
91
92 /* タイマー取得 */
93 timer = ffarch_get_timer();
94
95 /* 待ち */
96 ret = tslp_tsk(timer);
97 if ((ret != E_OK) && (ret != E_TMOUT)) {
98 syslog(LOG_NOTICE, "[ffarch] tslp_tsk error: %s %d",
99 itron_strerror(ret), timer);
100 break;
101 }
102
103 ret2 = get_tim(&now);
104 if (ret2 != E_OK) {
105 syslog(LOG_NOTICE, "[ffarch] get_tim error: %s",
106 itron_strerror(ret2));
107 break;
108 }
109
110 /* 時間経過 */
111 int elapse = now - prev;
112 ffarch_progress(elapse);
113
114 /* タイムアウト処理 */
115 ffarch_timeout();
116 }
117}
118
119FATFS RomDisk;
120
121gpio_t ins;
122sdfs_t sdfs;
123#define WP() false
124
125typedef struct SD {
126 DSTATUS dst;
127 BYTE type;
128 FATFS FatFs;
129} SD;
130SD Sd;
131
132bool_t romdisk_init();
133bool_t SD_begin();
134
135void ffarch_init(void)
136{
137 /* SD_CD */
138 gpio_init_in(&ins, P7_8);
139
140 /* SDカードを初期化 */
141 sdfs_init(&sdfs, P8_5, P8_6, P8_3, P8_4, "sd");
142
143 ffarch_state = FFS_IDLE;
144 ffarch_timer = 0;
145 ffarch_retry_count = 3;
146 sdfs_new_status = 0;
147 sdfs_prev_status = STA_NODISK;
148
149 ffarch_timeout();
150
151 act_tsk(FFARCH_TASK);
152
153 if (romdisk_init()) {
154 syslog(LOG_NOTICE, "ROM disk (0:) OK!");
155 }
156 else {
157 syslog(LOG_NOTICE, "ROM disk (0:) NG!");
158 }
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;
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(void)
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(void)
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 syslog(SD_CARD_LOG_LEVEL, "SD card (1:) initialize tired...");
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 syslog(SD_CARD_LOG_LEVEL, "SD card initializing ...");
393
394 if (SD_begin()) {
395 syslog(SD_CARD_LOG_LEVEL, "SD card (1:) OK!");
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 syslog(SD_CARD_LOG_LEVEL, "SD card (1:) NG!");
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 syslog(SD_CARD_LOG_LEVEL, "SD card unmount");
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
430void sdfs_debug(const char *fmt, ...)
431{
432 va_list arp;
433
434 va_start(arp, fmt);
435 syslog(SD_CARD_LOG_LEVEL, fmt, arp);
436 va_end(arp);
437}
438
439int ff_cre_syncobj(BYTE vol, FF_SYNC_t* sobj)
440{
441 return 1;
442}
443
444int ff_req_grant(FF_SYNC_t sobj)
445{
446 ER ret;
447 ret = wai_sem(SEM_FILESYSTEM);
448 return ret == E_OK;
449}
450
451void ff_rel_grant(FF_SYNC_t sobj)
452{
453 sig_sem(SEM_FILESYSTEM);
454}
455
456int ff_del_syncobj(FF_SYNC_t sobj)
457{
458 return 1;
459}
460
461void* ff_memalloc (UINT msize)
462{
463 return malloc(msize);
464}
465
466void ff_memfree (void* mblock)
467{
468 free(mblock);
469}
470
471DWORD get_fattime(void)
472{
473 time_t temp;
474 struct tm _tm;
475
476 temp = rtc_read();
477 gmtime_r(&temp, &_tm);
478
479 return ((DWORD)(_tm.tm_year - 1980) << 25)
480 | ((DWORD)_tm.tm_mon << 21)
481 | ((DWORD)_tm.tm_mday << 16)
482 | ((DWORD)_tm.tm_hour << 11)
483 | ((DWORD)_tm.tm_min << 5)
484 | ((DWORD)_tm.tm_sec >> 1);
485}
Note: See TracBrowser for help on using the repository browser.