1 ///////////////////////////////////////////////////////////////////////////////
2 // BOSSA
3 //
4 // Copyright (c) 2011-2018, ShumaTech
5 // All rights reserved.
6 //
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions are met:
9 //     * Redistributions of source code must retain the above copyright
10 //       notice, this list of conditions and the following disclaimer.
11 //     * Redistributions in binary form must reproduce the above copyright
12 //       notice, this list of conditions and the following disclaimer in the
13 //       documentation and/or other materials provided with the distribution.
14 //     * Neither the name of the <organization> nor the
15 //       names of its contributors may be used to endorse or promote products
16 //       derived from this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 // DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
22 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 ///////////////////////////////////////////////////////////////////////////////
29 #ifndef _FLASHER_H
30 #define _FLASHER_H
31 
32 #include <string>
33 #include <exception>
34 #include <vector>
35 
36 #include "Device.h"
37 #include "Flash.h"
38 #include "Samba.h"
39 #include "FileError.h"
40 
41 class FlashOffsetError : public std::exception
42 {
43 public:
FlashOffsetError()44     FlashOffsetError() : std::exception() {};
what()45     virtual const char* what() const throw() { return "Flash offset is invalid"; }
46 };
47 
48 class FlasherObserver
49 {
50 public:
FlasherObserver()51     FlasherObserver() {}
~FlasherObserver()52     virtual ~FlasherObserver() {}
53 
54     virtual void onStatus(const char *message, ...) = 0;
55     virtual void onProgress(int num, int div) = 0;
56 };
57 
58 class FlasherInfo
59 {
60 public:
FlasherInfo()61     FlasherInfo() {}
~FlasherInfo()62     virtual ~FlasherInfo() {}
63 
64     void print();
65 
66     std::string name;
67     uint32_t    chipId;
68     uint32_t    extChipId;
69     std::string version;
70     uint32_t    address;
71     uint32_t    numPages;
72     uint32_t    pageSize;
73     uint32_t    totalSize;
74     uint32_t    numPlanes;
75 
76     bool        security;
77     bool        bootFlash;
78     bool        bod;
79     bool        bor;
80 
81     bool        canBootFlash;
82     bool        canBod;
83     bool        canBor;
84     bool        canChipErase;
85     bool        canWriteBuffer;
86     bool        canChecksumBuffer;
87 
88     std::vector<bool> lockRegions;
89 };
90 
91 class Flasher
92 {
93 public:
Flasher(Samba & samba,Device & device,FlasherObserver & observer)94     Flasher(Samba& samba, Device& device, FlasherObserver& observer) : _samba(samba), _flash(device.getFlash()), _observer(observer) {}
~Flasher()95     virtual ~Flasher() {}
96 
97     void erase(uint32_t foffset);
98     void write(const char* filename, uint32_t foffset = 0);
99     bool verify(const char* filename, uint32_t& pageErrors, uint32_t& totalErrors, uint32_t foffset = 0);
100     void read(const char* filename, uint32_t fsize, uint32_t foffset = 0);
101     void lock(std::string& regionArg, bool enable);
102     void info(FlasherInfo& info);
103 
104 private:
105     Samba& _samba;
106     Device::FlashPtr& _flash;
107     FlasherObserver& _observer;
108 };
109 
110 #endif // _FLASHER_H
111