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

Last change on this file since 286 was 279, checked in by coas-nagasima, 7 years ago

ファイルを追加、更新。

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 6.8 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 <kernel.h>
57#include <stdlib.h>
58#include <string.h>
59#include "t_stdlib.h"
60#include "syssvc/serial.h"
61#include "syssvc/syslog.h"
62#include "kernel_cfg.h"
63#include "diskio.h"
64#include "sdfs.h"
65#include "ff.h"
66#include "tlsf.h"
67#include "ntstdio.h"
68
69#define SIO_PORTID 1
70extern ntstdio_t ntstdio;
71
72static tlsf_t sys_tlsf;
73static pool_t sys_pool;
74
75uint32_t __HeapBase;
76uint32_t __HeapLimit;
77FATFS RomDisk;
78
79gpio_t ins;
80sdfs_t sdfs;
81#define WP() false
82
83typedef struct SD {
84 DSTATUS dst;
85 BYTE type;
86 FATFS FatFs;
87} SD;
88SD Sd;
89
90void sys_init(void);
91bool_t romdisk_init();
92bool_t SD_begin();
93
94int mruby_arduino_init()
95{
96 int result = -1;
97
98 sys_init();
99
100 /* SD_CD */
101 gpio_init_in(&ins, P7_8);
102
103 /* SDカードを初期化 */
104 sdfs_init(&sdfs, P8_5, P8_6, P8_3, P8_4, "sd");
105
106 result = SD_begin() ? 0 : -1;
107 if (result == 0) {
108 ntstdio_printf(&ntstdio, "SD card (1:) OK!\n");
109 }
110 else {
111 ntstdio_printf(&ntstdio, "SD card (1:) NG!\n");
112 }
113 sta_cyc(SDFS_CYC);
114
115 if (romdisk_init())
116 result = 0;
117
118 if (result == 0) {
119 ntstdio_printf(&ntstdio, "ROM disk (0:) OK!\n");
120 }
121 else {
122 ntstdio_printf(&ntstdio, "ROM disk (0:) NG!\n");
123 }
124
125 /* uploadディレクトリを作成しておく */
126 f_mkdir("1:/upload");
127
128 serial_ctl_por(SIO_PORTID, IOCTL_FCSND | IOCTL_FCRCV);
129
130 return result;
131}
132
133void sys_init(void)
134{
135 sys_tlsf = tlsf_create(&__HeapBase);
136 if (sys_tlsf == NULL)
137 return;
138
139 sys_pool = tlsf_add_pool(sys_tlsf, ((uint8_t *)&__HeapBase) + tlsf_size(), ((size_t)&__HeapLimit - (size_t)&__HeapBase) - tlsf_size());
140}
141
142void sys_fini(void)
143{
144 tlsf_destroy(sys_tlsf);
145}
146
147void *sys_malloc(size_t size)
148{
149 return tlsf_malloc(sys_tlsf, size);
150}
151
152void *sys_calloc(size_t size, size_t count)
153{
154 void *result = tlsf_malloc(sys_tlsf, count * size);
155 memset(result, 0, count * size);
156 return result;
157}
158
159void *sys_realloc(void *ptr, size_t size)
160{
161 return tlsf_realloc(sys_tlsf, ptr, size);
162}
163
164void sys_free(void *ptr)
165{
166 tlsf_free(sys_tlsf, ptr);
167}
168
169bool_t romdisk_init()
170{
171 DSTATUS dst;
172 FRESULT res;
173
174 if (RomDisk.fs_type != 0)
175 return true;
176
177 if ((dst = ramdisk_initialize()) != RES_OK) {
178 return false;
179 }
180
181 if ((res = f_mount(&RomDisk, "0:", 1)) != FR_OK) {
182 return false;
183 }
184
185 return true;
186}
187
188bool_t SD_begin()
189{
190 DSTATUS dst;
191 FRESULT res;
192 BYTE pdrv = 1, type;
193
194 if (Sd.FatFs.fs_type != 0)
195 return true;
196
197 if ((dst = disk_initialize(pdrv)) != RES_OK) {
198 return false;
199 }
200
201 if ((dst = disk_ioctl(pdrv, MMC_GET_TYPE, &type)) != RES_OK) {
202 Sd.dst = dst;
203 Sd.type = 0;
204 }
205 else {
206 Sd.dst = RES_OK;
207 Sd.type = type;
208 }
209
210 if ((res = f_mount(&Sd.FatFs, "1:", 1)) != FR_OK) {
211 return false;
212 }
213
214 return true;
215}
216
217DSTATUS disk_initialize(BYTE pdrv)
218{
219 switch (pdrv) {
220 case 0:
221 return ramdisk_initialize();
222 case 1:
223 return sdfs_initialize(&sdfs);
224 }
225 return STA_NOINIT;
226}
227
228DSTATUS disk_status(BYTE pdrv)
229{
230 switch (pdrv) {
231 case 0:
232 return ramdisk_get_status();
233 case 1:
234 return sdfs_status(&sdfs);
235 }
236 return STA_NOINIT;
237}
238
239DRESULT disk_read(BYTE pdrv, BYTE *buff, DWORD sector, UINT count)
240{
241 switch (pdrv) {
242 case 0:
243 return ramdisk_read(buff, sector, count);
244 case 1:
245 return sdfs_read(&sdfs, buff, sector, count);
246 }
247 return RES_PARERR;
248}
249
250DRESULT disk_write(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count)
251{
252 switch (pdrv) {
253 case 0:
254 return ramdisk_write(buff, sector, count);
255 case 1:
256 return sdfs_write(&sdfs, buff, sector, count);
257 }
258 return RES_PARERR;
259}
260
261DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff)
262{
263 switch (pdrv) {
264 case 0:
265 return RES_PARERR; /* ramdisk_ioctl(cmd, buff); */
266 case 1:
267 switch(cmd) {
268 case CTRL_SYNC:
269 return sdfs_sync(&sdfs);
270 case GET_SECTOR_COUNT:
271 return sdfs_sectors(&sdfs);
272 case GET_BLOCK_SIZE:
273 *((DWORD*)buff) = 1; // default when not known
274 return RES_OK;
275 }
276 }
277 return RES_PARERR;
278}
279
280void sdfs_cychdr(intptr_t exinf)
281{
282 BYTE s;
283
284 s = sdfs._is_initialized;
285 if (WP()) /* Write protected */
286 s |= STA_PROTECT;
287 else /* Write enabled */
288 s &= ~STA_PROTECT;
289 if (gpio_read(&ins)) /* Card is in socket */
290 s &= ~STA_NODISK;
291 else /* Socket empty */
292 s |= (STA_NODISK | STA_NOINIT);
293 sdfs._is_initialized = s;
294}
295
296int ff_cre_syncobj(BYTE vol, _SYNC_t* sobj)
297{
298 return 1;
299}
300
301int ff_req_grant(_SYNC_t sobj)
302{
303 ER ret;
304 ret = wai_sem(SEM_FILESYSTEM);
305 return ret == E_OK;
306}
307
308void ff_rel_grant(_SYNC_t sobj)
309{
310 sig_sem(SEM_FILESYSTEM);
311}
312
313int ff_del_syncobj(_SYNC_t sobj)
314{
315 return 1;
316}
317
318void* ff_memalloc (UINT msize)
319{
320 return sys_malloc(msize);
321}
322
323void ff_memfree (void* mblock)
324{
325 sys_free(mblock);
326}
Note: See TracBrowser for help on using the repository browser.