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

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

FATFSのマクロ名を変更

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