~aleteoryx/muditaos

32de9ec671db9ddaf68a61d7a53f6a971f45f75d — Lucjan Bryndza 5 years ago 9f10b44
[EGD-5102] Fix compile on rt1051 platform

It is initial commmit which fix compilation after
vfs. global object removal. It still need implementation
newlib syscalls.
M board/rt1051/newlib/io_syscalls.cpp => board/rt1051/newlib/io_syscalls.cpp +5 -0
@@ 7,6 7,7 @@
#include <sys/types.h>
#include <dirent.h>
#include <newlib/vfs_io_syscalls.hpp>
#include <sys/statvfs.h>
extern "C"
{
    using namespace vfsn::internal;


@@ 109,5 110,9 @@ extern "C"
    int fsync( int fd ) {
        return syscalls::fsync(_REENT->_errno, fd);
    }
    int statvfs(const char *path, struct statvfs *buf)
    {
        return syscalls::statvfs(path,buf);
    }
}


M module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp => module-bsp/board/rt1051/bsp/battery-charger/battery_charger.cpp +4 -3
@@ 16,7 16,6 @@ extern "C"
}

#include "bsp/battery-charger/battery_charger.hpp"
#include "vfs.hpp"

#include "bsp/BoardDefinitions.hpp"
#include "common_data/EventStore.hpp"


@@ 24,7 23,7 @@ extern "C"
#include "drivers/i2c/DriverI2C.hpp"
#include <cstdio>
#include <purefs/filesystem_paths.hpp>

#include "fsl_common.h"
#define BSP_BATTERY_CHARGER_I2C_ADDR (0xD2 >> 1)
#define BSP_FUEL_GAUGE_I2C_ADDR      (0x6C >> 1)
#define BSP_TOP_CONTROLLER_I2C_ADDR  (0xCC >> 1)


@@ 337,6 336,8 @@ static int battery_chargerTopControllerWrite(bsp::batteryChargerRegisters regist
}

static int battery_chargerTopControllerRead(bsp::batteryChargerRegisters registerAddress, uint8_t *value)
    __attribute__((used));
static int battery_chargerTopControllerRead(bsp::batteryChargerRegisters registerAddress, uint8_t *value)
{
    if (value == NULL) {
        return -1;


@@ 389,7 390,7 @@ static bsp::batteryRetval battery_loadConfiguration(void)
static bsp::batteryRetval battery_storeConfiguration(void)
{
    // TODO:M.P procedure below seems to crash system, it should be fixed.
    if (ff_rename(configs::battery_cfgFile.c_str(), configs::battery_cfgFilePrev.c_str(), false) != 0) {
    if (rename(configs::battery_cfgFile.c_str(), configs::battery_cfgFilePrev.c_str()) != 0) {
        LOG_ERROR("Could not move configuration file");
        return bsp::batteryRetval::battery_ChargerError;
    }

M module-bsp/board/rt1051/bsp/usb => module-bsp/board/rt1051/bsp/usb +1 -1
@@ 1,1 1,1 @@
Subproject commit bd86bc1e7f464b81746bee08997f8f7adefb99d7
Subproject commit 43e882e21180a7fceb724a43aa0f72850bbb4a22

M module-services/service-desktop/endpoints/factoryReset/FactoryReset.cpp => module-services/service-desktop/endpoints/factoryReset/FactoryReset.cpp +2 -8
@@ 2,9 2,6 @@
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "FactoryReset.hpp"
#ifndef TARGET_Linux
#include <FreeRTOSFATConfig.h>
#endif
#include <SystemManager/SystemManager.hpp>
#include <log/log.hpp>
#include <purefs/filesystem_paths.hpp>


@@ 17,6 14,7 @@
#include <vector>
#include <purefs/filesystem_paths.hpp>
#include <purefs/fs/filesystem.hpp>
#include <limits.h>

namespace sys
{


@@ 36,11 34,7 @@ namespace FactoryReset
    static const int max_recurse_depth  = 120; /* 120 is just an arbitrary value of max number of recursive calls.
                                                * If more then error is assumed, not the real depth of directories."
                                                */
#ifdef TARGET_Linux
    static const int max_filepath_length = 4096;
#else
    static const int max_filepath_length = ffconfigMAX_FILENAME;
#endif
    static const int max_filepath_length = PATH_MAX;

    bool Run(sys::Service *ownerService)
    {

M module-utils/bootconfig/src/bootconfig.cpp => module-utils/bootconfig/src/bootconfig.cpp +1 -0
@@ 3,6 3,7 @@
#include <boot/bootconfig.hpp>
#include <boot/bootconstants.hpp>

#include <limits.h>
#include <purefs/filesystem_paths.hpp>
#include <source/version.hpp>
#include <time/time_conversion.hpp>

A module-vfs/board/rt1051/purefs/src/vfs_subsystem_internal.cpp => module-vfs/board/rt1051/purefs/src/vfs_subsystem_internal.cpp +14 -0
@@ 0,0 1,14 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <purefs/vfs_subsystem_internal.hpp>
#include <purefs/blkdev/disk_manager.hpp>

namespace purefs::subsystem::internal
{
    auto create_default_block_device() -> std::shared_ptr<blkdev::disk>
    {
        // TODO: implement for rt1051
        return nullptr;
    }
} // namespace purefs::subsystem::internal

M module-vfs/drivers/src/purefs/fs/filesystem_vfat.cpp => module-vfs/drivers/src/purefs/fs/filesystem_vfat.cpp +1 -1
@@ 323,7 323,7 @@ namespace purefs::fs::drivers
            return -ENXIO;
        }
        FRESULT fres{FR_OK};
        if (f_tell(fp) != newpos) {
        if (f_tell(fp) != static_cast<unsigned long>(newpos)) {
            fres = f_lseek(fp, newpos);
        }
        return (fres == FR_OK) ? (f_tell(fp)) : translate_error(fres);

M module-vfs/include/internal/newlib/vfs_io_syscalls.hpp => module-vfs/include/internal/newlib/vfs_io_syscalls.hpp +3 -0
@@ 8,6 8,7 @@
#include <dirent.h>
#include <stdint.h>

struct statvfs;
namespace vfsn::internal::syscalls
{
    int open(int &_errno_, const char *file, int flags, int mode);


@@ 34,4 35,6 @@ namespace vfsn::internal::syscalls
    int chmod(int &_errno_, const char *path, mode_t mode);
    int fchmod(int &_errno_, int fd, mode_t mode);
    int fsync(int &_errno_, int fd);
    int statvfs(const char *path, struct statvfs *buf);

} // namespace vfsn::internal::syscalls

M module-vfs/src/newlib/vfs_internal_dirent.cpp => module-vfs/src/newlib/vfs_internal_dirent.cpp +5 -55
@@ 2,7 2,6 @@
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include "vfs_internal_dirent.hpp"
#include <cstring>
#include <ff_stdio.h>
#include <errno.h>
#include <new>
#include <dirent.h>


@@ 11,70 10,21 @@ namespace vfsn::internal::dirent
{
    DIR_ITER *diropen(int &_errno_, const char *path)
    {
        FF_Stat_t fs;
        if (ff_stat(path, &fs)) {
            _errno_ = stdioGET_ERRNO();
            if (_errno_ == EFAULT)
                _errno_ = ENOENT;
            return nullptr;
        }
        if (!(fs.st_mode & FF_IFDIR)) {
            _errno_ = ENOTDIR;
            return nullptr;
        }
        auto ret = new (std::nothrow) DIR_ITER;
        if (!ret) {
            _errno_ = ENOMEM;
            return nullptr;
        }
        ret->dir_state = nullptr;
        std::strncpy(ret->name_state, path, sizeof(ret->name_state));
        return ret;
        return nullptr;
    }

    int dirreset(int &_errno_, DIR_ITER *state)
    {
        if (state->dir_state) {
            delete reinterpret_cast<FF_FindData_t *>(state->dir_state);
            state->dir_state = nullptr;
            _errno_          = 0;
            return 0;
        }
        else {
            _errno_ = EBADF;
            return -1;
        }
        return -1;
    }
    int dirnext(int &_errno_, DIR_ITER *state)
    {
        int ret;
        if (!state->dir_state) {
            auto fdd = new (std::nothrow) FF_FindData_t;
            if (!fdd) {
                _errno_ = ENOMEM;
                return -1;
            }
            std::memset(fdd, 0, sizeof(*fdd));
            ret              = ff_findfirst(state->name_state, fdd);
            state->dir_state = fdd;
        }
        else {
            auto fdd = static_cast<FF_FindData_t *>(state->dir_state);
            ret      = ff_findnext(fdd);
        }
        _errno_ = stdioGET_ERRNO();
        if (_errno_ == EFAULT)
            _errno_ = ENOENT;
        return ret;
        return -1;
    }

    int dirclose(int &_errno_, DIR_ITER *state)
    {
        if (state->dir_state) {
            delete reinterpret_cast<FF_FindData_t *>(state->dir_state);
        }
        delete state;
        _errno_ = 0;
        return 0;
        return -1;
    }

} // namespace vfsn::internal::dirent

M module-vfs/src/newlib/vfs_io_syscalls.cpp => module-vfs/src/newlib/vfs_io_syscalls.cpp +24 -357
@@ 1,6 1,5 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include <vfs.hpp>
#include <errno.h>
#include <dirent.h>
#include <log/log.hpp>


@@ 10,454 9,122 @@
#include "vfs_internal_dirent.hpp"
#include "HandleManager.hpp"
#include <newlib/vfs_io_syscalls.hpp>
#include <deprecated/vfs.hpp>

// NOTE: It will be removed in later stage
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

/** NOTE: This is generic wrapper for newlib syscalls
 * using current VFS implementation. This implementation
 * will be removed in next release when disk manager
 * and new VFS filesystem will be ready
 */

namespace vfsn::internal
{
    namespace
    {
        stdlib::HandleManager<FF_FILE> gFileHandles;
    }

    namespace
    {
        auto open_to_fopen_flags(int flags)
        {
            flags &= ~0x00010000; // Ignore binary
            if ((flags & O_RDONLY) || !flags) {
                return "r";
            }
            else if (flags & (O_WRONLY | O_CREAT | O_TRUNC)) {
                return "w";
            }
            else if (flags & (O_WRONLY | O_CREAT | O_APPEND)) {
                return "a";
            }
            else if (flags & O_RDWR) {
                return "r+";
            }
            else if (flags & (O_RDWR | O_CREAT | O_TRUNC)) {
                return "w+";
            }
            else if (flags & (O_RDWR | O_CREAT | O_APPEND)) {
                return "a+";
            }
            else {
                LOG_ERROR("Unsupported flag %08x", flags);
                return "";
            }
        }

    } // namespace

} // namespace vfsn::internal
#include <sys/statvfs.h>

namespace vfsn::internal::syscalls
{
    int open(int &_errno_, const char *file, int flags, int mode)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        auto fflags = open_to_fopen_flags(flags);
        if (*fflags == '\0') {
            _errno_ = EINVAL;
            return -1;
        }
        auto fil = ff_fopen(vfs.relativeToRoot(file).c_str(), fflags);
        if (!fil) {
            _errno_ = stdioGET_ERRNO();
            return -1;
        }
        int hwnd = gFileHandles.setHandle(fil);
        if (hwnd < 0) {
            ff_fclose(fil);
            _errno_ = EMFILE;
            LOG_ERROR("Unable to find handle %i", hwnd);
            return -1;
        }
        else {
            _errno_ = 0;
            return hwnd;
        }
        return -1;
    }

    long close(int &_errno_, int fd)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        auto fil = gFileHandles.clearHandle(fd);
        if (!fil) {
            LOG_ERROR("Unable to find handle %i", fd);
            _errno_ = EBADF;
            return -1;
        }
        auto ret = ff_fclose(fil);
        _errno_  = stdioGET_ERRNO();
        return ret;
        return -1;
    }

    long write(int &_errno_, int fd, const void *buf, size_t cnt)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        if (fd == STDERR_FILENO || fd == STDOUT_FILENO) {
            log_WriteToDevice((uint8_t *)buf, cnt);
            return cnt;
        }
        auto fil = gFileHandles[fd];
        if (!fil) {
            LOG_ERROR("Unable to find handle %i", fd);
            _errno_ = EBADF;
            return -1;
        }
        auto ret = ff_fwrite(buf, cnt, 1, fil);
        _errno_  = stdioGET_ERRNO();
        return ret > 0 ? (ret * cnt) : ret;
        return -1;
    }

    long read(int &_errno_, int fd, void *buf, size_t cnt)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        auto fil = gFileHandles[fd];
        if (!fil) {
            LOG_ERROR("Unable to find handle %i", fd);
            _errno_ = EBADF;
            return -1;
        }
        const auto remain_bytes = fil->ulFileSize - fil->ulFilePointer;
        if (remain_bytes > 0) {
            cnt            = std::min<size_t>(cnt, remain_bytes);
            const auto ret = ff_fread(buf, cnt, 1, fil);
            _errno_        = stdioGET_ERRNO();
            return ret > 0 ? ret * cnt : ret;
        }
        else {
            _errno_ = 0;
            return 0;
        }
        return -1;
    }

    off_t lseek(int &_errno_, int fd, off_t pos, int dir)
    {
        auto fil = gFileHandles[fd];
        if (!fil) {
            LOG_ERROR("Unable to find handle %i", fd);
            _errno_ = EBADF;
            return -1;
        }
        auto ret = ff_fseek(fil, pos, dir);
        if (ret) {
            _errno_ = stdioGET_ERRNO();
            return static_cast<off_t>(-1);
        }
        ret = ff_ftell(fil);
        if (ret < 0) {
            _errno_ = stdioGET_ERRNO();
            return static_cast<off_t>(-1);
        }
        return ret;
        return -1;
    }
    int fstat(int &_errno_, int fd, struct stat *pstat)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        auto fil = gFileHandles[fd];
        if (!fil) {
            LOG_ERROR("Unable to find handle %i", fd);
            _errno_ = EBADF;
            return -1;
        }
        std::memset(pstat, 0, sizeof(*pstat));
        pstat->st_ino  = fil->ulObjectCluster;
        pstat->st_size = fil->ulFileSize;
        pstat->st_dev  = 0;
        pstat->st_mode = S_IFREG | 0666;
        _errno_        = 0;
        return 0;
        return -1;
    }
    int link(int &_errno_, const char *existing, const char *newLink)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        _errno_ = ENOSYS;
        LOG_ERROR("Syscall %s not supported", __PRETTY_FUNCTION__);
        return -1;
    }
    int unlink(int &_errno_, const char *name)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        const auto rel_name = vfs.relativeToRoot(name);
        auto ret            = ff_remove(rel_name.c_str());
        if (ret && stdioGET_ERRNO() == EISDIR)
            ret = ff_deltree(rel_name.c_str(), nullptr, nullptr);
        _errno_ = stdioGET_ERRNO();
        return ret;
        return -1;
    }

    int fcntl(int &_errno_, int fd, int cmd, int arg)
    {
        _errno_ = ENOSYS;
        LOG_ERROR("Syscall %s not supported", __PRETTY_FUNCTION__);
        return -1;
    }
    int stat(int &_errno_, const char *file, struct stat *pstat)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        FF_Stat_t stat_ff;
        auto ret = ff_stat(vfs.relativeToRoot(file).c_str(), &stat_ff);
        if (!ret) {
            std::memset(pstat, 0, sizeof(*pstat));
            pstat->st_ino  = stat_ff.st_ino;
            pstat->st_size = stat_ff.st_size;
            pstat->st_dev  = stat_ff.st_dev;
            // Linux mode compat
            if (stat_ff.st_mode == FF_IFREG)
                pstat->st_mode = S_IFREG | 0666;
            if (stat_ff.st_mode == FF_IFDIR)
                pstat->st_mode = S_IFDIR | 0777;
        }
        _errno_ = stdioGET_ERRNO();
        // NOTE: ff_stdio uses wrong errno NOADDRESS
        if (_errno_ == EFAULT)
            _errno_ = ENOENT;
        return ret;
        return -1;
    }

    int chdir(int &_errno_, const char *path)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        auto ret = ff_chdir(vfs.relativeToRoot(path).c_str());
        _errno_  = stdioGET_ERRNO();
        return ret;
        return -1;
    }
    char *getcwd(int &_errno_, char *buf, size_t size)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return nullptr;
        }
        auto cwd = ff_getcwd(buf, size);
        _errno_  = stdioGET_ERRNO();
        return cwd;
        return nullptr;
    }
    int rename(int &_errno_, const char *oldName, const char *newName)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        auto ret = ff_rename(vfs.relativeToRoot(oldName).c_str(), vfs.relativeToRoot(newName).c_str(), true);
        _errno_  = stdioGET_ERRNO();
        return ret;
        return -1;
    }

    int mkdir(int &_errno_, const char *path, uint32_t mode)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        auto ret = ff_mkdir(vfs.relativeToRoot(path).c_str());
        _errno_  = stdioGET_ERRNO();
        return ret;
        return -1;
    }

    DIR *opendir(int &_errno_, const char *dirname)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return nullptr;
        }
        auto dir      = new DIR;
        dir->dir_data = dirent::diropen(_errno_, vfs.relativeToRoot(dirname).c_str());
        if (!dir->dir_data) {
            delete dir;
            return nullptr;
        }
        dir->position            = 0;
        dir->file_data.d_ino     = -1;
        dir->file_data.d_name[0] = '\0';
        return dir;
        return nullptr;
    }

    int closedir(int &_errno_, DIR *dirp)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        if (!dirp) {
            _errno_ = EBADF;
            return -1;
        }
        auto res = dirent::dirclose(_errno_, dirp->dir_data);
        delete dirp;
        return res;
        return -1;
    }

    struct dirent *readdir(int &_errno_, DIR *dirp)
    {
        if (!dirp) {
            _errno_ = EBADF;
            return nullptr;
        }
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return nullptr;
        }
        auto olderrno{_errno_};
        auto res = dirent::dirnext(_errno_, dirp->dir_data);
        auto fff = reinterpret_cast<FF_FindData_t *>(dirp->dir_data->dir_state);
        if (res < 0) {
            if (_errno_ == pdFREERTOS_ERRNO_ENMFILE) {
                _errno_ = olderrno;
            }
            return nullptr;
        }
        dirp->position += 1;
        if (strnlen(fff->pcFileName, NAME_MAX) >= sizeof(dirp->file_data.d_name)) {
            _errno_ = EOVERFLOW;
            return nullptr;
        }
        dirp->file_data.d_ino  = fff->xDirectoryEntry.ulObjectCluster;
        dirp->file_data.d_type = (fff->ucAttributes & FF_FAT_ATTR_DIR) ? DT_DIR : DT_REG;
        std::strncpy(dirp->file_data.d_name, fff->pcFileName, sizeof(dirp->file_data.d_name));
        return &dirp->file_data;
        return nullptr;
    }

    int readdir_r(int &_errno_, DIR *dirp, struct dirent *entry, struct dirent **result)
    {
        if (!dirp) {
            return EBADF;
        }
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        auto olderrno{_errno_};
        auto res = dirent::dirnext(_errno_, dirp->dir_data);
        auto fff = reinterpret_cast<FF_FindData_t *>(dirp->dir_data->dir_state);
        if (res < 0) {
            res = _errno_;
            if (_errno_ == pdFREERTOS_ERRNO_ENMFILE) {
                res = 0;
            }
            _errno_ = olderrno;
            return res;
        }
        dirp->position += 1;
        if (strnlen(fff->pcFileName, NAME_MAX) >= sizeof(entry->d_name)) {
            return EOVERFLOW;
        }
        entry->d_ino  = fff->xDirectoryEntry.ulObjectCluster;
        entry->d_type = (fff->ucAttributes & FF_FAT_ATTR_DIR) ? DT_DIR : DT_REG;
        std::strncpy(entry->d_name, fff->pcFileName, sizeof(entry->d_name));
        *result = entry;
        return 0;
        return -1;
    }

    void rewinddir(int &_errno_, DIR *dirp)
    {
        if (!dirp) {
            return;
        }
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return;
        }
        dirent::dirreset(_errno_, dirp->dir_data);
        dirp->position = 0;
    }

    void seekdir(int &_errno_, DIR *dirp, long int loc)
    {
        if (!dirp || loc < 0) {
            return;
        }
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return;
        }
        if (dirp->position > loc) {
            dirent::dirreset(_errno_, dirp->dir_data);
            dirp->position = 0;
        }
        while ((dirp->position < loc) && (dirent::dirnext(_errno_, dirp->dir_data) >= 0)) {
            dirp->position += 1;
        }
    }
    long int telldir(int &_errno_, DIR *dirp)
    {
        if (!dirp) {
            return -1;
        }
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        return dirp->position;
        return -1;
    }

    int chmod(int &_errno_, const char *path, mode_t mode)
    {
        _errno_ = ENOSYS;
        LOG_ERROR("Syscall %s not supported", __PRETTY_FUNCTION__);
        return -1;
    }
    int fchmod(int &_errno_, int fd, mode_t mode)
    {
        _errno_ = ENOSYS;
        LOG_ERROR("Syscall %s not supported", __PRETTY_FUNCTION__);
        return -1;
    }
    int fsync(int &_errno_, int fd)
    {
        if (!vfs.isInitialized()) {
            _errno_ = EIO;
            return -1;
        }
        auto fil = gFileHandles[fd];
        if (!fil) {
            LOG_ERROR("Unable to find handle %i", fd);
            _errno_ = EBADF;
            return -1;
        }
        auto ret = ff_fflush(fil);
        _errno_  = stdioGET_ERRNO();
        return ret;
        return -1;
    }
    int statvfs(const char *path, struct statvfs *buf)
    {
        return -1;
    }

} // namespace vfsn::internal::syscalls

#pragma GCC diagnostic pop

M module-vfs/targets/Target_RT1051.cmake => module-vfs/targets/Target_RT1051.cmake +1 -0
@@ 3,6 3,7 @@ set(BOARD_SOURCES ${BOARD_SOURCES}
        src/newlib/vfs_internal_dirent.cpp
        src/newlib/HandleManager.cpp
        board/rt1051/purefs/src/fs/thread_local_cwd.cpp
        board/rt1051/purefs/src/vfs_subsystem_internal.cpp
        CACHE INTERNAL ""
)