source: azure_iot_hub/trunk/ntshell/fatfs/ffarch.c@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 8.5 KB
Line 
1/*
2 * TOPPERS ECHONET Lite Communication Middleware
3 *
4 * Copyright (C) 2014-2017 Cores Co., Ltd. Japan
5 *
6 * 上記著作権者
7は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
8 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9 * 変・再é…
10å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * スコード中に含まれていること.
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再é…
16å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
17å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
18 * 者
19マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再é…
23å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
24 * と.
25 * (a) 再é…
26å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
27マニュアルなど)に,上記の著
28 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
29 * (b) 再é…
30å¸ƒã®å½¢æ…
31‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
32 * 報告すること.
33 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
34 * 害からも,上記著作権者
35およびTOPPERSプロジェクトをå…
36è²¬ã™ã‚‹ã“と.
37 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
38 * 由に基づく請求からも,上記著作権者
39およびTOPPERSプロジェクトを
40 * å…
41è²¬ã™ã‚‹ã“と.
42 *
43 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
44お
45 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
46 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
47 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
48 * の責任を負わない.
49 *
50 */
51
52/*
53 * サンプルプログラム(1)の本体
54 */
55
56#include "shellif.h"
57#include <kernel.h>
58#include <stdlib.h>
59#include <string.h>
60#include <stdbool.h>
61#include "t_stdlib.h"
62#include "syssvc/serial.h"
63#include "syssvc/syslog.h"
64#include "target_syssvc.h"
65#include "target_stddef.h"
66#include "kernel_cfg.h"
67#include "diskio.h"
68#include "mmc_rspi.h"
69#include "ff.h"
70#include "ffarch.h"
71#include <stdio.h>
72#include "gpio_api.h"
73#include "rtc_api.h"
74
75enum ffarch_state_t {
76 FFS_IDLE,
77 FFS_RETRY_WAIT,
78 FFS_DISABLE,
79};
80
81enum ffarch_state_t ffarch_state;
82volatile int ffarch_timer;
83int ffarch_retry_count;
84uint8_t mmc_rspi_prev_status;
85
86static void ffarch_initialize();
87
88/*
89 * FatFSタスク
90 */
91void ffarch_task(intptr_t exinf)
92{
93 ER ret, ret2;
94 SYSTIM prev, now;
95 int timer;
96
97 ffarch_initialize();
98
99 ret2 = get_tim(&now);
100 if (ret2 != E_OK){
101 syslog(LOG_NOTICE, "[ffarch] get_tim error: %s",
102 itron_strerror(ret2));
103 return;
104 }
105
106 for(;;){
107 prev = now;
108
109 /* タイマー取得 */
110 timer = ffarch_get_timer();
111
112 /* 待
113ち */
114 ret = tslp_tsk(timer);
115 if ((ret != E_OK) && (ret != E_TMOUT)) {
116 syslog(LOG_NOTICE, "[ffarch] tslp_tsk error: %s %d",
117 itron_strerror(ret), timer);
118 break;
119 }
120
121 ret2 = get_tim(&now);
122 if (ret2 != E_OK) {
123 syslog(LOG_NOTICE, "[ffarch] get_tim error: %s",
124 itron_strerror(ret2));
125 break;
126 }
127
128 /* 時間経過 */
129 int elapse = now - prev;
130 ffarch_progress(elapse);
131
132 /* タイムアウト処理 */
133 ffarch_timeout();
134 }
135}
136
137FATFS RomDisk;
138
139#define WP() false
140
141typedef struct SD {
142 DSTATUS dst;
143 BYTE type;
144 FATFS FatFs;
145} SD;
146SD Sd;
147
148bool_t romdisk_init();
149bool_t SD_begin();
150
151void ffarch_init(void)
152{
153#ifdef TOPPERS_GRCITRUS
154 ffarch_state = FFS_DISABLE;
155 ffarch_timer = TMO_FEVR;
156 mmc_rspi_prev_status = STA_NODISK;
157#else
158 ffarch_state = FFS_IDLE;
159 ffarch_timer = 0;
160 ffarch_retry_count = 3;
161 mmc_rspi_prev_status = STA_NODISK;
162
163 ffarch_timeout();
164
165 act_tsk(FFARCH_TASK);
166#endif
167 if (romdisk_init()) {
168 syslog(LOG_NOTICE, "ROM disk (0:) OK!");
169 }
170 else {
171 syslog(LOG_NOTICE, "ROM disk (0:) NG!");
172 }
173}
174
175void ffarch_initialize()
176{
177#ifdef TOPPERS_GRCITRUS
178 ffarch_state = FFS_DISABLE;
179 ffarch_timer = TMO_FEVR;
180 mmc_rspi_prev_status = STA_NODISK;
181#else
182 sta_cyc(MMC_RSPI_CYC);
183#endif
184}
185
186bool_t romdisk_init()
187{
188 DSTATUS dst;
189 FRESULT res;
190
191 if (RomDisk.fs_type != 0)
192 return true;
193
194 if ((dst = ramdisk_initialize()) != RES_OK) {
195 return false;
196 }
197
198 if ((res = f_mount(&RomDisk, "0:", 1)) != FR_OK) {
199 return false;
200 }
201
202 return true;
203}
204
205bool_t SD_begin()
206{
207 DSTATUS dst;
208 FRESULT res;
209 BYTE pdrv = 1, type;
210
211 if (Sd.FatFs.fs_type != 0)
212 return true;
213
214 if ((dst = disk_initialize(pdrv)) != RES_OK) {
215 return false;
216 }
217
218 if ((dst = disk_ioctl(pdrv, MMC_GET_TYPE, &type)) != RES_OK) {
219 Sd.dst = dst;
220 Sd.type = 0;
221 }
222 else {
223 Sd.dst = RES_OK;
224 Sd.type = type;
225 }
226
227 if ((res = f_mount(&Sd.FatFs, "1:", 1)) != FR_OK) {
228 return false;
229 }
230
231 return true;
232}
233
234DSTATUS disk_initialize(BYTE pdrv)
235{
236 switch (pdrv) {
237 case 0:
238 return ramdisk_initialize();
239 case 1:
240 return mmc_rspi_initialize();
241 }
242 return STA_NOINIT;
243}
244
245DSTATUS disk_status(BYTE pdrv)
246{
247 switch (pdrv) {
248 case 0:
249 return ramdisk_get_status();
250 case 1:
251 return mmc_rspi_status();
252 }
253 return STA_NOINIT;
254}
255
256DRESULT disk_read(BYTE pdrv, BYTE *buff, DWORD sector, UINT count)
257{
258 switch (pdrv) {
259 case 0:
260 return ramdisk_read(buff, sector, count);
261 case 1:
262 return mmc_rspi_read(buff, sector, count);
263 }
264 return RES_PARERR;
265}
266
267DRESULT disk_write(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count)
268{
269 switch (pdrv) {
270 case 0:
271 return ramdisk_write(buff, sector, count);
272 case 1:
273 return mmc_rspi_write(buff, sector, count);
274 }
275 return RES_PARERR;
276}
277
278DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff)
279{
280 switch (pdrv) {
281 case 0:
282 return RES_PARERR; /* ramdisk_ioctl(cmd, buff); */
283 case 1:
284 return mmc_rspi_ioctl(cmd, buff);
285 }
286 return RES_PARERR;
287}
288
289void mmc_rspi_status_changed(DSTATUS newst)
290{
291 if (ffarch_state == FFS_IDLE) {
292 mmc_rspi_prev_status = mmc_rspi_status();
293 ffarch_timer = 0;
294 wup_tsk(FFARCH_TASK);
295 }
296}
297
298int ffarch_get_timer(void)
299{
300 return ffarch_timer;
301}
302
303void ffarch_progress(int elapse)
304{
305 if (ffarch_timer != TMO_FEVR) {
306 ffarch_timer -= elapse;
307 if (ffarch_timer < 0) {
308 ffarch_timer = 0;
309 }
310 }
311}
312
313void ffarch_timeout(void)
314{
315 if (ffarch_timer != 0)
316 return;
317
318 switch (ffarch_state) {
319 case FFS_RETRY_WAIT:
320 if (ffarch_retry_count == 0) {
321 syslog(LOG_NOTICE, "SD card (1:) initialize tired...");
322
323 ffarch_state = FFS_IDLE;
324 ffarch_timer = TMO_FEVR;
325 ffarch_retry_count = 3;
326 break;
327 }
328 ffarch_retry_count--;
329 //goto case FFS_IDLE;
330 case FFS_IDLE:
331 /* SDカードがå…
332¥ã‚Œã‚‰ã‚ŒãŸå ´åˆ */
333 if (((mmc_rspi_prev_status & STA_NODISK) != 0) && ((mmc_rspi_status() & STA_NODISK) == 0)) {
334 syslog(LOG_NOTICE, "SD card initializing ...");
335
336 Sd.FatFs.fs_type = 0;
337 if (SD_begin()) {
338 syslog(LOG_NOTICE, "SD card (1:) OK!");
339
340 /* uploadディレクトリを作成しておく */
341 f_mkdir("1:/upload");
342
343 ffarch_state = FFS_IDLE;
344 ffarch_timer = TMO_FEVR;
345 ffarch_retry_count = 3;
346 }
347 else {
348 syslog(LOG_NOTICE, "SD card (1:) NG!");
349 ffarch_state = FFS_RETRY_WAIT;
350 ffarch_timer = 1000 * 1000;
351 }
352 }
353 /* SDカードが抜かれた場合 */
354 else if (((mmc_rspi_prev_status & STA_NODISK) == 0) && ((mmc_rspi_status() & STA_NODISK) != 0)) {
355 syslog(LOG_NOTICE, "SD card unmount");
356
357 f_mount(&Sd.FatFs, "1:", 0);
358 ffarch_state = FFS_IDLE;
359 ffarch_timer = TMO_FEVR;
360 ffarch_retry_count = 3;
361 }
362 mmc_rspi_prev_status = mmc_rspi_status();
363 break;
364 }
365}
366
367int ff_cre_syncobj(BYTE vol, FF_SYNC_t* sobj)
368{
369 return 1;
370}
371
372int ff_req_grant(FF_SYNC_t sobj)
373{
374 ER ret;
375 ret = wai_sem(SEM_FILESYSTEM);
376 return ret == E_OK;
377}
378
379void ff_rel_grant(FF_SYNC_t sobj)
380{
381 sig_sem(SEM_FILESYSTEM);
382}
383
384int ff_del_syncobj(FF_SYNC_t sobj)
385{
386 return 1;
387}
388
389void* ff_memalloc (UINT msize)
390{
391 return malloc(msize);
392}
393
394void ff_memfree (void* mblock)
395{
396 free(mblock);
397}
398
399DWORD get_fattime(void)
400{
401 time_t temp;
402 struct tm _tm;
403
404 temp = rtc_read();
405 gmtime_r(&temp, &_tm);
406
407 return ((DWORD)(_tm.tm_year - 1980) << 25)
408 | ((DWORD)_tm.tm_mon << 21)
409 | ((DWORD)_tm.tm_mday << 16)
410 | ((DWORD)_tm.tm_hour << 11)
411 | ((DWORD)_tm.tm_min << 5)
412 | ((DWORD)_tm.tm_sec >> 1);
413}
Note: See TracBrowser for help on using the repository browser.