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