Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 Apr 2011 11:31:32 +0300
From:      Aleksandr Rybalko <ray@dlink.ua>
To:        Milan Obuch <freebsd-mips@dino.sk>
Cc:        Aleksandr Rybalko <ray@ddteam.net>, freebsd-mips@freebsd.org
Subject:   Re: [RFC] Re: TP link MR3220 status, boot from flash via u-boot question
Message-ID:  <20110408113132.3c1df0a8.ray@dlink.ua>
In-Reply-To: <20110408095712.1fc36066@atom.dino.sk>
References:  <20110331101554.68171eed@atom.dino.sk> <AANLkTik9r7XZn2yyJe37EXYXfgkUzyt5Ne-eKd_XqGMO@mail.gmail.com> <20110331142640.07f2101b@atom.dino.sk> <20110401005733.3598e82c.ray@ddteam.net> <20110408095712.1fc36066@atom.dino.sk>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 8 Apr 2011 09:57:12 +0200
Milan Obuch <freebsd-mips@dino.sk> wrote:

>> On Fri, 1 Apr 2011 00:57:33 +0300, Aleksandr Rybalko <ray@ddteam.net>
>> wrote:
>> 
>> > On Thu, 31 Mar 2011 14:26:40 +0200
>> > Milan Obuch <freebsd-mips@dino.sk> wrote:
>> > 
>> > > On Thu, 31 Mar 2011 18:39:36 +0800, Adrian Chadd
>> > > <adrian@freebsd.org> wrote:
>> 
>> [ snip ]
>> 
>> > > Hi,
>> > > I am watching freebsd-wifi-build on googlecode and just noticed new
>> > > config there... Is your 11n wifi already working too? I would be
>> > > glad to compare your results with mine, so we could unify our
>> > > efforts. Right now, kernel load from flash in u-boot is a show
>> > > stopper for me, so if you could address this one first, it would
>> > > help me really much.
>> > 
>> > Draft for wiki page 'Run from NOR flash with U-Boot'
>> > 
>> 
>> In my case, to be exact, there is SPI flash, actually...

SPI is a interface, but flash type also NOR, IIRC

>> 
>> > Keywords: U-Boot, embedded
>> > 
>> > 1. Ask U-Boot: "what do you support to boot?"
>> > 
>> > Normally, U-Boot use special image for kernel/ramfs packing. But we
>> > need to know which compression support U-Boot that fleshed to our
>> > target board.
>> >
>> 
>> This one is easy - I can use gzip packed kernel only. If I try other
>> compressing method, u-boot complains with 'bad gzip data' message so
>> this one is clear in this case, I think.

Did you try all lzma typed (oldlzma, lzma and xz)?

Because I made 4M system with kernel compressed with LZMA(oldlzma) and fs is iso.ulzma
In gzipped kernel case we have kernel partition 200-600 Kb bigger. Then it hard to make usable FS. 

>> 
>> > First way: 
>> > use mkimage utility (/usr/ports/devel/u-boot) and make test
>> > images for all supported by mkimage compression types.
>> > <code>
>> > mkimage -A ${TARGET} -O linux -T kernel \
>> >             -C ${COMPRESSION_TYPE} \
>> >             -a ${RAM_START_ADDRESS} \
>> >             -e ${RAM_START_ADDRESS} \
>> >             -n 'FreeBSD Kernel Image' \
>> >             -d SOME_SMALL_FILE_NAME \
>> >             test.uboot
>> > </code>
>> > Then for each file, do transfer to board and run from image with
>> > `bootm' command. And check what U-Boot answer you, if answer like
>> > "Unimplemented compression type ?", then you know :).
>> > 
>> > Second way:
>> > From running Linux or U-Boot get first 64k block from kernel partition
>> > in flash. 
>> > 
>> > Break your mkimage utility: avoid exit when we do "show info" (key -i)
>> > CRC failed. And check compression type of 64k file we get from device.
>> > 
>> > Or just delete U-Boot image header from file
>> > <code>
>> > dd if=64k.file of=just_kern bs=64 skip=1
>> > </code>
>> > and check with file(1) utility 
>> > 
>> > 2. Create image
>> > 2.1. More canonical way, we have mkimage, gzip or bz2 and compiled
>> > kernel, maybe kernel.bin also.
>> > 
>> > <code>
>> > gzip --best --force vmlinux.bin
>> > </code>
>> > 
>> > for ELF kernel:
>> > <code>
>> > mkimage -A mips -O linux -T kernel \
>> >             -C gzip \
>> >             -a ${LOAD_ADDRESS} \
>> >             -e ${START_ADDRESS} \
>> >             -n 'FreeBSD Kernel Image' \
>> >             -d kernel \
>> >             kernel.uboot
>> > </code>
>> > LOAD_ADDRESS - in most cases this is RAM base address
>> > START_ADDRESS = LOAD_ADDRESS + ELF_HEADER_SIZE (0x1000 for ELF image) 
>> > 
>> > for kernel.bin:
>> > 
>> > LOAD_ADDRESS = RAM_BASE_ADDRESS + 0x1000
>> > START_ADDRESS = RAM_BASE_ADDRESS + 0x1000 
>> > 
>> > Don't forget to check/change KERNLOADADDR of kernel config file.
>> > KERNLOADADDR must be equal to START_ADDRESS.
>> > 
>> 
>> I tried it various way, no success yet. When I load kernel via TFTP to
>> address set in kernel config (0x80050000 in my case) I can issue a go
>> command to 'start' address, usually 0x80050100, but sometimes it is
>> 0x80050120 - I am checking for this after kernel is built - and kernel
>> boots correctly and works.

0x80050120 - something weird (maybe 0x20 U-Boot or TPlink header size)
0x80050100 - START_ADDRESS in case we use elf

to save some space make
objcopy -S -O binary kernel kernel.bin
then run mkimage with load and start address 0x80050100

>> 
>> As already mentioned, there is a mktplinkfw utility, which combines
>> kernel and root fs (or uses kernel with embedded root fs), prepends a
>> required header and pads generated image to full size of flash minus
>> 128 kB for u-boot itself. I am able to flash such image into flash, but
>> bootm tells only about success uncompressing kernel, starting kernel
>> and that's all.

I not work with mktplinkfw yet, so I can't hint you about that.

>> 
>> ## Booting image at 9f020000 ...
>>    Uncompressing Kernel Image ... OK
>> 
>> Starting kernel ...
>> 
>> Nothing more, powerdown necessary to start again.
>> 
>> > 2.2. Longest way, but have smallest footprint, used only if  
>> > U-Boot support LZMA.
>> > 
>> > Problem 1: Current version of mkimage from ports, don't support LZMA.
>> > So we need new: http://my.ddteam.net/files/u-boot.new.tar.gz
>> > 
>> > Problem 2: Devices I know support only old LZMA. 
>> > I use LZMA 4.17.
>> > 
>> > Then mkimage, like in 2.2., but -C lzma.
>> > 
>> > 3. Now we have kernel U-Boot image, so transfer it to device and try
>> > with `bootm' command.
>> > 
>> > 4. If all fine, write image to flash kernel partition.
>> > 
>> > 
>> > Hope this help :)
>> > 
>> 
>> [ snip ]
>> 
>> Not much yet, unfortunatelly...
>> 
>> On a side note, there is one thing to be addressed. As my device has
>> only 4 MB flash, I still need to shrink the image I would like to use
>> there. I could put there working kernel, when flash boot issue is
>> solved, but root fs not yet, together they do not fit. I still need to
>> save as much as 600 kB of space... Do you have any tips to share? In
>> some older mails here I saw you managed to do it for other device...

1. compile with NOSHARED=no
2. delete .h, .a, .o and many other docs and unused binary's (I think that step you know :) )
3. mkulzma+geom_uncompress instead mkuzip+geom_uzip

>> 
>> Regards,
>> Milan


WBW
-- 
Alexandr Rybalko <ray@dlink.ua> 
aka Alex RAY <ray@ddteam.net>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20110408113132.3c1df0a8.ray>