Ignore:
Timestamp:
Apr 29, 2017, 4:33:37 PM (7 years ago)
Author:
coas-nagasima
Message:

ファイルを追加、更新。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/ntshell/fatfs/ffarch.c

    r278 r279  
    5656#include <kernel.h>
    5757#include <stdlib.h>
    58 #include <errno.h>
    59 #include <sys/types.h>
    6058#include <string.h>
    6159#include "t_stdlib.h"
     60#include "syssvc/serial.h"
    6261#include "syssvc/syslog.h"
    6362#include "kernel_cfg.h"
     
    6564#include "sdfs.h"
    6665#include "ff.h"
     66#include "tlsf.h"
     67#include "ntstdio.h"
     68
     69#define SIO_PORTID 1
     70extern ntstdio_t ntstdio;
     71
     72static tlsf_t sys_tlsf;
     73static pool_t sys_pool;
     74
     75uint32_t  __HeapBase;
     76uint32_t  __HeapLimit;
     77FATFS RomDisk;
    6778
    6879gpio_t ins;
     
    7081#define WP() false
    7182
    72 extern FATFS RomDisk;
    73 extern unsigned char RamDisk[SZ_RAMDISK * 1024];
    74 
     83typedef struct SD {
     84        DSTATUS dst;
     85        BYTE type;
     86        FATFS FatFs;
     87} SD;
     88SD Sd;
     89
     90void sys_init(void);
    7591bool_t romdisk_init();
     92bool_t SD_begin();
    7693
    7794int mruby_arduino_init()
    7895{
    7996        int result = -1;
     97
     98        sys_init();
    8099
    81100        /* SD_CD */
     
    85104        sdfs_init(&sdfs, P8_5, P8_6, P8_3, P8_4, "sd");
    86105
    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;
    99107        if (result == 0) {
    100                 syslog(LOG_NOTICE, "ramdisk ok!");
     108                ntstdio_printf(&ntstdio, "SD card (1:) OK!\n");
    101109        }
    102110        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);
    107129
    108130        return result;
     131}
     132
     133void 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
     142void sys_fini(void)
     143{
     144        tlsf_destroy(sys_tlsf);
     145}
     146
     147void *sys_malloc(size_t size)
     148{
     149        return tlsf_malloc(sys_tlsf, size);
     150}
     151
     152void *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
     159void *sys_realloc(void *ptr, size_t size)
     160{
     161        return tlsf_realloc(sys_tlsf, ptr, size);
     162}
     163
     164void sys_free(void *ptr)
     165{
     166        tlsf_free(sys_tlsf, ptr);
    109167}
    110168
     
    122180
    123181        if ((res = f_mount(&RomDisk, "0:", 1)) != FR_OK) {
     182                return false;
     183        }
     184
     185        return true;
     186}
     187
     188bool_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) {
    124211                return false;
    125212        }
     
    207294}
    208295
    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;
     296int ff_cre_syncobj(BYTE vol, _SYNC_t* sobj)
     297{
     298        return 1;
     299}
     300
     301int ff_req_grant(_SYNC_t sobj)
     302{
    215303        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
     308void ff_rel_grant(_SYNC_t sobj)
     309{
     310        sig_sem(SEM_FILESYSTEM);
     311}
     312
     313int ff_del_syncobj(_SYNC_t sobj)
     314{
     315        return 1;
     316}
     317
     318void* ff_memalloc (UINT msize)
     319{
     320        return sys_malloc(msize);
     321}
     322
     323void ff_memfree (void* mblock)
     324{
     325        sys_free(mblock);
     326}
Note: See TracChangeset for help on using the changeset viewer.