source: asp3_tinet_ecnl_arm/trunk/ntshell/fatfs/ffarch.c@ 400

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

ファイルヘッダーの更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 9.9 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
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 syslog(LOG_NOTICE, "[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 syslog(LOG_NOTICE, "[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 syslog(LOG_NOTICE, "[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(void)
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 syslog(LOG_NOTICE, "ROM disk (0:) OK!");
153 }
154 else {
155 syslog(LOG_NOTICE, "ROM disk (0:) NG!");
156 }
157}
158
159void ffarch_initialize()
160{
161 sta_cyc(SDFS_CYC);
162}
163
164bool_t romdisk_init()
165{
166 DSTATUS dst;
167 FRESULT res;
168
169 if (RomDisk.fs_type != 0)
170 return true;
171
172 if ((dst = ramdisk_initialize()) != RES_OK) {
173 return false;
174 }
175
176 if ((res = f_mount(&RomDisk, "0:", 1)) != FR_OK) {
177 return false;
178 }
179
180 return true;
181}
182
183bool_t SD_begin()
184{
185 DSTATUS dst;
186 FRESULT res;
187 BYTE pdrv = 1, type;
188
189 if (Sd.FatFs.fs_type != 0)
190 return true;
191
192 if ((dst = disk_initialize(pdrv)) != RES_OK) {
193 return false;
194 }
195
196 if ((dst = disk_ioctl(pdrv, MMC_GET_TYPE, &type)) != RES_OK) {
197 Sd.dst = dst;
198 Sd.type = 0;
199 }
200 else {
201 Sd.dst = RES_OK;
202 Sd.type = type;
203 }
204
205 if ((res = f_mount(&Sd.FatFs, "1:", 1)) != FR_OK) {
206 return false;
207 }
208
209 return true;
210}
211
212DSTATUS disk_initialize(BYTE pdrv)
213{
214 switch (pdrv) {
215 case 0:
216 return ramdisk_initialize();
217 case 1:
218 return sdfs_initialize(&sdfs);
219 }
220 return STA_NOINIT;
221}
222
223DSTATUS disk_status(BYTE pdrv)
224{
225 switch (pdrv) {
226 case 0:
227 return ramdisk_get_status();
228 case 1:
229 return sdfs._is_initialized;
230 }
231 return STA_NOINIT;
232}
233
234DRESULT disk_read(BYTE pdrv, BYTE *buff, DWORD sector, UINT count)
235{
236 switch (pdrv) {
237 case 0:
238 return ramdisk_read(buff, sector, count);
239 case 1:
240 return sdfs_read(&sdfs, buff, sector, count);
241 }
242 return RES_PARERR;
243}
244
245DRESULT disk_write(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count)
246{
247 switch (pdrv) {
248 case 0:
249 return ramdisk_write(buff, sector, count);
250 case 1:
251 return sdfs_write(&sdfs, buff, sector, count);
252 }
253 return RES_PARERR;
254}
255
256DRESULT sdfs_ioctl(BYTE ctrl, void *buff);
257
258DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff)
259{
260 switch (pdrv) {
261 case 0:
262 return RES_PARERR; /* ramdisk_ioctl(cmd, buff); */
263 case 1:
264 return sdfs_ioctl(cmd, buff);
265 }
266 return RES_PARERR;
267}
268
269DRESULT sdfs_ioctl(BYTE ctrl, void *buff)
270{
271 DRESULT res;
272 uint32_t *dp = (uint32_t *)buff;
273 uint8_t *ptr = (uint8_t *)buff;
274
275 if (sdfs._is_initialized & STA_NOINIT)
276 return RES_NOTRDY;
277
278 res = RES_ERROR;
279
280 switch (ctrl) {
281 case CTRL_SYNC:
282 if (sdfs_sync(&sdfs) == 0) {
283 res = RES_OK;
284 }
285 break;
286 case GET_SECTOR_SIZE:
287 *(WORD*)buff = 512;
288 res = RES_OK;
289 break;
290 case GET_SECTOR_COUNT:
291 *(DWORD*)buff = sdfs._capacity / 512;
292 res = RES_OK;
293 break;
294 case GET_BLOCK_SIZE:
295 *(DWORD*)buff = sdfs._block_len;
296 res = RES_OK;
297 break;
298 case CTRL_TRIM:
299 res = sdfs_trim(&sdfs, dp[0], dp[1]);
300 break;
301 case MMC_GET_TYPE:
302 *ptr = sdfs._card_type;
303 res = RES_OK;
304 break;
305 case MMC_GET_CSD:
306 memcpy(ptr, sdfs._csd, sizeof(sdfs._csd));
307 res = RES_OK;
308 break;
309 case MMC_GET_CID:
310 memcpy(ptr, sdfs._cid, sizeof(sdfs._cid));
311 res = RES_OK;
312 break;
313 case MMC_GET_OCR:
314 if (sdfs_get_ocr(&sdfs, buff) == 0) {
315 res = RES_OK;
316 }
317 break;
318 case MMC_GET_SDSTAT:
319 if (sdfs_get_sdstat(&sdfs, buff) == 0) {
320 res = RES_OK;
321 }
322 break;
323 default:
324 res = RES_PARERR;
325 }
326
327 return res;
328}
329
330void sdfs_cychdr(intptr_t exinf)
331{
332 BYTE s = 0;
333
334 /* Write protected */
335 if (WP())
336 s |= STA_PROTECT;
337 else
338 s &= ~STA_PROTECT;
339
340 /* Card is in socket */
341 if (gpio_read(&ins))
342 s |= (STA_NODISK | STA_NOINIT);
343 else
344 s &= ~STA_NODISK;
345
346 sdfs_new_status = s;
347
348 if ((sdfs_prev_status != sdfs_new_status) && (ffarch_state == FFS_IDLE)) {
349 ffarch_timer = 0;
350 wup_tsk(FFARCH_TASK);
351 }
352}
353
354int ffarch_get_timer(void)
355{
356 return ffarch_timer;
357}
358
359void ffarch_progress(int elapse)
360{
361 if (ffarch_timer != TMO_FEVR) {
362 ffarch_timer -= elapse;
363 if (ffarch_timer < 0) {
364 ffarch_timer = 0;
365 }
366 }
367}
368
369void ffarch_timeout(void)
370{
371 if (ffarch_timer != 0)
372 return;
373
374 switch (ffarch_state) {
375 case FFS_RETRY_WAIT:
376 if (ffarch_retry_count == 0) {
377 syslog(LOG_NOTICE, "SD card (1:) initialize tired...");
378
379 ffarch_state = FFS_IDLE;
380 ffarch_timer = TMO_FEVR;
381 ffarch_retry_count = 3;
382 break;
383 }
384 ffarch_retry_count--;
385 //goto case FFS_IDLE;
386 case FFS_IDLE:
387 /* SDカードが入れられた場合 */
388 if ((sdfs._is_initialized & STA_NOINIT)
389 || (((sdfs_prev_status & STA_NODISK) != 0) && ((sdfs_new_status & STA_NODISK) == 0))) {
390 syslog(LOG_NOTICE, "SD card initializing ...");
391
392 if (SD_begin()) {
393 syslog(LOG_NOTICE, "SD card (1:) OK!");
394
395 /* uploadディレクトリを作成しておく */
396 f_mkdir("1:/upload");
397
398 ffarch_state = FFS_IDLE;
399 ffarch_timer = TMO_FEVR;
400 ffarch_retry_count = 3;
401 }
402 else {
403 syslog(LOG_NOTICE, "SD card (1:) NG!");
404 ffarch_state = FFS_RETRY_WAIT;
405 ffarch_timer = 1000 * 1000;
406 }
407 }
408 /* SDカードが抜かれた場合 */
409 else if (((sdfs_prev_status & STA_NODISK) == 0) && ((sdfs_new_status & STA_NODISK) != 0)) {
410 syslog(LOG_NOTICE, "SD card unmount");
411
412 f_mount(&Sd.FatFs, "1:", 0);
413 ffarch_state = FFS_IDLE;
414 ffarch_timer = TMO_FEVR;
415 ffarch_retry_count = 3;
416 }
417 if (((sdfs_prev_status ^ sdfs_new_status) & STA_PROTECT) != 0) {
418 if ((sdfs_new_status & STA_PROTECT) != 0)
419 sdfs._is_initialized |= STA_PROTECT;
420 else
421 sdfs._is_initialized &= ~STA_PROTECT;
422 }
423 sdfs_prev_status = sdfs_new_status;
424 break;
425 }
426}
427
428int ff_cre_syncobj(BYTE vol, FF_SYNC_t* sobj)
429{
430 return 1;
431}
432
433int ff_req_grant(FF_SYNC_t sobj)
434{
435 ER ret;
436 ret = wai_sem(SEM_FILESYSTEM);
437 return ret == E_OK;
438}
439
440void ff_rel_grant(FF_SYNC_t sobj)
441{
442 sig_sem(SEM_FILESYSTEM);
443}
444
445int ff_del_syncobj(FF_SYNC_t sobj)
446{
447 return 1;
448}
449
450void* ff_memalloc (UINT msize)
451{
452 return malloc(msize);
453}
454
455void ff_memfree (void* mblock)
456{
457 free(mblock);
458}
459
460DWORD get_fattime(void)
461{
462 time_t temp;
463 struct tm _tm;
464
465 temp = rtc_read();
466 gmtime_r(&temp, &_tm);
467
468 return ((DWORD)(_tm.tm_year - 1980) << 25)
469 | ((DWORD)_tm.tm_mon << 21)
470 | ((DWORD)_tm.tm_mday << 16)
471 | ((DWORD)_tm.tm_hour << 11)
472 | ((DWORD)_tm.tm_min << 5)
473 | ((DWORD)_tm.tm_sec >> 1);
474}
Note: See TracBrowser for help on using the repository browser.