File: dfumemorylayout.cpp

package info (click to toggle)
qflipper 1.3.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 12,320 kB
  • sloc: cpp: 18,500; sh: 247; ansic: 191; xml: 38; python: 14; makefile: 5
file content (91 lines) | stat: -rw-r--r-- 2,248 bytes parent folder | download | duplicates (2)
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
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "dfumemorylayout.h"

#include <QDebug>

#include "debug.h"

// TODO: Try optimising it
DFUMemoryLayout DFUMemoryLayout::fromStringDescriptor(const QByteArray &desc)
{
    DFUMemoryLayout ret;

    const auto fields = desc.split('/');

    if(fields.size() != 3) {
        error_msg("bad descriptor syntax");
        return ret;
    }

    ret.m_name = fields.at(0).trimmed();
    ret.m_address = fields.at(1).toULong(nullptr, 16);

    const auto banks = fields.at(2).split(',');

    for(const auto &bank : banks) {
        const auto bankFields = bank.split('*');

        if(bankFields.size() != 2) {
            error_msg("bad page bank syntax");
            return ret;
        }

        const auto pageCount = bankFields.first();
        const auto pageSize = bankFields.last();
        const auto sizeMultiplier = (pageSize.at(pageSize.length() - 2) == 'K' ? 1024 : 1);

        PageBank elem;
        elem.pageCount = pageCount.toULong();
        elem.type = pageSize.back();
        elem.pageSize = pageSize.chopped(2).toULong() * sizeMultiplier;

        ret.m_pageBanks.append(elem);
    }

    return ret;
}

const QString &DFUMemoryLayout::name() const
{
    return m_name;
}

uint32_t DFUMemoryLayout::address() const
{
    return m_address;
}

const QList<DFUMemoryLayout::PageBank> &DFUMemoryLayout::pageBanks() const
{
    return m_pageBanks;
}

// TODO: Try optimising it, the function will traverse all banks regardless of the start
const QList<uint32_t> DFUMemoryLayout::pageAddresses(uint32_t start, uint32_t end) const
{
    QList<uint32_t> ret;

    if((start < m_address) || (start > end)) {
        error_msg("address error");
        return ret;
    } else if(m_pageBanks.isEmpty()) {
        error_msg("page banks empty");
        return ret;
    } else {}

    ret.append(start);

    uint32_t currentAddress = m_address;

    for(const auto &bank : m_pageBanks) {
        for(size_t i = 0; i < bank.pageCount; ++i) {
            currentAddress += (uint32_t)bank.pageSize;
            if((currentAddress > start) && (currentAddress < end)) {
                ret.append(currentAddress);
            } else if(currentAddress >= end) {
                return ret;
            }
        }
    }

    return ret;
}