Debian: Getting Started with the PandaBoard

This is a page about TI’s Cortex-A9 based; PandaBoard and PandaBoard ES.

Availability

Boards:

Basic Requirements

ARM Cross Compiler: GCC

This is a pre-built (64bit) version of GCC that runs on generic linux, sorry (32bit) x86 users, it’s time to upgrade…
Download/Extract:

#user@localhost:~$
wget -c https://releases.linaro.org/components/toolchain/binaries/6.5-2018.12/arm-linux-gnueabihf/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz
tar xf gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz
export CC=`pwd`/gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-

Test Cross Compiler:

#user@localhost:~$
${CC}gcc --version
#Test Output:
arm-linux-gnueabihf-gcc (Linaro GCC 6.5-2018.12) 6.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Bootloader: U-Boot

Das U-Boot – the Universal Boot Loader: http://www.denx.de/wiki/U-Boot
Depending on your Linux Distrubution, you will also need a host gcc and other tools, so with Debian/Ubuntu start with installing the build-essential meta package.
eewiki.net patch archive: https://github.com/eewiki/u-boot-patches
Download:

#user@localhost:~$
git clone -b v2019.04 https://github.com/u-boot/u-boot --depth=1
cd u-boot/

Patches:

#user@localhost:~/u-boot$
wget -c https://github.com/eewiki/u-boot-patches/raw/master/v2019.04/0001-omap4_common-uEnv.txt-bootz-n-fixes.patch
 
patch -p1 < 0001-omap4_common-uEnv.txt-bootz-n-fixes.patch

Configure and Build:

#user@localhost:~/u-boot$
make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} omap4_panda_defconfig
make ARCH=arm CROSS_COMPILE=${CC}

Linux Kernel

This script will build the kernel, modules, device tree binaries and copy them to the deploy directory.
Download:

#user@localhost:~$
git clone https://github.com/RobertCNelson/armv7-multiplatform ./kernelbuildscripts
cd kernelbuildscripts/

For v5.4.x (Longterm 5.4.x):

#user@localhost:~/kernelbuildscripts$
git checkout origin/v5.4.x -b tmp

For v5.4.x-rt (Longterm 5.4.x + Real-Time Linux):

#user@localhost:~/kernelbuildscripts$
git checkout origin/v5.4.x-rt -b tmp

For v5.10.x (Longterm 5.10.x):

#user@localhost:~/kernelbuildscripts$
git checkout origin/v5.10.x -b tmp

For v5.10.x-rt (Longterm 5.10.x + Real-Time Linux):

#user@localhost:~/kernelbuildscripts$
git checkout origin/v5.10.x-rt -b tmp

For v5.15.x (Longterm 5.15.x):

#user@localhost:~/kernelbuildscripts$
git checkout origin/v5.15.x -b tmp

For v5.15.x-rt (Longterm 5.15.x + Real-Time Linux):

#user@localhost:~/kernelbuildscripts$
git checkout origin/v5.15.x-rt -b tmp

Build:

#user@localhost:~/kernelbuildscripts$
./build_kernel.sh

Root File System

Debian 11

User Password
debian temppwd
root root

Download:

#user@localhost:~$
wget -c https://rcn-ee.com/rootfs/eewiki/minfs/debian-11.3-minimal-armhf-2022-04-15.tar.xz

Verify:

#user@localhost:~$
sha256sum debian-11.3-minimal-armhf-2022-04-15.tar.xz
#sha256sum output:
575738843651de2962f251447f4742d4f33313d6f7f5edf282a401207f5e6646  debian-11.3-minimal-armhf-2022-04-15.tar.xz

Extract:

#user@localhost:~$
tar xf debian-11.3-minimal-armhf-2022-04-15.tar.xz

Setup microSD card

We need to access the External Drive to be utilized by the target device. Run lsblk to help figure out what linux device has been reserved for your External Drive.

#Example: for DISK=/dev/sdX
lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 465.8G  0 disk
├─sda1   8:1    0   512M  0 part /boot/efi
└─sda2   8:2    0 465.3G  0 part /                <- Development Machine Root Partition
sdb      8:16   1   962M  0 disk                  <- microSD/USB Storage Device
└─sdb1   8:17   1   961M  0 part                  <- microSD/USB Storage Partition
#Thus you would use:
export DISK=/dev/sdb
#Example: for DISK=/dev/mmcblkX
lsblk
NAME      MAJ:MIN   RM   SIZE RO TYPE MOUNTPOINT
sda         8:0      0 465.8G  0 disk
├─sda1      8:1      0   512M  0 part /boot/efi
└─sda2      8:2      0 465.3G  0 part /                <- Development Machine Root Partition
mmcblk0     179:0    0   962M  0 disk                  <- microSD/USB Storage Device
└─mmcblk0p1 179:1    0   961M  0 part                  <- microSD/USB Storage Partition
#Thus you would use:
export DISK=/dev/mmcblk0

Erase partition table/labels on microSD card:

sudo dd if=/dev/zero of=${DISK} bs=1M count=10

Install Bootloader:

#user@localhost:~$
sudo dd if=./u-boot/MLO of=${DISK} count=1 seek=1 bs=128k
sudo dd if=./u-boot/u-boot.img of=${DISK} count=2 seek=1 bs=384k

Create Partition Layout:
With util-linux v2.26, sfdisk was rewritten and is now based on libfdisk.

#Check the version of sfdisk installed on your pc is atleast 2.26.x or newer.
sudo sfdisk --version
#Example Output
sfdisk from util-linux 2.27.1
#sfdisk >= 2.26.x
sudo sfdisk ${DISK} <<-__EOF__
4M,,L,*
__EOF__

Format Partition:

for: DISK=/dev/mmcblkX
sudo mkfs.ext4 -L rootfs ${DISK}p1
 
for: DISK=/dev/sdX
sudo mkfs.ext4 -L rootfs ${DISK}1

Mount Partition:
On most systems these partitions may be auto-mounted…

sudo mkdir -p /media/rootfs/
 
for: DISK=/dev/mmcblkX
sudo mount ${DISK}p1 /media/rootfs/
 
for: DISK=/dev/sdX
sudo mount ${DISK}1 /media/rootfs/

Install Kernel and Root File System

To help new users, since the kernel version can change on a daily basis. The kernel building scripts listed on this page will now give you a hint of what kernel version was built.

-----------------------------
Script Complete
eewiki.net: [user@localhost:~$ export kernel_version=5.X.Y-Z]
-----------------------------

Copy and paste that “export kernel_version=5.X.Y-Z” exactly as shown in your own build/desktop environment and hit enter to create an environment variable to be used later.

export kernel_version=5.X.Y-Z

Copy Root File System

#user@localhost:~$
sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/
sync

Set uname_r in /boot/uEnv.txt

#user@localhost:~$
sudo sh -c "echo 'uname_r=${kernel_version}' >> /media/rootfs/boot/uEnv.txt"

Device Tree Binary

#~/
PandaBoard EA1->A3
sudo sh -c "echo 'dtb=omap4-panda.dtb' >> /media/rootfs/boot/uEnv.txt"
 
PandaBoard A4->+ (non ES)
sudo sh -c "echo 'dtb=omap4-panda-a4.dtb' >> /media/rootfs/boot/uEnv.txt"
 
PandaBoard ES
sudo sh -c "echo 'dtb=omap4-panda-es.dtb' >> /media/rootfs/boot/uEnv.txt"
 
PandaBoard ES Rev B3
sudo sh -c "echo 'dtb=omap4-panda-es-b3.dtb' >> /media/rootfs/boot/uEnv.txt"

Copy Kernel Image

Kernel Image:

#user@localhost:~$
sudo cp -v ./kernelbuildscripts/deploy/${kernel_version}.zImage /media/rootfs/boot/vmlinuz-${kernel_version}

Copy Kernel Device Tree Binaries

#user@localhost:~$
sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}/
sudo tar xfv ./kernelbuildscripts/deploy/${kernel_version}-dtbs.tar.gz -C /media/rootfs/boot/dtbs/${kernel_version}/

Copy Kernel Modules

#user@localhost:~$
sudo tar xfv ./kernelbuildscripts/deploy/${kernel_version}-modules.tar.gz -C /media/rootfs/

File Systems Table (/etc/fstab)

#user@localhost:~/$
sudo sh -c "echo '/dev/mmcblk0p1  /  auto  errors=remount-ro  0  1' >> /media/rootfs/etc/fstab"

WiFI

Install Firmware:

#~/
git clone git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git --depth=1
 
sudo mkdir -p /media/rootfs/lib/firmware/ti-connectivity
sudo cp -v ./linux-firmware/ti-connectivity/* /media/rootfs/lib/firmware/ti-connectivity

Remove microSD/SD card

sync
sudo umount /media/rootfs

FAQ

PandaBoard ES Rev B3: New Memory Timings

Note: the U-Boot patch on this wiki has this fix already applied…
Error:

#~/
U-Boot SPL 2013.04-00015-gfe81c6a (Apr 24 2013 - 14:35:14)
OMAP4460 ES1.1
SDRAM: identified size not same as expected size identified: 0
expected: 40000000

Fix:
Comment out:

#~/
/* Disable for PandaBoard ES Rev B3 #define CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS */

PandaBoard A4 (with “M” Micron memory)

Note: the U-Boot patch on this wiki has this fix already applied…

#~/
U-Boot SPL 2014.04-dirty (Apr 18 2014 - 13:51:58)
OMAP4430 ES2.3
SDRAM: identified size not same as expected size identified: 1000 expected: 40000000
SPL: Please implement spl_start_uboot() for your board
SPL: Direct Linux boot not active!
reading u-boot.img
reading u-boot.img

Fix: v2014.04:

#~/
/* #define CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS */
#define CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS

Comments

Any questions or comments please go to our TechForum: TechForum

1 Like

Hello. I tested the howto with PandaBoard A3. The image build process went smoothly, however, I get no HDMI output after booting the generated image. Any guess what might be wrong? The ethernet+wifi seems to work. The kernel version is 5.15.148-armv7-x42.

Thank you.

Hello tavvva,

We will take a look at what you have and see if we can troubleshoot, someone should get back to you.

Which of the two hdmi connectors are you trying to use? For me, one was always iffy (hotplug)…

Regards,

1 Like

Hello Robert. I tried both and no difference. The old Ubuntu 12.04 kernel boots with the one closer to the USB ports. The same for old Fedora 18, but I think I’ve seen some of the Fedoras running only from the other one, that’s why I always test both. However the second one somehow draws power from the HDMI cable and the board has one of the LEDs still on even when the power jack is disconnected and therefore I’d love to see the first one working. Moreover the images working with the first one refuse to boot when the cable is plugged to the second one.
Just thinking whether the issue I reported could be somehow related to the fact the native resolution of the monitor is 720p only (even when it can do 1080p). Maybe the driver became buggy at some point and refuses to work with some resolutions since then? Have you tried your image on a real hardware? If so, what revision of the board? Mine is A3. Thank you.

Oh, it’s been a while since i ran a CI farm of Panda’s… Found an A4, but no serial adapter… so let’s see if at-least hdmi comes up…

Regards,

Tested with second monitor and still the same - no signal. The old 3.x kernels were the last ones I’ve ever seen working.

It seems I’ll have to look at the old kernel sources and search for differences. It might be that a small detail was forgotten somewhere.

You don’t need a serial cable as the ethernet works quite reliably and if you give it an address from DHCP, it’s possible to SSH to the image …

I’m just wondering if it’ll even bootup, u-boot comes in handy for that, as it’s been sitting for years, in a static bag…

It does boot :] Actually the image generated with your howto works pretty well … just the video output suckzzzz :smiley:

Btw. the oldest 5.x kernel from the howto fails to build … the 5.10 and 5.15 works …

Newer and Newer versions of GCC for HOSTCC like to break things. For really old builds, I’ve just do it in an old Docker container now…

Regards,

Yeah … I’m crossbuilding 2.x kernels for ATARI in a virtual machine with old Debian 3 (woody) … the build takes just a couple of seconds …

Yeap, no video…

debian@arm:~$ uname -r ; dmesg | grep dss
5.15.148-armv7-x42
[    3.973785] platform 58000000.dss: Fixing up cyclic dependency with encoder0
[    3.981597] omapdss_dss 58000000.dss: supply vdda_video not found, using dummy regulator
[    4.301635] omapdss_dss 58000000.dss: supply vdda_video not found, using dummy regulator
[    4.320373] OF: graph: no port node found in /ocp/target-module@58000000/dss@0/target-module@5000/encoder@0
[    4.330413] OF: graph: no port node found in /ocp/target-module@58000000/dss@0/target-module@5000/encoder@0

Let’s have a little fun… i still build for Debian 11.x: https://repos.rcn-ee.net/debian/pool/main/l/linux-upstream/

sudo apt update
sudo apt-get install linux-image-6.11.0-rc2-omap2plus-r1

Yeap… video works… (CONN B)… now trying HDMI-1080, which also works, but buggy on startup (had to cycle)…

Let’s try something more stable, i only build LTS’s for omap3/omap4/omap5 generation…

sudo apt update
sudo apt-get install bbb.io-kernel-6.6-armv7

and 6.6.36-armv7-x15 is broken… We probably just a deconfig tweak…

Fingers crossed i still have this in the repo…

sudo apt update
sudo apt-get install linux-image-6.6.0-omap2plus-r0

Yeap, video works with 6.6.0-omap2plus-r0, so now to start testing config changes to fix 6.6.36-armv7-x15

Regards,

1 Like

Woohoo! I can confirm 6.6.0-omap2plus-r0 works for me …

Are these vanilla or patched? Is there a source for them available so that I could rebuild them with a different configuration?

So 6.6.0-omap2plus-r0 is v6.6.x branch of: GitHub - RobertCNelson/omap2plus-mainline-linux (main focus is to just build upstream omap2plus_defconfig for testing like what we just did)

and 6.6.36-armv7-x15 is the v6.6.x branch of: GitHub - RobertCNelson/armv7-multiplatform

Right now i’ve copied the omap2plus defconfig into my v6.6.x branch and build testing…

Regards,

Well … the problem with HDMI seems to be solved … but … the wifi disappeared :smiley:

I just tried to load the modules by hand, but nothing happened … no output in dmesg and the interface simply is not there