Download and save in your home directory the Linux Kernel sources:
Extract the Kernel sources from the compressed file by typing:
~$ tar xvfJ linux-4.4.16.tar.xz ...
Move inside the new folder:
~$ cd linux-4.4.16 ~/linux-4.4.16$
At this point I suggest to create a your own personal branch of Linux Kernel sources with git to keep a trace of any changes from the Kernel mainline using these commands.
~/linux-4.4.16$ git init; git add .; git commit -m "Linux vanilla"; git branch acme; git checkout acme
Download this patch file from GitHub:
and apply it by typing:
~/linux-4.4.16$ patch -p1 < linux-4.4.16.patch
Then select the right Linux configuration for your board by typing one of these commands:
~/linux-4.4.16$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-acqua_defconfig
~/linux-4.4.16$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-arietta_defconfig
~/linux-4.4.16$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-aria_defconfig
~/linux-4.4.16$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-foxg20_defconfig
If you need to customize the Kernel configuration or you just want to take a look around the Kernel setup type:
~/linux-4.4.16$ make ARCH=arm menuconfig
and navigate inside the Kernel configuration using the arrow keys and following the help provided by the menuconfig interface.
Now compile the the device tree file requested by your board by typing one of these commands:
~/linux-4.4.16$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-acqua.dtb
~/linux-4.4.16$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-arietta.dtb
~/linux-4.4.16$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-aria.dtb
~/linux-4.4.16$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- acme-foxg20.dtb
Compile the Linux Kernel sources and generate the binary compressed image file to save in the first partition of microSD card.
~/linux-4.4.16$ make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zImage ... Image arch/arm/boot/zImage is ready
The image generated contains the Linux Kernel and all the built-in device drivers (option [*] in menuconfig) compiled with it.
Al the drivers compiled as external modules (option [M] in menuconfig) need to be compiled and saved in the rootfs /lib directory on the second partition of the microSD. We didn't use any [M] flag in our defconfig so this procedure is not requested but. in case you add something. these are the commands to use to compile them:
~/linux-4.4.16$ make modules -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- ... ~/linux-4.4.16$ make modules_install INSTALL_MOD_PATH=./modules ARCH=arm ...
Insert a microSD formatted microSD with the boot loader and the rootfs contents already created in your Linux PC and copy on it the files directly:
Write the Linux Kernel image, the Device tree blog files in the first microSD partition and uncompress the modules in /modules/lib directory inside the second microSD partition:
~/linux-4.4.16$ cp arch/arm/boot/dts/acme-acqua.dtb /media/$USER/boot/at91-sama5d3_acqua.dtb ~/linux-4.4.16$ cp arch/arm/boot/zImage /media/$USER/boot ~/linux-4.4.16$ sudo rsync -avc modules/lib/. /media/$USER/rootfs/lib/.
~/linux-4.4.16$ cp arch/arm/boot/dts/acme-arietta.dtb /media/$USER/boot/acme-arietta.dtb ~/linux-4.4.16$ cp arch/arm/boot/zImage /media/$USER/boot ~/linux-4.4.16$ sudo rsync -avc modules/lib/. /media/$USER/rootfs/lib/.
~/linux-4.4.16$ cp arch/arm/boot/dts/acme-aria.dtb /media/$USER/boot/at91-ariag25.dtb ~/linux-4.4.16$ cp arch/arm/boot/zImage /media/$USER/boot ~/linux-4.4.16$ sudo rsync -avc modules/lib/. /media/$USER/rootfs/lib/.
~/linux-4.4.16$ cat arch/arm/boot/zImage arch/arm/boot/dts/acme-foxg20.dtb > /media/$USER/boot/uImage ~/linux-4.4.16$ sudo rsync -avc modules/lib/. /media/$USER/rootfs/lib/.
Use this method if you have a working board accessible via LAN, WiFi or USB
Write the Linux Kernel image, the Device tree blog files in the first microSD partition and uncompress the modules in /modules/lib directory inside the second microSD partition:
~/linux-4.4.16$ scp arch/arm/boot/dts/acme-acqua.dtb root@ip_address:/boot/at91-sama5d3_acqua.dtb ~/linux-4.4.16$ scp arch/arm/boot/zImage root@ip_address:/boot ~/linux-4.4.16$ rsync -avc modules/lib/. root@ip_address:/lib/.
~/linux-4.4.16$ scp arch/arm/boot/dts/acme-arietta.dtb root@192.168.10.10:/boot/acme-arietta.dtb ~/linux-4.4.16$ scp arch/arm/boot/zImage root@192.168.10.10:/boot ~/linux-4.4.16$ rsync -avc modules/lib/. root@192.168.10.10:/lib/.
~/linux-4.4.16$ scp arch/arm/boot/dts/acme-aria.dtb root@ip_address:/boot/at91-ariag25.dtb ~/linux-4.4.16$ scp arch/arm/boot/zImage root@ip_address:/boot ~/linux-4.4.16$ rsync -avc modules/lib/. root@ip_address:/lib/.
~/linux-4.4.16$ cat arch/arm/boot/zImage arch/arm/boot/dts/acme-foxg20.dtb > uImage ~/linux-4.4.16$ scp uImage root@ip_address:/boot ~/linux-4.4.16$ rsync -avc modules/lib/. root@ip_address:/lib/.
If this command doesn't work verify if rsync in installed on your board. Use apt-get install rsync.
At the first access to the board command line update the module dependencies by typing this command:
~# depmod -a