[A20-SOM204] Boot from eMMC using bootloader in SPI Flash and legacy kernel

Started by Titomax, November 07, 2019, 07:05:01 pm

Previous topic - Next topic

Titomax

Hi,
we are working with a board SOM204-A20 (A20-SOM204-1Ge16Gs16M-MC).
For some technical reasons, we need to work with an image Olimex legacy containing kernel 3.4.113. We cannot upgrade to a mainline release with kernel 4.

We have to boot from SPI Flash having kernel and filesystem installed in eMMC mounted onboard (as you suggest to have a boot without issues).

We followed instructions in file "migrate_to_SPI_eMMC_boot.txt", in particular instructions at point ii "How to change existing sunxi A20-OLinuXino image to boot from SPI with FS on eMMC (requires Linux machine)".

Quoteii. How to change existing sunxi A20-OLinuXino image to boot from SPI with FS on eMMC (requires Linux machine).
1. Download folder sunxi-sp-emmc with the files - emmc_FS_only.sh, emmc.sh, u-boot-sunxi-with-spl.bin, boot.cmd, boot.scr.
2. Copy your SD card image in this folder.
3. Perform update.sh on your linux image file
# ./update.sh your_image.img
The result will be a new tmp.img file
3. Write tmp.img file to the micro SD card
4. Mount the SD card
# mount /dev/sdX1 /mnt
where X is proper SD card device.
and copy boot.cmd and boot.scr files in first partition with:
# cp boot.* /mnt
# umount /dev/sdX1
5. Mount second partition
# mount /dev/sdX2 /mnt
and copy emmc_FS_only.sh, emmc.sh files in /root folder on second partition.
# cp emmc* /mnt/root
This is because we work with an image compiled by us from source code in branch "olinuxino" (at the moment image generated is called Armbian_5.92_Olimex-som204-a20_Ubuntu_xenial_default_3.4.113_desktop.img).

We managed to do point 1 and 2 but when we perform "update.sh" script on our compiled image file, we obtain a "tmp.img" not working. We cannot see any partition on it. In addition if we write "tmp.img" into a micro SD, we cannot see any partition in the card and so we cannot mount partition to copy boot.* files and emmc* files in the further point 4 and 5.

Is there an updated way to build an image, copy it on eMMC and make it bootable from SPI Flash?

Thank you





Titomax

Hi selfbg,
thank you for the prompt reply.

We already analyzed the script "update.sh" and we found the error: when the built image has a single partition instead of two or more, the fdisk command seems to be used in a wrong way. When we build an image from the olimex-armbian GIT repository we obtain always a single partition and we always fall in the wrong script branch. 

Below you can see the output prints when we run the original "update.sh" script on our image. At the end we run "fdisk -l" on the new generated image and no partition is present inside.

******* PARTITION INFO OF STARTING IMAGE BUILT FROM OLIMEX GIT REPOSITORY *******************
root@olimex# fdisk -l Armbian_5.92_Olimex-som204-a20_Ubuntu_xenial_default_3.4.113_desktop.img

Disk Armbian_5.92_Olimex-som204-a20_Ubuntu_xenial_default_3.4.113_desktop.img: 2 GiB, 2071986176 bytes, 4046848 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xe6bff4bd
Dispositivo                                                               Avvio Start    Fine Settori  Size Id Tipo
Armbian_5.92_Olimex-som204-a20_Ubuntu_xenial_default_3.4.113_desktop.img1        8192 4046847 4038656  1,9G 83 Linux


********* OUTPUTS FROM "update.sh" SCRIPT ***************************************************

root@olimex# ./update.sh Armbian_5.92_Olimex-som204-a20_Ubuntu_xenial_default_3.4.113_desktop.img

Processing: Armbian_5.92_Olimex-som204-a20_Ubuntu_xenial_default_3.4.113_desktop.img
--------------

Found 1 partitions
-----------------------------
1: 8192 4046847 4038656 83

Creating new file
-----------------

Make filesystem for partition 1
-------------------------------
mke2fs 1.44.1 (24-Mar-2018)
Discarding device blocks: fatto                           
Creazione del file system con 504576 4k blocchi e 126208 inode
Etichetta del file system=3c55b685-678b-4c64-939c-d3c9e816f8a3
Backup del superblocco salvati nei blocchi:
32768, 98304, 163840, 229376, 294912

Allocating group tables: fatto                           
Scrittura delle tavole degli inode: fatto                           
Creating journal (8192 blocks): fatto
Scrittura delle informazioni dei super-blocchi e dell'accounting del file system: fatto


Copy partitions
---------------
Copying partition 1: 83
  1,474,037,049  99%  106.67MB/s    0:00:13 (xfr#69051, to-chk=0/109757)   

Copy bootloader
---------------
1045+1 record dentro
1045+1 record fuori
1070896 bytes (1,1 MB, 1,0 MiB) copied, 0,00374842 s, 286 MB/s

******* PARTITION INFO OF GENERATED IMAGE **********************************************

root@olimex# fdisk -l tmp.img
Disk tmp.img: 2 GiB, 2071986176 bytes, 4046848 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

root@olimex#

We tried to fix the issue modifying the script but even if the generated image is now formally correct the boot doesn't start anyway.


selfbg

I guess is some issue with fdisk versions. However remove line 63 from update.sh and replace it with new line:

fdisk $NEW << __EOF__
n
p

$((${start[$i]} + $OFFSET))
$((${end[$i]} + $OFFSET))
t
${type[$i]}
w
__EOF__

fdisk $NEW << __EOF__
n
p

$((${start[$i]} + $OFFSET))

t
${type[$i]}
w
__EOF__

Titomax

Hi selfbg,
thanks again.
Yes, we have now a valid generated image with a single partition inside (as the original one) as you can see in the "fdisk -l tmp.img" output:

root@olimex# fdisk -l tmp.img
Disk tmp.img: 2 GiB, 2071986176 bytes, 4046848 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd583c1f3

Dispositivo Avvio Start    Fine Settori  Size Id Tipo
tmp.img1          10240 4046847 4036608  1,9G 83 Linux
root@olimex#


We anyway cannot go ahead because (as specified in the first post) in the instructions file "migrate_to_SPI_eMMC_boot.txt" at the steps 3, 4 and 5 we should mount two different partitions and copy some files into them...but we have only a single partition!

The result will be a new tmp.img file
3. Write tmp.img file to the micro SD card
4. Mount the SD card
# mount /dev/sdX1 /mnt
where X is proper SD card device.
and copy boot.cmd and boot.scr files in first partition with:
# cp boot.* /mnt
# umount /dev/sdX1
5. Mount second partition
# mount /dev/sdX2 /mnt
and copy emmc_FS_only.sh, emmc.sh files in /root folder on second partition.
# cp emmc* /mnt/root

Any other suggestion ?  ::)

selfbg

Try this:

mount /dev/sdx1 /mnt
cp boot.* /mnt/boot/
cp emmc* /mnt/root/

This should get you through these steps.

Titomax

Hi selfbg,
we made some steps more with your help.

We copied the files as you suggested all in the same partition of the prepared SD card.

Trying to boot leads us to the following result:

=> boot
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot/boot.scr
410 bytes read in 1 ms (400.4 KiB/s)
## Executing script at 43100000
** File not found script.bin **
47496 bytes read in 5 ms (9.1 MiB/s)
** File not found uImage **
** File not found boot/uImage **
Wrong Image Format for bootm command
ERROR: can't get kernel image!
SCRIPT FAILED: continuing...
NAND booting is temporary disabled.
scanning bus for devices...
SATA link 0 timeout.
AHCI 0001.0100 32 slots 1 ports 3 Gbps 0x1 impl SATA mode
flags: ncq stag pm led clo only pmp pio slum part ccc apst

Device 0: unknown device

Device 0: unknown device
ethernet@01c50000 Waiting for PHY auto negotiation to complete......... TIMEOUT !
Could not initialize PHY ethernet@01c50000
=>

What else are we missing ?  :'(

selfbg

The kernel image is missing.
Can you run this in the u-boot console and paste the output:
ext4ls mmc 0 /boot/

Titomax

Hi selfbg,
following the paste of the output:

=> ext4ls mmc 0 /boot/
<DIR>       4096 .
<DIR>       4096 ..
<SYM>         25 script.bin
<SYM>         21 uInitrd
<SYM>         21 zImage
<DIR>       4096 bin
<DIR>       4096 overlay-user
            1536 armbian_first_run.txt.template
         1987684 System.map-3.4.113-sun7i
             192 armbianEnv.txt
           99775 config-3.4.113-sun7i
            4882 boot-desktop.png
          230454 boot.bmp
             338 boot.cmd
             410 boot.scr
         5135878 initrd.img-3.4.113-sun7i
         5135942 uInitrd-3.4.113-sun7i
         5498616 vmlinuz-3.4.113-sun7i
=>

Our thoughts about the issue:
the system goes into the boot script "boot.scr" and looks for the location from which to load the uImage of the kernel. But it's wrong.

Please look at the "boot.cmd" that we find in the boot directory.

setenv bootm_boot_mode sec
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10
load mmc ${mmc_bootdev}:1 0x43000000 script.bin || load mmc ${mmc_bootdev}:1 0x43000000 boot/script.bin
load mmc ${mmc_bootdev}:1 0x42000000 uImage || load mmc ${mmc_bootdev}:1 0x42000000 boot/uImage
setenv machid 10bb
bootm 0x42000000

As you can see the script search for an "uImage" kernel file instead of the "zImage" one present in the same directory.
We guess that "boot.cmd" and "boot.scr" we are using are wrong.
Can you suggest where we could find the correct files or how we could modify them ?

Thanks

Titomax

Hi,
we weren't able to solve the last issue described so we decided to migrate from legacy kernel 3.4.113 to newer kernel 5.2.20.

Now we have the system correctly configured to boot from SPI and then to work from eMMC (it works) but we need to migrate from the old hardware management based on the "script.fex" file to the "device tree" approach.

Can anyone suggest a tutorial or a guide to help us in this activity ?

Thanks

LubOlimex

It can't be done automatically. You need to take care of each line, Use our overlays as a basis: https://github.com/OLIMEX/OLIMEX-sunxi-overlays

Other than that, what is the difference between your fex and the original unmodified fex? We might be able to give you advice if you are more specific what exactly doesn't work and what exactly you need to accomplish (e.g. which pin or which interface you need exposed, etc).
Technical support and documentation manager at Olimex

dpierleo

Hi,

I am a colleague of Titomax and we are working together at the same project.
First of all, thank you selfbg and LubOlimex for your help.

We are trying to follow all steps you showed us also in other thread.
We downloaded kernel and device tree sources using this command (we don't want to compile original device tree but we want to study its mechanism and code inside):

git clone --branch olimex https://github.com/olimex/build

We downloaded your overlays using this command:

https://github.com/OLIMEX/OLIMEX-sunxi-overlays

To implement an overlay in our som (i.e. that one for enabling uart4), we copied the relative dts file in som filesystem, then we executed:

armbian-add-overlay sun7i-a20-uart4.dts

Everything seems to work correctly after reboot.

After that we added also sun7i-a20-uart3.dts, sun7i-a20-spi2.dts. Also in this case everything seems to work but I'm trying to understand how it's possible given that in the file sun7i-a20-spi2.dts I see:

/dts-v1/;
/plugin/;

/ {
compatible = "allwinner,sun7i-a20";
description = "Enable SPI2 bus";

fragment@0 {
target-path = "/aliases";
__overlay__ {
spi2 = "/soc/spi@1c17000";
};
};

fragment@1 {
target = <&spi2>;
__overlay__ {
pinctrl-names = "default";
pinctrl-0 = <&spi2_pc_pins>, <&spi2_cs0_pc_pin>;
status = "okay";
};
};
};

without any definition of spi2_pc_pins and spi2_cs0_pc_pin. I checked also in original dts files sun7i-a20.dtsi, sun7i-a20-olimex-som204-evb.dts and sun7i-a20-olimex-som204-evb-emmc.dts and I didn't find any reference to labels spi2_pc_pins and spi2_cs0_pc_pin. So how can sun7i-a20-spi2.dts work correctly?

My second question is about a further step forward I have done: I added your overlay sun7i-a20-spi0.dts and my system crashed after that. The bootloader seems to load correctly all four overlays (without any error notifying) but stops after the words "Starting Kernel".

Could you help me please?

Thank you in advance

LubOlimex

SPI0 is used for the SPI flash. If you intend to use SPI flash or if you intend to boot from eMMC I would advise against using SPI0.

I recommend you this thread: https://www.olimex.com/forum/index.php?topic=7224.0
Technical support and documentation manager at Olimex