The Beaglebone Black is a pretty cool piece of tech for embedded projects. My current project is to drive a couple of RGB light strips, read some motion sensors, and use the BBB to host a webpage for settings and control. All of the hardware in neatly contained on the BBB Org servo cape currently available from Mouser. The fly in the ointment is the lack of a current device tree overlay for the servo cape. I am at a loss for how to get a dtbo file for the cape. Here is my attempt (cut, paste and edit) at a dtso file:
/* BeagleBone Black DeviceTree Overlay
* BBORG_SERVO-00A2.dtso
* revision date: February 22, 2026
* for kernel 6.18.x
* https://git.beagleboard.org/beagleboard/BeagleBoard-DeviceTrees/-/blob/d59410f20484eb736245e05f42529a53df08ea3b/src/arm64/overlays/BBORG_SERVO-00A2.dts
*/
// SPDX-License-Identifier: GPL-2.0-only
/* BeagleBone Black DeviceTree Overlay
* BBORG_SERVO-00A2.dts
* for kernel 6.18.x
* https://git.beagleboard.org/beagleboard/BeagleBoard-DeviceTrees/-/blob/d59410f20484eb736245e05f42529a53df08ea3b/src/arm64/overlays/BBORG_SERVO-00A2.dts
* revision date: February 22, 2026
*/
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (C) 2020 - 2022 Deepak Khatri <lorforlinux@beagleboard.org>
* Copyright (C) 2026 William Murphy <william@schoonerwebdesign.com>
*
* See Cape Interface Spec page for more info on Bone Buses
* https://docs.beagleboard.org/0.0/boards/capes/cape-interface-spec.html#beaglebone-cape-interface-spec
*
*/
/dts-v1/;
/plugin/;
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/pinctrl/am33xx.h>
/*
* Helper to show loaded overlays under: /proc/device-tree/chosen/overlays/
*/
&{/chosen} {
overlays {
BBORG_SERVO-00A2 = __TIMESTAMP__;
};
};
/*
* Free up the pins used by the cape from the pinmux helpers.
*/
&ocp {
P8_12_pinmux { status = "disabled"; }; /* IN1 */
P8_11_pinmux { status = "disabled"; }; /* IN2 */
P9_30_pinmux { status = "disabled"; }; /* IN3 */
P9_27_pinmux { status = "disabled"; }; /* IN4 */
P9_41_pinmux { status = "disabled"; }; /* IN5 */
P9_42_pinmux { status = "disabled"; }; /* IN6 */
P9_19_pinmux { status = "disabled"; }; /* i2c_scl */
P9_20_pinmux { status = "disabled"; }; /* i2c_sda */
P8_10_pinmux { status = "disabled"; }; /* pca9685.enable */
};
/*
* Setup input pins on cape.
*/
&am33xx_pinmux {
bb_gpio_pins: pinmux_bb_gpio_pins {
pinctrl-single,pins = <
AM33XX_PADCONF(AM335X_PIN_GPMC_AD12, PIN_INPUT_PULLUP, MUX_MODE7) /* IN1 P8_12 */
AM33XX_PADCONF(AM335X_PIN_GPMC_AD13, PIN_INPUT_PULLUP, MUX_MODE7) /* IN2 P8_11 */
AM33XX_PADCONF(AM335X_PIN_MCASP0_AXR0, PIN_INPUT_PULLUP, MUX_MODE7) /* IN3 P9_30 */
AM33XX_PADCONF(AM335X_PIN_MCASP0_FSR, PIN_INPUT_PULLUP, MUX_MODE7) /* IN4 P9_27 */
AM33XX_PADCONF(AM335X_PIN_XDMA_EVENT_INTR1, PIN_INPUT_PULLUP, MUX_MODE7) /* IN5 P9_41 */
AM33XX_PADCONF(AM335X_PIN_ECAP0_IN_PWM0_OUT, PIN_INPUT_PULLUP, MUX_MODE7) /* IN6 P9_42 */
AM33XX_PADCONF(AM335X_PIN_GPMC_WEN, PIN_OUTPUT_PULLDOWN, MUX_MODE7) /* PCA9685.ENABLE P8_10 */
>;
};
};
/*
* Setup i2c2 bus connection to PCA9685 pwm chip
*/
&i2c2 {,
status = "okay";
clock-frequency = <100000>;
#address-cells = <1>;
#size-cells = <0>;
pca: pca@70 {
compatible = "nxp,pca9685-pwm";
#pwm-cells = <2>;
reg = <0x70>;
label = "pca9685_servo";
/* invert; */
/* open-drain; */
};
};
/*
* Setup up pca9685 enable pin.
*/
&{/} {
leds {,
pinctrl-names = "default";
pinctrl-0 = <&bb_gpio_pins>;
compatible = "gpio-leds";
pin@837 {
label = "pca9685-enable";
// pca9685 Chip enable is ACTIVE-LOW but LEDs are set to ACTIVE-HIGH
// Set default-state to "off" to enable the pca9685 chip by default.
gpios = <&gpio2 4 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
};
};
What do I need to do before compiling the file?
$ dtc -I dts -O dtb -o BBORG_SERVO-00A2.dtbo BBORG_SERVO-00A2.dtso
here is some other info:
beagle@BeagleBone:~$ sudo beagle-version
eeprom:[A335BNLT0A5B2413BBBK0815]
model:[TI_AM335x_BeagleBone_Black]
dogtag:[BeagleBoard.org Debian Trixie Base Image 2026-02-12]
bootloader:[microSD-(push-button)]:[/dev/mmcblk0]:[U-Boot SPL 2022.04-g5509547b (Jan 22 2026 - 19:56:08 +0000)]:[location: dd MBR]
bootloader:[eMMC-(default)]:[/dev/mmcblk1]:[U-Boot SPL 2022.04-ge0d31da5 (Aug 04 2023 - 18:48:26 +0000)]:[location: dd MBR]
UBOOT: Booted Device-Tree:[am335x-boneblack-uboot.dts]
UBOOT: Loaded Overlay:[BB-ADC-00A0.kernel]
UBOOT: Loaded Overlay:[BB-BONE-eMMC1-01-00A0.kernel]
UBOOT: Loaded Overlay:[BB-HDMI-TDA998x-00A0.kernel]
kernel:[6.18.10-bone20]
/boot/uEnv.txt Settings:
uboot_overlay_options:[enable_uboot_overlays=1]
uboot_overlay_options:[uboot_overlay_pru=AM335X-PRU-UIO-00A0.dtbo]
pkg check: to individually upgrade run: [sudo apt install --only-upgrade <pkg>]
pkg:[bb-customizations]:[1.20250808.0-0~trixie+20250808]
pkg:[bb-usb-gadgets]:[1.20250523.1-0~trixie+20250527]
pkg:[bb-wl18xx-firmware]:[1.20230703.0-0~trixie+20240703]
pkg:[kmod]:[34.2-2bbbio1~trixie+20250522]
groups:[beagle : beagle adm kmem dialout cdrom floppy audio dip video plugdev users systemd-journal input render netdev i2c bluetooth gpio admin tisdk weston-launch]
cmdline:[console=ttyS0,115200n8 root=/dev/mmcblk0p3 ro rootfstype=ext4 rootwait uboot_detected_capes=BBORG_SERVO, fsck.repair=yes earlycon coherent_pool=1M net.ifnames=0 lpj=1990656 rng_core.default_quality=100]
dmesg | grep remote
[ 3.666661] remoteproc remoteproc0: wkup_m3 is available
[ 6.007179] remoteproc remoteproc0: powering up wkup_m3
[ 6.039434] remoteproc remoteproc0: Booting fw image am335x-pm-firmware.elf, size 217148
[ 6.077562] remoteproc remoteproc0: remote processor wkup_m3 is now up
[ 17.856449] systemd[1]: Reached target remote-fs.target - Remote File Systems.
[ 53.172951] remoteproc remoteproc1: 4a334000.pru is available
[ 53.251219] remoteproc remoteproc2: 4a338000.pru is available
dmesg | grep pru
[ 53.172951] remoteproc remoteproc1: 4a334000.pru is available
[ 53.251219] remoteproc remoteproc2: 4a338000.pru is available
dmesg | grep pinctrl-single
[ 3.685582] pinctrl-single 44e10800.pinmux: 142 pins, size 568
dmesg | grep gpio-of-helper
dmesg | grep wlcore
lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
END