1*4882a593Smuzhiyun #include <stdio.h>
2*4882a593Smuzhiyun #include "lv_port_file.h"
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #if 1//LV_USE_FILESYSTEM
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun /**
7*4882a593Smuzhiyun * Open a file
8*4882a593Smuzhiyun * @param drv pointer to a driver where this function belongs
9*4882a593Smuzhiyun * @param file_p pointer to a file_t variable
10*4882a593Smuzhiyun * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt)
11*4882a593Smuzhiyun * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR
12*4882a593Smuzhiyun * @return LV_FS_RES_OK or any error from lv_fs_res_t enum
13*4882a593Smuzhiyun */
fs_open(lv_fs_drv_t * drv,const char * path,lv_fs_mode_t mode)14*4882a593Smuzhiyun static void *fs_open(lv_fs_drv_t *drv, const char *path, lv_fs_mode_t mode)
15*4882a593Smuzhiyun {
16*4882a593Smuzhiyun FILE *file_p;
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun if (mode == LV_FS_MODE_WR)
19*4882a593Smuzhiyun file_p = fopen(path, "wb+");
20*4882a593Smuzhiyun else if (mode == LV_FS_MODE_RD)
21*4882a593Smuzhiyun file_p = fopen(path, "rb");
22*4882a593Smuzhiyun else if (mode == (LV_FS_MODE_WR | LV_FS_MODE_RD))
23*4882a593Smuzhiyun file_p = fopen(path, "wb+");
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun return (void *)file_p;
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun /**
30*4882a593Smuzhiyun * Close an opened file
31*4882a593Smuzhiyun * @param drv pointer to a driver where this function belongs
32*4882a593Smuzhiyun * @param file_p pointer to a file_t variable. (opened with lv_ufs_open)
33*4882a593Smuzhiyun * @return LV_FS_RES_OK: no error, the file is read
34*4882a593Smuzhiyun * any error from lv_fs_res_t enum
35*4882a593Smuzhiyun */
fs_close(lv_fs_drv_t * drv,void * file_p)36*4882a593Smuzhiyun static lv_fs_res_t fs_close(lv_fs_drv_t *drv, void *file_p)
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun lv_fs_res_t res = LV_FS_RES_OK;
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun /* Add your code here*/
41*4882a593Smuzhiyun fclose((file_p));
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun return res;
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun /**
47*4882a593Smuzhiyun * Read data from an opened file
48*4882a593Smuzhiyun * @param drv pointer to a driver where this function belongs
49*4882a593Smuzhiyun * @param file_p pointer to a file_t variable.
50*4882a593Smuzhiyun * @param buf pointer to a memory block where to store the read data
51*4882a593Smuzhiyun * @param btr number of Bytes To Read
52*4882a593Smuzhiyun * @param br the real number of read bytes (Byte Read)
53*4882a593Smuzhiyun * @return LV_FS_RES_OK: no error, the file is read
54*4882a593Smuzhiyun * any error from lv_fs_res_t enum
55*4882a593Smuzhiyun */
fs_read(lv_fs_drv_t * drv,void * file_p,void * buf,uint32_t btr,uint32_t * br)56*4882a593Smuzhiyun static lv_fs_res_t fs_read(lv_fs_drv_t *drv, void *file_p, void *buf, uint32_t btr, uint32_t *br)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun lv_fs_res_t res = LV_FS_RES_OK;
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun /* Add your code here*/
61*4882a593Smuzhiyun *br = fread((char *)buf, 1, btr, file_p);
62*4882a593Smuzhiyun if (*br == 0)
63*4882a593Smuzhiyun printf("ftell %d %p %d\n", ftell(file_p), buf, btr);
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun return res;
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun
fs_write(lv_fs_drv_t * drv,void * file_p,const void * buf,uint32_t btw,uint32_t * bw)68*4882a593Smuzhiyun static lv_fs_res_t fs_write(lv_fs_drv_t *drv, void *file_p, const void *buf, uint32_t btw, uint32_t *bw)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun lv_fs_res_t res = LV_FS_RES_OK;
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun /* Add your code here*/
73*4882a593Smuzhiyun *bw = fwrite((char *)buf, 1, btw, file_p);
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun return res;
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun /**
79*4882a593Smuzhiyun * Set the read write pointer. Also expand the file size if necessary.
80*4882a593Smuzhiyun * @param drv pointer to a driver where this function belongs
81*4882a593Smuzhiyun * @param file_p pointer to a file_t variable. (opened with lv_ufs_open )
82*4882a593Smuzhiyun * @param pos the new position of read write pointer
83*4882a593Smuzhiyun * @return LV_FS_RES_OK: no error, the file is read
84*4882a593Smuzhiyun * any error from lv_fs_res_t enum
85*4882a593Smuzhiyun */
fs_seek(lv_fs_drv_t * drv,void * file_p,uint32_t pos,lv_fs_whence_t whence)86*4882a593Smuzhiyun static lv_fs_res_t fs_seek(lv_fs_drv_t *drv, void *file_p, uint32_t pos, lv_fs_whence_t whence)
87*4882a593Smuzhiyun {
88*4882a593Smuzhiyun lv_fs_res_t res = LV_FS_RES_OK;
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun /* Add your code here*/
91*4882a593Smuzhiyun fseek(file_p, pos, whence);
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun return res;
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun
fs_tell(struct _lv_fs_drv_t * drv,void * file_p,uint32_t * pos_p)96*4882a593Smuzhiyun static lv_fs_res_t fs_tell(struct _lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun lv_fs_res_t res = LV_FS_RES_OK;
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun *pos_p = ftell(file_p);
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun return res;
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun
lv_port_fs_init(void)105*4882a593Smuzhiyun void lv_port_fs_init(void)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun static lv_fs_drv_t fs_drv = {0};
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun lv_fs_drv_init(&fs_drv);
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun /*Set up fields...*/
112*4882a593Smuzhiyun fs_drv.letter = 'A';
113*4882a593Smuzhiyun fs_drv.open_cb = fs_open;
114*4882a593Smuzhiyun fs_drv.close_cb = fs_close;
115*4882a593Smuzhiyun fs_drv.read_cb = fs_read;
116*4882a593Smuzhiyun fs_drv.write_cb = fs_write;
117*4882a593Smuzhiyun fs_drv.seek_cb = fs_seek;
118*4882a593Smuzhiyun fs_drv.tell_cb = fs_tell;
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun lv_fs_drv_register(&fs_drv);
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun #endif
123