Raspberrypi 4: meta-raspberrypi/dunfell - in 3 days from no network in U-Boot to dhcp/tftp
Introduction
This work is sponsored by Reliable Embedded Systems. You can find more information about our training/consulting services here.
Objectives
My favorite development setup is to have the boot loader load kernel/device tree over tftp and mount the rootfs over NFS. The first part does not work out of the box on a Raspberrypi 4 with meta-raspberrypi/dunfell since the default U-Boot (2020.01) does not yet support it.
What to do in such a case?
Interact with the community
Report your problem
I opened this issue at the meta-raspberrypi repo with that content:
U-Boot does not seem to support networking on the Raspberry Pi 4 - 64 Bit
Steps to reproduce the issue:
U-Boot> setenv autoload no
U-Boot> dhcp
No ethernet found.
U-Boot> ping 192.168.42.1
No ethernet found.
ping failed; host 192.168.42.1 is not alive
U-Boot>
Describe the results you received:
No ethernet found.
Describe the results you expected:
pong
Additional information you deem important (e.g. issue happens only occasionally):
Happens always
Additional details (revisions used, host distro, etc.):
Are there any plans to fix this?
If so what's the time frame?
Try some things
As it's not unusual with some communities I was pretty quickly put in touch with the right contact person and tried what was suggested.
Upgrade U-Boot Version
Network support is available in a more recent U-Boot version.
I found a newer U-Boot recipe (2020.07) at poky/master, but I work with poky/dunfell. Hmm let's see if/how we can back-port this.
It turned out that U-Boot 2020.07 requires some function which was introduced in a class which is not present in poky/dunfell. Now what? Back-porting!
poky: new cml1.bbclass required by new U-Boot recipe
Brave as I am I took the cml1.bbclass from poky/master and updated poky/dunfell as you can see here. As far as I can tell it did not break things so far, but I need more testing.
meta-raspberrypi-ml-bsp: new U-Boot recipe + patches
Initially I just copied over the U-Boot 2020.07 recipe from poky/master to my meta-raspberrypi-ml-bsp/dunfell branch as you can see here. Then it was necessary to add a few patches to make network work which I did via this bbappend.
meta-raspberrypi: hack for U-Boot
Finally I added a hack in my meta-raspberrypi fork in order to automatically get the kernel/device tree via tftp. I turned boot.cmd.in into a symlink which either points to boot.cmd.in.sdcard or boot.cmd.in.tftp now.
My boot.cmd.in.tftp to boot with kernel/device tree over tftp instead of sd card looks like this:
fdt addr ${fdt_addr} && fdt get value bootargs /chosen bootargs
setenv autoload no && dhcp && setenv serverip @@SERVERIP@@
setenv kernel @@KERNEL_IMAGETYPE@@ && setenv bootfile ${hostname}/${kernel}
setenv kernel_netload tftp ${kernel_addr_r} ${bootfile}
setenv fdt bcm2711-rpi-4-b.dtb && setenv myfdtfile ${hostname}/${fdt}
setenv fdt_netload tftp ${fdt_addr_r} ${myfdtfile}
run kernel_netload && run fdt_netload
@@KERNEL_BOOTCMD@@ ${kernel_addr_r} - ${fdt_addr}
as you can see here.
local.conf: kernel command line
In order to have U-Boot load the kernel/device tree over tftp instead of sd card you need to adjust the symlink above and this in local.conf:
# boot with rootfs on SD card: # CMDLINE = "dwc_otg.lpm_enable=0 ${SERIAL} root=/dev/mmcblk1p2 rootfstype=ext4 rootwait" # boot with rootfs over nfs: SERVERIP="192.168.42.108" CMDLINE = "dwc_otg.lpm_enable=0 ${SERIAL} root=/dev/nfs rootfstype=nfs nfsroot=${SERVERIP}:/opt/poky/raspi-4-rootfs,v3,tcp ip=dhcp rootwait"
Conclusion
Did you ever try to get a fix from your board/chip manufacturer? How was your experience with that?
That's another example of the power of "the Open Source community". It took (only) 3 days (and I am responsible for at least 1 day delay) to get the network in U-Boot to work on the raspberrypi 4.
Wow - simply wow!
Thank you community and especially Andrei and Matthias and please keep up the hard work.
Comments
Post a Comment