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

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

arm向けASP3版ECNLを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 6.3 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
55//extern ntstdio_t ntstdio;
56
57FATFS RomDisk;
58
59gpio_t ins;
60sdfs_t sdfs;
61#define WP() false
62
63typedef struct SD {
64 DSTATUS dst;
65 BYTE type;
66 FATFS FatFs;
67} SD;
68SD Sd;
69
70bool_t romdisk_init();
71bool_t SD_begin();
72
73int ffarch_init()
74{
75 int result = -1;
76
77 /* SD_CD */
78 gpio_init_in(&ins, P7_8);
79
80 /* SDカードを初期化 */
81 sdfs_init(&sdfs, P8_5, P8_6, P8_3, P8_4, "sd");
82
83 result = SD_begin() ? 0 : -1;
84 if (result == 0) {
85 printf("SD card (1:) OK!\n");
86 }
87 else {
88 printf("SD card (1:) NG!\n");
89 }
90 sta_cyc(SDFS_CYC);
91
92 if (romdisk_init())
93 result = 0;
94
95 if (result == 0) {
96 printf("ROM disk (0:) OK!\n");
97 }
98 else {
99 printf("ROM disk (0:) NG!\n");
100 }
101
102 /* uploadディレクトリを作成しておく */
103 f_mkdir("1:/upload");
104
105 serial_ctl_por(SIO_PORTID, IOCTL_FCSND | IOCTL_FCRCV);
106
107 return result;
108}
109
110bool_t romdisk_init()
111{
112 DSTATUS dst;
113 FRESULT res;
114
115 if (RomDisk.fs_type != 0)
116 return true;
117
118 if ((dst = ramdisk_initialize()) != RES_OK) {
119 return false;
120 }
121
122 if ((res = f_mount(&RomDisk, "0:", 1)) != FR_OK) {
123 return false;
124 }
125
126 return true;
127}
128
129bool_t SD_begin()
130{
131 DSTATUS dst;
132 FRESULT res;
133 BYTE pdrv = 1, type;
134
135 if (Sd.FatFs.fs_type != 0)
136 return true;
137
138 if ((dst = disk_initialize(pdrv)) != RES_OK) {
139 return false;
140 }
141
142 if ((dst = disk_ioctl(pdrv, MMC_GET_TYPE, &type)) != RES_OK) {
143 Sd.dst = dst;
144 Sd.type = 0;
145 }
146 else {
147 Sd.dst = RES_OK;
148 Sd.type = type;
149 }
150
151 if ((res = f_mount(&Sd.FatFs, "1:", 1)) != FR_OK) {
152 return false;
153 }
154
155 return true;
156}
157
158DSTATUS disk_initialize(BYTE pdrv)
159{
160 switch (pdrv) {
161 case 0:
162 return ramdisk_initialize();
163 case 1:
164 return sdfs_initialize(&sdfs);
165 }
166 return STA_NOINIT;
167}
168
169DSTATUS disk_status(BYTE pdrv)
170{
171 switch (pdrv) {
172 case 0:
173 return ramdisk_get_status();
174 case 1:
175 return sdfs_status(&sdfs);
176 }
177 return STA_NOINIT;
178}
179
180DRESULT disk_read(BYTE pdrv, BYTE *buff, DWORD sector, UINT count)
181{
182 switch (pdrv) {
183 case 0:
184 return ramdisk_read(buff, sector, count);
185 case 1:
186 return sdfs_read(&sdfs, buff, sector, count);
187 }
188 return RES_PARERR;
189}
190
191DRESULT disk_write(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count)
192{
193 switch (pdrv) {
194 case 0:
195 return ramdisk_write(buff, sector, count);
196 case 1:
197 return sdfs_write(&sdfs, buff, sector, count);
198 }
199 return RES_PARERR;
200}
201
202DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff)
203{
204 switch (pdrv) {
205 case 0:
206 return RES_PARERR; /* ramdisk_ioctl(cmd, buff); */
207 case 1:
208 switch(cmd) {
209 case CTRL_SYNC:
210 return sdfs_sync(&sdfs);
211 case GET_SECTOR_COUNT:
212 return sdfs_sectors(&sdfs);
213 case GET_BLOCK_SIZE:
214 *((DWORD*)buff) = 1; // default when not known
215 return RES_OK;
216 }
217 }
218 return RES_PARERR;
219}
220
221void sdfs_cychdr(intptr_t exinf)
222{
223 BYTE s;
224
225 s = sdfs._is_initialized;
226 if (WP()) /* Write protected */
227 s |= STA_PROTECT;
228 else /* Write enabled */
229 s &= ~STA_PROTECT;
230 if (gpio_read(&ins)) /* Card is in socket */
231 s &= ~STA_NODISK;
232 else /* Socket empty */
233 s |= (STA_NODISK | STA_NOINIT);
234 sdfs._is_initialized = s;
235}
236
237int ff_cre_syncobj(BYTE vol, _SYNC_t* sobj)
238{
239 return 1;
240}
241
242int ff_req_grant(_SYNC_t sobj)
243{
244 ER ret;
245 ret = wai_sem(SEM_FILESYSTEM);
246 return ret == E_OK;
247}
248
249void ff_rel_grant(_SYNC_t sobj)
250{
251 sig_sem(SEM_FILESYSTEM);
252}
253
254int ff_del_syncobj(_SYNC_t sobj)
255{
256 return 1;
257}
258
259void* ff_memalloc (UINT msize)
260{
261 return malloc(msize);
262}
263
264void ff_memfree (void* mblock)
265{
266 free(mblock);
267}
268
269DWORD get_fattime(void)
270{
271 time_t temp;
272 struct tm _tm;
273
274 temp = rtc_read();
275 gmtime_r(&temp, &_tm);
276
277 return ((DWORD)(_tm.tm_year - 1980) << 25)
278 | ((DWORD)_tm.tm_mon << 21)
279 | ((DWORD)_tm.tm_mday << 16)
280 | ((DWORD)_tm.tm_hour << 11)
281 | ((DWORD)_tm.tm_min << 5)
282 | ((DWORD)_tm.tm_sec >> 1);
283}
Note: See TracBrowser for help on using the repository browser.