[RFC] Re: TP link MR3220 status, boot from flash via u-boot
question
Aleksandr Rybalko
ray at dlink.ua
Fri Apr 8 08:31:41 UTC 2011
On Fri, 8 Apr 2011 09:57:12 +0200
Milan Obuch <freebsd-mips at dino.sk> wrote:
>> On Fri, 1 Apr 2011 00:57:33 +0300, Aleksandr Rybalko <ray at ddteam.net>
>> wrote:
>>
>> > On Thu, 31 Mar 2011 14:26:40 +0200
>> > Milan Obuch <freebsd-mips at dino.sk> wrote:
>> >
>> > > On Thu, 31 Mar 2011 18:39:36 +0800, Adrian Chadd
>> > > <adrian at 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 at dlink.ua>
aka Alex RAY <ray at ddteam.net>
More information about the freebsd-mips
mailing list