source: azure_iot_hub_f767zi/trunk/asp_baseplatform/gdic/rom_file/rom_file.c@ 457

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

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 7.4 KB
Line 
1/*
2 * TOPPERS BASE PLATFORM MIDDLEWARE
3 *
4 * Copyright (C) 2017-2019 by TOPPERS PROJECT
5 * Educational Working Group.
6 *
7 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation
8 * によって公表されている GNU General Public License の Version 2 に記
9 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
10 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
11 * 利用と呼ぶ)することを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18 * の無保証規定を掲載すること.
19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
20 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
21 * と.
22 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
23 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
24 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
25 * 報告すること.
26 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
27 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
28 *
29 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
30 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
31 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
32 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
33 *
34 * @(#) $Id$
35 */
36
37#include <kernel.h>
38#include <t_syslog.h>
39#include <t_stdlib.h>
40#include <stdio.h>
41#include <string.h>
42#include <target_syssvc.h>
43#include "syssvc/serial.h"
44#include "syssvc/syslog.h"
45#include "device.h"
46#include <fcntl.h>
47#include "storagedevice.h"
48#include "rom_file.h"
49
50
51static int num_files = 0;
52static int dirreadcount;
53static fs_descrip_t fs_descrip_table[MAX_DESCRIP];
54
55static void *romf_opendir(const char *pathname);
56static int romf_closedir(void *dir);
57static int romf_readdir(void *dir, void *pdirent);
58static int romf_open(int devno, const char *pathname, int flags);
59static int romf_close(int fd);
60static int romf_fstat(int fd, struct stat *buf);
61static off_t romf_lseek(int fd, off_t offset, int whence, int *res);
62static long romf_read(int fd, void *buf, long count, int *res);
63
64static const StorageDeviceFileFunc_t romfSDeviceFunc = {
65 romf_opendir,
66 romf_closedir,
67 romf_readdir,
68 0,
69 0,
70 0,
71 0,
72 0,
73 0,
74 0,
75 romf_open,
76 romf_close,
77 romf_fstat,
78 romf_lseek,
79 romf_read,
80 0,
81 0
82};
83
84
85/*
86 * FLASH-ROMファイル関数郡の初期化
87 */
88ER
89rom_file_init(void)
90{
91 StorageDevice_t *psdev;
92 int result;
93
94 num_files = 0;
95 memset(fs_descrip_table, 0, sizeof(fs_descrip_table));
96 result = SDMSetupDevice(DEFAULT_DEVNO, &psdev);
97 if(result == E_OK){
98 psdev->pdevff = (StorageDeviceFileFunc_t *)&romfSDeviceFunc;
99 psdev->_sdev_attribute |= SDEV_EMPLOY;
100 return MAX_DESCRIP;
101 }
102 else
103 return 0;
104}
105
106/*
107 * ROMファイルの生成
108 */
109int
110create_rom_file(const char *pathname, uintptr_t start, uint32_t size)
111{
112 fs_descrip_t *fdp;
113 int cd = -1;
114 int i;
115
116 dis_dsp(); /* disable dispatch */
117 for(i = 0 ; i < MAX_DESCRIP ; i++){
118 fdp = &fs_descrip_table[i];
119 if(fdp->create == 0){
120 fdp->create = 1;
121 fdp->inuse = 0;
122 fdp->fp = 0;
123 fdp->addr = start;
124 fdp->size = size;
125 fdp->filename = pathname;
126 cd = i;
127 num_files++;
128 break;
129 }
130 }
131 ena_dsp(); /* enable dispatch */
132 return cd;
133}
134
135/*
136 * FLASH-ROMファイルディレクトリオープン
137 */
138static void *
139romf_opendir(const char *pathname)
140{
141 dirreadcount = 0;
142 return (void *)&num_files;
143}
144
145/*
146 * ROMファイルディレクトリクローズ
147 */
148static int
149romf_closedir(void *dir)
150{
151 return 0;
152}
153
154/*
155 * ROMファイルディレクトリ読み込み
156 */
157static int
158romf_readdir(void *dir, void *pdirent)
159{
160 fs_descrip_t *pf;
161 struct dirent2 *pd = pdirent;
162 unsigned int i;
163
164 if(dirreadcount >= num_files)
165 return 0;
166 else{
167 pf = &fs_descrip_table[dirreadcount];
168 pd->d_fsize = pf->size;
169 pd->d_date = 0;
170 pd->d_time = 0;
171 pd->d_type = AM_RDO;
172 for(i = 0 ; i < 255 && pf->filename[i] != 0 ; i++){
173 pd->d_name[i] = pf->filename[i];
174 }
175 pd->d_name[i] = 0;
176 dirreadcount++;
177 return dirreadcount;
178 }
179}
180
181/*
182 * ROMファイルオープン
183 */
184static int
185romf_open(int devno, const char *pathname, int flags)
186{
187 fs_descrip_t *fdp = 0;
188 int fd;
189
190 SDMGetDeviceNo(&pathname);
191 if(*pathname == '/')
192 pathname++;
193 dis_dsp(); /* disable dispatch */
194 for(fd = 0 ; fd < num_files ; fd++){
195 fdp = &fs_descrip_table[fd];
196 if(fdp->create && strcmp(pathname, fdp->filename) == 0){
197 break;
198 }
199 }
200 if(fd < num_files && (flags & 0x0f) == O_RDONLY && fdp->inuse == 0){
201 fdp->inuse = 1;
202 fdp->fp = 0;
203 ena_dsp(); /* enable dispatch */
204 return fd;
205 }
206 else{
207 ena_dsp(); /* enable dispatch */
208 return -1;
209 }
210}
211
212/*
213 * ROMファイルクローズ
214 */
215static int
216romf_close(int fd)
217{
218 fs_descrip_t *fdp;
219
220 if(fd < 0 || num_files < fd)
221 return -1;
222 fdp = &fs_descrip_table[fd];
223 if(fdp->inuse == 1){
224 fdp->inuse = 0;
225 return 0;
226 }
227 else
228 return -1;
229}
230
231/*
232 * ROMファイルステート取得
233 */
234static int
235romf_fstat(int fd, struct stat *buf)
236{
237 fs_descrip_t *fdp;
238
239 if(fd < 0 || num_files < fd)
240 return -1;
241 fdp = &fs_descrip_table[fd];
242 if(fdp->create == 1){
243 memset(buf, 0, sizeof(struct stat));
244 buf->st_size = fdp->size;
245 return 0;
246 }
247 else
248 return -1;
249}
250
251/*
252 * ROMファイルシーク
253 */
254static off_t
255romf_lseek(int fd, off_t offset, int whence, int *res)
256{
257 fs_descrip_t *fdp;
258
259 *res = -1;
260 if(fd < 0 || num_files < fd)
261 return -1;
262 fdp = &fs_descrip_table[fd];
263 if(fdp->inuse == 1){
264 switch (whence) {
265 case SEEK_SET:
266 fdp->fp = offset;
267 break;
268 case SEEK_CUR:
269 fdp->fp += offset;
270 break;
271 case SEEK_END:
272 fdp->fp = fdp->size + offset;
273 break;
274 }
275 offset = fdp->fp;
276 *res = 0;
277 return offset;
278 }
279 else
280 return -1;
281}
282
283/*
284 * ROMファイル読みだし
285 */
286static long
287romf_read(int fd, void *buf, long count, int *res)
288{
289 fs_descrip_t*fdp;
290 int readsize;
291
292 *res = -1;
293 if(fd < 0 || num_files < fd)
294 return -1;
295 fdp = &fs_descrip_table[fd];
296 if(fdp->inuse == 1){
297 if(fdp->fp < fdp->size){
298 if((fdp->fp + count) <= fdp->size)
299 readsize = count; /* all counts can be read */
300 else
301 readsize = fdp->size - fdp->fp; /* a part of counts can be read */
302 memcpy(buf, ((uint8_t *)fdp->addr + fdp->fp), readsize);
303 buf += readsize;
304 fdp->fp += readsize;
305 }
306 else
307 readsize = 0; /* no data can be read */
308 *res = 0;
309 return readsize;
310 }
311 else
312 return -1;
313}
314
Note: See TracBrowser for help on using the repository browser.