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

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

sdfsを更新

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