How can I enable the 5 UARTs of the beaglebone AI-64?

Hi @benedict.hewson thank you for the clarification from above. Below is a summary of what worked for us to enable 4x UARTS:

Problem We Were Trying to Solve
We needed to enable and configure all 5 UARTs available on the BeagleBone AI-64. Additionally, we aim to expand this to include configurations for 4xCAN and 2xGPIO to suit our application’s needs. This thread serves as a reference for enabling UARTs, with follow-up questions related to the CAN and GPIO configurations.

Background on Our Implementation

  • The base image that we chose to go with: bbai64-debian-11.8-minimal-arm64-2023-10-07-4gb.img
    • This image enabled us to expose the necessary UART peripherals. We didn’t have success with newer images.
      Note: Post deployment we needed to run these steps on the BeagleBone Ai64:
sudo /opt/u-boot/bb-u-boot-beagleboneai64/install-emmc.sh
sudo /opt/u-boot/bb-u-boot-beagleboneai64/install-microsd.sh

Our Device Tree Changes

  1. k3-j721e-beagleboneai64-bone-buses.dtsi
    This includes our UART nodes, Pinmux configurations:
// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (C) 2022 BeagleBoard.org - https://beagleboard.org/
 */

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/linux-event-codes.h>
#include <dt-bindings/board/k3-j721e-bone-pins.h>
#include <dt-bindings/pinctrl/k3.h>

/* MYTRA NOTE: DO NOT MODIFY THE BUS PINMUX SETTINGS OUTLINED BELOW */

ocp: &main_pmx0 {
/* macro: BONE_PIN( <pin>, <mode_name>, <register_value_macro(s)>) */
#define BONE_PIN(XX,ZZ,QQ) \
	XX##_##ZZ##_pin: pinmux_##XX##_##ZZ##_pin { pinctrl-single,pins = < QQ >; };

	/* I2C: https://docs.beagleboard.io/latest/boards/capes/cape-interface-spec.html#i2c */
	/* bone_i2c_1 main_i2c6 P9.17 P9.18 */
	/* bone_i2c_2 main_i2c2 P9.19 P9.20 */
	/* bone_i2c_3 main_i2c4 P9.24 P9.26 */

	/* CAN: https://docs.beagleboard.io/latest/boards/capes/cape-interface-spec.html#can */
	/* bone_can_0 main_mcan0 P9.20 P9.19 */
	/* bone_can_1 main_mcan4 P9.26 P9.24 */
	/* bone_can_2 main_mcan5 P8.08 P8.07 */
	/* bone_can_3 main_mcan6 P8.10 P8.09 */
	/* bone_can_4 main_mcan7 P8.05 P8.06 */

	/* SPI : https://docs.beagleboard.io/latest/boards/capes/cape-interface-spec.html#spi */
	/* bone_spi_0 main_spi6 P9.18 P9.21 P9.22 P9.16 P9.23 */
	/* bone_spi_1 main_spi7 P9.30 P9.29 P9.31 P9.29 P9.42 */

	/* UART : https://docs.beagleboard.io/latest/boards/capes/cape-interface-spec.html#uart */
	/* bone_uart_1 main_uart2 P9.24 P9.22 */
	/* bone_uart_4 main_uart0 P9.13 P9.11 */
	/* bone_uart_5 main_uart5 P8.37 P8.38 P8.32 P8.31 */
	/* bone_uart_6 main_uart8 P8.29 P8.28 */
	/* bone_uart_7 main_uart2 P8.34 P8.22 */

	/* PWM: https://docs.beagleboard.io/latest/boards/capes/cape-interface-spec.html#pwm */
	/* bone_pwm_0 ehrpwm1 P9.22 P9.21 */
	/* bone_pwm_1 ehrpwm2 P9.14 P9.16 */
	/* bone_pwm_2 ehrpwm0 P8.19 P8.13 */

	/* Full P8/P9 header mode definitions */
	/* P8_01 - GND */
	/* P8_02 - GND */

	/* P8_03 (AH21) PRG1_PRU0_GPO19 (gpio0_20) AH21_MCAN6_TX */
	BONE_PIN(P8_03, default,   P8_03(PIN_INPUT, 7))
	BONE_PIN(P8_03, pruout,    P8_03(PIN_OUTPUT, 0))	/* prg1_pru0_gpo19 */
	BONE_PIN(P8_03, pruin,     P8_03(PIN_INPUT, 1))		/* prg1_pru0_gpi19 */
	BONE_PIN(P8_03, can,       P8_03(PIN_INPUT, 6))		/* mcan6_tx */
	BONE_PIN(P8_03, gpio,      P8_03(PIN_INPUT, 7))
	BONE_PIN(P8_03, gpio_pu,   P8_03(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_03, gpio_pd,   P8_03(PIN_INPUT_PULLDOWN, 7))

	/* P8_04 (AC29) PRG0_PRU0_GPO5 (gpio0_48) AC29_SYS_BOOTMODE2 */
	BONE_PIN(P8_04, default,   P8_04(PIN_INPUT, 7))
	BONE_PIN(P8_04, pruout,    P8_04(PIN_OUTPUT, 0))	/* prg0_pru0_gpo5 */
	BONE_PIN(P8_04, pruin,     P8_04(PIN_INPUT, 1))		/* prg0_pru0_gpi5 */
	BONE_PIN(P8_04, gpio,      P8_04(PIN_INPUT, 7))
	BONE_PIN(P8_04, gpio_pu,   P8_04(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_04, gpio_pd,   P8_04(PIN_INPUT_PULLDOWN, 7))

	/* P8_05 (AH25) PRG1_PRU1_GPO12 (gpio0_33) AH25_MCAN7_TX */
	BONE_PIN(P8_05, default,   P8_05(PIN_INPUT, 7))
	BONE_PIN(P8_05, pruout,    P8_05(PIN_OUTPUT, 0))	/* prg1_pru1_gpo12 */
	BONE_PIN(P8_05, pruin,     P8_05(PIN_INPUT, 1))		/* prg1_pru1_gpi12 */
	BONE_PIN(P8_05, can,       P8_05(PIN_INPUT, 6))		/* mcan7_tx */
	BONE_PIN(P8_05, gpio,      P8_05(PIN_INPUT, 7))
	BONE_PIN(P8_05, gpio_pu,   P8_05(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_05, gpio_pd,   P8_05(PIN_INPUT_PULLDOWN, 7))

	/* P8_06 (AG25) PRG1_PRU1_GPO13 (gpio0_34) AG25_MCAN7_RX */
	BONE_PIN(P8_06, default,   P8_06(PIN_INPUT, 7))
	BONE_PIN(P8_06, pruout,    P8_06(PIN_OUTPUT, 0))	/* prg1_pru1_gpo13 */
	BONE_PIN(P8_06, pruin,     P8_06(PIN_INPUT, 1))		/* prg1_pru1_gpi13 */
	BONE_PIN(P8_06, can,       P8_06(PIN_INPUT, 6))		/* mcan7_rx */
	BONE_PIN(P8_06, gpio,      P8_06(PIN_INPUT, 7))
	BONE_PIN(P8_06, gpio_pu,   P8_06(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_06, gpio_pd,   P8_06(PIN_INPUT_PULLDOWN, 7))

	/* P8_07 (AD24) PRG1_PRU0_GPO14 (gpio0_15) AD24_MCAN5_RX */
	BONE_PIN(P8_07, default,   P8_07(PIN_INPUT, 7))
	BONE_PIN(P8_07, pruout,    P8_07(PIN_OUTPUT, 0))	/* prg1_pru0_gpo14 */
	BONE_PIN(P8_07, pruin,     P8_07(PIN_INPUT, 1))		/* prg1_pru0_gpi14 */
	BONE_PIN(P8_07, can,       P8_07(PIN_INPUT, 6))		/* mcan5_rx */
	BONE_PIN(P8_07, gpio,      P8_07(PIN_INPUT, 7))
	BONE_PIN(P8_07, gpio_pu,   P8_07(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_07, gpio_pd,   P8_07(PIN_INPUT_PULLDOWN, 7))

	/* P8_08 (AG24) PRG1_PRU0_GPO13 (gpio0_14) AG24_MCAN5_TX */
	BONE_PIN(P8_08, default,   P8_08(PIN_INPUT, 7))
	BONE_PIN(P8_08, pruout,    P8_08(PIN_OUTPUT, 0))	/* prg1_pru0_gpo13 */
	BONE_PIN(P8_08, pruin,     P8_08(PIN_INPUT, 1))		/* prg1_pru0_gpi13 */
	BONE_PIN(P8_08, can,       P8_08(PIN_OUTPUT, 6))	/* mcan5_tx */
	BONE_PIN(P8_08, gpio,      P8_08(PIN_INPUT, 7))
	BONE_PIN(P8_08, gpio_pu,   P8_08(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_08, gpio_pd,   P8_08(PIN_INPUT_PULLDOWN, 7))

	/* P8_09 (AE24) PRG1_PRU0_GPO16 (gpio0_17) AE24_MCAN6_RX */
	BONE_PIN(P8_09, default,   P8_09(PIN_INPUT, 7))
	BONE_PIN(P8_09, pruout,    P8_09(PIN_OUTPUT, 0))	/* prg1_pru0_gpo16 */
	BONE_PIN(P8_09, pruin,     P8_09(PIN_INPUT, 1))		/* prg1_pru0_gpi16 */
	BONE_PIN(P8_09, can,       P8_09(PIN_INPUT, 6))		/* mcan6_rx */
	BONE_PIN(P8_09, gpio,      P8_09(PIN_INPUT, 7))
	BONE_PIN(P8_09, gpio_pu,   P8_09(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_09, gpio_pd,   P8_09(PIN_INPUT_PULLDOWN, 7))

	/* P8_10 (AC24) PRG1_PRU0_GPO15 (gpio0_16) AC24_MCAN6_TX */
	BONE_PIN(P8_10, default,   P8_10(PIN_INPUT, 7))
	BONE_PIN(P8_10, pruout,    P8_10(PIN_OUTPUT, 0))	/* prg1_pru0_gpo15 */
	BONE_PIN(P8_10, pruin,     P8_10(PIN_INPUT, 1))		/* prg1_pru0_gpi15 */
	BONE_PIN(P8_10, can,       P8_10(PIN_INPUT, 7))		/* mcan6_tx */
	BONE_PIN(P8_10, gpio,      P8_10(PIN_INPUT, 7))
	BONE_PIN(P8_10, gpio_pu,   P8_10(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_10, gpio_pd,   P8_10(PIN_INPUT_PULLDOWN, 7))

	/* P8_11 (AB24) PRG0_PRU0_GPO17 (gpio0_60) AB24_SYS_BOOTMODE7 */
	BONE_PIN(P8_11, default,   P8_11(PIN_INPUT, 7))
	BONE_PIN(P8_11, pruout,    P8_11(PIN_OUTPUT, 0))	/* prg0_pru0_gpo17 */
	BONE_PIN(P8_11, pruin,     P8_11(PIN_INPUT, 1))		/* prg0_pru0_gpi17 */
	BONE_PIN(P8_11, gpio,      P8_11(PIN_INPUT, 7))
	BONE_PIN(P8_11, gpio_pu,   P8_11(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_11, gpio_pd,   P8_11(PIN_INPUT_PULLDOWN, 7))

	/* P8_12 (AH28) PRG0_PRU0_GPO16 (gpio0_59) AH28_PRG0_PWM0_A2 */
	BONE_PIN(P8_12, default,   P8_12(PIN_INPUT, 7))
	BONE_PIN(P8_12, pruout,    P8_12(PIN_OUTPUT, 0))	/* prg0_pru0_gpo16 */
	BONE_PIN(P8_12, pruin,     P8_12(PIN_INPUT, 1))		/* prg0_pru0_gpi16 */
	BONE_PIN(P8_12, gpio,      P8_12(PIN_INPUT, 7))
	BONE_PIN(P8_12, gpio_pu,   P8_12(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_12, gpio_pd,   P8_12(PIN_INPUT_PULLDOWN, 7))

	/* P8_13 (V27) RGMII5_TD1 (gpio0_89) V27_EHRPWM0_B */
	BONE_PIN(P8_13, default,   P8_13(PIN_INPUT, 7))
	BONE_PIN(P8_13, gpio,      P8_13(PIN_INPUT, 7))
	BONE_PIN(P8_13, gpio_pu,   P8_13(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_13, gpio_pd,   P8_13(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P8_13, pwm,       P8_13(PIN_OUTPUT, 6))	/* ehrpwm0_b */

	/* P8_14 (AF27) PRG0_PRU1_GPO12 (gpio0_75) AF27_PRG0_PWM1_A0 */
	BONE_PIN(P8_14, default,   P8_14(PIN_INPUT, 7))
	BONE_PIN(P8_14, pruout,    P8_14(PIN_OUTPUT, 0))	/* prg0_pru1_gpo12 */
	BONE_PIN(P8_14, pruin,     P8_14(PIN_INPUT, 1))		/* prg0_pru1_gpi12 */
	BONE_PIN(P8_14, gpio,      P8_14(PIN_INPUT, 7))
	BONE_PIN(P8_14, gpio_pu,   P8_14(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_14, gpio_pd,   P8_14(PIN_INPUT_PULLDOWN, 7))

	/* P8_15 (AB29) PRG0_PRU0_GPO18 (gpio0_61) AB29_PRG0_ECAP0_IN_APWM_OUT */
	BONE_PIN(P8_15, default,   P8_15(PIN_INPUT, 7))
	BONE_PIN(P8_15, pruout,    P8_15(PIN_OUTPUT, 0))	/* prg0_pru0_gpo18 */
	BONE_PIN(P8_15, pruin,     P8_15(PIN_INPUT, 1))		/* prg0_pru0_gpi18 */
	BONE_PIN(P8_15, gpio,      P8_15(PIN_INPUT, 7))
	BONE_PIN(P8_15, gpio_pu,   P8_15(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_15, gpio_pd,   P8_15(PIN_INPUT_PULLDOWN, 7))

	/* P8_16 (AB28) PRG0_PRU0_GPO19 (gpio0_62) AB28_PRG0_PWM0_TZ_OUT */
	BONE_PIN(P8_16, default,   P8_16(PIN_INPUT, 7))
	BONE_PIN(P8_16, pruout,    P8_16(PIN_OUTPUT, 0))	/* prg0_pru0_gpo19 */
	BONE_PIN(P8_16, pruin,     P8_16(PIN_INPUT, 1))		/* prg0_pru0_gpi19 */
	BONE_PIN(P8_16, gpio,      P8_16(PIN_INPUT, 7))
	BONE_PIN(P8_16, gpio_pu,   P8_16(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_16, gpio_pd,   P8_16(PIN_INPUT_PULLDOWN, 7))

	/* P8_17 (AF22) PRG1_PRU0_GPO2 (gpio0_3) AF22_PRG1_PWM2_A0 */
	BONE_PIN(P8_17, default,   P8_17(PIN_INPUT, 7))
	BONE_PIN(P8_17, pruout,    P8_17(PIN_OUTPUT, 0))	/* prg1_pru0_gpo2 */
	BONE_PIN(P8_17, pruin,     P8_17(PIN_INPUT, 1))		/* prg1_pru0_gpi2 */
	BONE_PIN(P8_17, gpio,      P8_17(PIN_INPUT, 7))
	BONE_PIN(P8_17, gpio_pu,   P8_17(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_17, gpio_pd,   P8_17(PIN_INPUT_PULLDOWN, 7))

	/* P8_18 (AJ23) PRG1_PRU0_GPO3 (gpio0_4) AJ23_PRG1_PWM3_A2 */
	BONE_PIN(P8_18, default,   P8_18(PIN_INPUT, 7))
	BONE_PIN(P8_18, pruout,    P8_18(PIN_OUTPUT, 0))	/* prg1_pru0_gpo3 */
	BONE_PIN(P8_18, pruin,     P8_18(PIN_INPUT, 1))		/* prg1_pru0_gpi3 */
	BONE_PIN(P8_18, gpio,      P8_18(PIN_INPUT, 7))
	BONE_PIN(P8_18, gpio_pu,   P8_18(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_18, gpio_pd,   P8_18(PIN_INPUT_PULLDOWN, 7))

	/* P8_19 (V29) RGMII5_TD2 (gpio0_88) V29_EHRPWM0_A */
	BONE_PIN(P8_19, default,   P8_19(PIN_INPUT, 7))
	BONE_PIN(P8_19, gpio,      P8_19(PIN_INPUT, 7))
	BONE_PIN(P8_19, gpio_pu,   P8_19(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_19, gpio_pd,   P8_19(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P8_19, pwm,       P8_19(PIN_OUTPUT, 6))	/* ehrpwm0_a */

	/* P8_20 (AF26) PRG0_PRU1_GPO13 (gpio0_76) AF26_PRG0_PWM1_B0 */
	BONE_PIN(P8_20, default,   P8_20(PIN_INPUT, 7))
	BONE_PIN(P8_20, pruout,    P8_20(PIN_OUTPUT, 0))	/* prg0_pru1_gpo13 */
	BONE_PIN(P8_20, pruin,     P8_20(PIN_INPUT, 1))		/* prg0_pru1_gpi13 */
	BONE_PIN(P8_20, gpio,      P8_20(PIN_INPUT, 7))
	BONE_PIN(P8_20, gpio_pu,   P8_20(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_20, gpio_pd,   P8_20(PIN_INPUT_PULLDOWN, 7))

	/* P8_21 (AF21) PRG1_PRU1_GPO9 (gpio0_30) AF21_MCAN8_TX */
	BONE_PIN(P8_21, default,   P8_21(PIN_INPUT, 7))
	BONE_PIN(P8_21, pruout,    P8_21(PIN_OUTPUT, 0))	/* prg1_pru1_gpo9 */
	BONE_PIN(P8_21, pruin,     P8_21(PIN_INPUT, 1))		/* prg1_pru1_gpi9 */
	BONE_PIN(P8_21, gpio,      P8_21(PIN_INPUT, 7))
	BONE_PIN(P8_21, gpio_pu,   P8_21(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_21, gpio_pd,   P8_21(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P8_21, spi,       P8_21(PIN_OUTPUT, 4))	/* spi6_cs3 */

	/* P8_22 (AH23) PRG1_PRU0_GPO4 (gpio0_5) AH23_UART2_RXD */
	BONE_PIN(P8_22, default,   P8_22(PIN_INPUT, 7))
	BONE_PIN(P8_22, pruout,    P8_22(PIN_OUTPUT, 0))	/* prg1_pru0_gpo4 */
	BONE_PIN(P8_22, pruin,     P8_22(PIN_INPUT, 1))		/* prg1_pru0_gpi4 */
	BONE_PIN(P8_22, gpio,      P8_22(PIN_INPUT, 7))
	BONE_PIN(P8_22, gpio_pu,   P8_22(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_22, gpio_pd,   P8_22(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P8_22, uart,      P8_22(PIN_INPUT, 14))	/* uart2_rxd */

	/* P8_23 (AB23) PRG1_PRU1_GPO10 (gpio0_31) AB23_MCAN8_RX */
	BONE_PIN(P8_23, default,   P8_23(PIN_INPUT, 7))
	BONE_PIN(P8_23, pruout,    P8_23(PIN_OUTPUT, 0))	/* prg1_pru1_gpo10 */
	BONE_PIN(P8_23, pruin,     P8_23(PIN_INPUT, 1))		/* prg1_pru1_gpi10 */
	BONE_PIN(P8_23, pruuart,   P8_23(PIN_OUTPUT, 2))
	BONE_PIN(P8_23, gpio,      P8_23(PIN_INPUT, 7))
	BONE_PIN(P8_23, gpio_pu,   P8_23(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_23, gpio_pd,   P8_23(PIN_INPUT_PULLDOWN, 7))

	/* P8_24 (AD20) PRG1_PRU0_GPO5 (gpio0_6) AD20_SYS_BOOTMODE0 */
	BONE_PIN(P8_24, default,   P8_24(PIN_INPUT, 7))
	BONE_PIN(P8_24, pruout,    P8_24(PIN_OUTPUT, 0))	/* prg1_pru0_gpo5 */
	BONE_PIN(P8_24, pruin,     P8_24(PIN_INPUT, 1))		/* prg1_pru0_gpi5 */
	BONE_PIN(P8_24, gpio,      P8_24(PIN_INPUT, 7))
	BONE_PIN(P8_24, gpio_pu,   P8_24(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_24, gpio_pd,   P8_24(PIN_INPUT_PULLDOWN, 7))

	/* P8_25 (AH26) PRG1_PRU1_GPO14 (gpio0_35) AH26_PRG1_PRU1_GPO14 */
	BONE_PIN(P8_25, default,   P8_25(PIN_INPUT, 7))
	BONE_PIN(P8_25, pruout,    P8_25(PIN_OUTPUT, 0))	/* prg1_pru1_gpo14 */
	BONE_PIN(P8_25, pruin,     P8_25(PIN_INPUT, 1))		/* prg1_pru1_gpi14 */
	BONE_PIN(P8_25, gpio,      P8_25(PIN_INPUT, 7))
	BONE_PIN(P8_25, gpio_pu,   P8_25(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_25, gpio_pd,   P8_25(PIN_INPUT_PULLDOWN, 7))

	/* P8_26 (AC27) PRG0_PRU0_GPO8 (gpio0_51) AC27_PRG0_PWM2_A1 */
	BONE_PIN(P8_26, default,   P8_26(PIN_INPUT, 7))
	BONE_PIN(P8_26, pruout,    P8_26(PIN_OUTPUT, 0))	/* prg0_pru0_gpo8 */
	BONE_PIN(P8_26, pruin,     P8_26(PIN_INPUT, 1))		/* prg0_pru0_gpi8 */
	BONE_PIN(P8_26, gpio,      P8_26(PIN_INPUT, 7))
	BONE_PIN(P8_26, gpio_pu,   P8_26(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_26, gpio_pd,   P8_26(PIN_INPUT_PULLDOWN, 7))

	/* P8_27 (AA28) PRG0_PRU1_GPO8 (gpio0_71) AA28_PRG0_PRU1_GPO8 */
	BONE_PIN(P8_27, default,   P8_27(PIN_INPUT, 7))
	BONE_PIN(P8_27, pruout,    P8_27(PIN_OUTPUT, 0))	/* prg0_pru1_gpo8 */
	BONE_PIN(P8_27, pruin,     P8_27(PIN_INPUT, 1))		/* prg0_pru1_gpi8 */
	BONE_PIN(P8_27, gpio,      P8_27(PIN_INPUT, 7))
	BONE_PIN(P8_27, gpio_pu,   P8_27(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_27, gpio_pd,   P8_27(PIN_INPUT_PULLDOWN, 7))

	/* P8_28 (Y24) PRG0_PRU1_GPO9 (gpio0_72) Y24_PRG0_UART0_RXD */
	BONE_PIN(P8_28, default,   P8_28(PIN_INPUT, 7))
	BONE_PIN(P8_28, pruout,    P8_28(PIN_OUTPUT, 0))	/* prg0_pru1_gpo9 */
	BONE_PIN(P8_28, pruin,     P8_28(PIN_INPUT, 1))		/* prg0_pru1_gpi9 */
	BONE_PIN(P8_28, gpio,      P8_28(PIN_INPUT, 7))
	BONE_PIN(P8_28, gpio_pu,   P8_28(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_28, gpio_pd,   P8_28(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P8_28, uart,      P8_28(PIN_INPUT, 14))	/* uart8_rx */

	/* P8_29 (AA25) PRG0_PRU1_GPO10 (gpio0_73) AA25_PRG0_UART0_TXD */
	BONE_PIN(P8_29, default,   P8_29(PIN_INPUT, 7))
	BONE_PIN(P8_29, pruout,    P8_29(PIN_OUTPUT, 0))	/* prg0_pru1_gpo10 */
	BONE_PIN(P8_29, pruin,     P8_29(PIN_INPUT, 1))		/* prg0_pru1_gpi10 */
	BONE_PIN(P8_29, gpio,      P8_29(PIN_INPUT, 7))
	BONE_PIN(P8_29, gpio_pu,   P8_29(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_29, gpio_pd,   P8_29(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P8_29, uart,      P8_29(PIN_OUTPUT, 14))	/* uart8_tx */

	/* P8_30 (AG26) PRG0_PRU1_GPO11 (gpio0_74) AG26_PRG0_PRU1_GPO11 */
	BONE_PIN(P8_30, default,   P8_30(PIN_INPUT, 7))
	BONE_PIN(P8_30, pruout,    P8_30(PIN_OUTPUT, 0))	/* prg0_pru1_gpo11 */
	BONE_PIN(P8_30, pruin,     P8_30(PIN_INPUT, 1))		/* prg0_pru1_gpi11 */
	BONE_PIN(P8_30, gpio,      P8_30(PIN_INPUT, 7))
	BONE_PIN(P8_30, gpio_pu,   P8_30(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_30, gpio_pd,   P8_30(PIN_INPUT_PULLDOWN, 7))

	/* P8_31 (AJ25/AE29) PRG1_PRU1_GPO11/PRG0_PRU1_GPO0 (gpio0_32/gpio0_63) AJ25_AE29 */
	BONE_PIN(P8_31, default,   P8_31A(PIN_INPUT, 7) P8_31B(PIN_INPUT, 7))
	BONE_PIN(P8_31, pruout,    P8_31A(PIN_OUTPUT, 0) P8_31B(PIN_INPUT, 7))
	BONE_PIN(P8_31, pruin,     P8_31A(PIN_INPUT, 1) P8_31B(PIN_INPUT, 7))
	BONE_PIN(P8_31, gpio,      P8_31A(PIN_INPUT, 7) P8_31B(PIN_INPUT, 7))	/* gpio0_32 */
	BONE_PIN(P8_31, gpio_pu,   P8_31A(PIN_INPUT_PULLUP, 7) P8_31B(PIN_INPUT, 7))
	BONE_PIN(P8_31, gpio_pd,   P8_31A(PIN_INPUT_PULLDOWN, 7) P8_31B(PIN_INPUT, 7))
	BONE_PIN(P8_31, qep,       P8_31A(PIN_INPUT, 9) P8_31B(PIN_INPUT, 7))	/* eqep1_i */
	BONE_PIN(P8_31, uart,      P8_31A(PIN_INPUT, 7) P8_31B(PIN_INPUT, 14))	/* uart5_rxd */

	/* P8_32 (AG21/AD28) PRG1_PRU1_GPO5/PRG0_PRU1_GPO1 (gpio0_26/gpio0_64) AG21_AD28 */
	BONE_PIN(P8_32, default,   P8_32A(PIN_INPUT, 7) P8_32B(PIN_INPUT, 7))
	BONE_PIN(P8_32, pruout,    P8_32A(PIN_OUTPUT, 0) P8_32B(PIN_INPUT, 7))
	BONE_PIN(P8_32, pruin,     P8_32A(PIN_INPUT, 1) P8_32B(PIN_INPUT, 7))
	BONE_PIN(P8_32, gpio,      P8_32A(PIN_INPUT, 7) P8_32B(PIN_INPUT, 7))	/* gpio0_26 */
	BONE_PIN(P8_32, gpio_pu,   P8_32A(PIN_INPUT_PULLUP, 7) P8_32B(PIN_INPUT, 7))
	BONE_PIN(P8_32, gpio_pd,   P8_32A(PIN_INPUT_PULLDOWN, 7) P8_32B(PIN_INPUT, 7))
	BONE_PIN(P8_32, qep,       P8_32A(PIN_INPUT, 9) P8_32B(PIN_INPUT, 7))	/* eqep1_s */
	BONE_PIN(P8_32, uart,      P8_32A(PIN_INPUT, 7) P8_32B(PIN_OUTPUT, 14))	/* uart5_txd */

	/* P8_33 (AH24/AA2) PRG1_PRU1_GPO4/SPI0_CS0 (gpio0_25/gpio0_111) AH24_AA2 */
	BONE_PIN(P8_33, default,   P8_33A(PIN_INPUT, 7) P8_33B(PIN_INPUT, 7))
	BONE_PIN(P8_33, pruout,    P8_33A(PIN_OUTPUT, 0) P8_33B(PIN_INPUT, 7))	/* prg1_pru1_gpo4 */
	BONE_PIN(P8_33, pruin,     P8_33A(PIN_INPUT, 1) P8_33B(PIN_INPUT, 7))	/* prg1_pru1_gpi4 */
	BONE_PIN(P8_33, gpio,      P8_33A(PIN_INPUT, 7) P8_33B(PIN_INPUT, 7))	/* gpio0_25 */
	BONE_PIN(P8_33, gpio_pu,   P8_33A(PIN_INPUT_PULLUP, 7) P8_33B(PIN_INPUT, 7))
	BONE_PIN(P8_33, gpio_pd,   P8_33A(PIN_INPUT_PULLDOWN, 7) P8_33B(PIN_INPUT, 7))
	BONE_PIN(P8_33, qep,       P8_33A(PIN_INPUT, 9) P8_33B(PIN_INPUT, 7))	/* eqep1_b */

	/* P8_34 (AD22) PRG1_PRU0_GPO6 (gpio0_7) AD22_UART2_TXD */
	BONE_PIN(P8_34, default,   P8_34(PIN_INPUT, 7))
	BONE_PIN(P8_34, pruout,    P8_34(PIN_OUTPUT, 0))	/* prg1_pru0_gpo6 */
	BONE_PIN(P8_34, pruin,     P8_34(PIN_INPUT, 1))		/* prg1_pru0_gpi6 */
	BONE_PIN(P8_34, gpio,      P8_34(PIN_INPUT, 7))
	BONE_PIN(P8_34, gpio_pu,   P8_34(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_34, gpio_pd,   P8_34(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P8_34, uart,      P8_34(PIN_OUTPUT, 14))	/* uart2_txd */

	/* P8_35 (AD23/Y3) PRG1_PRU1_GPO3/SPI1_CS0 (gpio0_24/gpio0_116) AD23_Y3 */
	BONE_PIN(P8_35, default,   P8_35A(PIN_INPUT, 7) P8_35B(PIN_INPUT, 7))
	BONE_PIN(P8_35, pruout,    P8_35A(PIN_OUTPUT, 0) P8_35B(PIN_INPUT, 7))	/* prg1_pru1_gpo3 */
	BONE_PIN(P8_35, pruin,     P8_35A(PIN_INPUT, 1) P8_35B(PIN_INPUT, 7))	/* prg1_pru1_gpi3 */
	BONE_PIN(P8_35, gpio,      P8_35A(PIN_INPUT, 7) P8_35B(PIN_INPUT, 7))	/* gpio0_24 */
	BONE_PIN(P8_35, gpio_pu,   P8_35A(PIN_INPUT_PULLUP, 7) P8_35B(PIN_INPUT, 7))
	BONE_PIN(P8_35, gpio_pd,   P8_35A(PIN_INPUT_PULLDOWN, 7) P8_35B(PIN_INPUT, 7))
	BONE_PIN(P8_35, qep,       P8_35A(PIN_INPUT, 9) P8_35B(PIN_INPUT, 7))	/* eqep1_a */
	BONE_PIN(P8_35, uart,      P8_35A(PIN_INPUT, 7) P8_35B(PIN_INPUT, 3))	/* uart5_rxd */

	/* P8_36 (AE20) PRG1_PRU0_GPO7 (gpio0_8) AE20_MCAN4_TX */
	BONE_PIN(P8_36, default,   P8_36(PIN_INPUT, 7))
	BONE_PIN(P8_36, pruout,    P8_36(PIN_OUTPUT, 0))	/* prg1_pru0_gpo7 */
	BONE_PIN(P8_36, pruin,     P8_36(PIN_INPUT, 1))		/* prg1_pru0_gpi7 */
	BONE_PIN(P8_36, can,       P8_36(PIN_OUTPUT, 6))	/* mcan4_tx */
	BONE_PIN(P8_36, gpio,      P8_36(PIN_INPUT, 7))
	BONE_PIN(P8_36, gpio_pu,   P8_36(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_36, gpio_pd,   P8_36(PIN_INPUT_PULLDOWN, 7))

	/* P8_37 (Y27/AD21) RGMII6_RD2/PRG1_PRU0_GPO10 (gpio0_106/gpio0_11) Y27_AD21 */
	BONE_PIN(P8_37, default,   P8_37A(PIN_INPUT, 7) P8_37B(PIN_INPUT, 7))
	BONE_PIN(P8_37, pruout,    P8_37A(PIN_INPUT, 7) P8_37B(PIN_OUTPUT, 0))	/* prg1_pru0_gpo10 */
	BONE_PIN(P8_37, pruin,     P8_37A(PIN_INPUT, 7) P8_37B(PIN_INPUT, 1))	/* prg1_pru0_gpi10 */
	BONE_PIN(P8_37, gpio,      P8_37A(PIN_INPUT, 7) P8_37B(PIN_INPUT, 7))	/* gpio0_106 */
	BONE_PIN(P8_37, gpio_pu,   P8_37A(PIN_INPUT_PULLUP, 7) P8_37B(PIN_INPUT, 7))
	BONE_PIN(P8_37, gpio_pd,   P8_37A(PIN_INPUT_PULLDOWN, 7) P8_37B(PIN_INPUT, 7))
	BONE_PIN(P8_37, pwm,       P8_37A(PIN_OUTPUT, 6) P8_37B(PIN_INPUT, 7))	/* ehrpwm5_a */
	BONE_PIN(P8_37, spi,       P8_37A(PIN_INPUT, 7) P8_37B(PIN_OUTPUT, 4))	/* spi6_cs2 */
	BONE_PIN(P8_37, uart,      P8_37A(PIN_OUTPUT, 3) P8_37B(PIN_INPUT, 7))	/* uart5_txd */

	/* P8_38 (AJ20/Y29) PRG1_PRU0_GPO8/RGMII6_RD3 (gpio0_9/gpio0_105) Y29_AJ20 */
	BONE_PIN(P8_38, default,   P8_38A(PIN_INPUT, 7) P8_38B(PIN_INPUT, 7))
	BONE_PIN(P8_38, pruout,    P8_38A(PIN_OUTPUT, 0) P8_38B(PIN_INPUT, 7))	/* prg1_pru0_gpo8 */
	BONE_PIN(P8_38, pruin,     P8_38A(PIN_INPUT, 1) P8_38B(PIN_INPUT, 7))	/* prg1_pru0_gpi8 */
	BONE_PIN(P8_38, can,       P8_38A(PIN_INPUT, 6) P8_38B(PIN_INPUT, 7))	/* mcan4_rx */
	BONE_PIN(P8_38, gpio,      P8_38A(PIN_INPUT, 7) P8_38B(PIN_INPUT, 7))	/* gpio0_9 */
	BONE_PIN(P8_38, gpio_pu,   P8_38A(PIN_INPUT_PULLUP, 7) P8_38B(PIN_INPUT, 7))
	BONE_PIN(P8_38, gpio_pd,   P8_38A(PIN_INPUT_PULLDOWN, 7) P8_38B(PIN_INPUT, 7))
	BONE_PIN(P8_38, uart,      P8_38A(PIN_INPUT, 7) P8_38B(PIN_INPUT, 3))	/* uart5_rxd */

	/* P8_39 (AC26) PRG0_PRU1_GPO6 (gpio0_69) AC26_PRG0_PRU1_GPO6 */
	BONE_PIN(P8_39, default,   P8_39(PIN_INPUT, 7))
	BONE_PIN(P8_39, pruout,    P8_39(PIN_OUTPUT, 0))	/* prg0_pru1_gpo6 */
	BONE_PIN(P8_39, pruin,     P8_39(PIN_INPUT, 1))		/* prg0_pru1_gpi6 */
	BONE_PIN(P8_39, gpio,      P8_39(PIN_INPUT, 7))
	BONE_PIN(P8_39, gpio_pu,   P8_39(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_39, gpio_pd,   P8_39(PIN_INPUT_PULLDOWN, 7))

	/* P8_40 (AA24) PRG0_PRU1_GPO7 (gpio0_70) AA24_PRG0_PRU1_GPO7 */
	BONE_PIN(P8_40, default,   P8_40(PIN_INPUT, 7))
	BONE_PIN(P8_40, pruout,    P8_40(PIN_OUTPUT, 0))	/* prg0_pru1_gpo7 */
	BONE_PIN(P8_40, pruin,     P8_40(PIN_INPUT, 1))		/* prg0_pru1_gpi7 */
	BONE_PIN(P8_40, gpio,      P8_40(PIN_INPUT, 7))
	BONE_PIN(P8_40, gpio_pu,   P8_40(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_40, gpio_pd,   P8_40(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P8_40, uart,      P8_40(PIN_OUTPUT, 14))	/* uart2_txd */

	/* P8_41 (AD29) PRG0_PRU1_GPO4 (gpio0_67) AD29_PRG0_PRU1_GPO4 */
	BONE_PIN(P8_41, default,   P8_41(PIN_INPUT, 7))
	BONE_PIN(P8_41, pruout,    P8_41(PIN_OUTPUT, 0))	/* prg0_pru1_gpo4 */
	BONE_PIN(P8_41, pruin,     P8_41(PIN_INPUT, 1))		/* prg0_pru1_gpi4 */
	BONE_PIN(P8_41, gpio,      P8_41(PIN_INPUT, 7))
	BONE_PIN(P8_41, gpio_pu,   P8_41(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_41, gpio_pd,   P8_41(PIN_INPUT_PULLDOWN, 7))

	/* P8_42 (AB27) PRG0_PRU1_GPO5 (gpio0_68) AB27_SYS_BOOTMODE6 */
	BONE_PIN(P8_42, default,   P8_42(PIN_INPUT, 7))
	BONE_PIN(P8_42, pruout,    P8_42(PIN_OUTPUT, 0))	/* prg0_pru1_gpo5 */
	BONE_PIN(P8_42, pruin,     P8_42(PIN_INPUT, 1))		/* prg0_pru1_gpi5 */
	BONE_PIN(P8_42, gpio,      P8_42(PIN_INPUT, 7))
	BONE_PIN(P8_42, gpio_pu,   P8_42(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_42, gpio_pd,   P8_42(PIN_INPUT_PULLDOWN, 7))

	/* P8_43 (AD27) PRG0_PRU1_GPO2 (gpio0_65) AD27_PRG0_PRU1_GPO2 */
	BONE_PIN(P8_43, default,   P8_43(PIN_INPUT, 7))
	BONE_PIN(P8_43, pruout,    P8_43(PIN_OUTPUT, 0))	/* prg0_pru1_gpo2 */
	BONE_PIN(P8_43, pruin,     P8_43(PIN_INPUT, 1))		/* prg0_pru1_gpi2 */
	BONE_PIN(P8_43, gpio,      P8_43(PIN_INPUT, 7))
	BONE_PIN(P8_43, gpio_pu,   P8_43(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_43, gpio_pd,   P8_43(PIN_INPUT_PULLDOWN, 7))

	/* P8_44 (AC25) PRG0_PRU1_GPO3 (gpio0_66) AC25_PRG0_PRU1_GPO3 */
	BONE_PIN(P8_44, default,   P8_44(PIN_INPUT, 7))
	BONE_PIN(P8_44, pruout,    P8_44(PIN_OUTPUT, 0))	/* prg0_pru1_gpo3 */
	BONE_PIN(P8_44, pruin,     P8_44(PIN_INPUT, 1))		/* prg0_pru1_gpi3 */
	BONE_PIN(P8_44, gpio,      P8_44(PIN_INPUT, 7))
	BONE_PIN(P8_44, gpio_pu,   P8_44(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_44, gpio_pd,   P8_44(PIN_INPUT_PULLDOWN, 7))

	/* P8_45 (AG29) PRG0_PRU1_GPO16 (gpio0_79) AG29_PRG0_PRU1_GPO16 */
	BONE_PIN(P8_45, default,   P8_45(PIN_INPUT, 7))
	BONE_PIN(P8_45, pruout,    P8_45(PIN_OUTPUT, 0))	/* prg0_pru1_gpo16 */
	BONE_PIN(P8_45, pruin,     P8_45(PIN_INPUT, 1))		/* prg0_pru1_gpi16 */
	BONE_PIN(P8_45, gpio,      P8_45(PIN_INPUT, 7))
	BONE_PIN(P8_45, gpio_pu,   P8_45(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_45, gpio_pd,   P8_45(PIN_INPUT_PULLDOWN, 7))

	/* P8_46 (Y25) PRG0_PRU1_GPO17 (gpio0_80) Y25_SYS_BOOTMODE3 */
	BONE_PIN(P8_46, default,   P8_46(PIN_INPUT, 7))
	BONE_PIN(P8_46, pruout,    P8_46(PIN_OUTPUT, 0))	/* prg0_pru1_gpo17 */
	BONE_PIN(P8_46, pruin,     P8_46(PIN_INPUT, 1))		/* prg0_pru1_gpi17 */
	BONE_PIN(P8_46, gpio,      P8_46(PIN_INPUT, 7))
	BONE_PIN(P8_46, gpio_pu,   P8_46(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P8_46, gpio_pd,   P8_46(PIN_INPUT_PULLDOWN, 7))

	/* Full P9 header mode definitions */
	/* P9_01 - GND */
	/* P9_02 - GND */
	/* P9_03 - VOUT_3V3 */
	/* P9_04 - VOUT_3V3 */
	/* P9_05 - VIN */
	/* P9_06 - VIN */
	/* P9_07 - VOUT_SYS */
	/* P9_08 - VOUT_SYS */
	/* P9_09 - RESET# */
	/* P9_10 - POWER# */

	/* P9_11 (AC23) PRG1_PRU0_GPO0 (gpio0_1) AC23_UART0_RXD */
	BONE_PIN(P9_11, default,   P9_11(PIN_INPUT, 7))
	BONE_PIN(P9_11, pruout,    P9_11(PIN_OUTPUT, 0))	/* prg1_pru0_gpo0 */
	BONE_PIN(P9_11, pruin,     P9_11(PIN_INPUT, 1))		/* prg1_pru0_gpi0 */
	BONE_PIN(P9_11, gpio,      P9_11(PIN_INPUT, 7))
	BONE_PIN(P9_11, gpio_pu,   P9_11(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_11, gpio_pd,   P9_11(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P9_11, uart,      P9_11(PIN_INPUT, 14))	/* uart0_rxd */

	/* P9_12 (AE27) PRG0_PRU0_GPO2 (gpio0_45) AE27_MCASP0_ACLKR */
	BONE_PIN(P9_12, default,   P9_12(PIN_INPUT, 7))
	BONE_PIN(P9_12, pruout,    P9_12(PIN_OUTPUT, 0))	/* prg0_pru0_gpo2 */
	BONE_PIN(P9_12, pruin,     P9_12(PIN_INPUT, 1))		/* prg0_pru0_gpi2 */
	BONE_PIN(P9_12, gpio,      P9_12(PIN_INPUT, 7))
	BONE_PIN(P9_12, gpio_pu,   P9_12(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_12, gpio_pd,   P9_12(PIN_INPUT_PULLDOWN, 7))

	/* P9_13 (AG22) PRG1_PRU0_GPO1 (gpio0_2) AG22_UART0_TXD */
	BONE_PIN(P9_13, default,   P9_13(PIN_INPUT, 7))
	BONE_PIN(P9_13, pruout,    P9_13(PIN_OUTPUT, 0))	/* prg1_pru0_gpo1 */
	BONE_PIN(P9_13, pruin,     P9_13(PIN_INPUT, 1))		/* prg1_pru0_gpi1 */
	BONE_PIN(P9_13, gpio,      P9_13(PIN_INPUT, 7))
	BONE_PIN(P9_13, gpio_pu,   P9_13(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_13, gpio_pd,   P9_13(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P9_13, uart,      P9_13(PIN_OUTPUT, 14))	/* uart0_txd */

	/* P9_14 (U27) RGMII5_RD3 (gpio0_93) U27_EHRPWM2_A */
	BONE_PIN(P9_14, default,   P9_14(PIN_INPUT, 7))
	BONE_PIN(P9_14, gpio,      P9_14(PIN_INPUT, 7))
	BONE_PIN(P9_14, gpio_pu,   P9_14(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_14, gpio_pd,   P9_14(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P9_14, pwm,       P9_14(PIN_OUTPUT, 6))	/* ehrpwm2_a */

	/* P9_15 (AD25) PRG0_PRU0_GPO4 (gpio0_47) AD25_PRG0_PRU0_GPO4 */
	BONE_PIN(P9_15, default,   P9_15(PIN_INPUT, 7))
	BONE_PIN(P9_15, pruout,    P9_15(PIN_OUTPUT, 0))	/* prg0_pru0_gpo4 */
	BONE_PIN(P9_15, pruin,     P9_15(PIN_INPUT, 1))		/* prg0_pru0_gpi4 */
	BONE_PIN(P9_15, gpio,      P9_15(PIN_INPUT, 7))
	BONE_PIN(P9_15, gpio_pu,   P9_15(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_15, gpio_pd,   P9_15(PIN_INPUT_PULLDOWN, 7))

	/* P9_16 (U24) RGMII5_RD2 (gpio0_94) U24_EHRPWM2_B */
	BONE_PIN(P9_16, default,   P9_16(PIN_INPUT, 7))
	BONE_PIN(P9_16, pruout,    P9_16(PIN_OUTPUT, 0))
	BONE_PIN(P9_16, pruin,     P9_16(PIN_INPUT, 1))
	BONE_PIN(P9_16, gpio,      P9_16(PIN_INPUT, 7))
	BONE_PIN(P9_16, gpio_pu,   P9_16(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_16, gpio_pd,   P9_16(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P9_16, pwm,       P9_16(PIN_OUTPUT, 6))	/* ehrpwm2_b */

	/* P9_17 (AC21/AA3) PRG1_PRU1_GPO7/SPI0_D1 (gpio0_28/gpio0_115) AC21_AA3 */
	BONE_PIN(P9_17, default,   P9_17A(PIN_INPUT, 7) P9_17B(PIN_INPUT, 7))
	BONE_PIN(P9_17, pruout,    P9_17A(PIN_OUTPUT, 0) P9_17B(PIN_INPUT, 7))	/* prg1_pru1_gpo7 */
	BONE_PIN(P9_17, pruin,     P9_17A(PIN_INPUT, 1) P9_17B(PIN_INPUT, 7))	/* prg1_pru1_gpi7 */
	BONE_PIN(P9_17, gpio,      P9_17A(PIN_INPUT, 7) P9_17B(PIN_INPUT, 7))	/* gpio0_28 */
	BONE_PIN(P9_17, gpio_pu,   P9_17A(PIN_INPUT_PULLUP, 7) P9_17B(PIN_INPUT, 7))
	BONE_PIN(P9_17, gpio_pd,   P9_17A(PIN_INPUT_PULLDOWN, 7) P9_17B(PIN_INPUT, 7))
	BONE_PIN(P9_17, i2c,       P9_17A(PIN_INPUT, 7) P9_17B(PIN_INPUT_PULLUP, 2))	/* i2c6_scl */
	BONE_PIN(P9_17, spi,       P9_17A(PIN_OUTPUT, 4) P9_17B(PIN_INPUT, 7))	/* spi6_cs0 */

	/* P9_18 (AH22/Y2) PRG1_PRU1_GPO19/SPI1_D1 (gpio0_40/gpio0_120) AH22_Y2 */
	BONE_PIN(P9_18, default,   P9_18A(PIN_INPUT, 7) P9_18B(PIN_INPUT, 7))
	BONE_PIN(P9_18, pruout,    P9_18A(PIN_OUTPUT, 0) P9_18B(PIN_INPUT, 7))	/* prg1_pru1_gpo19 */
	BONE_PIN(P9_18, pruin,     P9_18A(PIN_INPUT, 1) P9_18B(PIN_INPUT, 7))	/* prg1_pru1_gpi19 */
	BONE_PIN(P9_18, gpio,      P9_18A(PIN_INPUT, 7) P9_18B(PIN_INPUT, 7))	/* gpio0_40 */
	BONE_PIN(P9_18, gpio_pu,   P9_18A(PIN_INPUT_PULLUP, 7) P9_18B(PIN_INPUT, 7))
	BONE_PIN(P9_18, gpio_pd,   P9_18A(PIN_INPUT_PULLDOWN, 7) P9_18B(PIN_INPUT, 7))
	BONE_PIN(P9_18, i2c,       P9_18A(PIN_INPUT, 7) P9_18B(PIN_INPUT_PULLUP, 2))	/* i2c6_sda */
	BONE_PIN(P9_18, spi,       P9_18A(PIN_INPUT, 4) P9_18B(PIN_INPUT, 7))	/* spi6_d1 (tested PIN_INPUT) */

	/* P9_19 (W5/AF29) MCAN0_RX/PRG0_PRU1_GPO15 (gpio1_1/gpio0_78) W5_AF29 */
	BONE_PIN(P9_19, default,   P9_19A(PIN_INPUT, 7) P9_19B(PIN_INPUT, 7))
	BONE_PIN(P9_19, pruout,    P9_19A(PIN_INPUT, 7) P9_19B(PIN_OUTPUT, 0))	/* prg0_pru1_gpo15 */
	BONE_PIN(P9_19, pruin,     P9_19A(PIN_INPUT, 7) P9_19B(PIN_INPUT, 1))	/* prg0_pru1_gpi15 */
	BONE_PIN(P9_19, can,       P9_19A(PIN_INPUT, 0) P9_19B(PIN_INPUT, 7))	/* mcan0_rx */
	BONE_PIN(P9_19, gpio,      P9_19A(PIN_INPUT, 7) P9_19B(PIN_INPUT, 7))	/* gpio1_1 */
	BONE_PIN(P9_19, gpio_pu,   P9_19A(PIN_INPUT_PULLUP, 7) P9_19B(PIN_INPUT, 7))
	BONE_PIN(P9_19, gpio_pd,   P9_19A(PIN_INPUT_PULLDOWN, 7) P9_19B(PIN_INPUT, 7))
	BONE_PIN(P9_19, i2c,       P9_19A(PIN_INPUT_PULLUP, 4) P9_19B(PIN_INPUT, 7))	/* i2c2_scl */

	/* P9_20 (W6/AE25) MCAN0_TX/PRG0_PRU1_GPO14 (gpio1_2/gpio0_77) W6_AE25 */
	BONE_PIN(P9_20, default,   P9_20A(PIN_INPUT, 7) P9_20B(PIN_INPUT, 7))
	BONE_PIN(P9_20, pruout,    P9_20A(PIN_INPUT, 7) P9_20B(PIN_OUTPUT, 0))	/* prg0_pru1_gpo14 */
	BONE_PIN(P9_20, pruin,     P9_20A(PIN_INPUT, 7) P9_20B(PIN_INPUT, 1))	/* prg0_pru1_gpi14 */
	BONE_PIN(P9_20, can,       P9_20A(PIN_OUTPUT, 0) P9_20B(PIN_INPUT, 7))	/* mcan0_tx */
	BONE_PIN(P9_20, gpio,      P9_20A(PIN_INPUT, 7) P9_20B(PIN_INPUT, 7))	/* gpio1_2 */
	BONE_PIN(P9_20, gpio_pu,   P9_20A(PIN_INPUT_PULLUP, 7) P9_20B(PIN_INPUT, 7))
	BONE_PIN(P9_20, gpio_pd,   P9_20A(PIN_INPUT_PULLDOWN, 7) P9_20B(PIN_INPUT, 7))
	BONE_PIN(P9_20, i2c,       P9_20A(PIN_INPUT_PULLUP, 4) P9_20B(PIN_INPUT, 7))	/* i2c2_sda */

	/* P9_21 (AJ22/U28) PRG1_PRU1_GPO18/RGMII5_TD0 (gpio0_39/gpio0_90) AJ22_U28 */
	BONE_PIN(P9_21, default,   P9_21A(PIN_INPUT, 7) P9_21B(PIN_INPUT, 7))
	BONE_PIN(P9_21, pruout,    P9_21A(PIN_OUTPUT, 0) P9_21B(PIN_INPUT, 7))	/* prg1_pru1_gpo18 */
	BONE_PIN(P9_21, pruin,     P9_21A(PIN_INPUT, 1) P9_21B(PIN_INPUT, 7))	/* prg1_pru1_gpi18 */
	BONE_PIN(P9_21, gpio,      P9_21A(PIN_INPUT, 7) P9_21B(PIN_INPUT, 7))	/* gpio0_39 */
	BONE_PIN(P9_21, gpio_pu,   P9_21A(PIN_INPUT_PULLUP, 7) P9_21B(PIN_INPUT, 7))
	BONE_PIN(P9_21, gpio_pd,   P9_21A(PIN_INPUT_PULLDOWN, 7) P9_21B(PIN_INPUT, 7))
	BONE_PIN(P9_21, pwm,       P9_21A(PIN_INPUT, 7) P9_21B(PIN_OUTPUT, 6))	/* ehrpwm1_a */
	BONE_PIN(P9_21, spi,       P9_21A(PIN_OUTPUT, 4) P9_21B(PIN_INPUT, 7))	/* spi6_d0 */

	/* P9_22 (AC22/U29) PRG1_PRU1_GPO17/RGMII5_TXC (gpio0_38/gpio0_91) AC22_U29 */
	BONE_PIN(P9_22, default,   P9_22A(PIN_INPUT, 7) P9_22B(PIN_INPUT, 7))
	BONE_PIN(P9_22, pruout,    P9_22A(PIN_OUTPUT, 0) P9_22B(PIN_INPUT, 7))	/* prg1_pru1_gpo17 */
	BONE_PIN(P9_22, pruin,     P9_22A(PIN_INPUT, 1) P9_22B(PIN_INPUT, 7))	/* prg1_pru1_gpi17 */
	BONE_PIN(P9_22, gpio,      P9_22A(PIN_INPUT, 7) P9_22B(PIN_INPUT, 7))	/* gpio0_38 */
	BONE_PIN(P9_22, gpio_pu,   P9_22A(PIN_INPUT_PULLUP, 7) P9_22B(PIN_INPUT, 7))
	BONE_PIN(P9_22, gpio_pd,   P9_22A(PIN_INPUT_PULLDOWN, 7) P9_22B(PIN_INPUT, 7))
	BONE_PIN(P9_22, i2c,       P9_22A(PIN_INPUT, 7) P9_22B(PIN_INPUT_PULLUP, 2))	/* i2c6_scl */
	BONE_PIN(P9_22, pwm,       P9_22A(PIN_INPUT, 7) P9_22B(PIN_OUTPUT, 6))	/* ehrpwm1_b */
	BONE_PIN(P9_22, spi,       P9_22A(PIN_OUTPUT, 4) P9_22B(PIN_INPUT, 7))	/* spi6_clk */

	/* P9_23 (AG20) PRG1_PRU0_GPO9 (gpio0_10) AG20_SPI6_CS1 */
	BONE_PIN(P9_23, default,   P9_23(PIN_INPUT, 7))
	BONE_PIN(P9_23, pruout,    P9_23(PIN_OUTPUT, 0))	/* prg1_pru0_gpo9 */
	BONE_PIN(P9_23, pruin,     P9_23(PIN_INPUT, 1))		/* prg1_pru0_gpi9 */
	BONE_PIN(P9_23, gpio,      P9_23(PIN_INPUT, 7))
	BONE_PIN(P9_23, gpio_pu,   P9_23(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_23, gpio_pd,   P9_23(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P9_23, spi,       P9_23(PIN_OUTPUT, 4))	/* spi6_cs1 */

	/* P9_24 (Y5/AJ24) SPI1_D0/PRG1_PRU0_GPO12 (gpio0_119/gpio0_13) Y5_AJ24 */
	BONE_PIN(P9_24, default,   P9_24A(PIN_INPUT, 7) P9_24B(PIN_INPUT, 7))
	BONE_PIN(P9_24, pruout,    P9_24A(PIN_INPUT, 7) P9_24B(PIN_OUTPUT, 0))	/* prg1_pru0_gpo12 */
	BONE_PIN(P9_24, pruin,     P9_24A(PIN_INPUT, 7) P9_24B(PIN_INPUT, 1))	/* prg1_pru0_gpi12 */
	BONE_PIN(P9_24, can,       P9_24A(PIN_INPUT, 7) P9_24B(PIN_INPUT, 6) )	/* mcan4_rx */
	BONE_PIN(P9_24, gpio,      P9_24A(PIN_INPUT, 7) P9_24B(PIN_INPUT, 7))	/* gpio0_119 */
	BONE_PIN(P9_24, gpio_pu,   P9_24A(PIN_INPUT_PULLUP, 7) P9_24B(PIN_INPUT, 7))
	BONE_PIN(P9_24, gpio_pd,   P9_24A(PIN_INPUT_PULLDOWN, 7) P9_24B(PIN_INPUT, 7))
	BONE_PIN(P9_24, i2c,       P9_24A(PIN_INPUT_PULLUP, 2) P9_24B(PIN_INPUT, 7))	/* i2c4_scl */
	BONE_PIN(P9_24, uart,      P9_24A(PIN_OUTPUT, 3) P9_24B(PIN_INPUT, 7))	/* uart2_txd */

	/* P9_25 (AC4/W26) UART1_CTSn/RGMII6_RXC (gpio0_127/gpio0_104) AC4_W26 */
	BONE_PIN(P9_25, default,   P9_25A(PIN_INPUT, 7) P9_25B(PIN_INPUT, 7))
	BONE_PIN(P9_25, gpio,      P9_25A(PIN_INPUT, 7) P9_25B(PIN_INPUT, 7))	/* gpio0_127 */
	BONE_PIN(P9_25, gpio_pu,   P9_25A(PIN_INPUT_PULLUP, 7) P9_25B(PIN_INPUT, 7))
	BONE_PIN(P9_25, gpio_pd,   P9_25A(PIN_INPUT_PULLDOWN, 7) P9_25B(PIN_INPUT, 7))
	BONE_PIN(P9_25, pwm,       P9_25A(PIN_INPUT, 7) P9_25B(PIN_OUTPUT, 6))	/* ehrpwm4_b */
	BONE_PIN(P9_25, qep,       P9_25A(PIN_INPUT, 5) P9_25B(PIN_INPUT, 7))	/* eqep0_s */

	/* P9_26 (Y1/AF24) SPI1_CLK/PRG1_PRU0_GPO11 (gpio0_118/gpio0_12) Y1_AF24 */
	BONE_PIN(P9_26, default,   P9_26A(PIN_INPUT, 7) P9_26B(PIN_INPUT, 7))
	BONE_PIN(P9_26, pruout,    P9_26A(PIN_INPUT, 7) P9_26B(PIN_OUTPUT, 0))	/* prg1_pru0_gpo11 */
	BONE_PIN(P9_26, pruin,     P9_26A(PIN_INPUT, 7) P9_26B(PIN_INPUT, 1))	/* prg1_pru0_gpi11 */
	BONE_PIN(P9_26, can,       P9_26A(PIN_INPUT, 7) P9_26B(PIN_OUTPUT, 6) )	/* mcan4_tx */
	BONE_PIN(P9_26, gpio,      P9_26A(PIN_INPUT, 7) P9_26B(PIN_INPUT, 7))	/* gpio0_118 */
	BONE_PIN(P9_26, gpio_pu,   P9_26A(PIN_INPUT_PULLUP, 7) P9_26B(PIN_INPUT, 7))
	BONE_PIN(P9_26, gpio_pd,   P9_26A(PIN_INPUT_PULLDOWN, 7) P9_26B(PIN_INPUT, 7))
	BONE_PIN(P9_26, i2c,       P9_26A(PIN_INPUT_PULLUP, 2) P9_26B(PIN_INPUT, 7))	/* i2c4_sda */
	BONE_PIN(P9_26, uart,      P9_26A(PIN_INPUT, 3) P9_26B(PIN_INPUT, 7))	/* uart2_rxd */

	/* P9_27 (AD26/AB1) PRG0_PRU0_GPO3/UART0_RTSn (gpio0_46/gpio0_124) AD26_AB1 */
	BONE_PIN(P9_27, default,   P9_27A(PIN_INPUT, 7) P9_27B(PIN_INPUT, 7))
	BONE_PIN(P9_27, pruout,    P9_27A(PIN_OUTPUT, 0) P9_27B(PIN_INPUT, 7))	/* prg0_pru0_gpo3 */
	BONE_PIN(P9_27, pruin,     P9_27A(PIN_INPUT, 1) P9_27B(PIN_INPUT, 7))	/* prg0_pru0_gpi3 */
	BONE_PIN(P9_27, gpio,      P9_27A(PIN_INPUT, 7) P9_27B(PIN_INPUT, 7))	/* gpio0_46 */
	BONE_PIN(P9_27, gpio_pu,   P9_27A(PIN_INPUT_PULLUP, 7) P9_27B(PIN_INPUT, 7))
	BONE_PIN(P9_27, gpio_pd,   P9_27A(PIN_INPUT_PULLDOWN, 7) P9_27B(PIN_INPUT, 7))
	BONE_PIN(P9_27, qep,       P9_27A(PIN_INPUT, 7) P9_27B(PIN_INPUT, 5))	/* eqep0_b */

	/* P9_28 (U2/AF28) ECAP0_IN_APWM_OUT/PRG0_PRU0_GPO0 (gpio1_11/gpio0_43) U2_AF28 */
	BONE_PIN(P9_28, default,   P9_28A(PIN_INPUT, 7) P9_28B(PIN_INPUT, 7))
	BONE_PIN(P9_28, pruout,    P9_28A(PIN_INPUT, 7) P9_28B(PIN_OUTPUT, 0))	/* prg0_pru0_gpo0 */
	BONE_PIN(P9_28, pruin,     P9_28A(PIN_INPUT, 7) P9_28B(PIN_INPUT, 1))	/* prg0_pru0_gpi0 */
	BONE_PIN(P9_28, gpio,      P9_28A(PIN_INPUT, 7) P9_28B(PIN_INPUT, 7))	/* gpio1_11 */
	BONE_PIN(P9_28, gpio_pu,   P9_28A(PIN_INPUT_PULLUP, 7) P9_28B(PIN_INPUT, 7))
	BONE_PIN(P9_28, gpio_pd,   P9_28A(PIN_INPUT_PULLDOWN, 7) P9_28B(PIN_INPUT, 7))
	BONE_PIN(P9_28, spi,       P9_28A(PIN_OUTPUT, 6) P9_28B(PIN_INPUT, 7))	/* spi7_cs0 */

	/* P9_29 (V5/AB25) TIMER_IO1/PRG0_PRU0_GPO10 (gpio1_14/gpio0_53) V5_AB25 */
	BONE_PIN(P9_29, default,   P9_29A(PIN_INPUT, 7) P9_29B(PIN_INPUT, 7))
	BONE_PIN(P9_29, pruout,    P9_29A(PIN_INPUT, 7) P9_29B(PIN_OUTPUT, 0))	/* prg0_pru0_gpo10 */
	BONE_PIN(P9_29, pruin,     P9_29A(PIN_INPUT, 7) P9_29B(PIN_INPUT, 1))	/* prg0_pru0_gpi10 */
	BONE_PIN(P9_29, gpio,      P9_29A(PIN_INPUT, 7) P9_29B(PIN_INPUT, 7))	/* gpio1_14 */
	BONE_PIN(P9_29, gpio_pu,   P9_29A(PIN_INPUT_PULLUP, 7) P9_29B(PIN_INPUT, 7))
	BONE_PIN(P9_29, gpio_pd,   P9_29A(PIN_INPUT_PULLDOWN, 7) P9_29B(PIN_INPUT, 7))
	/* https://forum.beagleboard.org/t/bbai-64-bone-spi1-0-overlay-development-and-debug/34113/10 */
	BONE_PIN(P9_29, spi,       P9_29A(PIN_INPUT, 6) P9_29B(PIN_INPUT, 7))   /* spi7_d1 (tested PIN_INPUT) */

	/* P9_30 (V6/AE28) TIMER_IO0/PRG0_PRU0_GPO1 (gpio1_13/gpio0_44) V6_AE28 */
	BONE_PIN(P9_30, default,   P9_30A(PIN_INPUT, 7) P9_30B(PIN_INPUT, 7))
	BONE_PIN(P9_30, pruout,    P9_30A(PIN_INPUT, 7) P9_30B(PIN_OUTPUT, 0))	/* prg0_pru0_gpo1 */
	BONE_PIN(P9_30, pruin,     P9_30A(PIN_INPUT, 7) P9_30B(PIN_INPUT, 1))	/* prg0_pru0_gpi1 */
	BONE_PIN(P9_30, gpio,      P9_30A(PIN_INPUT, 7) P9_30B(PIN_INPUT, 7))	/* gpio1_13 */
	BONE_PIN(P9_30, gpio_pu,   P9_30A(PIN_INPUT_PULLUP, 7) P9_30B(PIN_INPUT, 7))
	BONE_PIN(P9_30, gpio_pd,   P9_30A(PIN_INPUT_PULLDOWN, 7) P9_30B(PIN_INPUT, 7))
	BONE_PIN(P9_30, spi,       P9_30A(PIN_OUTPUT, 6) P9_30B(PIN_INPUT, 7))	/* spi7_d0 */

	/* P9_31 (U3/AB26) EXT_REFCLK1/PRG0_PRU0_GPO9 (gpio1_12/gpio0_52) U3_AB26 */
	BONE_PIN(P9_31, default,   P9_31A(PIN_INPUT, 7) P9_31B(PIN_INPUT, 7))
	BONE_PIN(P9_31, pruout,    P9_31A(PIN_INPUT, 7) P9_31B(PIN_OUTPUT, 0))	/* prg0_pru0_gpo9 */
	BONE_PIN(P9_31, pruin,     P9_31A(PIN_INPUT, 7) P9_31B(PIN_INPUT, 1))	/* prg0_pru0_gpi9 */
	BONE_PIN(P9_31, gpio,      P9_31A(PIN_INPUT, 7) P9_31B(PIN_INPUT, 7))	/* gpio1_12 */
	BONE_PIN(P9_31, gpio_pu,   P9_31A(PIN_INPUT_PULLUP, 7) P9_31B(PIN_INPUT, 7))
	BONE_PIN(P9_31, gpio_pd,   P9_31A(PIN_INPUT_PULLDOWN, 7) P9_31B(PIN_INPUT, 7))
	BONE_PIN(P9_31, spi,       P9_31A(PIN_OUTPUT, 6) P9_31B(PIN_INPUT, 7))	/* spi7_clk */

	/* P9_32 - ADC_REF_OUT */

	/* P9_33 (K24/AC28) MCU_ADC0_AIN4/PRG0_PRU0_GPO7 (gpio0_50) K24_AC28 */
	BONE_PIN(P9_33, default,   P9_33B(PIN_INPUT, 7))
	BONE_PIN(P9_33, pruout,    P9_33B(PIN_OUTPUT, 0))	/* prg0_pru0_gpo7 */
	BONE_PIN(P9_33, pruin,     P9_33B(PIN_INPUT, 1))	/* prg0_pru0_gpi7 */
	BONE_PIN(P9_33, gpio,      P9_33B(PIN_INPUT, 7))
	BONE_PIN(P9_33, gpio_pu,   P9_33B(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_33, gpio_pd,   P9_33B(PIN_INPUT_PULLDOWN, 7))

	/* P9_34 - ADC_GND */

	/* P9_35 (K29/AH27) MCU_ADC0_AIN6/PRG0_PRU0_GPO12 (gpio0_55) K29_AH27 */
	BONE_PIN(P9_35, default,   P9_35B(PIN_INPUT, 7))
	BONE_PIN(P9_35, pruout,    P9_35B(PIN_OUTPUT, 0))	/* prg0_pru0_gpo12 */
	BONE_PIN(P9_35, pruin,     P9_35B(PIN_INPUT, 1))	/* prg0_pru0_gpi12 */
	BONE_PIN(P9_35, gpio,      P9_35B(PIN_INPUT, 7))
	BONE_PIN(P9_35, gpio_pu,   P9_35B(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_35, gpio_pd,   P9_35B(PIN_INPUT_PULLDOWN, 7))

	/* P9_36 (K27/AH29) MCU_ADC0_AIN5/PRG0_PRU0_GPO13 (gpio0_56) K27_AH29 */
	BONE_PIN(P9_36, default,   P9_36B(PIN_INPUT, 7))
	BONE_PIN(P9_36, pruout,    P9_36B(PIN_OUTPUT, 0))	/* prg0_pru0_gpo13 */
	BONE_PIN(P9_36, pruin,     P9_36B(PIN_INPUT, 1))	/* prg0_pru0_gpi13 */
	BONE_PIN(P9_36, gpio,      P9_36B(PIN_INPUT, 7))
	BONE_PIN(P9_36, gpio_pu,   P9_36B(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_36, gpio_pd,   P9_36B(PIN_INPUT_PULLDOWN, 7))

	/* P9_37 (K28/AG28) MCU_ADC0_AIN2/PRG0_PRU0_GPO14 (gpio0_57) K28_AG28 */
	BONE_PIN(P9_37, default,   P9_37B(PIN_INPUT, 7))
	BONE_PIN(P9_37, pruout,    P9_37B(PIN_OUTPUT, 0))	/* prg0_pru0_gpo14 */
	BONE_PIN(P9_37, pruin,     P9_37B(PIN_INPUT, 1))	/* prg0_pru0_gpi14 */
	BONE_PIN(P9_37, gpio,      P9_37B(PIN_INPUT, 7))
	BONE_PIN(P9_37, gpio_pu,   P9_37B(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_37, gpio_pd,   P9_37B(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P9_37, uart,      P9_37A(PIN_INPUT, 7) P9_37B(PIN_INPUT, 8))	/* uart4_rxd */

	/* P9_38 (L28/AG27) MCU_ADC0_AIN3/PRG0_PRU0_GPO15 (gpio0_58) L28_AG27 */
	BONE_PIN(P9_38, default,   P9_38B(PIN_INPUT, 7))
	BONE_PIN(P9_38, pruout,    P9_38B(PIN_OUTPUT, 0))	/* prg0_pru0_gpo15 */
	BONE_PIN(P9_38, pruin,     P9_38B(PIN_INPUT, 1))	/* prg0_pru0_gpi15 */
	BONE_PIN(P9_38, gpio,      P9_38B(PIN_INPUT, 7))
	BONE_PIN(P9_38, gpio_pu,   P9_38B(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_38, gpio_pd,   P9_38B(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P9_38, uart,      P9_38A(PIN_INPUT, 7) P9_38B(PIN_OUTPUT, 8))	/* uart4_txd */

	/* P9_39 (K25/AJ28) MCU_ADC0_AIN0/PRG0_PRU0_GPO11 (gpio0_54) K25_AJ28 */
	BONE_PIN(P9_39, default,   P9_39B(PIN_INPUT, 7))
	BONE_PIN(P9_39, pruout,    P9_39B(PIN_OUTPUT, 0))	/* prg0_pru0_gpo11 */
	BONE_PIN(P9_39, pruin,     P9_39B(PIN_INPUT, 1))	/* prg0_pru0_gpi11 */
	BONE_PIN(P9_39, gpio,      P9_39B(PIN_INPUT, 7))
	BONE_PIN(P9_39, gpio_pu,   P9_39B(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_39, gpio_pd,   P9_39B(PIN_INPUT_PULLDOWN, 7))

	/* P9_40 (K26/AA26) MCU_ADC0_AIN1/PRG0_PRU1_GPO18 (gpio0_81) K26_AA26 */
	BONE_PIN(P9_40, default,   P9_40B(PIN_INPUT, 7))
	BONE_PIN(P9_40, pruout,    P9_40B(PIN_OUTPUT, 0))	/* prg0_pru1_gpo18 */
	BONE_PIN(P9_40, pruin,     P9_40B(PIN_INPUT, 1))	/* prg0_pru1_gpi18 */
	BONE_PIN(P9_40, gpio,      P9_40B(PIN_INPUT, 7))
	BONE_PIN(P9_40, gpio_pu,   P9_40B(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_40, gpio_pd,   P9_40B(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P9_40, uart,      P9_40B(PIN_INPUT, 14))	/* uart2_rxd */

	/* P9_41 (AD5) UART1_RTSn (gpio1_0) AD5_EQEP0_I */
	BONE_PIN(P9_41, default,   P9_41(PIN_INPUT, 7))
	BONE_PIN(P9_41, pruout,    P9_41(PIN_OUTPUT, 0))
	BONE_PIN(P9_41, pruin,     P9_41(PIN_INPUT, 1))
	BONE_PIN(P9_41, gpio,      P9_41(PIN_INPUT, 7))
	BONE_PIN(P9_41, gpio_pu,   P9_41(PIN_INPUT_PULLUP, 7))
	BONE_PIN(P9_41, gpio_pd,   P9_41(PIN_INPUT_PULLDOWN, 7))
	BONE_PIN(P9_41, qep,       P9_41(PIN_INPUT, 5))	/* eqep0_i */

	/* P9_42 (AC2/AJ21) UART0_CTSn/PRG1_PRU0_GPO17 (gpio0_123/gpio0_18) AC2_AJ21 */
	BONE_PIN(P9_42, default,   P9_42A(PIN_INPUT, 7) P9_42B(PIN_INPUT, 7))
	BONE_PIN(P9_42, pruout,    P9_42A(PIN_INPUT, 7) P9_42B(PIN_OUTPUT, 0))	/* prg1_pru0_gpo17 */
	BONE_PIN(P9_42, pruin,     P9_42A(PIN_INPUT, 7) P9_42B(PIN_INPUT, 1))	/* prg1_pru0_gpi17 */
	BONE_PIN(P9_42, can,       P9_42A(PIN_INPUT, 7) P9_42B(PIN_OUTPUT, 6) )	/* mcan5_tx */
	BONE_PIN(P9_42, gpio,      P9_42A(PIN_INPUT, 7) P9_42B(PIN_INPUT, 7))	/* gpio0_123 */
	BONE_PIN(P9_42, gpio_pu,   P9_42A(PIN_INPUT_PULLUP, 7) P9_42B(PIN_INPUT, 7))
	BONE_PIN(P9_42, gpio_pd,   P9_42A(PIN_INPUT_PULLDOWN, 7) P9_42B(PIN_INPUT, 7))
	BONE_PIN(P9_42, qep,       P9_42A(PIN_INPUT, 5) P9_42B(PIN_INPUT, 7))	/* eqep0_a */

	/* P9_43 - GND */
	/* P9_44 - GND */
	/* P9_45 - GND */
	/* P9_46 - GND */

	// Additional Pinmux for UART6 (used by BONE-UART4)
	uart6_pins_default: uart6-pins-default {
		pinctrl-single,pins = <
			P9_14(PIN_INPUT, 3)   /* UART6 RX */
			P9_16(PIN_OUTPUT, 3)  /* UART6 TX */
		>;
	};

	p8_19_gpio_pin: pinmux_p8_19_gpio_pin {
			pinctrl-single,pins = <
					P8_19(PIN_INPUT, 7)
			>;
	};

	p8_33_gpio_pin: pinmux_p8_33_gpio_pin {
			pinctrl-single,pins = <
					P8_33A(PIN_INPUT, 7)
			>;
	};
};

/*
 * --------------------------------------------------
 * This file maps the UART, CAN, GPIO peripherals to their respective hardware resources,
 * such as pins, power domains, and symlink aliases.
 *
 * Structure of Configuration:
 * ---------------------------
 * <label>: &<reference_node> {
 *     pinctrl-names: Defines the pinctrl state (e.g., "default").
 *     pinctrl-0:     Specifies the pinmux settings for this peripheral.
 *     symlink:       Defines the alias used for this peripheral (e.g., bone/uart/X).
 *     power-domains: Specifies the power domain for the UART peripheral.
 *     status:        Enables ("okay") or disables ("disabled") the peripheral.
 * };
 *
 * Notes:
 * - Labels (e.g., bone_uart_0, bone_uart_1) are logical names used for referencing.
 * - References (e.g., &main_uart0, &main_uart2) point to the base hardware definitions in the SoC-level .dtsi file as defined in: k3-j721e-main.dtsi
 */

// ========================================
// UART configuration for BeagleBone AI-64
// ========================================

/* BeagleBoard AI64 UART Port Mapping Table as defined here: https://docs.beagleboard.org/boards/capes/cape-interface-spec.html#id48
 *
 * +-----------------+-------------+---------+---------+---------+---------------------+
 * | Bone Bus        | DT Symbol   | AI-64   | TX      | RX      | Overlay             |
 * +-----------------+-------------+---------+---------+---------+---------------------+
 * | /dev/bone/uart/0| bone_uart_0 | MAIN_UART0 | P9.24 | P9.26  | Console Debug       |
 * | /dev/bone/uart/1| bone_uart_1 | MAIN_UART2 | P9.24 | P9.26  | BONE-UART1          |
 * | /dev/bone/uart/2| bone_uart_2 | n/a       | P9.21 | P9.22  | BONE-UART2          |
 * | /dev/bone/uart/3| bone_uart_3 | n/a       | P9.42 | n/a    | BONE-UART3          |
 * | /dev/bone/uart/4| bone_uart_4 | MAIN_UART0| P9.13 | P9.11  | BONE-UART4          |
 * | /dev/bone/uart/5| bone_uart_5 | MAIN_UART5| P8.37 | P8.38  | BONE-UART5          |
 * | /dev/bone/uart/6| bone_uart_6 | MAIN_UART8| P8.29 | P8.30  | BONE-UART6          |
 * | /dev/bone/uart/7| bone_uart_7 | MAIN_UART2| P8.34 | P8.22  | BONE-UART7          |
 * +-----------------+-------------+---------+---------+---------+---------------------+
 *
 * Notes:
 * - The important fields are the AI-64, TX, and RX columns which map to the physical pins on the board and cannot be renamed or changed
 */

/* UART 1: Peripheral on Pins P9_24 (TX) and P9_26 (RX) */
bone_uart_1: &main_uart2 { 
    /* 
     * Description: 
     * 
     * Notes:
     * - UART is enabled in BONE-UART1.dts
     */
    pinctrl-names = "default";
    pinctrl-0 = <
        &P9_24_uart_pin /* TX */
        &P9_26_uart_pin /* RX */
    >;
    symlink = "bone/uart/1";
    status = "disabled";
};

/* UART 2: Peripheral on Pins P8_37 (TX) and P8_38 (RX) */
bone_uart_2: &main_uart5 {
    /* 
     * Description:
     * 
     * Notes:
     * - UART is enabled in BONE-UART2.dts
     */
    pinctrl-names = "default";
    pinctrl-0 = <
        &P8_37_uart_pin /* TX */
        &P8_38_uart_pin /* RX */
    >;
    symlink = "bone/uart/2";
    status = "disabled";
};

/* UART 3: Peripheral on Pins P8_29 (TX) and P8_28 (RX) */
bone_uart_3: &main_uart8 {
    /* 
     * Description:
     * 
     * Notes:
     * - UART is enabled in BONE-UART3.dts
     */
    pinctrl-names = "default";
    pinctrl-0 = <
        &P8_29_uart_pin /* TX */
        &P8_28_uart_pin /* RX */
    >;
    symlink = "bone/uart/3";
    status = "disabled";
};

/* UART4 Configuration */
bone_uart_4: &main_uart6 {
	pinctrl-names = "default";
	pinctrl-0 = <&uart6_pins_default>;
	symlink = "bone/uart/4";
	status = "disabled"; // Default disabled; enabled via overlay
};

// ========================================
// CAN configuration for BeagleBone AI-64
// ========================================

/* BeagleBoard AI64 CAN Port Mapping Table as defined here: https://docs.beagleboard.org/boards/capes/cape-interface-spec.html#id50
 *
 * +------------------+---------+---------+---------------------+
 * | Bone Bus         | AI-64   | TX      | RX      | Overlay   |
 * +------------------+---------+---------+---------+-----------+
 * | /dev/bone/can/0  | MAIN_MCAN0 | P9.20 | P9.19  | BONE-CAN0 |
 * | /dev/bone/can/1  | MAIN_MCAN4 | P9.26 | P9.24  | BONE-CAN1 |
 * | /dev/bone/can/2  | MAIN_MCAN5 | P8.08 | P8.07  | BONE-CAN2 |
 * | /dev/bone/can/3  | MAIN_MCAN6 | P8.10 | P8.09  | BONE-CAN3 |
 * | /dev/bone/can/4  | MAIN_MCAN7 | P8.05 | P8.06  | BONE-CAN4 |
 * +------------------+---------+---------+---------+-----------+
 *
 * Notes:
 * - The important fields are the AI-64, TX, and RX columns which map to the physical pins on the board and cannot be renamed or changed
 */

/* CAN 1: Peripheral on Pins P8_10 (TX) and P8_09 (RX) */
bone_can_1: &main_mcan6 { 
    /* 
     * Description: 
     * 
     * Notes:
     * - CAN is enabled in BONE-CAN1.dts
     */
    pinctrl-names = "default";
    pinctrl-0 = <
        &P8_10_can_pin /* TX */
        &P8_09_can_pin /* RX */
    >;
    symlink = "bone/can/1";
    status = "disabled";
};

/* CAN 2: Peripheral on Pins P8_08 (TX) and P8_07 (RX) */
bone_can_2: &main_mcan5 { 
    /* 
     * Description: 
     * 
     * Notes:
     * - CAN is enabled in BONE-CAN2.dts
     */
    pinctrl-names = "default";
    pinctrl-0 = <
        &P8_08_can_pin /* TX */
        &P8_07_can_pin /* RX */
    >;
    symlink = "bone/can/2";
    status = "disabled";
};

/* CAN 3: Peripheral on Pins P9_20 (TX) and P9_19 (RX) */
bone_can_3: &main_mcan0 { 
    /* 
     * Description: 
     * 
     * Notes:
     * - CAN is enabled in BONE-CAN3.dts
     */
    pinctrl-names = "default";
    pinctrl-0 = <
        &P9_20_can_pin /* TX */
        &P9_19_can_pin /* RX */
    >;
    symlink = "bone/can/3";
    status = "disabled";
};

/* CAN 4: Peripheral on Pins P8_05 (TX) and P8_06 (RX) */
bone_can_4: &main_mcan7 { 
    /* 
     * Description: 
     * 
     * Notes:
     * - CAN is enabled in BONE-CAN4.dts
     */
    pinctrl-names = "default";
    pinctrl-0 = <
        &P8_05_can_pin /* TX */
        &P8_06_can_pin /* RX */
    >;
    symlink = "bone/can/4";
    status = "disabled";
};


 // ========================================
// GPIO configuration for BeagleBone AI-64
// ========================================

/* BeagleBoard AI-64 GPIO Mapping Table as defined here:
 * https://docs.beagleboard.org/boards/capes/cape-interface-spec.html#digital-gpio
 *
 * +----------------------+-----------+------------+
 * | SYSFS link           | AI-64     | Header Pin |
 * +----------------------+-----------+------------+
 * | /sys/class/leds/P8_19| gpio0_88  | P8.19      |
 * | /sys/class/leds/P8_33| gpio0_25  | P8.33      |
 * +----------------------+-----------+------------+
 *
 * Notes:
 * - The important fields are the AI-64 values, which map to the physical pins 
 *   on the board and cannot be renamed or changed.
 */

&main_gpio0 {
		bone_gpio_1: bone-gpio-1 {
				compatible = "mytra,raw-gpio-pin";
				pinctrl-names = "default";
				pinctrl-0 = <&p8_19_gpio_pin>;
				gpios = <&main_gpio0 88 GPIO_ACTIVE_HIGH>;
				symlink = "bone/gpio/1";
				status = "disabled";
		};

		bone_gpio_2: bone-gpio-2 {
				compatible = "mytra,raw-gpio-pin";
				pinctrl-names = "default";
				pinctrl-0 = <&p8_33_gpio_pin>;
				gpios = <&main_gpio0 25 GPIO_ACTIVE_HIGH>;
				symlink = "bone/gpio/2";
				status = "disabled";
		};
};
  1. Our device tree change:
// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (C) 2022 BeagleBoard.org - https://beagleboard.org/
 *
 * Combined overlay to enable UART1, UART2, UART3, and UART4 on BeagleBone AI-64
 */

/dts-v1/;
/plugin/;

#include <dt-bindings/pinctrl/k3.h>
#include <dt-bindings/board/k3-j721e-bone-pins.h>

/*
 * Helper to show loaded overlays under: /proc/device-tree/chosen/overlays/
 */
&{/chosen} {
    overlays {
        BONE-UART1.kernel = __TIMESTAMP__;
        BONE-UART2.kernel = __TIMESTAMP__;
        BONE-UART3.kernel = __TIMESTAMP__;
        BONE-UART4.kernel = __TIMESTAMP__;
    };
};

/*
 * Enable UART1 Peripheral as defined in: k3-j721e-beagleboneai64-bone-buses.dtsi
 */
&bone_uart_1 {
    status = "okay"; // Enable UART1
};

/*
 * Enable UART2 Peripheral as defined in: k3-j721e-beagleboneai64-bone-buses.dtsi
 */
&bone_uart_2 {
    status = "okay"; // Enable UART2
};

/*
 * Enable UART3 Peripheral as defined in: k3-j721e-beagleboneai64-bone-buses.dtsi
 */
&bone_uart_3 {
    status = "okay"; // Enable UART3
};

/*
 * Enable UART4 Peripheral as defined in: k3-j721e-beagleboneai64-bone-buses.dtsi
 */
&bone_uart_4 {
    status = "okay"; // Enable UART4
};
  1. extlinux.conf bootloader config change:
menu title BeagleBone AI-64 microSD (extlinux.conf) Options

timeout 50

default BeagleBone AI-64 microSD (default)

label BeagleBone AI-64 microSD Recovery
    kernel /Image
    append root=/dev/mmcblk1p2 ro rootfstype=ext4 rootwait net.ifnames=0
    fdtdir /
    initrd /initrd.img

label BeagleBone AI-64 copy microSD to eMMC
    kernel /Image
    append root=/dev/mmcblk1p2 ro rootfstype=ext4 rootwait net.ifnames=0 init=/usr/sbin/init-beagle-flasher
    fdtdir /
    initrd /initrd.img

label BeagleBone AI-64 microSD (default)
    kernel /Image
    append root=/dev/mmcblk1p2 ro rootfstype=ext4 rootwait net.ifnames=0 quiet console=null
    # The "console=null" disables the debug console, which otherwise uses MAIN_UART0
    fdtdir /
    fdtoverlays /overlays/BONE-UART1.dtbo /overlays/BONE-UART2.dtbo /overlays/BONE-UART3.dtbo /overlays/BONE-UART4.dtbo /overlays/BONE-CAN1.dtbo /overlays/BONE-CAN2.dtbo /overlays/BONE-CAN3.dtbo /overlays/BONE-CAN4.dtbo /overlays/BONE-GPIO1.dtbo /overlays/BONE-GPIO2.dtbo
    initrd /initrd.img

Deployment strategy

  1. Transfer all relevant files to the Beaglebone Ai64 target:
#!/bin/bash

#########################################
# Script to Transfer Device Tree Files
# 
# Description:
# - This script transfers the relevant .dts files, extlinux.conf, base .dtsi file,
#   and the GPIO test script to the target device.
# - It also transfers pre and post-reboot automation scripts to the target's home directory.
#
# Usage:
# - Place this script in hw/scripts.
# - Run the script from the hw directory.
# - Provide the target IP address as the first argument when running the script.
#
# Example:
# ./scripts/transfer_dtb_files.sh 172.16.101.21
#
#########################################

# Check if target IP is provided
if [ -z "$1" ]; then
    echo -e "\033[0;31mError: Please provide the target IP as the first argument.\033[0m"
    echo "Usage: $0 <TARGET_IP>"
    exit 1
fi

# Define variables for the target IP and directories
TARGET_IP="$1"
OVERLAYS_DIR="/opt/source/dtb-5.10-ti/src/arm64/overlays"
BASE_DIR="/opt/source/dtb-5.10-ti/src/arm64"
TMP_DIR="/tmp"
HOME_DIR="/home/debian"

# Directories relative to the script's location
SCRIPT_DIR="$(dirname "$0")"
OVERLAYS_PATH="$(realpath "$SCRIPT_DIR/../overlays")"
CONFIGS_PATH="$(realpath "$SCRIPT_DIR/../configs")"
BASE_PATH="$(realpath "$SCRIPT_DIR/../base")"
SCRIPTS_PATH="$(realpath "$SCRIPT_DIR/../scripts")"

# Colored output functions
function print_green() {
    echo -e "\033[0;32m$1\033[0m"
}

function print_red() {
    echo -e "\033[0;31m$1\033[0m"
}

function print_yellow() {
    echo -e "\033[0;33m$1\033[0m"
}

# Files to copy
DTS_FILES=(
    "BONE-CAN1.dts"
    "BONE-CAN2.dts"
    "BONE-CAN3.dts"
    "BONE-CAN4.dts"
    "BONE-UART1.dts"
    "BONE-UART2.dts"
    "BONE-UART3.dts"
    "BONE-UART4.dts"
    "BONE-GPIO1.dts"
    "BONE-GPIO2.dts"
)
AUTOMATION_SCRIPTS=(
    "pre_reboot_setup.sh"
    "post_reboot_verification.sh"
)
EXTLINUX_FILE="extlinux.conf"
DTB_FILE="k3-j721e-beagleboneai64-bone-buses.dtsi"
GPIO_TEST_SCRIPT="setup_and_run_gpio_test.sh"

# Function to copy files
function copy_files() {
    local target_ip="$1"

    # Copy DTS overlay files
    print_yellow "Copying DTS overlay files to target..."
    for dts_file in "${DTS_FILES[@]}"; do
        local source_path="$OVERLAYS_PATH/$dts_file"
        if [ -f "$source_path" ]; then
            scp "$source_path" "debian@${target_ip}:${OVERLAYS_DIR}"
            print_green "Copied $dts_file to ${OVERLAYS_DIR}"
        else
            print_red "$dts_file does not exist in $OVERLAYS_PATH. Skipping."
        fi
    done

    # Copy base DTS file
    local base_dtb_path="$BASE_PATH/$DTB_FILE"
    if [ -f "$base_dtb_path" ]; then
        print_yellow "Copying base DTS file to target..."
        scp "$base_dtb_path" "debian@${target_ip}:${BASE_DIR}"
        print_green "Copied $DTB_FILE to ${BASE_DIR}"
    else
        print_red "$DTB_FILE does not exist in $BASE_PATH. Skipping."
    fi

    # Copy extlinux.conf
    local extlinux_path="$CONFIGS_PATH/$EXTLINUX_FILE"
    if [ -f "$extlinux_path" ]; then
        print_yellow "Copying extlinux.conf to target..."
        scp "$extlinux_path" "debian@${target_ip}:${TMP_DIR}"
        print_green "Copied $EXTLINUX_FILE to ${TMP_DIR}"
    else
        print_red "$EXTLINUX_FILE does not exist in $CONFIGS_PATH. Skipping."
    fi

    # Copy automation scripts to the target's home directory
    print_yellow "Copying automation scripts to target..."
    for script in "${AUTOMATION_SCRIPTS[@]}"; do
        local_script_path="$SCRIPTS_PATH/$script"
        if [ -f "$local_script_path" ]; then
            scp "$local_script_path" "debian@${target_ip}:${HOME_DIR}/"
            print_green "Copied $script to ${HOME_DIR} on the target."
        else
            print_red "$script does not exist in $SCRIPTS_PATH. Skipping."
        fi
    done

    # Copy GPIO test script to the target's home directory
    local gpio_test_script_path="$SCRIPTS_PATH/$GPIO_TEST_SCRIPT"
    if [ -f "$gpio_test_script_path" ]; then
        print_yellow "Copying GPIO test script to target..."
        scp "$gpio_test_script_path" "debian@${target_ip}:${HOME_DIR}/"
        print_green "Copied $GPIO_TEST_SCRIPT to ${HOME_DIR} on the target."
    else
        print_red "$GPIO_TEST_SCRIPT does not exist in $SCRIPTS_PATH. Skipping."
    fi
}

# Run the file copy process
copy_files "$TARGET_IP"

# End script
print_green "File transfer process completed."
  1. Build device tree modifications on the target
#!/bin/bash

#########################################
# Pre-Reboot Setup Script for BeagleBone
#
# Description:
# - Builds and installs device tree files.
# - Updates extlinux.conf with the transferred version.
# - Issues a reboot command.
#########################################

# Password for sudo
PASSWORD="temppwd"

# Directories and files
DTB_DIR="/opt/source/dtb-5.10-ti/"
EXTLINUX_CONF="/boot/firmware/extlinux/extlinux.conf"
TMP_EXTLINUX_CONF="/tmp/extlinux.conf"

# Colored output functions
function print_green() {
    echo -e "\033[0;32m$1\033[0m"
}

function print_red() {
    echo -e "\033[0;31m$1\033[0m"
}

function print_yellow() {
    echo -e "\033[0;33m$1\033[0m"
}

# 1. Build and Install Device Tree Files
print_yellow "Step 1: Building and installing device tree files..."
cd "$DTB_DIR" || { print_red "Failed to change directory to $DTB_DIR"; exit 1; }
echo "$PASSWORD" | sudo -S make clean && make && sudo make install && sync
if [ $? -eq 0 ]; then
    print_green "Device tree build and installation completed successfully."
else
    print_red "Device tree build and installation failed. Exiting."
    exit 1
fi

# 2. Update extlinux.conf
print_yellow "Step 2: Updating extlinux.conf..."
if [ -f "$TMP_EXTLINUX_CONF" ]; then
    echo "$PASSWORD" | sudo -S cp "$TMP_EXTLINUX_CONF" "$EXTLINUX_CONF"
    if [ $? -eq 0 ]; then
        print_green "extlinux.conf updated successfully."
    else
        print_red "Failed to update extlinux.conf. Exiting."
        exit 1
    fi
else
    print_red "Temporary extlinux.conf file not found at $TMP_EXTLINUX_CONF. Exiting."
    exit 1
fi

# 3. Reboot the System
print_yellow "Step 3: Rebooting the system..."
echo "$PASSWORD" | sudo -S reboot
if [ $? -eq 0 ]; then
    print_green "Reboot command issued successfully."
else
    print_red "Failed to issue reboot command. Exiting."
    exit 1
fi
  1. Post reboot, verify the device trees were loaded
#!/bin/bash

#########################################
# Post-Reboot Verification Script
#
# Description:
# - Verifies that the U-Boot and overlays are properly installed.
# - Verifies UART symlinks.
#########################################

# Colored output functions
function print_green() {
    echo -e "\033[0;32m$1\033[0m"
}

function print_red() {
    echo -e "\033[0;31m$1\033[0m"
}

function print_yellow() {
    echo -e "\033[0;33m$1\033[0m"
}

# Expected U-Boot output
EXPECTED_UBOOT_OUTPUT=(
    "UBOOT: Booted Device-Tree:[k3-j721e-beagleboneai64.dts]"
    "UBOOT: Loaded Overlay:[BONE-CAN1.kernel]"
    "UBOOT: Loaded Overlay:[BONE-CAN2.kernel]"
    "UBOOT: Loaded Overlay:[BONE-CAN3.kernel]"
    "UBOOT: Loaded Overlay:[BONE-CAN4.kernel]"
    "UBOOT: Loaded Overlay:[BONE-UART1.kernel]"
    "UBOOT: Loaded Overlay:[BONE-UART2.kernel]"
    "UBOOT: Loaded Overlay:[BONE-UART3.kernel]"
    "UBOOT: Loaded Overlay:[BONE-UART4.kernel]"
    "UBOOT: Loaded Overlay:[BONE-GPIO1.kernel]"
    "UBOOT: Loaded Overlay:[BONE-GPIO2.kernel]"
)

# 1. Verify U-Boot and Overlays
print_yellow "Step 1: Verifying U-Boot and overlays..."
UBOOT_OUTPUT=$(sudo beagle-version | grep UBOOT)
echo "$UBOOT_OUTPUT" | tee /tmp/uboot_verification.log

# Check each expected line in the output
UBOOT_PASS=true
for expected_line in "${EXPECTED_UBOOT_OUTPUT[@]}"; do
    if ! echo "$UBOOT_OUTPUT" | grep -qF "$expected_line"; then
        print_red "Missing expected line: $expected_line"
        UBOOT_PASS=false
    fi
done

if $UBOOT_PASS; then
    print_green "UBOOT verification passed."
else
    print_red "UBOOT verification failed."
    exit 1
fi

# 2. Verify UART Symlinks
print_yellow "Step 2: Verifying UART symlinks..."
UART_OUTPUT=$(for i in /dev/bone/uart/*; do echo "$i is linked to $(readlink -f $i)"; done)
echo "$UART_OUTPUT" | tee /tmp/uart_verification.log

EXPECTED_UART_LINKS=(
    "/dev/bone/uart/1 is linked to /dev/ttyS4"
    "/dev/bone/uart/2 is linked to /dev/ttyS7"
    "/dev/bone/uart/3 is linked to /dev/ttyS0"
    "/dev/bone/uart/4 is linked to /dev/ttyS8"
)

# Check each expected UART symlink
UART_PASS=true
for expected_link in "${EXPECTED_UART_LINKS[@]}"; do
    if ! echo "$UART_OUTPUT" | grep -qF "$expected_link"; then
        print_red "Missing expected UART link: $expected_link"
        UART_PASS=false
    fi
done

if $UART_PASS; then
    print_green "UART symlink verification passed."
else
    print_red "UART symlink verification failed."
    exit 1
fi

print_green "All post-reboot verification steps completed successfully."
exit 0

Relevant resources:

Additional information:

Important information
When testing UART with the minicom utility on the BeagleBone Ai64, make sure to go into the settings everytime you connect to a UART port (ex. sudo minicom -D /dev/bone/uart/4 -b 115200), and set the hardware control off as mentioned by @benedict.hewson above: How can I enable the 5 UARTs of the beaglebone AI-64? - #12 by benedict.hewson