Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ on:
- 'pab-[0-9]*'
- 'jaj-[0-9]*'
- 'pab-v3-[0-9]*'
- 'pab-can-[0-9]*'
pull_request:

concurrency:
Expand Down Expand Up @@ -42,8 +43,9 @@ jobs:
run: |
TAG="${GITHUB_REF_NAME}"
case "$TAG" in
pab-v3-*) PRODUCT="pab-v3"; VERSION="${TAG#pab-v3-}"; TARGET="PAB_V3" ;;
pab-*) PRODUCT="pab"; VERSION="${TAG#pab-}"; TARGET="PAB" ;;
pab-v3-*) PRODUCT="pab-v3"; VERSION="${TAG#pab-v3-}"; TARGET="PAB_V3" ;;
pab-can-*) PRODUCT="pab-can"; VERSION="${TAG#pab-can-}"; TARGET="PAB_CAN" ;;
pab-*) PRODUCT="pab"; VERSION="${TAG#pab-}"; TARGET="PAB" ;;
jaj-*) PRODUCT="jaj"; VERSION="${TAG#jaj-}"; TARGET="JAJ" ;;
*) echo "::error::Unrecognized tag format: $TAG"; exit 1 ;;
esac
Expand Down
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Scripts for building and flashing a Jetson **Orin Nano** or **Orin NX** on an AR
| `PAB` | ARK Jetson PAB Carrier |
| `JAJ` | ARK Just a Jetson Carrier |
| `PAB_V3` | ARK Jetson PAB V3 Carrier |
| `PAB_CAN` | ARK PAB CAN Jetson Carrier |

## Build & Flash

Expand All @@ -31,7 +32,7 @@ Download the BSP, root filesystem, and kernel source tarballs (one time):
```
./build.sh PAB --clean --provision
```
- Targets are `PAB`, `JAJ`, `PAB_V3`, or `all`.
- Targets are `PAB`, `JAJ`, `PAB_V3`, `PAB_CAN`, or `all`.
- `--clean` wipes `staging/{TARGET}/` and re-stages from scratch.
- `--provision` preinstalls [ARK-OS](https://github.com/ARK-Electronics/ARK-OS) and tooling into the image. Omit it for a bare image. To bake in your own packages, edit [`provision.sh`](provision.sh).

Expand Down Expand Up @@ -68,7 +69,7 @@ ssh jetson@jetson.local

## Cameras

Every carrier ships with an IMX219 overlay already selected, so cameras work out of the box: the quad overlay on **PAB**, the dual overlay on **JAJ** and **PAB_V3**. To use a different camera, select an overlay with NVIDIA's `jetson-io` tool. List what's available:
Every carrier ships with an IMX219 overlay already selected, so cameras work out of the box: the quad overlay on **PAB**, the dual overlay on **JAJ**, **PAB_V3**, and **PAB_CAN**. To use a different camera, select an overlay with NVIDIA's `jetson-io` tool. List what's available:
```
sudo /opt/nvidia/jetson-io/config-by-hardware.py -l
```
Expand Down
26 changes: 14 additions & 12 deletions build.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/bin/bash

# Usage: ./build.sh <PAB|JAJ|PAB_V3|all> [--clean] [--provision]
# Usage: ./build.sh <PAB|JAJ|PAB_V3|PAB_CAN|all> [--clean] [--provision]
# --clean wipe staging/{TARGET}/ and re-stage from downloads before building
# --provision install ARK-OS into the rootfs (staging only: first build or --clean)
#
Expand All @@ -21,13 +21,13 @@ TARGET=""

for arg in "$@"; do
case "$arg" in
PAB|JAJ|PAB_V3) TARGET="$arg" ;;
PAB|JAJ|PAB_V3|PAB_CAN) TARGET="$arg" ;;
all) TARGET="all" ;;
--clean) CLEAN=1 ;;
--provision) PROVISION=1 ;;
*)
echo "Invalid argument: $arg" >&2
echo "Usage: $0 <PAB | JAJ | PAB_V3 | all> [--clean] [--provision]" >&2
echo "Usage: $0 <PAB | JAJ | PAB_V3 | PAB_CAN | all> [--clean] [--provision]" >&2
exit 1
;;
esac
Expand All @@ -40,18 +40,20 @@ if [ -z "$TARGET" ]; then
echo "1) PAB"
echo "2) JAJ"
echo "3) PAB_V3"
echo "4) all"
read -p "Enter your choice (1-4): " choice
echo "4) PAB_CAN"
echo "5) all"
read -p "Enter your choice (1-5): " choice
case $choice in
1|PAB) TARGET="PAB" ;;
2|JAJ) TARGET="JAJ" ;;
3|PAB_V3) TARGET="PAB_V3" ;;
4|all) TARGET="all" ;;
1|PAB) TARGET="PAB" ;;
2|JAJ) TARGET="JAJ" ;;
3|PAB_V3) TARGET="PAB_V3" ;;
4|PAB_CAN) TARGET="PAB_CAN" ;;
5|all) TARGET="all" ;;
*) echo "Invalid choice. Exiting."; exit 1 ;;
esac
else
echo "ERROR: target required (PAB | JAJ | PAB_V3 | all) when running non-interactively." >&2
echo "Usage: $0 <PAB | JAJ | PAB_V3 | all> [--clean] [--provision]" >&2
echo "ERROR: target required (PAB | JAJ | PAB_V3 | PAB_CAN | all) when running non-interactively." >&2
echo "Usage: $0 <PAB | JAJ | PAB_V3 | PAB_CAN | all> [--clean] [--provision]" >&2
exit 1
fi
fi
Expand Down Expand Up @@ -96,7 +98,7 @@ sudo -v

if [ "$TARGET" = "all" ]; then
trap 'echo ""; echo "Aborted."; exit 130' INT
for t in PAB JAJ PAB_V3; do
for t in PAB JAJ PAB_V3 PAB_CAN; do
echo ""
echo "========================================="
echo " Building $t"
Expand Down
17 changes: 9 additions & 8 deletions docs/cameras.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,25 @@ This document covers tested camera sensors, available device tree overlays, and

| Sensor | Lanes | Resolution | Overlays | Status |
|--------|-------|------------|----------|--------|
| IMX219 | 2 | 3280x2464 | dual (JAJ/PAB_V3), quad (PAB) | Working |
| IMX477 | 2 | 4056x3040 | dual (JAJ/PAB_V3), quad (PAB) | Working |
| IMX708 | 2 | 4608x2592 | dual (JAJ/PAB_V3), quad (PAB) | Working |
| IMX219 | 2 | 3280x2464 | dual (JAJ/PAB_V3/PAB_CAN), quad (PAB) | Working |
| IMX477 | 2 | 4056x3040 | dual (JAJ/PAB_V3/PAB_CAN), quad (PAB) | Working |
| IMX708 | 2 | 4608x2592 | dual (JAJ/PAB_V3/PAB_CAN), quad (PAB) | Working |

Each carrier ships exactly one overlay per sensor: dual on JAJ / PAB_V3 (two CSI ports), quad on PAB (four CSI ports).
Each carrier ships exactly one overlay per sensor: dual on JAJ / PAB_V3 / PAB_CAN (two CSI ports), quad on PAB (four CSI ports).

## IMX219 (Sony, 8MP)

Tested and working in 2-lane mode.

- **PAB**: Tested on all 4 CSI ports (quad overlay)
- **JAJ / PAB_V3**: Tested on both CSI ports (dual overlay)
- **PAB_CAN**: same dev-kit CSI wiring as PAB_V3 (dual overlay)

### Overlays

| Overlay | Filename | Ports |
|---------|----------|-------|
| Dual | `tegra234-p3767-camera-p3768-imx219-dual.dtbo` | CAM0 + CAM1 (JAJ/PAB_V3 default) |
| Dual | `tegra234-p3767-camera-p3768-imx219-dual.dtbo` | CAM0 + CAM1 (JAJ/PAB_V3/PAB_CAN default) |
| Quad | `tegra234-p3767-camera-p3768-imx219-quad.dtbo` | All 4 ports (PAB default) |

## IMX477 (Sony Starvis, 12.3MP)
Expand All @@ -34,7 +35,7 @@ Tested and working in 2-lane mode on all carrier boards.

| Overlay | Filename | Ports |
|---------|----------|-------|
| Dual | `tegra234-p3767-camera-p3768-imx477-dual.dtbo` | CAM0 + CAM1 (JAJ/PAB_V3) |
| Dual | `tegra234-p3767-camera-p3768-imx477-dual.dtbo` | CAM0 + CAM1 (JAJ/PAB_V3/PAB_CAN) |
| Quad | `tegra234-p3767-camera-p3768-imx477-quad.dtbo` | All 4 ports (PAB) |

The quad overlay is new and not yet hardware-validated: it pairs the port wiring of the IMX219 quad (the PAB default) with the sensor modes of the retired single overlay.
Expand All @@ -53,7 +54,7 @@ Driver is RidgeRun's `nv_imx708`, vendored under `kernel_overlay/`. One 10-bit m

| Overlay | Filename | Ports |
|---------|----------|-------|
| Dual | `tegra234-p3767-camera-p3768-imx708-dual.dtbo` | CAM0 + CAM1 (JAJ/PAB_V3) |
| Dual | `tegra234-p3767-camera-p3768-imx708-dual.dtbo` | CAM0 + CAM1 (JAJ/PAB_V3/PAB_CAN) |
| Quad | `tegra234-p3767-camera-p3768-imx708-quad.dtbo` | All 4 ports (PAB) |

## Installing a Camera Overlay
Expand All @@ -66,7 +67,7 @@ The overlays ARK ships live under `products/<TARGET>/overlay/` (the `.dts`/`.dts

Build the overlay DTBs (from host):
```
./build.sh PAB # or JAJ, PAB_V3
./build.sh PAB # or JAJ, PAB_V3, PAB_CAN
```

Copy the overlay to the Jetson:
Expand Down
2 changes: 1 addition & 1 deletion docs/device-tree.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ Each product carries only the files it actually changes:

- `bootloader/.../tegra234-mb*-bct-*-p3767-*.{dtsi,dts}` — the MB1/MB2 BCT pinmux, GPIO, pad-voltage and misc config for the carrier (ARK's Pinmux spreadsheet output). These are bootloader inputs, compiled separately from the kernel DTBs, so they stay as full files.
- `source/hardware/nvidia/t23x/nv-public/nv-platform/ark-<target>-overrides.dtsi` — the **one fragment** holding every kernel-DTB change for the carrier (UARTB, USB topology, HDA, display, etc.), expressed as overrides (`&{/path} { ... }`) over the stock tree.
- `source/.../nv-platform/tegra234-dcb-p3737-0000-p3701-0000-hdmi.dtsi` (JAJ, PAB_V3 only) — the HDMI display-control block the fragment `#include`s.
- `source/.../nv-platform/tegra234-dcb-p3737-0000-p3701-0000-hdmi.dtsi` (JAJ, PAB_V3, PAB_CAN only) — the HDMI display-control block the fragment `#include`s.

Model strings are **not** files — they live in `products/<target>/dtb_models.env`.

Expand Down
6 changes: 3 additions & 3 deletions docs/gpio.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# GPIO on ARK Jetson Carriers

Using GPIO pins on ARK JAJ / PAB / PAB_V3 carriers running JetPack 6 (L4T r36.x).
Using GPIO pins on ARK JAJ / PAB / PAB_V3 / PAB_CAN carriers running JetPack 6 (L4T r36.x).

## TL;DR

Expand All @@ -25,7 +25,7 @@ I2S0 connector pins on **PAB** and **JAJ**, exposed as GPIO by default (configur

`PAC.06` is on the AON GPIO controller, which retains state through SC7 suspend; main GPIO does not.

On **PAB_V3**, `PAC.06` is reserved for the KSZ8795 ethernet switch reset and is driven HIGH by BCT — do not use as general GPIO.
On **PAB_V3**, `PAC.06` is reserved for the KSZ8795 ethernet switch reset and is driven HIGH by BCT — do not use as general GPIO. On **PAB_CAN**, `PAC.06` is LAN96455S SWITCH_RSTn (module pin 211 / GPIO09): active-low (low = reset, high = run). MB1 holds it **LOW** through early boot; a kernel gpio-hog then drives **HIGH** so the rising edge starts unmanaged ROM boot — do not use as general GPIO.

## Verify the lines

Expand All @@ -37,7 +37,7 @@ sudo gpioinfo | grep -E '"P(H\.07|I\.0[0-2]|AC\.06)"'

All five show as `unused` **inputs** at idle — the four outputs held high by their pull-ups, DIN floating. Your app claims a line and sets its direction when it needs to drive or read.

> **PAB** and **JAJ** wire this connector and ship it GPIO-by-default. **PAB_V3** does not route the I2S0 signals to a connector, so it has no connector GPIO here (and `PAC.06`/MCLK is its KSZ8795 ethernet reset — see above). The `ark_i2s_gpio` jetson-io overlay has been removed from all three.
> **PAB** and **JAJ** wire this connector and ship it GPIO-by-default. **PAB_V3** and **PAB_CAN** do not route the I2S0 signals to a connector, so they have no connector GPIO here (and `PAC.06`/MCLK is their ethernet switch reset — see above). The `ark_i2s_gpio` jetson-io overlay has been removed from all carriers.

## Drive and read

Expand Down
2 changes: 1 addition & 1 deletion docs/i2c.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# I2C on ARK Jetson Carriers

Orin Nano / NX, all ARK carriers (JAJ / PAB / PAB_V3).
Orin Nano / NX, all ARK carriers (JAJ / PAB / PAB_V3 / PAB_CAN).

## Scan a bus

Expand Down
14 changes: 8 additions & 6 deletions flash.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

# Usage: ./flash.sh <TARGET> [--sdcard] [--usb]
#
# TARGET: PAB | JAJ | PAB_V3
# TARGET: PAB | JAJ | PAB_V3 | PAB_CAN
#
# Flashes a previously-built target directly from its staging directory.
# The device must be in USB recovery mode before running this script.
Expand All @@ -16,7 +16,7 @@ TARGET=""

while [[ $# -gt 0 ]]; do
case $1 in
PAB|JAJ|PAB_V3)
PAB|JAJ|PAB_V3|PAB_CAN)
TARGET="$1"
shift ;;
--sdcard)
Expand All @@ -28,7 +28,7 @@ while [[ $# -gt 0 ]]; do
shift ;;
*)
echo "Unknown option: $1" >&2
echo "Usage: ./flash.sh <PAB | JAJ | PAB_V3> [--sdcard] [--usb]" >&2
echo "Usage: ./flash.sh <PAB | JAJ | PAB_V3 | PAB_CAN> [--sdcard] [--usb]" >&2
exit 1 ;;
esac
done
Expand All @@ -39,16 +39,18 @@ if [ -z "$TARGET" ]; then
echo "1) PAB"
echo "2) JAJ"
echo "3) PAB_V3"
read -p "Enter your choice (1-3): " choice
echo "4) PAB_CAN"
read -p "Enter your choice (1-4): " choice
case $choice in
1) TARGET="PAB" ;;
2) TARGET="JAJ" ;;
3) TARGET="PAB_V3" ;;
4) TARGET="PAB_CAN" ;;
*) echo "Invalid choice. Exiting."; exit 1 ;;
esac
else
echo "ERROR: target required (PAB | JAJ | PAB_V3) when running non-interactively." >&2
echo "Usage: ./flash.sh <PAB | JAJ | PAB_V3> [--sdcard] [--usb]" >&2
echo "ERROR: target required (PAB | JAJ | PAB_V3 | PAB_CAN) when running non-interactively." >&2
echo "Usage: ./flash.sh <PAB | JAJ | PAB_V3 | PAB_CAN> [--sdcard] [--usb]" >&2
exit 1
fi
fi
Expand Down
1 change: 1 addition & 0 deletions packaging/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ This document covers how flash packages are generated, released, and consumed. E
| PAB | ARK Jetson PAB Carrier | `pab-` |
| JAJ | ARK Just a Jetson Carrier | `jaj-` |
| PAB_V3 | ARK Jetson PAB V3 Carrier | `pab-v3-` |
| PAB_CAN | ARK PAB CAN Jetson Carrier | `pab-can-` |

Each carrier has its own device tree. A flash package built for one carrier will not work on another.

Expand Down
5 changes: 3 additions & 2 deletions packaging/flash_from_package.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#
# Usage:
# ./flash_from_package.sh <tag> # specific release (e.g. pab-6.2.1.1); auto-detects a draft of that tag
# ./flash_from_package.sh <product> # latest published release for a product (pab, jaj, pab-v3)
# ./flash_from_package.sh <product> # latest published release for a product (pab, jaj, pab-v3, pab-can)
# ./flash_from_package.sh <product> --draft # latest DRAFT release for a product (needs gh read access)
# ./flash_from_package.sh <tag> --full # regenerate images even if cached ones match
# ./flash_from_package.sh --clean # remove all cached data
Expand All @@ -36,6 +36,7 @@ usage() {
echo " $(basename "$0") pab Flash the latest PAB release"
echo " $(basename "$0") jaj Flash the latest JAJ release"
echo " $(basename "$0") pab-v3 Flash the latest PAB_V3 release"
echo " $(basename "$0") pab-can Flash the latest PAB_CAN release"
echo " $(basename "$0") pab-v3 --draft Flash the latest PAB_V3 DRAFT (needs gh read access)"
echo " $(basename "$0") pab --full Regenerate flash images even if cached ones match"
echo " $(basename "$0") --clean Remove all cached data"
Expand All @@ -46,7 +47,7 @@ usage() {

is_product_name() {
case "$1" in
pab|jaj|pab-v3) return 0 ;;
pab|jaj|pab-v3|pab-can) return 0 ;;
*) return 1 ;;
esac
}
Expand Down
8 changes: 4 additions & 4 deletions packaging/generate_flash_package.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,17 @@ TARGET=""

while [[ $# -gt 0 ]]; do
case $1 in
PAB|JAJ|PAB_V3) TARGET="$1"; shift ;;
PAB|JAJ|PAB_V3|PAB_CAN) TARGET="$1"; shift ;;
*)
echo "Unknown option: $1" >&2
echo "Usage: ./generate_flash_package.sh <PAB | JAJ | PAB_V3>" >&2
echo "Usage: ./generate_flash_package.sh <PAB | JAJ | PAB_V3 | PAB_CAN>" >&2
exit 1 ;;
esac
done

if [ -z "$TARGET" ]; then
echo "ERROR: target required (PAB | JAJ | PAB_V3)." >&2
echo "Usage: ./generate_flash_package.sh <PAB | JAJ | PAB_V3>" >&2
echo "ERROR: target required (PAB | JAJ | PAB_V3 | PAB_CAN)." >&2
echo "Usage: ./generate_flash_package.sh <PAB | JAJ | PAB_V3 | PAB_CAN>" >&2
exit 1
fi

Expand Down
6 changes: 3 additions & 3 deletions packaging/publish_release.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
set -e

if [ $# -lt 2 ]; then
echo "Usage: ./publish_release.sh <PAB | JAJ | PAB_V3> <version>"
echo "Usage: ./publish_release.sh <PAB | JAJ | PAB_V3 | PAB_CAN> <version>"
echo " e.g. ./publish_release.sh PAB 6.2.1.1"
echo ""
echo "Creates and pushes a tag — CI handles the rest."
Expand All @@ -24,9 +24,9 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"

case "$TARGET" in
PAB|JAJ|PAB_V3) ;;
PAB|JAJ|PAB_V3|PAB_CAN) ;;
*)
echo "ERROR: Invalid target '$TARGET'. Must be PAB, JAJ, or PAB_V3."
echo "ERROR: Invalid target '$TARGET'. Must be PAB, JAJ, PAB_V3, or PAB_CAN."
exit 1
;;
esac
Expand Down
Binary file not shown.
11 changes: 11 additions & 0 deletions products/PAB_CAN/default_overlays
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Device-tree overlay(s) baked into this product's image at flash time, so they are
# active on the first boot with no jetson-io step. flash.sh hands each dtbo to
# tegraflash as ADDITIONAL_DTB_OVERLAY, which merges it into the base DTB on top of
# whichever Orin Nano/NX SKU the flasher detects — so one image still covers every
# SKU. One dtbo basename per line ('#' comments allowed); each must be built into
# kernel/dtb/ via overlay/dtbo.list. A user can still switch cameras with jetson-io:
# it boots its own FDT'd entry off the clean /boot/dtb kernel DTB, superseding this
# without a duplicate-node collision.

# PAB_CAN ships with the dual IMX219 camera enabled by default.
tegra234-p3767-camera-p3768-imx219-dual.dtbo
Loading
Loading