Changeset 279 for EcnlProtoTool/trunk/ntshell/fatfs/ffarch.c
- Timestamp:
- Apr 29, 2017, 4:33:37 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/ntshell/fatfs/ffarch.c
r278 r279 56 56 #include <kernel.h> 57 57 #include <stdlib.h> 58 #include <errno.h>59 #include <sys/types.h>60 58 #include <string.h> 61 59 #include "t_stdlib.h" 60 #include "syssvc/serial.h" 62 61 #include "syssvc/syslog.h" 63 62 #include "kernel_cfg.h" … … 65 64 #include "sdfs.h" 66 65 #include "ff.h" 66 #include "tlsf.h" 67 #include "ntstdio.h" 68 69 #define SIO_PORTID 1 70 extern ntstdio_t ntstdio; 71 72 static tlsf_t sys_tlsf; 73 static pool_t sys_pool; 74 75 uint32_t __HeapBase; 76 uint32_t __HeapLimit; 77 FATFS RomDisk; 67 78 68 79 gpio_t ins; … … 70 81 #define WP() false 71 82 72 extern FATFS RomDisk; 73 extern unsigned char RamDisk[SZ_RAMDISK * 1024]; 74 83 typedef struct SD { 84 DSTATUS dst; 85 BYTE type; 86 FATFS FatFs; 87 } SD; 88 SD Sd; 89 90 void sys_init(void); 75 91 bool_t romdisk_init(); 92 bool_t SD_begin(); 76 93 77 94 int mruby_arduino_init() 78 95 { 79 96 int result = -1; 97 98 sys_init(); 80 99 81 100 /* SD_CD */ … … 85 104 sdfs_init(&sdfs, P8_5, P8_6, P8_3, P8_4, "sd"); 86 105 87 SD_begin(); 88 89 FIL fd; 90 UINT rlen = 0; 91 memset(&fd, 0, sizeof(fd)); 92 if (f_open(&fd, "1:/httpd-fs.bin", FA_OPEN_EXISTING | FA_READ) == FR_OK) { 93 f_read(&fd, RamDisk, SZ_RAMDISK * 1024, &rlen); 94 f_close(&fd); 95 if (romdisk_init()) 96 result = 0; 97 } 98 106 result = SD_begin() ? 0 : -1; 99 107 if (result == 0) { 100 syslog(LOG_NOTICE, "ramdisk ok!");108 ntstdio_printf(&ntstdio, "SD card (1:) OK!\n"); 101 109 } 102 110 else { 103 syslog(LOG_NOTICE, "ramdisk ng!"); 104 } 105 106 arduino_init(); 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); 107 129 108 130 return result; 131 } 132 133 void 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 142 void sys_fini(void) 143 { 144 tlsf_destroy(sys_tlsf); 145 } 146 147 void *sys_malloc(size_t size) 148 { 149 return tlsf_malloc(sys_tlsf, size); 150 } 151 152 void *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 159 void *sys_realloc(void *ptr, size_t size) 160 { 161 return tlsf_realloc(sys_tlsf, ptr, size); 162 } 163 164 void sys_free(void *ptr) 165 { 166 tlsf_free(sys_tlsf, ptr); 109 167 } 110 168 … … 122 180 123 181 if ((res = f_mount(&RomDisk, "0:", 1)) != FR_OK) { 182 return false; 183 } 184 185 return true; 186 } 187 188 bool_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) { 124 211 return false; 125 212 } … … 207 294 } 208 295 209 static int lock[TNUM_TSKID]; 210 static int stack_pos[TNUM_TSKID]; 211 212 void __malloc_lock(struct _reent *a) 213 { 214 ID tskid; 296 int ff_cre_syncobj(BYTE vol, _SYNC_t* sobj) 297 { 298 return 1; 299 } 300 301 int ff_req_grant(_SYNC_t sobj) 302 { 215 303 ER ret; 216 int count, sp; 217 218 ret = get_tid(&tskid); 219 if (ret != E_OK) { 220 /*syslog(LOG_DEBUG, "get_tid %s", itron_strerror(ret));*/ 221 Asm("bkpt #0"); 222 } 223 224 Asm("mov %0, sp" : "=r"(sp) :); 225 if ((stack_pos[tskid - 1] == 0) || (stack_pos[tskid - 1] < sp)) 226 stack_pos[tskid - 1] = sp; 227 228 count = ++lock[tskid - 1]; 229 if (count != 1) 230 return; 231 232 ret = wai_sem(SEM_MALLOC); 233 if (ret != E_OK) { 234 /*syslog(LOG_DEBUG, "wai_sem %s", itron_strerror(ret));*/ 235 Asm("bkpt #0"); 236 } 237 } 238 239 void __malloc_unlock(struct _reent *a) 240 { 241 ID tskid; 242 ER ret; 243 int count; 244 245 ret = get_tid(&tskid); 246 if (ret != E_OK) { 247 /*syslog(LOG_DEBUG, "get_tid %s", itron_strerror(ret));*/ 248 Asm("bkpt #0"); 249 } 250 251 count = --lock[tskid - 1]; 252 if(count != 0) 253 return; 254 255 ret = sig_sem(SEM_MALLOC); 256 if (ret != E_OK) { 257 /*syslog(LOG_DEBUG, "sig_sem %s", itron_strerror(ret));*/ 258 Asm("bkpt #0"); 259 } 260 } 261 262 // Provide implementation of _sbrk (low-level dynamic memory allocation 263 // routine) for GCC_ARM which compares new heap pointer with MSP instead of 264 // SP. This make it compatible with RTX RTOS thread stacks. 265 266 // Linker defined symbol used by _sbrk to indicate where heap should start. 267 int __end__; 268 uint32_t __HeapLimit; 269 270 // Turn off the errno macro and use actual global variable instead. 271 #undef errno 272 int errno; 273 274 static unsigned char* heap = (unsigned char*)&__end__; 275 276 // Dynamic memory allocation related syscall. 277 caddr_t _sbrk(int incr) { 278 unsigned char* prev_heap = heap; 279 unsigned char* new_heap = heap + incr; 280 281 if (new_heap >= (unsigned char*)&__HeapLimit) { /* __HeapLimit is end of heap section */ 282 errno = ENOMEM; 283 return (caddr_t)-1; 284 } 285 286 heap = new_heap; 287 return (caddr_t) prev_heap; 288 } 289 290 void reset_heap() 291 { 292 // .data 293 extern uint8_t __malloc_av_[0x408]; 294 extern uint8_t __malloc_sbrk_base[0x4]; 295 extern uint8_t __malloc_trim_threshold[0x4]; 296 // .bss 297 extern uint8_t __malloc_top_pad[0x4]; 298 extern uint8_t __malloc_current_mallinfo[0x28]; 299 extern uint8_t __malloc_max_sbrked_mem[0x4]; 300 extern uint8_t __malloc_max_total_mem[0x4]; 301 // 302 extern void *__etext; 303 extern void *__data_start__; 304 305 int offset = (int)&__etext - (int)&__data_start__; 306 307 __malloc_lock(_REENT); 308 309 memcpy(__malloc_av_, &__malloc_av_[offset], sizeof(__malloc_av_)); 310 memcpy(__malloc_sbrk_base, &__malloc_sbrk_base[offset], sizeof(__malloc_sbrk_base)); 311 memcpy(__malloc_trim_threshold, &__malloc_trim_threshold[offset], sizeof(__malloc_trim_threshold)); 312 313 memset(__malloc_top_pad, 0, sizeof(__malloc_top_pad)); 314 memset(__malloc_current_mallinfo, 0, sizeof(__malloc_current_mallinfo)); 315 memset(__malloc_max_sbrked_mem, 0, sizeof(__malloc_max_sbrked_mem)); 316 memset(__malloc_max_total_mem, 0, sizeof(__malloc_max_total_mem)); 317 318 heap = (unsigned char*)&__end__; 319 320 __malloc_unlock(_REENT); 321 } 322 323 void exit(int return_code) { 324 Asm("bkpt #0"); 325 reset_heap(); 326 ext_tsk(); 327 for(;;); 328 } 304 ret = wai_sem(SEM_FILESYSTEM); 305 return ret == E_OK; 306 } 307 308 void ff_rel_grant(_SYNC_t sobj) 309 { 310 sig_sem(SEM_FILESYSTEM); 311 } 312 313 int ff_del_syncobj(_SYNC_t sobj) 314 { 315 return 1; 316 } 317 318 void* ff_memalloc (UINT msize) 319 { 320 return sys_malloc(msize); 321 } 322 323 void ff_memfree (void* mblock) 324 { 325 sys_free(mblock); 326 }
Note:
See TracChangeset
for help on using the changeset viewer.