~aleteoryx/muditaos

muditaos/module-platform/rt1051/src/disk_eeprom.cpp -rw-r--r-- 2.7 KiB
a405cad6Aleteoryx trim readme 6 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// Copyright (c) 2017-2024, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/blob/master/LICENSE.md
#include "disk_eeprom.hpp"

#include "bsp/eeprom/eeprom.hpp"
#include "board/rt1051/bsp/eeprom/M24256.hpp"
#include "board/BoardDefinitions.hpp"

namespace purefs::blkdev
{
    auto disk_eeprom::probe(unsigned flags) -> int
    {
        cpp_freertos::LockGuard lock(mutex);
        bsp::eeprom::init();
        if (!bsp::eeprom::isPresent(bus_id)) {
            return -ENXIO;
        }
        return 0;
    }

    auto disk_eeprom::status() const -> media_status
    {
        cpp_freertos::LockGuard lock(mutex);
        return (bsp::eeprom::isPresent(bus_id)) ? (media_status::healthly) : (media_status::error);
    }

    auto disk_eeprom::get_info(info_type what, hwpart_t hwpart) const -> scount_t
    {
        if (hwpart > 0) {
            return -ERANGE;
        }
        cpp_freertos::LockGuard lock(mutex);
        switch (what) {
        case info_type::sector_size:
            return bsp::eeprom::eeprom_block_size(bus_id);
        case info_type::sector_count:
            return bsp::eeprom::eeprom_total_size(bus_id) / bsp::eeprom::eeprom_block_size(bus_id);
        case info_type::erase_block:
            return 0;
        default:
            return -ENOTSUP;
        }
    }

    auto disk_eeprom::write(const void *buf, sector_t lba, std::size_t count, hwpart_t hwpart) -> int
    {
        if (hwpart > 0) {
            return -ERANGE;
        }
        cpp_freertos::LockGuard lock(mutex);
        const size_t block_siz = bsp::eeprom::eeprom_block_size(bus_id);
        const size_t total_siz = bsp::eeprom::eeprom_total_size(bus_id);
        const auto addr        = lba * block_siz;
        const auto len         = count * block_siz;
        if (addr + len > total_siz) {
            return -ERANGE;
        }
        const auto bytes_written = bsp::eeprom::eeprom_write(bus_id, addr, reinterpret_cast<const char *>(buf), len);
        return (bytes_written != int(len)) ? (-ENXIO) : (0);
    }

    auto disk_eeprom::read(void *buf, sector_t lba, std::size_t count, hwpart_t hwpart) -> int
    {
        if (hwpart > 0) {
            return -ERANGE;
        }
        cpp_freertos::LockGuard lock(mutex);
        const size_t block_siz = bsp::eeprom::eeprom_block_size(bus_id);
        const size_t total_siz = bsp::eeprom::eeprom_total_size(bus_id);
        const auto addr        = lba * block_siz;
        const auto len         = count * block_siz;
        if (addr + len > total_siz) {
            return -ERANGE;
        }
        const auto bytes_read = bsp::eeprom::eeprom_read(bus_id, addr, reinterpret_cast<char *>(buf), len);
        return (bytes_read != int(len)) ? (-ENXIO) : (0);
    }
} // namespace purefs::blkdev