I took the u-boot sources for imx507 from the official repo of the KOBO reader at git://github.com/kobolabs/Kobo-Reader.git cause I was unable to find a working u-boot repository that contains the mx50/imx507. Hey Deutsche Telekom, you should publish something… The u-boot source is located in Kobo-Reader/hw/imx507/u-boot-2009.08.tar.gz. To build the boot-loader you also need a matching tool-chain – happily you can find one also in the KOBO repo – this time in Kobo-Reader/toolchain/gcc-linaro-arm-linux-gnueabihf-4.8-2013.04-20130417_linux.tar.bz2. You could get both archives here (cause the full blown KOBO-Reader-Repo is currently about 3.5G – and you only need these two parts to start):
Copy both archives to a common directory and then:
>tar xzvf u-boot-2009.08.tar.gz >tar xjvf gcc-linaro-arm-linux-gnueabihf-4.8-2013.04-20130417_linux.tar.bz2 >export PATH=$PATH:/home/devel/projects/tolino_shine/own_uboot/kobo/gcc-linaro-arm-linux-gnueabihf-4.8-2013.04-20130417_linux/bin/
_note 0: replace the exported path with yours!
_note 1a: if you use the files from the git repo – change the name of the used toolchain/gcc-prefix in u-boot-2009.08/build_mddr_256.sh and u-boot-2009.08/build.sh from arm-fsl-gnueabi- to arm-linux-gnueabihf-
_note 1b: The names are already changed in archives linked above.
_note2: For running the build_mddr_256.sh the program dialog (console based dialogs & menus) must be installed on your system.
Now you are ready to build:
>cd u-boot-2009.08/ >./u-boot-2009.08/build_mddr_256.sh
and choose E60610 board, K4X2G323PD – Go! The build process creates a file named u-boot_mddr_256-E60610-K4X2G323PD.bin (just the renamed u-boot.bin) – thats the boot-loader. Easy, huh?
Connect your SD card to your PC – use dmesg to make sure you take the right device for the next steps.
_warning: all data on the SD will be lost!
_note: tested it with 2GB – must not be a SDHC – old cards are working
The bootcode of the CPU expects the code at 0x400 on the SD card. The created image is already padded to fit this needs – so no seeking is needed – just write the image to the card:
#>dd if=u-boot_mddr_256-E60610-K4X2G323PD.bin of=/dev/SDCARD bs=512
The drawback of using the image with padding is, that if you write it to the SD card also the MBR is wiped out – means your partition table is also deleted. For development it is handy to just replace the u-boot and not the 0x400 bytes in front of it – so lets strip the image.
>dd if=u-boot_mddr_256-E60610-K4X2G323PD.bin of=u-boot_mddr_256-E60610-K4X2G323PD.bin.stripped bs=512 skip=2
Writing the stripped image is straight forward – and it keeps the MBR untouched/intact:
#>dd if=u-boot_mddr_256-E60610-K4X2G323PD.bin.stripped of=/dev/SDCARD bs=512 seek=2
_note: before starting developing you should clean the SD card entirely to be save from side-effects caused by old data:
#>dd if=/dev/zero of=/dev/SDCARD bs=512
Plug the card into the shine, connect serial adapter and power on… the first boot-up reveals some other stuff that is needed to boot the shine properly.
MMC read: dev # 0, block # 1023, count 1 partition # 0 ... 1 blocks read: OK no "hwcfg" bin header - MMC read: dev # 0, block # 18431, count 1 partition # 0 ... 1 blocks read: OK no "logo" bin header - MMC read: dev # 0, block # 14335, count 1 partition # 0 ... 1 blocks read: OK no "waveform" bin header boot normal : no hwconfig ! _init_tps65185_power(): cannot init without hwconfig !
At the moment I think the tps65185 is the most important – cause without the display powered up we will see nothing. The magic behind the hardware configuration is partly done in freescale/mx50_rdp/ntx_common.c. The array gszNtxBinMagicA contains the magic number (FF F5 AF FF) that is checked within the function _load_ntx_bin_header. The information about the size of the hardware configuration is the location of the magic number + 8 – so if we find the magic number in the image we could easily extract the hardware config of the shine to use it in our own build…
Looking at block 1023 (=0x7fe00) of the backup image for finding the magic number, according to the code…
Magic = 0x7fe00 + 0x200 – 0x10 -> 0x7FFF0 -> Gotcha!
BinSize = Magic + 8 -> 0x7FFF8 = 0x6e -> 110
…strange cause the size of the header is
…and only that amount of memory is copied. Strange. But now we could extract the configuration from the backup image of the shine and put it on our SD card.
>dd if=first_16_mb_sd_card.img of=tolino_shine_hw_config.img skip=524272 bs=1 count=67 ... >hexdump -C tolino_shine_hw_config.img 00000000 ff f5 af ff 78 56 34 12 6e 00 00 00 00 00 00 00 |....xV4.n.......| 00000010 48 57 20 43 4f 4e 46 49 47 20 76 31 2e 36 00 26 |HW CONFIG v1.6.&| 00000020 1e 0d 00 00 07 00 00 08 04 06 06 00 00 18 01 00 |................| 00000030 02 00 02 02 07 01 68 02 e4 00 00 02 02 02 00 01 |......h.........| 00000040 05 00 00 |...| 00000043
Now lets write the hardware configuration on the card and check what happens on boot.
#>dd if=tolino_shine_hw_config.img of=/dev/SDCARD seek=524272 bs=1
On boot now we get
.................... Kernel RAM visiable size=255M->255M init TPS65185 power ... ....................
means the power control for the display is working now 🙂 You can find the complete boot log here.
_note: have a look at the source files in board/freescale/mx50_rdp – it is a great playground (eg. ntx_hwconfig.h explains what is stored inside the hw config blob)
Next step: adding a kernel and a initrd.
Useful to understand what the heck is done when compiling u-boot for a specific board: freescale IMX50 user guide