123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- --- a/nslu2_image.cc
- +++ b/nslu2_image.cc
- @@ -54,28 +54,44 @@ namespace NSLU2Image {
- int &address, int &length) {
- address = image.tellg();
- length = buffer_length;
- - if (address+length > NSLU2Protocol::FlashSize)
- - length = NSLU2Protocol::FlashSize-address;
- + if (address+length > EndAddress)
- + length = EndAddress-address;
- if (length > 0)
- SafeRead(&image, buffer, length, "image (read)");
- }
-
- + virtual void GetBoundaries(int &start, int &end)
- + {
- + start = BaseAddress;
- + end = EndAddress;
- + }
- +
- /* Rewind to the start of the image (or the Kernel if not
- * doing a complete reprogram).
- */
- virtual void Rewind(void) {
- - SafeSeek(&image, reprogram ? 0 : NSLU2Protocol::BaseAddress,
- + SafeSeek(&image, reprogram ? 0 : BaseAddress,
- "image (seek)");
- }
-
- private:
- + int BaseAddress;
- + int EndAddress;
- +
- /* Validate that this really is an image file. */
- void Validate(const char *i) {
- char signature[8];
-
- SafeSeek(&image, -8, i, std::ios::end);
- SafeRead(&image, signature, 8, i);
- - if (memcmp(signature, "eRcOmM", 6) != 0)
- +
- + if (memcmp(signature, "eRcOmM", 6) == 0) {
- + BaseAddress = NSLU2Protocol::BaseAddress;
- + EndAddress = NSLU2Protocol::FlashSize;
- + } else if (memcmp(signature + 1, "sErCoMm", 7) == 0) {
- + BaseAddress = 0;
- + EndAddress = NSLU2Protocol::FlashSize - 0x40000;
- + } else
- throw NSLU2Image::FileError(DataError, i, 0);
- }
-
- @@ -93,6 +109,12 @@ namespace NSLU2Image {
- virtual ~SynthesiseImage() {
- }
-
- + void GetBoundaries(int &start, int &end)
- + {
- + start = NSLU2Protocol::BaseAddress;
- + end = NSLU2Protocol::FlashSize;
- + }
- +
- /* Get the next block of bytes, returns an address and length, false if
- * there is a problem.
- */
- --- a/nslu2_image.h
- +++ b/nslu2_image.h
- @@ -35,6 +35,8 @@ namespace NSLU2Image {
- virtual ~Image() {
- }
-
- + virtual void GetBoundaries(int &start, int &end) = 0;
- +
- /* Get the next block of bytes, returns an address and length.
- */
- virtual void GetBytes(char *buffer, size_t buffer_length,
- --- a/nslu2_upgrade.cc
- +++ b/nslu2_upgrade.cc
- @@ -95,7 +95,7 @@ namespace NSLU2Upgrade {
-
- class RealDoUpgrade : public DoUpgrade {
- public:
- - RealDoUpgrade(Wire *w, Progress *p, bool r) :
- + RealDoUpgrade(Wire *w, Progress *p, bool r, int start, int end) :
- wire(w), progress(p), sequenceError(-1), reprogram(r),
- lastType(NSLU2Protocol::InvalidType) {
- if (reprogram) {
- @@ -105,6 +105,8 @@ namespace NSLU2Upgrade {
- NSLU2Protocol::UpgradeStartPacket packet(seq);
- wire->Send(packet.PacketBuffer(), packet.PacketLength());
- }
- + BaseAddress = start;
- + EndAddress = end;
- }
-
- virtual ~RealDoUpgrade() {
- @@ -205,8 +207,8 @@ namespace NSLU2Upgrade {
-
- };
-
- - DoUpgrade *DoUpgrade::MakeDoUpgrade(Wire *wire, Progress *progress, bool reprogram) {
- - return new RealDoUpgrade(wire, progress, reprogram);
- + DoUpgrade *DoUpgrade::MakeDoUpgrade(Wire *wire, Progress *progress, bool reprogram, int start, int end) {
- + return new RealDoUpgrade(wire, progress, reprogram, start, end);
- }
- };
-
- @@ -421,13 +423,18 @@ void NSLU2Upgrade::RealDoUpgrade::Upgrad
- /* Simple upgrade programs only the addresses beyound BaseAddress,
- * reprogram overwrites the whole flash.
- */
- - if (!reprogram && address < NSLU2Protocol::BaseAddress) {
- + if (!reprogram && address < BaseAddress) {
- length += address;
- - if (length <= NSLU2Protocol::BaseAddress)
- + if (length <= BaseAddress)
- return; /* nothing to do. */
- - address = NSLU2Protocol::BaseAddress;
- + address = BaseAddress;
- length -= address;
- }
- + if (!reprogram && address + length > EndAddress) {
- + if (address >= EndAddress)
- + return; /* nothing to do. */
- + length -= EndAddress - address;
- + }
-
- #if 1
- /* Skip blocks of 255 valued bytes - the erase clears the flash to this
- @@ -495,11 +502,11 @@ void NSLU2Upgrade::RealDoUpgrade::Verify
- Finish();
-
- /* Verify never verifies anything below BaseAddress. */
- - if (address < NSLU2Protocol::BaseAddress) {
- + if (address < BaseAddress) {
- length += address;
- - if (length <= NSLU2Protocol::BaseAddress)
- + if (length <= BaseAddress)
- return; /* nothing to do. */
- - address = NSLU2Protocol::BaseAddress;
- + address = BaseAddress;
- length -= address;
- }
-
- --- a/nslu2_upgrade.h
- +++ b/nslu2_upgrade.h
- @@ -206,6 +206,8 @@ namespace NSLU2Upgrade {
-
- class DoUpgrade {
- public:
- + int BaseAddress;
- + int EndAddress;
- virtual ~DoUpgrade() {
- }
-
- @@ -228,7 +230,7 @@ namespace NSLU2Upgrade {
- virtual void Reboot(void) = 0;
- /* Reboot the NSLU2. */
-
- - static DoUpgrade *MakeDoUpgrade(Wire *wire, Progress *progress, bool reprogram);
- + static DoUpgrade *MakeDoUpgrade(Wire *wire, Progress *progress, bool reprogram, int start, int end);
- /* Instantiate a real DoUpgrade, returns NULL if the object
- * cannot be instantiated.
- *
- --- a/upslug2.cc
- +++ b/upslug2.cc
- @@ -21,8 +21,8 @@
-
- class ProgressBar : public UpSlug2::CharacterProgressBar<80> {
- public:
- - ProgressBar(bool reprogram, const unsigned char *t) :
- - UpSlug2::CharacterProgressBar<80>(reprogram, 64),
- + ProgressBar(bool reprogram, const unsigned char *t, int start, int end) :
- + UpSlug2::CharacterProgressBar<80>(reprogram, 64, start, end),
- target(t), displayed(false), ticker(0) {
- }
-
- @@ -95,7 +95,7 @@ private:
- else if (seen == -1) {
- seen = 0;
- if (!reprogram)
- - sent -= NSLU2Protocol::BaseAddress;
- + sent -= NSLU2Protocol::FlashSize - (EndAddress - BaseAddress);
- } else
- sent -= seen;
-
- @@ -423,7 +423,7 @@ int main(int argc, char **argv) {
- { 0, 0, 0, 0 }
- };
-
- - do switch (getopt_long(argc, argv, "he:d:t:f:vUni:Ck:r:R:j:p:P:T:F:E:", options, 0)) {
- + do switch (getopt_long(argc, argv, "he:d:t:f:vUni:Ck:r:R:j:op:P:T:F:E:", options, 0)) {
- case -1: if (optind < argc) {
- std::fprintf(stderr, "%s: unrecognised option\n", argv[optind]);
- std::exit(1);
- @@ -523,16 +523,22 @@ done:
-
- if (mac && got_kernel) {
- Pointer<NSLU2Upgrade::Wire> wire(NSLU2Upgrade::Wire::MakeWire(device, fromMac, mac, euid));
- - ProgressBar progress(reprogram, mac);
- + int BaseAddress = NSLU2Protocol::BaseAddress;
- + int EndAddress = NSLU2Protocol::FlashSize;
-
- if (full_image) { /* complete image. */
- /* The full image case allows a complete reprogram. */
- + NSLU2Image::Image *image_p;
- Pointer<NSLU2Image::Image> image(
- NSLU2Image::Image::MakeImage(
- reprogram, full_image));
- + image_p = image.p;
- + image_p->GetBoundaries(BaseAddress, EndAddress);
- + ProgressBar progress(reprogram, mac, BaseAddress, EndAddress);
- Pointer<NSLU2Upgrade::DoUpgrade> upgrade(
- NSLU2Upgrade::DoUpgrade::MakeDoUpgrade(
- - wire.p, &progress, reprogram));
- + wire.p, &progress, reprogram,
- + BaseAddress, EndAddress));
- progress.FirstDisplay();
- Upgrade(upgrade.p, image.p, no_upgrade, no_verify);
- progress.EndDisplay();
- @@ -551,9 +557,11 @@ done:
- fis_payload,
- product_id, protocol_id,
- firmware_version, extra_version));
- + ProgressBar progress(reprogram, mac, BaseAddress, EndAddress);
- Pointer<NSLU2Upgrade::DoUpgrade> upgrade(
- NSLU2Upgrade::DoUpgrade::MakeDoUpgrade(
- - wire.p, &progress, false));
- + wire.p, &progress, false,
- + BaseAddress, EndAddress));
- progress.FirstDisplay();
- Upgrade(upgrade.p, image.p, no_upgrade, no_verify);
- progress.EndDisplay();
- --- a/upslug2_progress.h
- +++ b/upslug2_progress.h
- @@ -161,15 +161,19 @@ namespace UpSlug2 {
- Timedout, /* *: timeout on a sent packet for this address. */
- NumberOfStates
- } Status;
- -
- + int BaseAddress;
- + int EndAddress;
- +
- /* reprogram says whether this is a full reprogram (the entire
- * flash will be erased) or not (the leading, RedBoot, SysConf
- * partitions are not erased).
- * resolution should be about 6 for a command line (character)
- * progress bar and 8 for a GUI (pixel) progress bar.
- */
- - ProgressBar(bool r) :
- + ProgressBar(bool r, int start, int end) :
- reprogram(r), timeout(false), retransmit(false), status(Init) {
- + BaseAddress = start;
- + EndAddress = end;
- }
-
- /* lowWaterMark..(highWaterMark-1) bytes are in state 'st',
- @@ -179,8 +183,8 @@ namespace UpSlug2 {
- /* These initial settings cover the majority of cases
- * correctly.
- */
- - lowWaterMark = reprogram ? 0 : NSLU2Protocol::BaseAddress;
- - highWaterMark = status >= st ? NSLU2Protocol::FlashSize-1 : 0;
- + lowWaterMark = reprogram ? 0 : BaseAddress;
- + highWaterMark = status >= st ? EndAddress-1 : 0;
- switch (st) {
- case Init:
- /* Everything has an initial value... */
- @@ -286,9 +290,9 @@ namespace UpSlug2 {
- */
- template <int characters> class CharacterProgressBar : public ProgressBar {
- public:
- - CharacterProgressBar(bool reprogram, int n, const char ind[NumberOfStates] = 0) :
- + CharacterProgressBar(bool reprogram, int n, int start, int end, const char ind[NumberOfStates] = 0) :
- numberOfCharacters(n > characters || n < 1 ? characters : n),
- - ProgressBar(reprogram) {
- + ProgressBar(reprogram, start, end) {
- if (ind)
- std::memcpy(indicators, ind, NumberOfStates);
- else
|