Re: apex-1.3.31 and sercomm flash header
On Sat, Aug 05, 2006 at 12:44:53AM +0200, Martin Michlmayr wrote:
> * Marc Singer <elf@buici.com> [2006-07-28 18:06]:
> > So, what exactly do you want it to be able to do?
>
> Sorry for the delay. Thank you for working on this - I've played with
> it now and it's working great.
>
> > What I'm thinking is that we should be a little more explicit about
> > what we're doing.
> > 1) We *must* put the second stage, whatever it is, at the same
> > address in flash, 0x60000.
>
> Yes, that's right. In addition to this requirement, it seems that the
> FIS entry at 0x60000 has to be 8 blocks in size. I tried putting APEX
> there as a "Loader" partition with 1 block and then RedBoot crashes
> while loading it:
Ow, ow, ow, ow, ow.
> copy kernel code from flash to RAM
> copy ramdisk file from flash to RAM
> $T0a0f:00020650;0d:0003ddc0;#a4
>
> However, it works after changing the size to 8 blocks.
>
> Given that the loader/APEX partition has to be 8 blocks (1048576
> bytes), it might be a good idea to put the APEX environment in there
> as well.
Actually, there is another way we can handle this. The partition for
this region can overlap other regions. So, we let the region where
APEX resides be 8 blocks, but the next partition starts one block from
the start of this partition.
>
> > 2) We would like to be able to add a partition for the second stage
> > loader, in this case APEX.
> >
> > I can see that we need or may need the following:
> >
> > 1) A new option, -L | --loader to add a second stage loader.
>
> Yes, I've implemented this now and have successfully flashed an image
> with APEX, Linux and a ramdisk. I've attached the patch.
>
> Rod, can you please review the patch.
> Mark, what do you think of moving the APEX environment?
>
> Anything else?
Just the above comments. I think it is worth looking into working
around yet-another-limitation in Redboot.
>
> --
> Martin Michlmayr
> http://www.cyrius.com/
> --- slugimage~ 2006-08-04 22:52:24.000000000 +0200
> +++ slugimage 2006-08-05 00:34:09.000000000 +0200
> @@ -725,9 +725,11 @@
> } @partitions;
> }
>
> -sub defaultPartitions {
> +sub defaultPartitions($) {
> + my($loader) = @_;
>
> - return ({'name'=>'RedBoot', 'file'=>'RedBoot',
> + my @partitions =
> + ({'name'=>'RedBoot', 'file'=>'RedBoot',
> 'offset'=>0x00000000, 'size'=>0x00040000,
> 'variable'=>0, 'header'=>0, 'pseudo'=>0, 'data'=>undef, 'byteswap'=>0},
> {'name'=>'EthAddr', 'file'=>undef,
> @@ -735,12 +737,22 @@
> 'variable'=>0, 'header'=>0, 'pseudo'=>1, 'data'=>undef, 'byteswap'=>0},
> {'name'=>'SysConf', 'file'=>'SysConf',
> 'offset'=>0x00040000, 'size'=>0x00020000,
> - 'variable'=>0, 'header'=>0, 'pseudo'=>0, 'data'=>undef, 'byteswap'=>0},
> - {'name'=>'Kernel', 'file'=>'vmlinuz',
> - 'offset'=>0x00060000, 'size'=>0x00100000,
> - 'variable'=>0, 'header'=>16, 'pseudo'=>0, 'data'=>undef, 'byteswap'=>0},
> + 'variable'=>0, 'header'=>0, 'pseudo'=>0, 'data'=>undef, 'byteswap'=>0});
> +
> + my $loader_size = 0;
> + if ($loader) {
> + $loader_size = 0x00100000;
> + push @partitions,
> + ({'name'=>'Loader', 'file'=>'loader',
> + 'offset'=>0x00060000, 'size'=>$loader_size,
> + 'variable'=>0, 'header'=>16, 'pseudo'=>0, 'data'=>undef, 'byteswap'=>0});
> + }
> +
> + push @partitions,
> + ({'name'=>'Kernel', 'file'=>'vmlinuz',
> + 'offset'=>(0x00060000+$loader_size),
> + 'variable'=>1, 'header'=>16, 'pseudo'=>0, 'data'=>undef, 'byteswap'=>0},
> {'name'=>'Ramdisk', 'file'=>'ramdisk.gz',
> - 'offset'=>0x00160000, 'size'=>0x006a0000,
> 'variable'=>1, 'header'=>16, 'pseudo'=>0, 'data'=>undef, 'byteswap'=>0},
> {'name'=>'FIS directory', 'file'=>undef,
> 'offset'=>0x007e0000, 'size'=>0x00020000,
> @@ -750,16 +762,13 @@
> 'variable'=>1, 'header'=>16, 'pseudo'=>1, 'data'=>undef, 'byteswap'=>0},
> {'name'=>'Trailer', 'file'=>'Trailer',
> 'offset'=>0x007ffff0, 'size'=>0x00000010,
> - 'variable'=>0, 'header'=>0, 'pseudo'=>1, 'data'=>undef, 'byteswap'=>0},
> - );
> -
> + 'variable'=>0, 'header'=>0, 'pseudo'=>1, 'data'=>undef, 'byteswap'=>0});
> + return @partitions;
> }
>
> # Main routine starts here ...
>
> -my(@partitions) = defaultPartitions();
> -
> -my($unpack, $pack, $little, $input, $output, $redboot, $kernel, $sysconf, $ramdisk, $fisdir, $payload, $trailer, $ethaddr);
> +my($unpack, $pack, $little, $input, $output, $redboot, $kernel, $sysconf, $ramdisk, $fisdir, $payload, $trailer, $ethaddr, $loader);
> my (@cleanup);
>
> END {
> @@ -784,6 +793,7 @@
> "y|payload=s" => \$payload,
> "t|trailer=s" => \$trailer,
> "e|ethaddr=s" => \$ethaddr,
> + "L|loader=s" => \$loader,
> ) or (not defined $pack and not defined $unpack)) {
> print "Usage: slugimage <options>\n";
> print "\n";
> @@ -801,6 +811,7 @@
> print " [-f|--fisdir] <file> Input/Output FIS directory filename\n";
> print " [-y|--payload] <file> Input/Output Payload filename\n";
> print " [-t|--trailer] <file> Input/Output Trailer filename\n";
> + print " [-L|--loader] <file> Second stage boot loader filename\n";
> print " [-e|--ethaddr] <AABBCCDDEEFF> Set the Ethernet address\n";
>
> # TODO: document --ramdisk syntax
> @@ -808,6 +819,19 @@
> exit 1;
> }
>
> +my(@partitions) = defaultPartitions($loader);
> +# If we don't use our own second stage boot loader, we need to follow the
> +# layout assumed by the NSLU2 firmware.
> +if (!$loader) {
> + map { ($_->{'name'} eq 'Kernel') && ($_->{'offset'} = 0x00060000); } @partitions;
> + map { ($_->{'name'} eq 'Kernel') && ($_->{'size'} = 0x00100000); } @partitions;
> + map { ($_->{'name'} eq 'Ramdisk') && ($_->{'offset'} = 0x00160000); } @partitions;
> + map { ($_->{'name'} eq 'Ramdisk') && ($_->{'size'} = 0x006a0000); } @partitions;
> + if ($pack) {
> + map { ($_->{'name'} eq 'Kernel') && ($_->{'variable'} = 0); } @partitions;
> + }
> +}
> +
> if ($pack) {
> die "Output filename must be specified\n" unless defined $output;
>
> @@ -849,6 +873,7 @@
>
> # Go through the partition options, and set the names and files in @partitions
> if (defined $redboot) { map { ($_->{'name'} eq 'RedBoot') && ($_->{'file'} = $redboot); } @partitions; }
> +if (defined $loader) { map { ($_->{'name'} eq 'Loader') && ($_->{'file'} = $loader); } @partitions; }
> if (defined $kernel) { map { ($_->{'name'} eq 'Kernel') && ($_->{'file'} = $kernel); } @partitions; }
> if (defined $sysconf) { map { ($_->{'name'} eq 'SysConf') && ($_->{'file'} = $sysconf); } @partitions; }
> if (defined $fisdir) { map { ($_->{'name'} eq 'FIS directory') && ($_->{'file'} = $fisdir); } @partitions; }
> @@ -857,7 +882,8 @@
>
> if (defined $little) {
> map {
> - if (($_->{'name'} eq 'Kernel') or
> + if (($_->{'name'} eq 'Loader') or
> + ($_->{'name'} eq 'Kernel') or
> ($_->{'name'} eq 'Ramdisk')) {
> $_->{'byteswap'} = 1;
> }
Reply to: