Personal tools

How to write image to VisionSOM-6ULL eMMC on Windows and Linux

From SomLabs Wiki

Revision as of 01:59, 5 July 2018 by Admin (talk | contribs)
Jump to: navigation, search

How to write image to VisionSOM-6ULL eMMC on Windows and Linux


Prerequisites

  • Writing image from Linux host
    • PC with Ubuntu 16
    • VisionSOM module connected to network, access to console is required
  • Writing image from Windows host


Setup TFTP and DHCP servers on host computer

Linux

Install isc-dhcp-server package:

sudo apt install isc-dhcp-server

Configure DHCP server, to do that edit file /etc/dhcp/dhcpd.conf:

sudo nano /etc/dhcp/dhcpd.conf

Add lines:

subnet <SUBNET_ADDRESS> netmask <NETMASK> {
  range <RANGE_START> <RANGE_END>;
}

Set adresses to fit your network:

  • <SUBNET_ADDRESS> is address of your network (most common are 192.168.0.0 and 192.168.1.0)
  • <NETMASK> is mask of your network (most common is 255.255.255.0)
  • <RANGE_START> and <RANGE_END> are first and last DHCP client adresses, for example 192.168.0.200 192.168.0.220

You also need to set interfaces that DHCP server will listen on, to do that edit /etc/default/isc-dhcp-server file:

nano /etc/default/isc-dhcp-server

Add/modify line with INTERFACES variable:

INTERFACES="<INTERFACES>"

Replace <INTERFACES> with space-separated list of interfaces, to find their names execute:

ip a

The output will look like this:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp3s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 54:ee:75:b0:b0:ad brd ff:ff:ff:ff:ff:ff
3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 58:fb:84:a3:a2:82 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.123/24 brd 192.168.0.255 scope global wlp2s0
       valid_lft forever preferred_lft forever
    inet6 2a02:a310:813c:d700:d26:a34f:fa29:709d/64 scope global noprefixroute dynamic 
       valid_lft 792131sec preferred_lft 187331sec
    inet6 fe80::b7f8:715e:756c:33bb/64 scope link 
       valid_lft forever preferred_lft forever

In this case lo, enp3s0 and wlp2s0 are interface names. To listen on enp3s0 and wlp2s0 interfaces enter:

INTERFACES="enp3s0 wlp2s0"

After saving these modifications restart DHCP server:

sudo service isc-dhcp-server restart

To install TFTP server execute:

sudo apt install tftpd-hpa

Root directory of TFTP server is /var/lib/tftpboot, in next steps you will put image file/files in this directory.

Windows

Install Open TFTP Server and Open DHCP Server. After installation go to c:\OpenDHCPServer\ directory (or wherever you installed Open DHCP Server) and open OpenDHCPServer.ini, find first [RANGE_SET] section and modify DHCPRange value to values fitting your network (in this example it is 192.168.0.200-192.168.0.220)

[RANGE_SET]
# This is first and simple DHCP range section example,
# This example may be good enough for simple/home use.
# If you need range filters, look at example below
DHCPRange=192.168.0.200-192.168.0.220
;DHCPRange=192.168.5.1-192.168.5.254
# Following are range specific DHCP options.
# You can copy more options names from [GLOBAL_OPTIONS]

Restart DHCP server:

  • Open Control Panel
  • Click Administrative Tools
  • Double-click Services
  • Find Open DHCP Server in the list, right-click it and choose Restart

You may also need to disable firewall for DHCP and TFTP servers.

Open Windows Defender Security Center and click Firewall & network protection.

Emmc-flashing-01.jpg

Click Allow an app through the firewall.

Emmc-flashing-02.jpg

Press Change settings, then click Allow another app... button.

Emmc-flashing-03.jpg

Click Browse... button, select TFTP server executable (default c:\OpenTFTPServer\OpenTFTPServerMT.exe) and confirm, then click Add. Perform the same operation for DHCP server (c:\OpenDHCPServer\OpenDHCPServer.exe).

Emmc-flashing-04.jpg

Note! If you have any additional security software you may need to allow incoming connections to DHCP server and TFTP server.

Root directory of TFTP server is c:\OpenTFTPServer\, in next steps you will put image file/files in this directory.

Writing image to eMMC

Writing image smaller than SoM RAM

You need uncompressed image file, place it in TFTP server root directory.

Connect your board to network, power it up and connect to the console. While the board is booting you need to stop autoboot by pressing any key in the console:

U-Boot 2016.03 (Feb 06 2018 - 00:58:21 +0100)

CPU:   Freescale i.MX6ULL rev1.0 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 40C
Reset cause: POR
Board: SomLabs VisionSOM 6ULL
DRAM:  512 MiB
MMC:   FSL_SDHC: 0
*** Warning - bad CRC, using default environment

Display: TFT43AB (480x272)
Video: 480x272x24
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc0(part 0) is current device
Net:   FEC0 [PRIME]
Warning: FEC0 (eth0) using random MAC address - 5e:8f:15:1b:17:5c

Normal Boot
Hit any key to stop autoboot:  0
=> 

Now you can enter a command that will download the image and will write it to eMMC memory:

setenv serverip <TFTP_SERVER_IP>; setenv bootfile <IMAGE_FILE_NAME>; dhcp; mmc write $loadaddr 0 <IMAGE_FILE_SIZE>

You must:

  • Replace <TFTP_SERVER_IP> with your TFTP server IP
  • Replace <IMAGE_FILE_NAME> with name of the image file you placed on your TFTP server
  • Replace <IMAGE_FILE_SIZE> with hexadecimal number of 512 byte blocks that the image file consist of. For example:
    • Your image file size is 142606336 bytes
    • Divide the size by 512, 142606336/512 = 278528
    • Convert this number to hexadecimal: 44000

Example:

setenv serverip 192.168.0.111; setenv bootfile sdcard.img; dhcp; mmc write $loadaddr 0 44000

After the command completes reboot your board, your new image should boot now.

Writing image bigger than SoM RAM

You need uncompressed image file, as it is too big to load it at once it must be splitted into smaller files. Note that result files sizes should be multiple of 512.

Splitting file on Linux

Get your image file, for example Debian image, and decompress it:

cd ~
wget http://ftp.somlabs.com/debian-stretch-visionsom-6ull.img.xz
unxz 

Now we will split the file into smaller parts:

sudo split --bytes=450M debian-stretch-visionsom-6ull.img part_

In this command:

  • --bytes=450M means that parts will have maximum size of 450MB (you may need smaller parts if your SoM has smaller RAM
  • debian-stretch-visionsom-6ull.img is name of the file to split
  • part_ is a prefix that will be used to create names of output files. In this case we will get part_aa and part_ab output files

To get exact file sizes run (we will need them in the next step):

ls part_* -l

You will get this output:

-rw-r--r-- 1 root root 471859200 lut 11 13:11 part_aa
-rw-r--r-- 1 root root 361758720 lut 11 13:12 part_ab

Copy this files to your TFPT root:

sudo cp ~/part_* /var/lib/tftpboot/

Splitting file on Windows

Get your image file, for example Debian image, and decompress it. Run Total Commander, in the left panel open c:\OpenTFTPServer\ directory, in the right panel open the directory with extracted image file. Select image file with right-click (file name should become red), select Files>Split File in the menu, in Bytes per file field enter maximal file size, in this example SoM with 512 MB RAM is used, so we will use 450MB files, that is 471859200 bytes, so enter 471859200 and click ok.

Emmc-flashing-05.jpg

In the left panel you should get debian-stretch-visionsom-6ull.001 and debian-stretch-visionsom-6ull.002 files.

Writing splitted image files

Connect your board to network, power it up and connect to the console. While the board is booting you need to stop autoboot by pressing any key in the console:

U-Boot 2016.03 (Feb 06 2018 - 00:58:21 +0100)

CPU:   Freescale i.MX6ULL rev1.0 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 40C
Reset cause: POR
Board: SomLabs VisionSOM 6ULL
DRAM:  512 MiB
MMC:   FSL_SDHC: 0
*** Warning - bad CRC, using default environment

Display: TFT43AB (480x272)
Video: 480x272x24
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc0(part 0) is current device
Net:   FEC0 [PRIME]
Warning: FEC0 (eth0) using random MAC address - 5e:8f:15:1b:17:5c

Normal Boot
Hit any key to stop autoboot:  0
=> 

Now we can write image files, but first it is necessary to calculate part_* (on Linux) or debian-stretch-visionsom-6ull.* (on Windows) files sizes in 512B blocks as hexadecimals:

  • part_aa/debian-stretch-visionsom-6ull.001 - size 471859200B, 471859200/512 = 921600 blocks = E1000 (hex)
  • part_ab/debian-stretch-visionsom-6ull.002 - size 361758720B, 361758720/512 = 706560 blocks = AC800 (hex)


Go to u-boot and enter this command to download and write first part (note that you have to change IP address to your host PC address, change part_aa to debian-stretch-visionsom-6ull.001 if you are on Windows, and change E1000 value if your file has different size):

setenv serverip 192.168.0.111; setenv bootfile part_aa; dhcp; mmc write $loadaddr 0 E1000

In the mmc write command we passed three parameters:

  • $loadaddr is address of downloaded file in RAM
  • 0 is number of the first 512B block that will be written (as hexadecimal)
  • E1000 is number 512B blocks to write (as hexadecimal)

To write the second part we need to pass different start address (note that you have to change IP address to your host PC address, change part_ab to debian-stretch-visionsom-6ull.002 if you are on Windows, and change E1000 and AC800 values if your files have different sizes)

setenv bootfile part_ab; dhcp; mmc write $loadaddr E1000 AC800

After this operation is complete you can reboot your board.

NXP Partner ST Partner