~aleteoryx/muditaos

ref: e97a6a7ac770dffc3a7207237f63d417a6efa5ce muditaos/products/BellHybrid/serial-number-parser/DeviceMetadata.cpp -rw-r--r-- 2.1 KiB
e97a6a7a — Lefucjusz [BH-2085] Commit Harmony database migration 1 year, 3 months 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
// 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 <serial-number-parser/DeviceMetadata.hpp>
#include <serial-number-parser/SerialNumberParser.hpp>
#include <purefs/vfs_subsystem.hpp>
#include <log/log.hpp>

namespace serial_number_parser
{
    namespace
    {
        /* Block device constants */
        constexpr auto blkdevName  = "emmc0sys1";
        constexpr auto blockSize   = 512;
        constexpr auto blockToRead = 2;
        constexpr auto blocksCount = 1;

        constexpr auto serialNumberOffset = 0;
        constexpr auto serialNumberLength = 13;

        const auto unknownVersionMetadata = VersionMetadata(unknownColour, unknownVersion);
        const auto unknownDeviceMetadata  = DeviceMetadata(unknownSerialNumber, unknownVersionMetadata);

        std::string readSerialNumber()
        {
            char block[blockSize];

            const auto diskManager = purefs::subsystem::disk_mgr();
            if (diskManager == nullptr) {
                return "";
            }

            const auto status = diskManager->read(blkdevName, block, blockToRead, blocksCount);
            if (status != 0) {
                return "";
            }

            return std::string(&block[serialNumberOffset], serialNumberLength);
        }
    } // namespace

    DeviceMetadata getDeviceMetadata()
    {
        const auto serialNumber = readSerialNumber();
        if (serialNumber.empty()) {
            LOG_ERROR("Error reading serial number from eMMC!");
            return unknownDeviceMetadata;
        }

        const auto deviceVersionMetadata = getDeviceVersionMetadata(serialNumber);
        if (!deviceVersionMetadata.has_value()) {
            LOG_ERROR("Failed to read device version metadata for device with serial number '%s'!",
                      serialNumber.c_str());
            return DeviceMetadata(serialNumber, unknownVersionMetadata);
        }

        return DeviceMetadata(serialNumber, deviceVersionMetadata.value());
    }
} // namespace serial_number_parser