diff --git a/.github/workflows/build-jp502.yml b/.github/workflows/build-jp502.yml index acec0078..fd9cff50 100644 --- a/.github/workflows/build-jp502.yml +++ b/.github/workflows/build-jp502.yml @@ -20,6 +20,6 @@ jobs: - name: setup workspace run: yes | ./setup_workspace.sh 5.0.2 - name: apply patches - run: git config --global user.email "builder@example.com" && git config --global user.name "builder" && ./apply_patches.sh 5.0.2 + run: git config --global user.email "builder@example.com" && git config --global user.name "builder" && ./apply_patches.sh - name: build - run: ./build_all.sh 5.0.2 + run: ./build_all.sh diff --git a/.github/workflows/build-jp512.yml b/.github/workflows/build-jp512.yml index 386e38a6..ec7034fe 100644 --- a/.github/workflows/build-jp512.yml +++ b/.github/workflows/build-jp512.yml @@ -20,6 +20,6 @@ jobs: - name: setup workspace run: yes | ./setup_workspace.sh 5.1.2 - name: apply patches - run: git config --global user.email "builder@example.com" && git config --global user.name "builder" && ./apply_patches.sh 5.1.2 + run: git config --global user.email "builder@example.com" && git config --global user.name "builder" && ./apply_patches.sh - name: build - run: ./build_all.sh 5.1.2 + run: ./build_all.sh diff --git a/.github/workflows/build-jp6.1.yml b/.github/workflows/build-jp6.1.yml index 3e42015e..5f33262f 100644 --- a/.github/workflows/build-jp6.1.yml +++ b/.github/workflows/build-jp6.1.yml @@ -20,6 +20,6 @@ jobs: - name: setup workspace run: yes | ./setup_workspace.sh 6.1 - name: apply patches - run: git config --global user.email "builder@example.com" && git config --global user.name "builder" && ./apply_patches.sh 6.1 + run: git config --global user.email "builder@example.com" && git config --global user.name "builder" && ./apply_patches.sh - name: build - run: ./build_all.sh 6.1 + run: ./build_all.sh diff --git a/.github/workflows/build-jp6.2.yml b/.github/workflows/build-jp6.2.yml index 8e4e2e71..4a70808c 100644 --- a/.github/workflows/build-jp6.2.yml +++ b/.github/workflows/build-jp6.2.yml @@ -20,6 +20,6 @@ jobs: - name: setup workspace run: yes | ./setup_workspace.sh 6.2 - name: apply patches - run: git config --global user.email "builder@example.com" && git config --global user.name "builder" && ./apply_patches.sh 6.2 + run: git config --global user.email "builder@example.com" && git config --global user.name "builder" && ./apply_patches.sh - name: build - run: ./build_all.sh 6.2 + run: ./build_all.sh diff --git a/.github/workflows/build-jp6.yml b/.github/workflows/build-jp6.yml index bfdc368e..465ee945 100644 --- a/.github/workflows/build-jp6.yml +++ b/.github/workflows/build-jp6.yml @@ -20,6 +20,6 @@ jobs: - name: setup workspace run: yes | ./setup_workspace.sh 6.0 - name: apply patches - run: git config --global user.email "builder@example.com" && git config --global user.name "builder" && ./apply_patches.sh 6.0 + run: git config --global user.email "builder@example.com" && git config --global user.name "builder" && ./apply_patches.sh - name: build - run: ./build_all.sh 6.0 + run: ./build_all.sh diff --git a/.github/workflows/build-jp7.1.yml b/.github/workflows/build-jp7.1.yml new file mode 100644 index 00000000..7939310f --- /dev/null +++ b/.github/workflows/build-jp7.1.yml @@ -0,0 +1,25 @@ +name: Build JP 7.1 + +on: + push: + branches: + - master + - dev + pull_request: + branches: ['**'] + +permissions: read-all + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 #v3 + - name: setup workspace + run: yes | ./setup_workspace.sh 7.1 + - name: apply patches + run: git config --global user.email "builder@example.com" && git config --global user.name "builder" && ./apply_patches.sh + - name: build + run: ./build_all.sh diff --git a/.github/workflows/build-jp7.yml b/.github/workflows/build-jp7.yml new file mode 100644 index 00000000..2ea79e5f --- /dev/null +++ b/.github/workflows/build-jp7.yml @@ -0,0 +1,25 @@ +name: Build JP 7.0 + +on: + push: + branches: + - master + - dev + pull_request: + branches: ['**'] + +permissions: read-all + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 #v3 + - name: setup workspace + run: yes | ./setup_workspace.sh 7.0 + - name: apply patches + run: git config --global user.email "builder@example.com" && git config --global user.name "builder" && ./apply_patches.sh + - name: build + run: ./build_all.sh diff --git a/README.md b/README.md index 30bb640b..600f04e1 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ # D457 MIPI on NVIDIA® Jetson AGX Xavier™ and AGX Orin™ The RealSense™ MIPI platform driver enables the user to control and stream RealSense™ 3D MIPI cameras. The system shall include: -* NVIDIA® Jetson platform (Currently Supported JetPack versions are: 6.2.1, 6.2, 6.1, 6.0, 5.1.2, 5.0.2, 4.6.1) +* NVIDIA® Jetson platform (Currently Supported JetPack versions are: 7.1, 7.0, 6.2.1, 6.2, 6.1, 6.0, 5.1.2, 5.0.2, 4.6.1) * RealSense™ De-Serialize board * NVIDIA® Jetson AGX Orin™ Passive adapter board from [Leopard Imaging LI-JTX1-SUB-ADPT](https://leopardimaging.com/product/accessories/adapters-carrier-boards/for-nvidia-jetson/li-jtx1-sub-adpt/) * RS MIPI camera (e.g. https://store.realsenseai.com/buy-intel-realsense-depth-camera-d457.html) @@ -24,6 +24,7 @@ The system shall include: # Documentation +- NVIDIA® Jetson AGX Orin™ board setup - AGX Orin™ [JetPack 7.x](./README_JP7.md) setup guide - NVIDIA® Jetson AGX Orin™ board setup - AGX Orin™ [JetPack 6.0](./README_JP6.0.md) setup guide - NVIDIA® Jetson AGX Xavier™ board setup - AGX Xavier™ [JetPack 5.x.2](./README_JP5.md) setup guide - NVIDIA® Jetson AGX Xavier™ board setup - AGX Xavier™ [JetPack 4.6.1](./README_JP4.md) setup guide @@ -38,8 +39,9 @@ Please follow the [instruction](https://docs.nvidia.com/sdk-manager/install-with # JetPack build -- [JetPack 6.0](./README_JP6.0.md#build-environment-prerequisites) +- [JetPack 7.x](./README_JP7.md#build-environment-prerequisites) - [JetPack 6.2](./README_JP6.2.md#build-environment-prerequisites) +- [JetPack 6.0](./README_JP6.0.md#build-environment-prerequisites) - [JetPack 5.x.2](./README_JP5.md#build-kernel-dtb-and-d457-driver) - [JetPack 4.6.1](./README_JP4.md#build-kernel-dtb-and-d457-driver) diff --git a/README_JP7.md b/README_JP7.md new file mode 100644 index 00000000..f312f642 --- /dev/null +++ b/README_JP7.md @@ -0,0 +1,198 @@ +# RealSense™ camera driver for GMSL* interface + +# D457 MIPI on NVIDIA® Jetson AGX Orin™ JetPack 7.x +The RealSense™ MIPI platform driver enables the user to control and stream RealSense™ 3D MIPI cameras. +The system shall include: +* NVIDIA® Jetson™ platform Supported JetPack versions are: + - 7.1 production release + - 7.0 production release +* RealSense™ De-Serialize board +* Jetson AGX Orin™ Passive adapter board from [Leopard Imaging® LI-JTX1-SUB-ADPT](https://leopardimaging.com/product/accessories/adapters-carrier-boards/for-nvidia-jetson/li-jtx1-sub-adpt/) +* RS MIPI camera [D457](https://store.realsenseai.com/buy-intel-realsense-depth-camera-d457.html) + +![orin_adapter](https://github.com/dmipx/realsense_mipi_platform_driver/assets/104717350/524e3eb6-6e6b-41cf-9562-9c0f920dd821) + + +> Note: This MIPI reference driver is based on RealSense™ de-serialize board. For other de-serialize boards, modification might be needed. + +### Links +- RealSense™ camera driver for GMSL* interface [Front Page](./README.md) +- NVIDIA® Jetson AGX Orin™ board setup - AGX Orin™ [JetPack 6.0](./README_JP6.0.md) setup guide +- NVIDIA® Jetson AGX Orin™ board setup - AGX Orin™ [JetPack 6.2](./README_JP6.2.md) setup guide +- NVIDIA® Jetson AGX Xavier™ board setup - AGX Xavier™ [JetPack 5.x.2](./README_JP5.md) setup guide +- NVIDIA® Jetson AGX Xavier™ board setup - AGX Xavier™ [JetPack 4.6.1](./README_JP4.md) setup guide +- Build Tools manual page [Build Manual page](./README_tools.md) +- Driver API manual page [Driver API page](./README_driver.md) + +## NVIDIA® Jetson AGX Orin™ board setup + +Please follow the [instruction](https://docs.nvidia.com/sdk-manager/install-with-sdkm-jetson/index.html) to flash JetPack to the NVIDIA® Jetson AGX Orin™ with NVIDIA® SDK Manager or other methods NVIDIA provides. Make sure the board is ready to use. + +## Build environment prerequisites +``` +sudo apt-get install -y build-essential bc wget flex bison curl libssl-dev xxd tar +``` +## Build NVIDIA® kernel drivers, dtb and D457 driver + +These are descriptiver steps. Bash commands to be issued follow: +1. Clone [realsense_mipi_platform_driver](https://github.com/realsenseai/realsense_mipi_platform_driver.git) repo. +2. Checkout dev branch. +3. The developers can set up build environment, ARM64 compiler, kernel sources and NVIDIA's Jetson git repositories by using the setup script. +4. Apply patches for kernel drivers, nvidia-oot module and tegra devicetree. +5. Build project +6. Apply build results to target (Jetson). +7. Configure target. + +Assuming building for 7.1. One can also build for 7.0 just replace the last parameter. +Build version can be specified only once. It will be written to jetpack_version.txt file and used for later steps. +You can display the current version cating the file jetpack_version. It will be show at the beginning of each script. +``` +git clone --branch dev --single-branch https://github.com/realsenseai/realsense_mipi_platform_driver.git +cd realsense_mipi_platform_driver +./setup_workspace.sh 7.1 +./apply_patches.sh +./build_all.sh +``` +Note: dev_dbg() log support will not be enabled by default. If needed, run the `./build_all.sh` script with `--dev-dbg` option like below. +``` +./build_all.sh --dev-dbg +``` + +## Install kernel drivers, extra modules and device-tree to Jetson AGX Orin + +Following steps required: + +1. Copy build artifacts: +If you build locally (native build on Jetson) use the following bash commands: +``` +sudo cp -r ./images/7.1/rootfs/lib/modules/6.8.12-tegra /lib/modules/ +sudo cp ./images/7.1/rootfs/boot/tegra264-camera-d4xx-*.dtbo /boot/dev/ +sudo mv -f /boot/dev/Image /boot/dev/Image.old +sudo cp ./images/7.1/rootfs/boot/Image /boot/dev/ +``` +In case of crossbuild on host prepare a tarball to ssh copy to Jetson target. +Example user 'nvidia' on Jetson with host name 'jetson.domain' +``` +tar czf rootfs.tar.gz -C images/7.1/rootfs boot lib +scp rootfs.tar.gz nvidia@jetson.domain: +``` +Log in into Jetson target, extract the tarball and install extracted files: +``` +tar xf rootfs.tar.gz +sudo cp -r ./lib/modules/6.8.12-tegra /lib/modules/ +sudo cp ./boot/tegra264-camera-d4xx-overlay-Advantech.dtbo /boot/ +sudo cp ./boot/Image /boot/dev/ +``` +2. Run $ `sudo /opt/nvidia/jetson-io/jetson-io.py`, to exit choose save & reboot: + 1. Configure Jetson AGX CSI Connector + 2. Configure for compatible hardware + 3. Choose appropriate configuration: + i. Jetson RealSense Camera D457 + ii. Jetson RealSense Camera D457 dual + 5. Choose to save & reboot + +3. Enable and run depmod scan for "extra" & "kernel" modules +``` +# enable extra & kernel modules +# original file content: cat /etc/depmod.d/ubuntu.conf -- search updates ubuntu built-in +sudo sed -i 's/search updates/search extra updates kernel/g' /etc/depmod.d/ubuntu.conf +# update driver cache +sudo depmod +``` +4. +Verify bootloader configuration +``` +cat /boot/extlinux/extlinux.conf +-------- +LABEL JetsonIO + MENU LABEL Custom Header Config: + LINUX /boot/dev/Image + FDT /boot/dtb/kernel_tegra264-p4071-0000+p3834-0008-nv.dtb + APPEND ${cbootargs} root=PARTUUID=bbb3b34e-...... + OVERLAYS /boot/tegra264-camera-d4xx-overlay.dtbo +-------- +``` +On Jetson target (user home folder) assuming backup step was followed: + + +### Verify driver loaded - on Jetson: +- Driver API manual page [Driver API page](./README_driver.md) + +``` +nvidia@ubuntu:~$ sudo dmesg | grep tegra-capture-vi +[ 9.357521] platform 13e00000.host1x:nvcsi@15a00000: Fixing up cyclic dependency with tegra-capture-vi +[ 9.419926] tegra-camrtc-capture-vi tegra-capture-vi: ep of_device is not enabled endpoint. +[ 9.419932] tegra-camrtc-capture-vi tegra-capture-vi: ep of_device is not enabled endpoint. +[ 10.001170] tegra-camrtc-capture-vi tegra-capture-vi: subdev DS5 mux 9-001a bound +[ 10.025295] tegra-camrtc-capture-vi tegra-capture-vi: subdev DS5 mux 12-001a bound +[ 10.040934] tegra-camrtc-capture-vi tegra-capture-vi: subdev DS5 mux 13-001a bound +[ 10.056151] tegra-camrtc-capture-vi tegra-capture-vi: subdev DS5 mux 14-001a bound +[ 10.288088] tegra-camrtc-capture-vi tegra-capture-vi: subdev 13e00000.host1x:nvcsi@15a00000- bound +[ 10.324025] tegra-camrtc-capture-vi tegra-capture-vi: subdev 13e00000.host1x:nvcsi@15a00000- bound +[ 10.324631] tegra-camrtc-capture-vi tegra-capture-vi: subdev 13e00000.host1x:nvcsi@15a00000- bound +[ 10.325056] tegra-camrtc-capture-vi tegra-capture-vi: subdev 13e00000.host1x:nvcsi@15a00000- bound + +nvidia@ubuntu:~$ sudo dmesg | grep d4xx +[ 9.443608] d4xx 9-001a: Probing driver for D45x +[ 9.983168] d4xx 9-001a: ds5_chrdev_init() class_create +[ 9.989521] d4xx 9-001a: D4XX Sensor: DEPTH, firmware build: 5.15.1.0 +[ 10.007813] d4xx 12-001a: Probing driver for D45x +[ 10.013899] d4xx 12-001a: D4XX Sensor: RGB, firmware build: 5.15.1.0 +[ 10.025787] d4xx 13-001a: Probing driver for D45x +[ 10.029095] d4xx 13-001a: D4XX Sensor: Y8, firmware build: 5.15.1.0 +[ 10.041282] d4xx 14-001a: Probing driver for D45x +[ 10.044759] d4xx 14-001a: D4XX Sensor: IMU, firmware build: 5.15.1.0 + +``` + +### Known issues +- Camera not recognized +Verify I2C MUX detected. If "probe failed" reported, replace extension board adapter (LI-JTX1-SUB-ADPT). +``` +nvidia@ubuntu:~$ sudo dmesg | grep pca954x +[ 3.933113] pca954x 2-0072: probe failed +``` + +- Configuration with jetson-io tool system fail to boot with message "couldn't find root partition" +Verify bootloader configuration +`/boot/extlinux/extlinux.conf` +Sometimes configuration tool missing APPEND parameters. Duplicate `primary` section `APPEND` line to `JetsonIO` `APPEND` section, verify it's similar. + +Example Bad: +``` +LABEL primary + MENU LABEL primary kernel + LINUX /boot/Image + INITRD /boot/initrd + APPEND ${cbootargs} root=PARTUUID=634b7e44-aacc-4dd9-a769-3a664b83b159 rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 console=ttyAMA0,115200 firmware_class.path=/etc/firmware fbcon=map:0 net.ifnames=0 nospectre_bhb video=efifb:off console=tty0 nv-auto-config + +LABEL JetsonIO + MENU LABEL Custom Header Config: + LINUX /boot/Image + FDT /boot/dtb/kernel_tegra234-p3737-0000+p3701-0000-nv.dtb + INITRD /boot/initrd + APPEND ${cbootargs} + OVERLAYS /boot/tegra234-camera-d4xx-overlay-dual.dtbo +``` +Example Good: +``` +LABEL primary + MENU LABEL primary kernel + LINUX /boot/Image + INITRD /boot/initrd + APPEND ${cbootargs} root=PARTUUID=634b7e44-aacc-4dd9-a769-3a664b83b159 rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 console=ttyAMA0,115200 firmware_class.path=/etc/firmware fbcon=map:0 net.ifnames=0 nospectre_bhb video=efifb:off console=tty0 nv-auto-config + +LABEL JetsonIO + MENU LABEL Custom Header Config: + LINUX /boot/dev/Image + FDT /boot/dtb/kernel_tegra264-p4071-0000+p3834-0008-nv.dtb + INITRD /boot/initrd + APPEND ${cbootargs} root=PARTUUID=634b7e44-aacc-4dd9-a769-3a664b83b159 rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 console=ttyAMA0,115200 firmware_class.path=/etc/firmware fbcon=map:0 net.ifnames=0 nospectre_bhb video=efifb:off console=tty0 nv-auto-config + OVERLAYS /boot/tegra264-camera-d4xx-overlay.dtbo +``` +- Configuration tool jetson-io terminates without configuration menu. +verify that `/boot/dtb` has only one dtb file +``` +nvidia@ubuntu:~$ ls /boot/dtb/ +kernel_tegra264-p4071-0000+p3834-0008-nv.dtb +``` diff --git a/apply_patches.sh b/apply_patches.sh index df25c19b..0d97c61a 100755 --- a/apply_patches.sh +++ b/apply_patches.sh @@ -2,165 +2,182 @@ set -e -if [[ $# < 1 ]]; then - echo "apply_patches.sh [--one-cam | --dual-cam] JetPack_version [apply]" - echo "apply_patches.sh JetPack_version reset" - exit 1 -fi - +ACTION="apply" # Default to single camera DT for JetPack 5.0.2 # single - jp5 [default] single cam GMSL board # dual - dual cam GMSL board SC20220126 JP5_D4XX_DTSI="tegra194-camera-d4xx-single.dtsi" -if [[ "$1" == "--one-cam" ]]; then - JP5_D4XX_DTSI="tegra194-camera-d4xx-single.dtsi" - shift -elif [[ "$1" == "--dual-cam" ]]; then - JP5_D4XX_DTSI="tegra194-camera-d4xx-dual.dtsi" - shift -elif [[ "$1" == "--max96712-EVB" ]]; then - JP5_D4XX_DTSI="tegra194-camera-d4xx-max96712-EVB.dtsi" - shift -elif [[ "$1" == "--fg12-16ch" ]]; then - JP5_D4XX_DTSI="tegra194-camera-d4xx-fg12-16ch.dtsi" - shift -elif [[ "$1" == "--fg12-16ch-dual" ]]; then - JP5_D4XX_DTSI="tegra194-camera-d4xx-fg12-16ch-dual.dtsi" +while [[ $# -gt 0 ]]; do + if [[ "$1" == "--one-cam" ]]; then + JP5_D4XX_DTSI="tegra194-camera-d4xx-single.dtsi" + elif [[ "$1" == "--dual-cam" ]]; then + JP5_D4XX_DTSI="tegra194-camera-d4xx-dual.dtsi" + elif [[ "$1" == "--max96712-EVB" ]]; then + JP5_D4XX_DTSI="tegra194-camera-d4xx-max96712-EVB.dtsi" + elif [[ "$1" == "--fg12-16ch" ]]; then + JP5_D4XX_DTSI="tegra194-camera-d4xx-fg12-16ch.dtsi" + elif [[ "$1" == "--fg12-16ch-dual" ]]; then + JP5_D4XX_DTSI="tegra194-camera-d4xx-fg12-16ch-dual.dtsi" + elif [[ "$1" == reset ]]; then + ACTION="reset" + elif [[ $1 == "-h" ]]; then + echo Usage: + echo "$0 [--one-cam | --dual-cam | --max96712-EVB | --fg12-16ch | --fg12-16ch-dual ] [reset] [-h]" + echo -e 'reset\t: hard reset (git) to version from jetpack_version file' + echo -e '-h\t: show this help' + exit 0 + fi shift -fi - -. scripts/setup-common "$1" +done -# Determine which sources directory exists (specific version like 6.0 or normalized like 6.x) -if [[ -d "sources_$1" ]]; then - SOURCES_VERSION="$1" -elif [[ -d "sources_$JETPACK_VERSION" ]]; then - SOURCES_VERSION="$JETPACK_VERSION" -else - SOURCES_VERSION="$1" # Default to original input if neither exists yet -fi - -ACTION="$2" -[[ -z "$ACTION" ]] && ACTION="apply" +. scripts/setup-common # set JP4 devicetree -if [[ "$JETPACK_VERSION" == "4.6.1" ]]; then +if [[ "$JETPACK_VERSION" == "4.x" ]]; then JP5_D4XX_DTSI="tegra194-camera-d4xx.dtsi" fi -if [[ "$JETPACK_VERSION" == "6.x" ]]; then - D4XX_SRC_DST=nvidia-oot -else +if version_lt "$JETPACK_VERSION" "6.0"; then D4XX_SRC_DST=kernel/nvidia +else + D4XX_SRC_DST=nvidia-oot fi # NVIDIA SDK Manager's JetPack 4.6.1 source_sync.sh doesn't set the right folder name, it mismatches with the direct tar # package source code. Correct the folder name. -if [[ "$ACTION" == apply && -d "sources_$SOURCES_VERSION/hardware/nvidia/platform/t19x/galen-industrial-dts" ]]; then - mv sources_$SOURCES_VERSION/hardware/nvidia/platform/t19x/galen-industrial-dts sources_$SOURCES_VERSION/hardware/nvidia/platform/t19x/galen-industrial +if [[ "$ACTION" == apply && -d "${BUILD_SRCS}/hardware/nvidia/platform/t19x/galen-industrial-dts" ]]; then + mv ${BUILD_SRCS}/hardware/nvidia/platform/t19x/galen-industrial-dts ${BUILD_SRCS}/hardware/nvidia/platform/t19x/galen-industrial fi -if [[ "$ACTION" == reset && -d "sources_$SOURCES_VERSION/hardware/nvidia/platform/t19x/galen-industrial" ]]; then - rm -rfv "sources_$SOURCES_VERSION/hardware/nvidia/platform/t19x/galen-industrial" > /dev/null +if [[ "$ACTION" == reset && -d "${BUILD_SRCS}/hardware/nvidia/platform/t19x/galen-industrial" ]]; then + rm -rfv "${BUILD_SRCS}/hardware/nvidia/platform/t19x/galen-industrial" > /dev/null fi # Create nvethernetrm symlink for JP 6.x (moved from source_sync_6.x.sh) # JP 5.x handles nvethernetrm differently (full path clone, not a symlink) # Must remove the directory first since git reset restores it as a real directory # and ln -sf cannot replace a directory with a symlink -if [[ "$JETPACK_VERSION" =~ ^6\. ]]; then +if ! version_lt "$JETPACK_VERSION" 6.0; then if [[ "$ACTION" == reset ]] || [[ "$ACTION" == apply ]]; then - rm -rf "sources_$SOURCES_VERSION/nvidia-oot/drivers/net/ethernet/nvidia/nvethernet/nvethernetrm" - ln -sf ../../../../../../nvethernetrm "sources_$SOURCES_VERSION/nvidia-oot/drivers/net/ethernet/nvidia/nvethernet/nvethernetrm" + rm -rf "${BUILD_SRCS}/nvidia-oot/drivers/net/ethernet/nvidia/nvethernet/nvethernetrm" + ln -sf ../../../../../../nvethernetrm "${BUILD_SRCS}/nvidia-oot/drivers/net/ethernet/nvidia/nvethernet/nvethernetrm" fi fi apply_external_patches() { - git -C "sources_$SOURCES_VERSION/$3" status > /dev/null - if [[ "$1" == 'apply' ]]; then - if ! git -C "sources_$SOURCES_VERSION/$3" diff --quiet || ! git -C "sources_$SOURCES_VERSION/$3" diff --cached --quiet; then - read -p "Repo sources_$SOURCES_VERSION/$3 has changes that may disturb applying patches. Continue (y/N)? " confirm - [[ "$confirm" != "y" && "$confirm" != "Y" ]] && exit 1 + local source="${BUILD_SRCS}/$2" + git -C "${source}" status > /dev/null + if [[ "$ACTION" == 'apply' ]]; then + if ! git -C "${source}" diff --quiet || ! git -C "${source}" diff --cached --quiet; then + read -p "Repo ${source} has changes that may disturb applying patches. Continue (Y/n)? " confirm + [[ -n "$confirm" && "$confirm" != "y" && "$confirm" != "Y" ]] && exit 1 fi - ls -Ld "${PWD}/$3/$2" - ls -Lw1 "${PWD}/$3/$2" - # Store the original commit hash before applying patches - ORIGINAL_COMMIT=$(git -C "sources_$SOURCES_VERSION/$3" rev-parse HEAD) - echo "$ORIGINAL_COMMIT" > "sources_$SOURCES_VERSION/$3/.realsense_patch_base" - git -C "sources_$SOURCES_VERSION/$3" apply "${PWD}/$3/$2"/* - elif [ "$1" = "reset" ]; then - if ! git -C "sources_$SOURCES_VERSION/$3" diff --quiet || ! git -C "sources_$SOURCES_VERSION/$3" diff --cached --quiet; then - read -p "Repo sources_$SOURCES_VERSION/$3 has changes that will be hard reset. Continue (y/N)? " confirm - [[ "$confirm" != "y" && "$confirm" != "Y" ]] && exit 1 - fi - echo -n "$(ls -d "sources_$SOURCES_VERSION/$3"): " - # Reset to original commit if .realsense_patch_base exists, otherwise use L4T_VERSION - if [[ -f "sources_$SOURCES_VERSION/$3/.realsense_patch_base" ]]; then - RESET_TARGET=$(cat "sources_$SOURCES_VERSION/$3/.realsense_patch_base") - git -C "sources_$SOURCES_VERSION/$3" reset --hard "$RESET_TARGET" - rm -f "sources_$SOURCES_VERSION/$3/.realsense_patch_base" - else - git -C "sources_$SOURCES_VERSION/$3" reset --hard $4 + echo -e "\e[33m$(ls -Ld ${PWD}/$2/$1)\e[0m" + ls -Lw1 "${PWD}/$2/$1" + git -C "${source}" apply "${PWD}/$2/$1"/* + elif [[ "$ACTION" = "reset" ]]; then + if ! git -C "${source}" diff --quiet || ! git -C "${source}" diff --cached --quiet; then + read -p "Repo ${source} has changes that will be hard reset. Continue (Y/n)? " confirm + [[ -n "$confirm" && "$confirm" != "y" && "$confirm" != "Y" ]] && exit 1 fi + echo -n "$(ls -d ${source}): " + git -C "${source}" reset --hard $L4T_VERSION fi } -apply_external_patches "$ACTION" "$1" "$D4XX_SRC_DST" "$L4T_VERSION" +if [[ ! -d "${BUILD_SRCS}" ]]; then + echo "Sources folder not found. Run ./setup_workspace.sh first" + exit 2 +fi -[[ -d "sources_$SOURCES_VERSION/$KERNEL_DIR" ]] && apply_external_patches "$ACTION" "$1" "$KERNEL_DIR" "$L4T_VERSION" +apply_external_patches "$JP_INPUT_VERSION" "$D4XX_SRC_DST" +apply_external_patches "$JP_INPUT_VERSION" "$KERNEL_DIR" -if [[ "$JETPACK_VERSION" == "6.x" ]]; then - apply_external_patches "$ACTION" "$JETPACK_VERSION" "hardware/nvidia/t23x/nv-public" "$L4T_VERSION" -else - apply_external_patches "$ACTION" "$1" "hardware/nvidia/platform/t19x/galen/kernel-dts" "$L4T_VERSION" +if version_lt "$JETPACK_VERSION" "6.0"; then + apply_external_patches "$JETPACK_VERSION" "hardware/nvidia/platform/t19x/galen/kernel-dts" +elif version_lt "$JETPACK_VERSION" "7.0"; then + # from JP7 DT files are handled in kernel tree + apply_external_patches "$JETPACK_VERSION" "hardware/nvidia/t23x/nv-public" fi +echo "Patches applied successfully" + if [[ "$ACTION" = "apply" ]]; then - cp -i kernel/realsense/d4xx.c "sources_$SOURCES_VERSION/${D4XX_SRC_DST}/drivers/media/i2c/" - if [[ "$JETPACK_VERSION" == "6.x" ]]; then - # jp6 overlay - cp hardware/realsense/tegra234-camera-d4xx-overlay*.dts "sources_$SOURCES_VERSION/hardware/nvidia/t23x/nv-public/overlay/" + version_lt "$JETPACK_VERSION" "5.0" || ln -f kernel/realsense/d4xx.c "${BUILD_SRCS}/${D4XX_SRC_DST}/drivers/media/i2c/" + if version_lt "$JETPACK_VERSION" "6.0"; then + # device tree + cp "hardware/realsense/${JP5_D4XX_DTSI}" "${BUILD_SRCS}/hardware/nvidia/platform/t19x/galen/kernel-dts/common/tegra194-camera-d4xx.dtsi" # max96712 header - cp nvidia-oot/max96712.h "sources_$SOURCES_VERSION/nvidia-oot/include/media/" + cp kernel/nvidia/max96712.h "${BUILD_SRCS}/kernel/nvidia/include/media/" else - # device tree - cp "hardware/realsense/${JP5_D4XX_DTSI}" "sources_$SOURCES_VERSION/hardware/nvidia/platform/t19x/galen/kernel-dts/common/tegra194-camera-d4xx.dtsi" # max96712 header - cp kernel/nvidia/max96712.h "sources_$SOURCES_VERSION/kernel/nvidia/include/media/" + ln -f nvidia-oot/max96712.h "${BUILD_SRCS}/nvidia-oot/include/media/" + if version_lt "$JETPACK_VERSION" "7.0"; then + # jp6 overlay + ln -f hardware/realsense/tegra234-camera-d4xx-overlay*.dts "${BUILD_SRCS}/hardware/nvidia/t23x/nv-public/overlay/" + ln -f ${BUILD_SRCS}/hardware/nvidia/t23x/nv-public/include/platforms/dt-bindings/tegra234-p3737-0000+p3701-0000.h \ + ${BUILD_SRCS}/$KERNEL_DIR/include/dt-bindings/ + else + # Copy tegra264-gpio.h for Thor overlay compilation if not already present + if [[ ! -f "${BUILD_SRCS}/$KERNEL_DIR/include/dt-bindings/gpio/tegra264-gpio.h" ]]; then + ln -f "${BUILD_SRCS}/$KERNEL_DIR/3rdparty/canonical/linux-noble/include/dt-bindings/gpio/tegra264-gpio.h" \ + "${BUILD_SRCS}/$KERNEL_DIR/include/dt-bindings/gpio/" 2>/dev/null || true + fi + ln -f hardware/realsense/tegra264-camera-d4xx-overlay*.dtso "${BUILD_SRCS}/$KERNEL_DIR/arch/arm64/boot/dts/nvidia/" + fi fi - + # Stage all modified files after patching - git -C "sources_$SOURCES_VERSION/$D4XX_SRC_DST" add -A - [[ -d "sources_$SOURCES_VERSION/$KERNEL_DIR" ]] && git -C "sources_$SOURCES_VERSION/$KERNEL_DIR" add -A - if [[ -d "sources_$SOURCES_VERSION/hardware/nvidia/t23x/nv-public" ]]; then - git -C "sources_$SOURCES_VERSION/hardware/nvidia/t23x/nv-public" add -A - elif [[ -d "sources_$SOURCES_VERSION/hardware/nvidia/platform/t19x/galen/kernel-dts" ]]; then - git -C "sources_$SOURCES_VERSION/hardware/nvidia/platform/t19x/galen/kernel-dts" add -A + git -C "${BUILD_SRCS}/$D4XX_SRC_DST" add drivers/media/i2c/d4xx.c + git -C "${BUILD_SRCS}/$D4XX_SRC_DST" add -u + [[ -d "${BUILD_SRCS}/$KERNEL_DIR" ]] && git -C "${BUILD_SRCS}/$KERNEL_DIR" add -A + if [[ -d "${BUILD_SRCS}/hardware/nvidia/t23x/nv-public" ]]; then + git -C "${BUILD_SRCS}/hardware/nvidia/t23x/nv-public" add -A + fi + if [[ -d "${BUILD_SRCS}/hardware/nvidia/platform/t19x/galen/kernel-dts" ]]; then + git -C "${BUILD_SRCS}/hardware/nvidia/platform/t19x/galen/kernel-dts" add -A fi - + # Get author identity from root repo - GIT_AUTHOR_NAME=$(git config user.name) - GIT_AUTHOR_EMAIL=$(git config user.email) - + if git config user.name > /dev/null; then + GIT_AUTHOR_NAME=$(git config user.name) + else + read -p "Enter your git user name: " GIT_AUTHOR_NAME + git config user.name "$GIT_AUTHOR_NAME" + fi + if git config user.email > /dev/null; then + GIT_AUTHOR_EMAIL=$(git config user.email) + else + read -p "Enter your git user e-mail: " GIT_AUTHOR_EMAIL + git config user.email "$GIT_AUTHOR_EMAIL" + fi + # Update local git identity for subrepos - git -C "sources_$SOURCES_VERSION/$D4XX_SRC_DST" config user.name "$GIT_AUTHOR_NAME" - git -C "sources_$SOURCES_VERSION/$D4XX_SRC_DST" config user.email "$GIT_AUTHOR_EMAIL" - if [[ -d "sources_$SOURCES_VERSION/$KERNEL_DIR" ]]; then - git -C "sources_$SOURCES_VERSION/$KERNEL_DIR" config user.name "$GIT_AUTHOR_NAME" - git -C "sources_$SOURCES_VERSION/$KERNEL_DIR" config user.email "$GIT_AUTHOR_EMAIL" + git -C "${BUILD_SRCS}/$D4XX_SRC_DST" config user.name "$GIT_AUTHOR_NAME" + git -C "${BUILD_SRCS}/$D4XX_SRC_DST" config user.email "$GIT_AUTHOR_EMAIL" + if [[ -d "${BUILD_SRCS}/$KERNEL_DIR" ]]; then + git -C "${BUILD_SRCS}/$KERNEL_DIR" config user.name "$GIT_AUTHOR_NAME" + git -C "${BUILD_SRCS}/$KERNEL_DIR" config user.email "$GIT_AUTHOR_EMAIL" + fi + if [[ -d "${BUILD_SRCS}/hardware/nvidia/platform/t19x/galen/kernel-dts" ]]; then + git -C "${BUILD_SRCS}/hardware/nvidia/platform/t19x/galen/kernel-dts" config user.name "$GIT_AUTHOR_NAME" + git -C "${BUILD_SRCS}/hardware/nvidia/platform/t19x/galen/kernel-dts" config user.email "$GIT_AUTHOR_EMAIL" fi - if [[ -d "sources_$SOURCES_VERSION/hardware/nvidia/platform/t19x/galen/kernel-dts" ]]; then - git -C "sources_$SOURCES_VERSION/hardware/nvidia/platform/t19x/galen/kernel-dts" config user.name "$GIT_AUTHOR_NAME" - git -C "sources_$SOURCES_VERSION/hardware/nvidia/platform/t19x/galen/kernel-dts" config user.email "$GIT_AUTHOR_EMAIL" - elif [[ -d "sources_$SOURCES_VERSION/hardware/nvidia/t23x/nv-public" ]]; then - git -C "sources_$SOURCES_VERSION/hardware/nvidia/t23x/nv-public" config user.name "$GIT_AUTHOR_NAME" - git -C "sources_$SOURCES_VERSION/hardware/nvidia/t23x/nv-public" config user.email "$GIT_AUTHOR_EMAIL" + if [[ -d "${BUILD_SRCS}/hardware/nvidia/t23x/nv-public" ]]; then + git -C "${BUILD_SRCS}/hardware/nvidia/t23x/nv-public" config user.name "$GIT_AUTHOR_NAME" + git -C "${BUILD_SRCS}/hardware/nvidia/t23x/nv-public" config user.email "$GIT_AUTHOR_EMAIL" fi # Commit all staged files - git -C "sources_$SOURCES_VERSION/$D4XX_SRC_DST" commit -m "RS patched" || true - [[ -d "sources_$SOURCES_VERSION/$KERNEL_DIR" ]] && git -C "sources_$SOURCES_VERSION/$KERNEL_DIR" commit -m "RS patched" || true - if [[ -d "sources_$SOURCES_VERSION/hardware/nvidia/t23x/nv-public" ]]; then - git -C "sources_$SOURCES_VERSION/hardware/nvidia/t23x/nv-public" commit -m "RS patched" || true - elif [[ -d "sources_$SOURCES_VERSION/hardware/nvidia/platform/t19x/galen/kernel-dts" ]]; then - git -C "sources_$SOURCES_VERSION/hardware/nvidia/platform/t19x/galen/kernel-dts" commit -m "RS patched" || true + git -C "${BUILD_SRCS}/$D4XX_SRC_DST" commit -m "RS patched" || true + [[ -d "${BUILD_SRCS}/$KERNEL_DIR" ]] && git -C "${BUILD_SRCS}/$KERNEL_DIR" commit -m "RS patched" || true + if [[ -d "${BUILD_SRCS}/hardware/nvidia/t23x/nv-public" ]]; then + git -C "${BUILD_SRCS}/hardware/nvidia/t23x/nv-public" commit -m "RS patched" || true + fi + if [[ -d "${BUILD_SRCS}/hardware/nvidia/platform/t19x/galen/kernel-dts" ]]; then + git -C "${BUILD_SRCS}/hardware/nvidia/platform/t19x/galen/kernel-dts" commit -m "RS patched" || true + fi +elif [[ "$ACTION" = "reset" ]]; then + if version_lt "$JP_INPUT_VERSION" "5.0"; then + rm "${BUILD_SRCS}/${D4XX_SRC_DST}/drivers/media/i2c/d4xx.c" || true + rm "${BUILD_SRCS}/hardware/nvidia/platform/t19x/galen/kernel-dts/common/tegra194-camera-d4xx.dtsi" || true fi fi diff --git a/build_all.sh b/build_all.sh index d93f614f..a0d688e5 100755 --- a/build_all.sh +++ b/build_all.sh @@ -2,12 +2,6 @@ set -e -if [[ $# < 1 || "$1" == "-h" ]]; then - echo "build_all.sh [--clean] [--dev-dbg] JetPack_version [JetPack_Linux_source]" - echo "build_all.sh -h" - exit 1 -fi - CLEAN=0 DEVDBG=0 @@ -32,11 +26,16 @@ done export DEVDIR=$(cd `dirname $0` && pwd) NPROC=$(nproc) -. $DEVDIR/scripts/setup-common "$1" +if [[ "$1" == "-h" ]]; then + echo "build_all.sh [--clean] [--dev-dbg] [JetPack_version [JetPack_Linux_source]]" + echo "build_all.sh -h" +fi + +. scripts/setup-common "$1" -SRCS="$DEVDIR/sources_$1" +BUILD_SRCS="${DEVDIR}/${BUILD_SRCS}" if [[ -n "$2" ]]; then - SRCS=$(realpath $2) + BUILD_SRCS=$(realpath $2) fi if [[ $(uname -m) == aarch64 ]]; then @@ -44,23 +43,26 @@ if [[ $(uname -m) == aarch64 ]]; then echo Native build echo else - if [[ "$JETPACK_VERSION" == "6.x" ]]; then - export CROSS_COMPILE=$DEVDIR/l4t-gcc/$JETPACK_VERSION/bin/aarch64-buildroot-linux-gnu- + if [[ "$JETPACK_VERSION" == "7.x" ]]; then + CROSS_COMPILE=$DEVDIR/l4t-gcc/$JETPACK_VERSION/bin/aarch64-none-linux-gnu- + elif [[ "$JETPACK_VERSION" == "6.x" ]]; then + CROSS_COMPILE=$DEVDIR/l4t-gcc/$JETPACK_VERSION/bin/aarch64-buildroot-linux-gnu- elif [[ "$JETPACK_VERSION" == "5.x" ]]; then - export CROSS_COMPILE=$DEVDIR/l4t-gcc/$JETPACK_VERSION/bin/aarch64-buildroot-linux-gnu- - elif [[ "$JETPACK_VERSION" == "4.6.1" ]]; then - export CROSS_COMPILE=$DEVDIR/l4t-gcc/$JETPACK_VERSION/bin/aarch64-linux-gnu- + CROSS_COMPILE=$DEVDIR/l4t-gcc/$JETPACK_VERSION/bin/aarch64-buildroot-linux-gnu- + elif [[ "$JETPACK_VERSION" == "4.x" ]]; then + CROSS_COMPILE=$DEVDIR/l4t-gcc/$JETPACK_VERSION/bin/aarch64-linux-gnu- fi + export CROSS_COMPILE fi export LOCALVERSION=-tegra -export TEGRA_KERNEL_OUT="$DEVDIR/images/$1" +export TEGRA_KERNEL_OUT="$DEVDIR/images/${JP_INPUT_VERSION}" # Clean if requested if [[ $CLEAN == 1 ]]; then - echo "Cleaning build artifacts for $1..." + echo "Cleaning build artifacts for ${JP_INPUT_VERSION}..." rm -rf $TEGRA_KERNEL_OUT - rm -rf $SRCS/out + rm -rf $BUILD_SRCS/out fi mkdir -p $TEGRA_KERNEL_OUT @@ -69,53 +71,56 @@ export KERNEL_MODULES_OUT=$TEGRA_KERNEL_OUT/modules # Check if BUILD_NUMBER is set as it will add a postfix to the kernel name "vermagic" (normally it happens on CI who have BUILD_NUMBER defined) [[ -n "${BUILD_NUMBER}" ]] && echo "Warning! You have BUILD_NUMBER set to ${BUILD_NUMBER}, This will affect your vermagic" -# Copy d4xx.c to the appropriate sources directory -echo "Copying d4xx.c to sources directory..." -if [[ "$JETPACK_VERSION" == "6.x" ]]; then - cp $DEVDIR/kernel/realsense/d4xx.c $SRCS/nvidia-oot/drivers/media/i2c/d4xx.c -else - # For JetPack 5.x and 4.6.1 - cp $DEVDIR/kernel/realsense/d4xx.c $SRCS/kernel/nvidia/drivers/media/i2c/d4xx.c -fi - # Build jp6 out-of-tree modules # following: # https://docs.nvidia.com/jetson/archives/r36.2/DeveloperGuide/SD/Kernel/KernelCustomization.html#building-the-jetson-linux-kernel -if [[ "$JETPACK_VERSION" == "6.x" ]]; then - cd $SRCS - export KERNEL_HEADERS=$SRCS/kernel/kernel-jammy-src - ln -sf $TEGRA_KERNEL_OUT $SRCS/out +if version_lt "$JETPACK_VERSION" "6.0"; then + #JP4/5 + cd $BUILD_SRCS/$KERNEL_DIR + make O=$TEGRA_KERNEL_OUT tegra_defconfig + if [[ "$DEVDBG" == "1" ]]; then + scripts/config --file $TEGRA_KERNEL_OUT/.config --enable DYNAMIC_DEBUG + fi + make O=$TEGRA_KERNEL_OUT -j${NPROC} + make O=$TEGRA_KERNEL_OUT modules_install INSTALL_MOD_PATH=$KERNEL_MODULES_OUT + D4XX_CMD_FILE="$(find "$TEGRA_KERNEL_OUT" -name '.d4xx.o.cmd' 2>/dev/null | head -1)" +else + cd $BUILD_SRCS + export KERNEL_HEADERS=${BUILD_SRCS}/${KERNEL_DIR} + ln -sf $TEGRA_KERNEL_OUT $BUILD_SRCS/out if [[ "$DEVDBG" == "1" ]]; then cd $KERNEL_HEADERS # Generate .config file from default defconfig - make ARCH=arm64 defconfig + make defconfig # Update the CONFIG_DYNAMIC_DEBUG and CONFIG_DEBUG_CORE flags in .config file scripts/config --enable DYNAMIC_DEBUG scripts/config --enable DYNAMIC_DEBUG_CORE # Convert the .config file into defconfig - make ARCH=arm64 savedefconfig + make savedefconfig # Save the new generated file as custom_defconfig cp defconfig ./arch/arm64/configs/custom_defconfig # Remove unwanted rm defconfig .config - make ARCH=arm64 mrproper - cd $SRCS + make mrproper + cd $BUILD_SRCS # Building the Image with custom_defconfig - make ARCH=arm64 KERNEL_DEF_CONFIG=custom_defconfig -C kernel + make KERNEL_DEF_CONFIG=custom_defconfig -C kernel else # Building the Image with default defconfig - make ARCH=arm64 -C kernel + make -C kernel fi - make ARCH=arm64 modules - D4XX_CMD_FILE="$SRCS/nvidia-oot/drivers/media/i2c/.d4xx.o.cmd" - make ARCH=arm64 dtbs + make modules + D4XX_CMD_FILE="$BUILD_SRCS/nvidia-oot/drivers/media/i2c/.d4xx.o.cmd" mkdir -p $TEGRA_KERNEL_OUT/rootfs/boot/dtb - cp $SRCS/nvidia-oot/device-tree/platform/generic-dts/dtbs/tegra234-p3737-0000+p3701-0000-nv.dtb $TEGRA_KERNEL_OUT/rootfs/boot/dtb/ - cp $SRCS/nvidia-oot/device-tree/platform/generic-dts/dtbs/tegra234-p3737-0000+p3701-0005-nv.dtb $TEGRA_KERNEL_OUT/rootfs/boot/dtb/ - cp $SRCS/nvidia-oot/device-tree/platform/generic-dts/dtbs/tegra234-camera-d4xx-overlay*.dtbo $TEGRA_KERNEL_OUT/rootfs/boot/ + if version_lt "$JETPACK_VERSION" "7.0"; then + make dtbs + cp $BUILD_SRCS/nvidia-oot/device-tree/platform/generic-dts/dtbs/tegra234-camera-d4xx-overlay*.dtbo $TEGRA_KERNEL_OUT/rootfs/boot/ + else + cp $BUILD_SRCS/$KERNEL_DIR/arch/arm64/boot/dts/nvidia/tegra2[36]4-camera-d4xx-overlay*.dtbo $TEGRA_KERNEL_OUT/rootfs/boot/ + fi export INSTALL_MOD_PATH=$TEGRA_KERNEL_OUT/rootfs/ - make ARCH=arm64 install -C kernel - make ARCH=arm64 modules_install + make -C kernel install + make modules_install # iio support KERNELVERSION=$(cat $KERNEL_HEADERS/include/config/kernel.release) KERNEL_MODULES_OUT=$INSTALL_MOD_PATH/lib/modules/${KERNELVERSION} @@ -130,16 +135,6 @@ if [[ "$JETPACK_VERSION" == "6.x" ]]; then # RealSense cameras support cp $KERNEL_MODULES_OUT/kernel/drivers/media/usb/uvc/uvcvideo.ko $KERNEL_MODULES_OUT/extra/ || true cp $KERNEL_MODULES_OUT/kernel/drivers/media/v4l2-core/videodev.ko $KERNEL_MODULES_OUT/extra/ || true -else -#jp4/5 - cd $SRCS/$KERNEL_DIR - make ARCH=arm64 O=$TEGRA_KERNEL_OUT tegra_defconfig - if [[ "$DEVDBG" == "1" ]]; then - scripts/config --file $TEGRA_KERNEL_OUT/.config --enable DYNAMIC_DEBUG - fi - make ARCH=arm64 O=$TEGRA_KERNEL_OUT -j${NPROC} - make ARCH=arm64 O=$TEGRA_KERNEL_OUT modules_install INSTALL_MOD_PATH=$KERNEL_MODULES_OUT - D4XX_CMD_FILE="$(find "$TEGRA_KERNEL_OUT" -name '.d4xx.o.cmd' 2>/dev/null | head -1)" fi # Generate .vscode/compile_commands.json from the cached module build artefact @@ -150,4 +145,3 @@ if [ -n "${D4XX_CMD_FILE:-}" ] && [ -f "$D4XX_CMD_FILE" ]; then else echo "Warning: .d4xx.o.cmd not found; skipping compile_commands.json generation" fi - diff --git a/hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0001-d4xx-enable-d4xx-for-Xavier-kernel-4.9.patch b/hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0001-d4xx-enable-d4xx-for-Xavier-kernel-4.9.patch similarity index 100% rename from hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0001-d4xx-enable-d4xx-for-Xavier-kernel-4.9.patch rename to hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0001-d4xx-enable-d4xx-for-Xavier-kernel-4.9.patch diff --git a/hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0002-metadata-fix.patch b/hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0002-metadata-fix.patch similarity index 100% rename from hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0002-metadata-fix.patch rename to hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0002-metadata-fix.patch diff --git a/hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0003-Enable-Y8-on-separate-video-node.patch b/hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0003-Enable-Y8-on-separate-video-node.patch similarity index 100% rename from hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0003-Enable-Y8-on-separate-video-node.patch rename to hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0003-Enable-Y8-on-separate-video-node.patch diff --git a/hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0004-enable-RGB-MD.patch b/hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0004-enable-RGB-MD.patch similarity index 100% rename from hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0004-enable-RGB-MD.patch rename to hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0004-enable-RGB-MD.patch diff --git a/hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0005-Enable-IMU-streaming.patch b/hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0005-Enable-IMU-streaming.patch similarity index 100% rename from hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0005-Enable-IMU-streaming.patch rename to hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0005-Enable-IMU-streaming.patch diff --git a/hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0006-SerDes-Add-SerDes-configuration-under-I2C-MUX.patch b/hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0006-SerDes-Add-SerDes-configuration-under-I2C-MUX.patch similarity index 100% rename from hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0006-SerDes-Add-SerDes-configuration-under-I2C-MUX.patch rename to hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0006-SerDes-Add-SerDes-configuration-under-I2C-MUX.patch diff --git a/hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0007-SerDes-Link-SerDes-to-VI-driver.patch b/hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0007-SerDes-Link-SerDes-to-VI-driver.patch similarity index 100% rename from hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0007-SerDes-Link-SerDes-to-VI-driver.patch rename to hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0007-SerDes-Link-SerDes-to-VI-driver.patch diff --git a/hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0008-DSO-18218-change-i2c-clock-to-100kHz.patch b/hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0008-DSO-18218-change-i2c-clock-to-100kHz.patch similarity index 100% rename from hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0008-DSO-18218-change-i2c-clock-to-100kHz.patch rename to hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0008-DSO-18218-change-i2c-clock-to-100kHz.patch diff --git a/hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0009-Disable-metadata-for-IR.patch b/hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0009-Disable-metadata-for-IR.patch similarity index 100% rename from hardware/nvidia/platform/t19x/galen/kernel-dts/4.6.1/0009-Disable-metadata-for-IR.patch rename to hardware/nvidia/platform/t19x/galen/kernel-dts/4.x/0009-Disable-metadata-for-IR.patch diff --git a/hardware/nvidia/platform/t19x/galen/kernel-dts/5.1.2/0001-Porting-dts-to-jetpack-5.1.2.patch b/hardware/nvidia/platform/t19x/galen/kernel-dts/5.1.2/0001-Porting-dts-to-jetpack-5.1.2.patch deleted file mode 100644 index 9e7667c9..00000000 --- a/hardware/nvidia/platform/t19x/galen/kernel-dts/5.1.2/0001-Porting-dts-to-jetpack-5.1.2.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 761052d064d68b94a7e09a3f2fbbc9557153489f Mon Sep 17 00:00:00 2001 -From: Dmitry Perchanov -Date: Wed, 18 Oct 2023 14:00:35 +0300 -Subject: [PATCH] Porting dts to jetpack 5.1.2 - -Signed-off-by: Dmitry Perchanov ---- - tegra194-p2888-0001-p2822-0000.dts | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/tegra194-p2888-0001-p2822-0000.dts b/tegra194-p2888-0001-p2822-0000.dts -index a46befc..7ae66c1 100644 ---- a/tegra194-p2888-0001-p2822-0000.dts -+++ b/tegra194-p2888-0001-p2822-0000.dts -@@ -18,7 +18,8 @@ - * Top level DTS file for CVM:P2888-0001 and CVB:P2822-0000. - */ - #include "common/tegra194-p2888-0001-p2822-0000-common.dtsi" --#include "common/tegra194-p2822-camera-modules.dtsi" -+#include "common/tegra194-camera-d4xx.dtsi" -+/*#include "common/tegra194-p2822-camera-modules.dtsi"*/ - #include "common/tegra194-audio-p2822-0000.dtsi" - - #if defined(LINUX_VERSION) && LINUX_VERSION >= 419 --- -2.34.1 - diff --git a/hardware/nvidia/platform/t19x/galen/kernel-dts/5.0.2/0001-Porting-dts-to-jetpack-5.0.2.patch b/hardware/nvidia/platform/t19x/galen/kernel-dts/5.x/0001-Porting-dts-to-jetpack-5.0.2.patch similarity index 100% rename from hardware/nvidia/platform/t19x/galen/kernel-dts/5.0.2/0001-Porting-dts-to-jetpack-5.0.2.patch rename to hardware/nvidia/platform/t19x/galen/kernel-dts/5.x/0001-Porting-dts-to-jetpack-5.0.2.patch diff --git a/hardware/realsense/tegra264-camera-d4xx-overlay-advantech.dtso b/hardware/realsense/tegra264-camera-d4xx-overlay-advantech.dtso new file mode 100644 index 00000000..b1ae496e --- /dev/null +++ b/hardware/realsense/tegra264-camera-d4xx-overlay-advantech.dtso @@ -0,0 +1,456 @@ +// SPDX-License-Identifier: GPL-2.0-only +// SPDX-FileCopyrightText: Copyright (c) 2018-2023, INTEL CORPORATION. All rights reserved. + +/dts-v1/; +/plugin/; + +#include + +/* camera control gpio definitions */ +/ { + overlay-name = "Jetson RealSense Camera D4xx with max96712 for Thor"; + jetson-header-name = "Jetson AGX CSI Connector"; + compatible = "nvidia,p4071-0000+p3834-0008", "nvidia,p3834-0008", "nvidia,tegra264"; + + fragment@0 { + target-path = "/"; + __overlay__ { + tegra-capture-vi { + num-channels = <4>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_vi_in0: endpoint { + status = "okay"; + vc-id = <0>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_out0>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_vi_in1: endpoint { + status = "okay"; + vc-id = <1>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_out1>; + }; + }; + port@2 { + status = "okay"; + reg = <2>; + d4xx_vi_in2: endpoint { + status = "okay"; + vc-id = <2>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_out2>; + }; + }; + port@3 { + status = "okay"; + reg = <3>; + d4xx_vi_in3: endpoint { + status = "okay"; + vc-id = <3>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_out3>; + }; + }; + }; + }; + tegra-camera-platform { + compatible = "nvidia, tegra-camera-platform"; + status = "okay"; + num_csi_lanes = <2>; + max_lane_speed = <1500000>; + min_bits_per_pixel = <8>; + vi_peak_byte_per_pixel = <2>; + vi_bw_margin_pct = <25>; + max_pixel_rate = <160000>; + isp_peak_byte_per_pixel = <5>; + isp_bw_margin_pct = <25>; + modules { + status = "okay"; + module0 { + status = "okay"; + badge = "d4xx_Y8"; + position = "left"; + orientation = "1"; + drivernode0 { + status = "okay"; + pcl_id = "v4l2_sensor"; + devname = "DS5 mux 9-001c"; + // proc-device-tree = "/proc/device-tree/bus@0/i2c@810c6a0000/ds5@1c"; + sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@810c6a0000/ds5@1c"; + }; + }; + module1 { + status = "okay"; + badge = "d4xx_depth"; + position = "left"; + orientation = "1"; + drivernode0 { + status = "okay"; + pcl_id = "v4l2_sensor"; + devname = "DS5 mux 9-001a"; + // proc-device-tree = "/proc/device-tree/bus@0/i2c@810c6a0000/ds5@1a"; + sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@810c6a0000/ds5@1a"; + }; + }; + module2 { + status = "okay"; + badge = "d4xx_imu"; + position = "left"; + orientation = "1"; + drivernode0 { + status = "okay"; + pcl_id = "v4l2_sensor"; + devname = "DS5 mux 9-001d"; + // proc-device-tree = "/proc/device-tree/bus@0/i2c@810c6a0000/ds5@1d"; + sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@810c6a0000/ds5@1d"; + }; + }; + module3 { + status = "okay"; + badge = "d4xx_rgb"; + position = "left"; + orientation = "1"; + drivernode0 { + status = "okay"; + pcl_id = "v4l2_sensor"; + devname = "DS5 mux 9-001b"; + // proc-device-tree = "/proc/device-tree/bus@0/i2c@810c6a0000/ds5@1b"; + sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@810c6a0000/ds5@1b"; + }; + }; + }; + }; + bus@0 { + host1x@8181200000 { + nvcsi@8188000000 { + num-channels = <4>; + channel@0 { + status = "okay"; + reg = <0>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_csi_in0: endpoint@0 { + status = "okay"; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&ds5_0_out>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_csi_out0: endpoint@1 { + status = "okay"; + port-index = <1>; + remote-endpoint = <&d4xx_vi_in0>; + }; + }; + }; + }; + channel@1 { + status = "okay"; + reg = <1>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_csi_in1: endpoint@2 { + status = "okay"; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&ds5_1_out>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_csi_out1: endpoint@3 { + status = "okay"; + port-index = <1>; + remote-endpoint = <&d4xx_vi_in1>; + }; + }; + }; + }; + channel@2 { + status = "okay"; + reg = <2>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_csi_in2: endpoint@4 { + status = "okay"; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&ds5_2_out>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_csi_out2: endpoint@5 { + status = "okay"; + port-index = <1>; + remote-endpoint = <&d4xx_vi_in2>; + }; + }; + }; + }; + channel@3 { + status = "okay"; + reg = <3>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_csi_in3: endpoint@6 { + status = "okay"; + port-index = <3>; + bus-width = <2>; + remote-endpoint = <&ds5_3_out>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_csi_out3: endpoint@7 { + status = "okay"; + port-index = <1>; + remote-endpoint = <&d4xx_vi_in3>; + }; + }; + }; + }; + }; + }; + + i2c@810c6a0000 { + clock-frequency = <400000>; + + dser: max96712@29 { + status = "okay"; + reg = <0x29>; + compatible = "maxim,max96712"; + csi-mode = "2x4"; + max-src = <1>; + channel = "a"; + }; + + ser_a: max9295_a@40 { + status = "okay"; + compatible = "maxim,max9295"; + reg = <0x40>; + maxim,gmsl-dser-device = <&dser>; + }; + + ds5_3: ds5@1d { + status = "okay"; + def-addr = <0x10>; + reg = <0x1d>; + override_reg = <0x1a>; + compatible = "intel,d4xx"; + use_sensor_mode_id = "true"; + cam-type = "IMU"; + nvidia,gmsl-ser-device = <&ser_a>; + nvidia,gmsl-dser-device = <&dser>; + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + ds5_3_out: endpoint { + vc-id = <3>; + port-index = <3>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_in3>; + }; + }; + }; + mode0 { + pixel_t = "grey_y16"; + num_lanes = "2"; + csi_pixel_bit_depth = "16"; + active_w = "640"; + active_h = "480"; + tegra_sinterface = "serial_a"; + mclk_khz = "24000"; + pix_clk_hz = "74250000"; + line_length = "800"; /* 2200 */ + embedded_metadata_height = "0"; + }; + gmsl-link { + src-csi-port = "b"; + dst-csi-port = "a"; + serdes-csi-link = "a"; + csi-mode = "1x4"; + st-vc = <0>; + vc-id = <3>; + num-lanes = <2>; + }; + }; + + ds5_2: ds5@1c { + status = "okay"; + def-addr = <0x10>; + reg = <0x1c>; + override_reg = <0x1a>; + compatible = "intel,d4xx"; + use_sensor_mode_id = "true"; + cam-type = "Y8"; + nvidia,gmsl-ser-device = <&ser_a>; + nvidia,gmsl-dser-device = <&dser>; + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + ds5_2_out: endpoint { + vc-id = <2>; + port-index = <2>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_in2>; + }; + }; + }; + /* mode0: Y8, mode1: depth D16 */ + mode0 { + pixel_t = "grey_y16"; + num_lanes = "2"; + csi_pixel_bit_depth = "16"; + active_w = "1280"; + active_h = "720"; + tegra_sinterface = "serial_a"; + mclk_khz = "24000"; + pix_clk_hz = "74250000"; + line_length = "1650"; /* 2200 */ + embedded_metadata_height = "1"; + }; + gmsl-link { + src-csi-port = "b"; + dst-csi-port = "a"; + serdes-csi-link = "a"; + csi-mode = "1x4"; + st-vc = <0>; + vc-id = <2>; + num-lanes = <2>; + }; + }; + + ds5_1: ds5@1b { + status = "okay"; + def-addr = <0x10>; + reg = <0x1b>; + override_reg = <0x1a>; + compatible = "intel,d4xx"; + use_sensor_mode_id = "true"; + cam-type = "RGB"; + nvidia,gmsl-ser-device = <&ser_a>; + nvidia,gmsl-dser-device = <&dser>; + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + ds5_1_out: endpoint { + vc-id = <1>; + port-index = <1>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_in1>; + }; + }; + }; + mode0 { + pixel_t = "grey_y16"; + num_lanes = "2"; + csi_pixel_bit_depth = "16"; + active_w = "1920"; + active_h = "1080"; + tegra_sinterface = "serial_a"; + mclk_khz = "24000"; + pix_clk_hz = "74250000"; + line_length = "2200"; /* 2200 */ + embedded_metadata_height = "1"; + }; + gmsl-link { + src-csi-port = "b"; + dst-csi-port = "a"; + serdes-csi-link = "a"; + csi-mode = "1x4"; + st-vc = <0>; + vc-id = <1>; + num-lanes = <2>; + }; + }; + + ds5_0: ds5@1a { + status = "okay"; + def-addr = <0x10>; + reg = <0x1a>; + compatible = "intel,d4xx"; + use_sensor_mode_id = "true"; + cam-type = "Depth"; + nvidia,gmsl-ser-device = <&ser_a>; + nvidia,gmsl-dser-device = <&dser>; + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + ds5_0_out: endpoint { + vc-id = <0>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_in0>; + }; + }; + }; + mode0 { + pixel_t = "grey_y16"; + num_lanes = "2"; + csi_pixel_bit_depth = "16"; + active_w = "1280"; + active_h = "720"; + tegra_sinterface = "serial_a"; + mclk_khz = "24000"; + pix_clk_hz = "74250000"; + line_length = "1650"; /* 2200 */ + embedded_metadata_height = "1"; + }; + gmsl-link { + src-csi-port = "b"; + dst-csi-port = "a"; + serdes-csi-link = "a"; + csi-mode = "1x4"; + st-vc = <0>; + vc-id = <0>; + num-lanes = <2>; + }; + }; + }; + }; + }; + }; +}; diff --git a/hardware/realsense/tegra264-camera-d4xx-overlay-max96712-EVB.dtso b/hardware/realsense/tegra264-camera-d4xx-overlay-max96712-EVB.dtso new file mode 100644 index 00000000..d2ee4e39 --- /dev/null +++ b/hardware/realsense/tegra264-camera-d4xx-overlay-max96712-EVB.dtso @@ -0,0 +1,480 @@ +// SPDX-License-Identifier: GPL-2.0-only +// SPDX-FileCopyrightText: Copyright (c) 2018-2023, INTEL CORPORATION. All rights reserved. + +/dts-v1/; +/plugin/; + +#include +#define CAM0_RST_L TEGRA264_MAIN_GPIO(H, 3) +#define CAMERA_I2C_MUX_BUS(x) (0x1E + x) + +/* camera control gpio definitions */ +/ { + overlay-name = "Jetson RealSense Camera D4xx with max96712 and tca9548"; + jetson-header-name = "Jetson AGX CSI Connector"; + compatible = "nvidia,p4071-0000+p3834-0008", "nvidia,p3834-0008", "nvidia,tegra264"; + + fragment@0 { + target-path = "/"; + __overlay__ { + tegra-capture-vi { + num-channels = <4>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_vi_in0: endpoint { + status = "okay"; + vc-id = <0>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_out0>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_vi_in1: endpoint { + status = "okay"; + vc-id = <1>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_out1>; + }; + }; + port@2 { + status = "okay"; + reg = <2>; + d4xx_vi_in2: endpoint { + status = "okay"; + vc-id = <2>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_out2>; + }; + }; + port@3 { + status = "okay"; + reg = <3>; + d4xx_vi_in3: endpoint { + status = "okay"; + vc-id = <3>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_out3>; + }; + }; + }; + }; + + tegra-camera-platform { + compatible = "nvidia, tegra-camera-platform"; + status = "okay"; + num_csi_lanes = <2>; + max_lane_speed = <1500000>; + min_bits_per_pixel = <8>; + vi_peak_byte_per_pixel = <2>; + vi_bw_margin_pct = <25>; + max_pixel_rate = <160000>; + isp_peak_byte_per_pixel = <5>; + isp_bw_margin_pct = <25>; + modules { + status = "okay"; + module0 { + status = "okay"; + badge = "d4xx_Y8"; + position = "left"; + orientation = "1"; + drivernode0 { + status = "okay"; + pcl_id = "v4l2_sensor"; + devname = "DS5 mux 9-001c"; + // proc-device-tree = "/proc/device-tree/bus@0/i2c@810c6d0000/ds5@1c"; + sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@810c6d0000/tca9548@72/ic2@0/ds5@1c"; + }; + }; + module1 { + status = "okay"; + badge = "d4xx_depth"; + position = "left"; + orientation = "1"; + drivernode0 { + status = "okay"; + pcl_id = "v4l2_sensor"; + devname = "DS5 mux 9-001a"; + // proc-device-tree = "/proc/device-tree/bus@0/i2c@810c6d0000/ds5@1a"; + sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@810c6d0000/tca9548@72/ic2@0/ds5@1a"; + }; + }; + module2 { + status = "okay"; + badge = "d4xx_imu"; + position = "left"; + orientation = "1"; + drivernode0 { + status = "okay"; + pcl_id = "v4l2_sensor"; + devname = "DS5 mux 9-001d"; + // proc-device-tree = "/proc/device-tree/bus@0/i2c@810c6d0000/ds5@1d"; + sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@810c6d0000/tca9548@72/ic2@0/ds5@1d"; + }; + }; + module3 { + status = "okay"; + badge = "d4xx_rgb"; + position = "left"; + orientation = "1"; + drivernode0 { + status = "okay"; + pcl_id = "v4l2_sensor"; + devname = "DS5 mux 9-001b"; + // proc-device-tree = "/proc/device-tree/bus@0/i2c@810c6d0000/ds5@1b"; + sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@810c6d0000/tca9548@72/ic2@0/ds5@1b"; + }; + }; + }; + }; + bus@0 { + host1x@8181200000 { + nvcsi@8188000000 { + num-channels = <4>; + channel@0 { + status = "okay"; + reg = <0>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_csi_in0: endpoint@0 { + status = "okay"; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&ds5_0_out>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_csi_out0: endpoint@1 { + status = "okay"; + port-index = <1>; + remote-endpoint = <&d4xx_vi_in0>; + }; + }; + }; + }; + channel@1 { + status = "okay"; + reg = <1>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_csi_in1: endpoint@2 { + status = "okay"; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&ds5_1_out>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_csi_out1: endpoint@3 { + status = "okay"; + port-index = <1>; + remote-endpoint = <&d4xx_vi_in1>; + }; + }; + }; + }; + channel@2 { + status = "okay"; + reg = <2>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_csi_in2: endpoint@4 { + status = "okay"; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&ds5_2_out>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_csi_out2: endpoint@5 { + status = "okay"; + port-index = <1>; + remote-endpoint = <&d4xx_vi_in2>; + }; + }; + }; + }; + channel@3 { + status = "okay"; + reg = <3>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_csi_in3: endpoint@6 { + status = "okay"; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&ds5_3_out>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_csi_out3: endpoint@7 { + status = "okay"; + port-index = <1>; + remote-endpoint = <&d4xx_vi_in3>; + }; + }; + }; + }; + }; + }; + + i2c@810c6d0000 { + clock-frequency = <400000>; + tca9548@72 { + status = "okay"; + reg = <0x72>; + compatible = "nxp,pca9548"; + #address-cells = <1>; + #size-cells = <0>; + skip_mux_detect = "yes"; + /*vcc-pullup-supply = <&battery_reg>;*/ + vcc_lp = "vcc"; + i2c@0 { + status = "okay"; + reg = <0>; + i2c-mux,deselect-on-exit; + #address-cells = <1>; + #size-cells = <0>; + + dser: max96712@29 { + status = "okay"; + reg = <0x29>; + compatible = "maxim,max96712"; + csi-mode = "2x4"; + max-src = <1>; + channel = "a"; + }; + + ser_a: max9295_a@42 { + status = "okay"; + compatible = "maxim,max9295"; + reg = <0x42>; + maxim,gmsl-dser-device = <&dser>; + }; + + ds5_3: ds5@1d { + status = "okay"; + def-addr = <0x10>; + reg = <0x1d>; + override_reg = <0x1a>; + compatible = "intel,d4xx"; + use_sensor_mode_id = "true"; + //vcc-supply = <&vdd_cam12v_poc>; + cam-type = "IMU"; + nvidia,gmsl-ser-device = <&ser_a>; + nvidia,gmsl-dser-device = <&dser>; + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + ds5_3_out: endpoint { + vc-id = <3>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_in3>; + }; + }; + }; + mode0 { + pixel_t = "grey_y16"; + num_lanes = "2"; + csi_pixel_bit_depth = "16"; + active_w = "640"; + active_h = "480"; + tegra_sinterface = "serial_b"; + mclk_khz = "24000"; + pix_clk_hz = "74250000"; + line_length = "1280"; /* 2200 */ + embedded_metadata_height = "0"; + }; + gmsl-link { + src-csi-port = "b"; + dst-csi-port = "a"; + serdes-csi-link = "a"; + csi-mode = "1x4"; + st-vc = <0>; + vc-id = <3>; + num-lanes = <2>; + }; + }; + + ds5_2: ds5@1c { + status = "okay"; + def-addr = <0x10>; + reg = <0x1c>; + override_reg = <0x1a>; + compatible = "intel,d4xx"; + use_sensor_mode_id = "true"; + //vcc-supply = <&vdd_cam12v_poc>; + cam-type = "Y8"; + nvidia,gmsl-ser-device = <&ser_a>; + nvidia,gmsl-dser-device = <&dser>; + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + ds5_2_out: endpoint { + vc-id = <2>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_in2>; + }; + }; + }; + /* mode0: Y8, mode1: depth D16 */ + mode0 { + pixel_t = "grey_y16"; + num_lanes = "2"; + csi_pixel_bit_depth = "16"; + active_w = "1280"; + active_h = "720"; + tegra_sinterface = "serial_b"; + mclk_khz = "24000"; + pix_clk_hz = "74250000"; + line_length = "1280"; /* 2200 */ + embedded_metadata_height = "1"; + }; + gmsl-link { + src-csi-port = "b"; + dst-csi-port = "a"; + serdes-csi-link = "a"; + csi-mode = "1x4"; + st-vc = <0>; + vc-id = <2>; + num-lanes = <2>; + }; + }; + + ds5_1: ds5@1b { + status = "okay"; + def-addr = <0x10>; + reg = <0x1b>; + override_reg = <0x1a>; + compatible = "intel,d4xx"; + use_sensor_mode_id = "true"; + //vcc-supply = <&vdd_cam12v_poc>; + cam-type = "RGB"; + nvidia,gmsl-ser-device = <&ser_a>; + nvidia,gmsl-dser-device = <&dser>; + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + ds5_1_out: endpoint { + vc-id = <1>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_in1>; + }; + }; + }; + mode0 { + pixel_t = "grey_y16"; + num_lanes = "2"; + csi_pixel_bit_depth = "16"; + active_w = "1920"; + active_h = "1080"; + tegra_sinterface = "serial_e"; + mclk_khz = "24000"; + pix_clk_hz = "74250000"; + line_length = "1280"; /* 2200 */ + embedded_metadata_height = "1"; + }; + gmsl-link { + src-csi-port = "b"; + dst-csi-port = "a"; + serdes-csi-link = "a"; + csi-mode = "1x4"; + st-vc = <0>; + vc-id = <1>; + num-lanes = <2>; + }; + }; + + ds5_0: ds5@1a { + status = "okay"; + def-addr = <0x10>; + reg = <0x1a>; + compatible = "intel,d4xx"; + use_sensor_mode_id = "true"; + //vcc-supply = <&vdd_cam12v_poc>; + cam-type = "Depth"; + nvidia,gmsl-ser-device = <&ser_a>; + nvidia,gmsl-dser-device = <&dser>; + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + ds5_0_out: endpoint { + vc-id = <0>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_in0>; + }; + }; + }; + mode0 { + pixel_t = "grey_y16"; + num_lanes = "2"; + csi_pixel_bit_depth = "16"; + active_w = "1280"; + active_h = "720"; + tegra_sinterface = "serial_a"; + mclk_khz = "24000"; + pix_clk_hz = "74250000"; + line_length = "1280"; /* 2200 */ + embedded_metadata_height = "1"; + }; + gmsl-link { + src-csi-port = "b"; + dst-csi-port = "a"; + serdes-csi-link = "a"; + csi-mode = "1x4"; + st-vc = <0>; + vc-id = <0>; + num-lanes = <2>; + }; + }; + }; + }; + }; + }; + }; + }; +}; diff --git a/hardware/realsense/tegra264-camera-d4xx-overlay.dtso b/hardware/realsense/tegra264-camera-d4xx-overlay.dtso new file mode 100644 index 00000000..5f41c26c --- /dev/null +++ b/hardware/realsense/tegra264-camera-d4xx-overlay.dtso @@ -0,0 +1,479 @@ +// SPDX-License-Identifier: GPL-2.0-only +// SPDX-FileCopyrightText: Copyright (c) 2018-2023, INTEL CORPORATION. All rights reserved. + +/dts-v1/; +/plugin/; + +#include +#define CAM0_RST_L TEGRA264_MAIN_GPIO(H, 3) +#define CAMERA_I2C_MUX_BUS(x) (0x1E + x) + +/* camera control gpio definitions */ +/ { + overlay-name = "Jetson RealSense Camera D4xx with max9296 and tca9548"; + jetson-header-name = "Jetson AGX CSI Connector"; + compatible = "nvidia,p4071-0000+p3834-0008", "nvidia,p3834-0008", "nvidia,tegra264"; + + fragment@0 { + target-path = "/"; + __overlay__ { + tegra-capture-vi { + num-channels = <4>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_vi_in0: endpoint { + status = "okay"; + vc-id = <0>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_out0>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_vi_in1: endpoint { + status = "okay"; + vc-id = <1>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_out1>; + }; + }; + port@2 { + status = "okay"; + reg = <2>; + d4xx_vi_in2: endpoint { + status = "okay"; + vc-id = <2>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_out2>; + }; + }; + port@3 { + status = "okay"; + reg = <3>; + d4xx_vi_in3: endpoint { + status = "okay"; + vc-id = <3>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_out3>; + }; + }; + }; + }; + tegra-camera-platform { + compatible = "nvidia, tegra-camera-platform"; + status = "okay"; + num_csi_lanes = <2>; + max_lane_speed = <1500000>; + min_bits_per_pixel = <8>; + vi_peak_byte_per_pixel = <2>; + vi_bw_margin_pct = <25>; + max_pixel_rate = <160000>; + isp_peak_byte_per_pixel = <5>; + isp_bw_margin_pct = <25>; + modules { + status = "okay"; + module0 { + status = "okay"; + badge = "d4xx_Y8"; + position = "left"; + orientation = "1"; + drivernode0 { + status = "okay"; + pcl_id = "v4l2_sensor"; + devname = "DS5 mux 9-001c"; + // proc-device-tree = "/proc/device-tree/bus@0/i2c@810c6d0000/ds5@1c"; + sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@810c6d0000/ds5@1c"; + }; + }; + module1 { + status = "okay"; + badge = "d4xx_depth"; + position = "left"; + orientation = "1"; + drivernode0 { + status = "okay"; + pcl_id = "v4l2_sensor"; + devname = "DS5 mux 9-001a"; + // proc-device-tree = "/proc/device-tree/bus@0/i2c@810c6d0000/ds5@1a"; + sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@810c6d0000/ds5@1a"; + }; + }; + module2 { + status = "okay"; + badge = "d4xx_imu"; + position = "left"; + orientation = "1"; + drivernode0 { + status = "okay"; + pcl_id = "v4l2_sensor"; + devname = "DS5 mux 9-001d"; + // proc-device-tree = "/proc/device-tree/bus@0/i2c@810c6d0000/ds5@1d"; + sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@810c6d0000/ds5@1d"; + }; + }; + module3 { + status = "okay"; + badge = "d4xx_rgb"; + position = "left"; + orientation = "1"; + drivernode0 { + status = "okay"; + pcl_id = "v4l2_sensor"; + devname = "DS5 mux 9-001b"; + // proc-device-tree = "/proc/device-tree/bus@0/i2c@810c6d0000/ds5@1b"; + sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/i2c@810c6d0000/ds5@1b"; + }; + }; + }; + }; + bus@0 { + host1x@8181200000 { + nvcsi@8188000000 { + num-channels = <4>; + channel@0 { + status = "okay"; + reg = <0>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_csi_in0: endpoint@0 { + status = "okay"; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&ds5_0_out>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_csi_out0: endpoint@1 { + status = "okay"; + remote-endpoint = <&d4xx_vi_in0>; + }; + }; + }; + }; + channel@1 { + status = "okay"; + reg = <1>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_csi_in1: endpoint@2 { + status = "okay"; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&ds5_1_out>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_csi_out1: endpoint@3 { + status = "okay"; + remote-endpoint = <&d4xx_vi_in1>; + }; + }; + }; + }; + channel@2 { + status = "okay"; + reg = <2>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_csi_in2: endpoint@4 { + status = "okay"; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&ds5_2_out>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_csi_out2: endpoint@5 { + status = "okay"; + remote-endpoint = <&d4xx_vi_in2>; + }; + }; + }; + }; + channel@3 { + status = "okay"; + reg = <3>; + ports { + status = "okay"; + port@0 { + status = "okay"; + reg = <0>; + d4xx_csi_in3: endpoint@6 { + status = "okay"; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&ds5_3_out>; + }; + }; + port@1 { + status = "okay"; + reg = <1>; + d4xx_csi_out3: endpoint@7 { + status = "okay"; + remote-endpoint = <&d4xx_vi_in3>; + }; + }; + }; + }; + }; + }; + i2c@810c6d0000 { + clock-frequency = <100000>; + tca9548@72 { + status = "okay"; + reg = <0x72>; + compatible = "nxp,pca9548"; + #address-cells = <1>; + #size-cells = <0>; + skip_mux_detect = "yes"; + // vcc-supply = <&vdd_1v8_ls>; + /*vcc-pullup-supply = <&battery_reg>;*/ + // force_bus_start = ; + // vcc_lp = "vcc"; + i2c@0 { + status = "okay"; + reg = <0>; + i2c-mux,deselect-on-exit; + #address-cells = <1>; + #size-cells = <0>; + + dser: max9296@48 { + status = "okay"; + reg = <0x48>; + compatible = "maxim,max9296"; + csi-mode = "2x4"; + max-src = <1>; + // reset-gpios = <&gpio CAM0_RST_L GPIO_ACTIVE_HIGH>; + }; + + ser_prim: max9295_prim@40 { + status = "okay"; + reg = <0x40>; + compatible = "maxim,max9295"; + is-prim-ser; + }; + + ser_a: max9295_a@42 { + status = "okay"; + compatible = "maxim,max9295"; + reg = <0x42>; + maxim,gmsl-dser-device = <&dser>; + }; + + ds5_3: ds5@1d { + status = "okay"; + def-addr = <0x10>; + reg = <0x1d>; + override_reg = <0x1a>; + compatible = "intel,d4xx"; + use_sensor_mode_id = "true"; + cam-type = "IMU"; + nvidia,gmsl-ser-device = <&ser_a>; + nvidia,gmsl-dser-device = <&dser>; + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + ds5_3_out: endpoint { + vc-id = <3>; + port-index = <3>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_in3>; + }; + }; + }; + mode0 { + pixel_t = "grey_y16"; + num_lanes = "2"; + csi_pixel_bit_depth = "16"; + active_w = "640"; + active_h = "480"; + tegra_sinterface = "serial_b"; + mclk_khz = "24000"; + pix_clk_hz = "74250000"; + line_length = "1280"; /* 2200 */ + embedded_metadata_height = "0"; + }; + gmsl-link { + src-csi-port = "b"; + dst-csi-port = "a"; + serdes-csi-link = "a"; + csi-mode = "1x4"; + st-vc = <0>; + vc-id = <3>; + num-lanes = <2>; + }; + }; + + ds5_2: ds5@1c { + status = "okay"; + def-addr = <0x10>; + reg = <0x1c>; + override_reg = <0x1a>; + compatible = "intel,d4xx"; + use_sensor_mode_id = "true"; + cam-type = "Y8"; + nvidia,gmsl-ser-device = <&ser_a>; + nvidia,gmsl-dser-device = <&dser>; + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + ds5_2_out: endpoint { + vc-id = <2>; + port-index = <2>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_in2>; + }; + }; + }; + /* mode0: Y8, mode1: depth D16 */ + mode0 { + pixel_t = "grey_y16"; + num_lanes = "2"; + csi_pixel_bit_depth = "16"; + active_w = "1280"; + active_h = "720"; + tegra_sinterface = "serial_b"; + mclk_khz = "24000"; + pix_clk_hz = "74250000"; + line_length = "1280"; /* 2200 */ + embedded_metadata_height = "1"; + }; + gmsl-link { + src-csi-port = "b"; + dst-csi-port = "a"; + serdes-csi-link = "a"; + csi-mode = "1x4"; + st-vc = <0>; + vc-id = <2>; + num-lanes = <2>; + }; + }; + + ds5_1: ds5@1b { + status = "okay"; + def-addr = <0x10>; + reg = <0x1b>; + override_reg = <0x1a>; + compatible = "intel,d4xx"; + use_sensor_mode_id = "true"; + cam-type = "RGB"; + nvidia,gmsl-ser-device = <&ser_a>; + nvidia,gmsl-dser-device = <&dser>; + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + ds5_1_out: endpoint { + vc-id = <1>; + port-index = <1>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_in1>; + }; + }; + }; + mode0 { + pixel_t = "grey_y16"; + num_lanes = "2"; + csi_pixel_bit_depth = "16"; + active_w = "1920"; + active_h = "1080"; + tegra_sinterface = "serial_e"; + mclk_khz = "24000"; + pix_clk_hz = "74250000"; + line_length = "1280"; /* 2200 */ + embedded_metadata_height = "1"; + }; + gmsl-link { + src-csi-port = "b"; + dst-csi-port = "a"; + serdes-csi-link = "a"; + csi-mode = "1x4"; + st-vc = <0>; + vc-id = <1>; + num-lanes = <2>; + }; + }; + + ds5_0: ds5@1a { + status = "okay"; + def-addr = <0x10>; + reg = <0x1a>; + compatible = "intel,d4xx"; + use_sensor_mode_id = "true"; + cam-type = "Depth"; + nvidia,gmsl-ser-device = <&ser_a>; + nvidia,gmsl-dser-device = <&dser>; + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + ds5_0_out: endpoint { + vc-id = <0>; + port-index = <0>; + bus-width = <2>; + remote-endpoint = <&d4xx_csi_in0>; + }; + }; + }; + mode0 { + pixel_t = "grey_y16"; + num_lanes = "2"; + csi_pixel_bit_depth = "16"; + active_w = "1280"; + active_h = "720"; + tegra_sinterface = "serial_a"; + mclk_khz = "24000"; + pix_clk_hz = "74250000"; + line_length = "1280"; /* 2200 */ + embedded_metadata_height = "1"; + }; + gmsl-link { + src-csi-port = "b"; + dst-csi-port = "a"; + serdes-csi-link = "a"; + csi-mode = "1x4"; + st-vc = <0>; + vc-id = <0>; + num-lanes = <2>; + }; + }; + }; + }; + }; + }; + }; + }; +}; diff --git a/kernel/kernel-jammy-src/Makefile b/kernel/kernel-jammy-src/Makefile index 7874f699..4034730c 100644 --- a/kernel/kernel-jammy-src/Makefile +++ b/kernel/kernel-jammy-src/Makefile @@ -28,25 +28,21 @@ kernel: @echo "Building $(KERNEL_SRC_DIR) sources" @echo "================================================================================" $(MAKE) \ - ARCH=arm64 \ -C $(kernel_source_dir) $(O_OPT) \ LOCALVERSION=$(version) \ $(KERNEL_DEF_CONFIG) $(MAKE) -j $(NPROC) \ - ARCH=arm64 \ -C $(kernel_source_dir) $(O_OPT) \ LOCALVERSION=$(version) \ --output-sync=target Image $(MAKE) -j $(NPROC) \ - ARCH=arm64 \ -C $(kernel_source_dir) $(O_OPT) \ LOCALVERSION=$(version) \ --output-sync=target dtbs $(MAKE) -j $(NPROC) \ - ARCH=arm64 \ -C $(kernel_source_dir) $(O_OPT) \ LOCALVERSION=$(version) \ --output-sync=target modules @@ -68,7 +64,6 @@ install: @echo "================================================================================" install $(kernel_image) $(INSTALL_MOD_PATH)/boot/ $(MAKE) \ - ARCH=arm64 \ -C $(kernel_source_dir) $(O_OPT) \ LOCALVERSION=$(version) \ INSTALL_MOD_PATH=$(INSTALL_MOD_PATH) \ @@ -83,7 +78,6 @@ clean: @echo "Cleaning $(KERNEL_SRC_DIR) sources" @echo "================================================================================" $(MAKE) \ - ARCH=arm64 \ -C $(kernel_source_dir) $(O_OPT) \ mrproper @echo "================================================================================" diff --git a/kernel/kernel-noble-src/7.0/0001-kernel-enable-HID_SENSOR-without-USB-impact.patch b/kernel/kernel-noble-src/7.0/0001-kernel-enable-HID_SENSOR-without-USB-impact.patch new file mode 100644 index 00000000..18af0d95 --- /dev/null +++ b/kernel/kernel-noble-src/7.0/0001-kernel-enable-HID_SENSOR-without-USB-impact.patch @@ -0,0 +1,47 @@ +From a28c524638e88665f3757002703a7add3e95643b Mon Sep 17 00:00:00 2001 +From: ejgoldik +Date: Sun, 8 Jun 2025 11:08:56 +0300 +Subject: [PATCH] kernel: enable HID_SENSOR without USB impact + +Signed-off-by: Ehud J. Goldik +--- + arch/arm64/configs/defconfig | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig +index 57e2a364e..8fffc0a60 100644 +--- a/arch/arm64/configs/defconfig ++++ b/arch/arm64/configs/defconfig +@@ -862,9 +862,11 @@ CONFIG_SND_SOC_LPASS_WSA_MACRO=m + CONFIG_SND_SIMPLE_CARD=m + CONFIG_SND_AUDIO_GRAPH_CARD=m + CONFIG_SND_AUDIO_GRAPH_CARD2=m ++CONFIG_HID=m + CONFIG_HIDRAW=y + CONFIG_UHID=m + CONFIG_HID_MULTITOUCH=m ++CONFIG_HID_SENSOR_HUB=m + CONFIG_I2C_HID_ACPI=m + CONFIG_I2C_HID_OF=m + CONFIG_USB=y +@@ -1148,6 +1150,7 @@ CONFIG_EXTCON_USB_GPIO=y + CONFIG_EXTCON_USBC_CROS_EC=y + CONFIG_RENESAS_RPCIF=m + CONFIG_IIO=y ++CONFIG_HID_SENSOR_ACCEL_3D=m + CONFIG_EXYNOS_ADC=y + CONFIG_IMX93_ADC=m + CONFIG_MAX9611=m +@@ -1155,6 +1158,9 @@ CONFIG_QCOM_SPMI_ADC5=m + CONFIG_TI_AM335X_ADC=m + CONFIG_IIO_CROS_EC_SENSORS_CORE=m + CONFIG_IIO_CROS_EC_SENSORS=m ++CONFIG_HID_SENSOR_IIO_COMMON=m ++CONFIG_HID_SENSOR_IIO_TRIGGER=m ++CONFIG_HID_SENSOR_GYRO_3D=m + CONFIG_IIO_ST_LSM6DSX=m + CONFIG_IIO_CROS_EC_LIGHT_PROX=m + CONFIG_SENSORS_ISL29018=m +-- +2.43.0 + diff --git a/kernel/kernel-noble-src/7.0/0002-realsense-camera-formats-jammy-master.patch b/kernel/kernel-noble-src/7.0/0002-realsense-camera-formats-jammy-master.patch new file mode 100644 index 00000000..4932310a --- /dev/null +++ b/kernel/kernel-noble-src/7.0/0002-realsense-camera-formats-jammy-master.patch @@ -0,0 +1,194 @@ +From a82c166d13d5ad2b1837e68123f5e25ea81c458e Mon Sep 17 00:00:00 2001 +From: Dmitry Perchanov +Date: Thu, 1 Sep 2022 18:14:43 +0300 +Subject: [PATCH] Streaming formats for Ubuntu 22.04 (jammy). Kernel 5.15 + +Author: Yu MENG + +Signed-off-by: Dmitry Perchanov +--- + drivers/media/common/uvc.c | 57 ++++++++++++++++++++++++++++ + drivers/include/linux/usb/uvc.h | 34 +++++++++++++++++ + drivers/media/v4l2-core/v4l2-ioctl.c | 9 +++++ + include/uapi/linux/videodev2.h | 9 +++++ + 4 files changed, 109 insertions(+) + +diff --git a/drivers/media/common/uvc.c b/drivers/media/common/uvc.c +index 9a791d8ef200..205d524128da 100644 +--- a/drivers/media/common/uvc.c ++++ b/drivers/media/common/uvc.c +@@ -165,6 +165,10 @@ static struct uvc_format_desc uvc_fmts[] = { + .guid = UVC_GUID_FORMAT_Y12I, + .fcc = V4L2_PIX_FMT_Y12I, + }, ++ { ++ .guid = UVC_GUID_FORMAT_Y16I, ++ .fcc = V4L2_PIX_FMT_Y16I, ++ }, + { + .guid = UVC_GUID_FORMAT_Z16, + .fcc = V4L2_PIX_FMT_Z16, +@@ -220,6 +225,48 @@ static struct uvc_format_desc uvc_fmts[] = { + .guid = UVC_GUID_FORMAT_HEVC, + .fcc = V4L2_PIX_FMT_HEVC, + }, ++ { ++ .guid = UVC_GUID_FORMAT_D16, ++ .fcc = V4L2_PIX_FMT_Z16, ++ }, ++ { ++ .guid = UVC_GUID_FORMAT_W10, ++ .fcc = V4L2_PIX_FMT_W10, ++ }, ++ { ++ .guid = UVC_GUID_FORMAT_CONFIDENCE_MAP, ++ .fcc = V4L2_PIX_FMT_CONFIDENCE_MAP, ++ }, ++ /* FishEye 8-bit monochrome */ ++ { ++ .guid = UVC_GUID_FORMAT_RAW8, ++ .fcc = V4L2_PIX_FMT_GREY, ++ }, ++ /* Legacy formats for backward-compatibility*/ ++ { ++ .guid = UVC_GUID_FORMAT_RW16, ++ .fcc = V4L2_PIX_FMT_RW16, ++ }, ++ { ++ .guid = UVC_GUID_FORMAT_BAYER16, ++ .fcc = V4L2_PIX_FMT_SBGGR16, ++ }, ++ { ++ .guid = UVC_GUID_FORMAT_Z16H, ++ .fcc = V4L2_PIX_FMT_Z16H, ++ }, ++ { ++ .guid = UVC_GUID_FORMAT_FG, ++ .fcc = V4L2_PIX_FMT_FG, ++ }, ++ { ++ .guid = UVC_GUID_FORMAT_INZC, ++ .fcc = V4L2_PIX_FMT_INZC, ++ }, ++ { ++ .guid = UVC_GUID_FORMAT_PAIR, ++ .fcc = V4L2_PIX_FMT_PAIR, ++ }, + }; + + const struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16]) +diff --git a/include/linux/usb/uvc.h b/include/linux/usb/uvc.h +index c3ea6a53869f..3a551e3fa262 100644 +--- a/include/linux/usb/uvc.h ++++ b/include/linux/usb/uvc.h +@@ -145,6 +145,9 @@ + #define UVC_GUID_FORMAT_Y12I \ + { 'Y', '1', '2', 'I', 0x00, 0x00, 0x10, 0x00, \ + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} ++#define UVC_GUID_FORMAT_Y16I \ ++ { 'Y', '1', '6', 'I', 0x00, 0x00, 0x10, 0x00, \ ++ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} + #define UVC_GUID_FORMAT_Z16 \ + { 'Z', '1', '6', ' ', 0x00, 0x00, 0x10, 0x00, \ + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} +@@ -175,6 +178,38 @@ + { 'H', 'E', 'V', 'C', 0x00, 0x00, 0x10, 0x00, \ + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} + ++ #define UVC_GUID_FORMAT_D16 \ ++ { 'P', 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, \ ++ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} ++ #define UVC_GUID_FORMAT_W10 \ ++ { 'W', '1', '0', ' ', 0x00, 0x00, 0x10, 0x00, \ ++ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} ++ #define UVC_GUID_FORMAT_RAW8 \ ++ { 'R', 'A', 'W', '8', 0x66, 0x1a, 0x42, 0xa2, \ ++ 0x90, 0x65, 0xd0, 0x18, 0x14, 0xa8, 0xef, 0x8a} ++ #define UVC_GUID_FORMAT_CONFIDENCE_MAP \ ++ { 'C', ' ', ' ', ' ', 0x00, 0x00, 0x10, 0x00, \ ++ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} ++ /* Legacy formats */ ++ #define UVC_GUID_FORMAT_RW16 \ ++ { 'R', 'W', '1', '6', 0x00, 0x00, 0x10, 0x00, \ ++ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} ++ #define UVC_GUID_FORMAT_BAYER16 \ ++ { 'R', 'W', '1', '6', 0x66, 0x1a, 0x42, 0xa2, \ ++ 0x90, 0x65, 0xd0, 0x18, 0x14, 0xa8, 0xef, 0x8a} ++ #define UVC_GUID_FORMAT_Z16H \ ++ { 'Z', '1', '6', 'H', 0x00, 0x00, 0x10, 0x00, \ ++ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} ++ #define UVC_GUID_FORMAT_FG \ ++ { 'F', 'G', ' ', ' ', 0x00, 0x00, 0x10, 0x00, \ ++ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} ++ #define UVC_GUID_FORMAT_INZC \ ++ { 'I', 'N', 'Z', 'C', 0x02, 0xb6, 0x0f, 0x48, \ ++ 0x97, 0x8c, 0xe4, 0xe8, 0x8a, 0xe8, 0x9b, 0x89} ++ #define UVC_GUID_FORMAT_PAIR \ ++ { 'P', 'A', 'I', 'R', 0x36, 0x85, 0x41, 0x48, \ ++ 0xb6, 0xbf, 0x8f, 0xc6, 0xff, 0xb0, 0x83, 0xa8} ++ + struct uvc_format_desc { + u8 guid[16]; + u32 fcc; +diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c +index 7c596a85f34f..7c36ba1bb35a 100644 +--- a/drivers/media/v4l2-core/v4l2-ioctl.c ++++ b/drivers/media/v4l2-core/v4l2-ioctl.c +@@ -1267,6 +1267,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) + case V4L2_PIX_FMT_IPU3_Y10: descr = "10-bit greyscale (IPU3 Packed)"; break; + case V4L2_PIX_FMT_Y8I: descr = "Interleaved 8-bit Greyscale"; break; + case V4L2_PIX_FMT_Y12I: descr = "Interleaved 12-bit Greyscale"; break; ++ case V4L2_PIX_FMT_Y16I: descr = "Interleaved 16-bit Greyscale"; break; + case V4L2_PIX_FMT_Z16: descr = "16-bit Depth"; break; + case V4L2_PIX_FMT_INZI: descr = "Planar 10:16 Greyscale Depth"; break; + case V4L2_PIX_FMT_CNF4: descr = "4-bit Depth Confidence (Packed)"; break; +@@ -1387,6 +1388,14 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) + case V4L2_PIX_FMT_Y210: descr = "10-bit YUYV Packed"; break; + case V4L2_PIX_FMT_Y212: descr = "12-bit YUYV Packed"; break; + case V4L2_PIX_FMT_Y216: descr = "16-bit YUYV Packed"; break; ++ /* Librealsense formats*/ ++ case V4L2_PIX_FMT_RW16: descr = "16-bit Raw data"; break; ++ case V4L2_PIX_FMT_W10: descr = "10-bit packed 8888[2222]"; break; ++ case V4L2_PIX_FMT_CONFIDENCE_MAP: descr = "Packed [44] confidence data"; break; ++ case V4L2_PIX_FMT_FG: descr = "Frame Grabber (FG )"; break; ++ case V4L2_PIX_FMT_INZC: descr = "Planar Depth/Confidence (INZC)"; break; ++ case V4L2_PIX_FMT_PAIR: descr = "Relative IR (PAIR)"; break; ++ case V4L2_PIX_FMT_Z16H: descr = "Z16 Huffman Compression"; break; + + default: + /* Compressed formats */ +diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h +index 9260791b8438..fd50e9c34a0e 100644 +--- a/include/uapi/linux/videodev2.h ++++ b/include/uapi/linux/videodev2.h +@@ -731,18 +731,27 @@ struct v4l2_pix_format { + #define V4L2_PIX_FMT_S5C_UYVY_JPG v4l2_fourcc('S', '5', 'C', 'I') /* S5C73M3 interleaved UYVY/JPEG */ + #define V4L2_PIX_FMT_Y8I v4l2_fourcc('Y', '8', 'I', ' ') /* Greyscale 8-bit L/R interleaved */ + #define V4L2_PIX_FMT_Y12I v4l2_fourcc('Y', '1', '2', 'I') /* Greyscale 12-bit L/R interleaved */ ++#define V4L2_PIX_FMT_Y16I v4l2_fourcc('Y', '1', '6', 'I') /* Greyscale 16-bit L/R interleaved */ + #define V4L2_PIX_FMT_Z16 v4l2_fourcc('Z', '1', '6', ' ') /* Depth data 16-bit */ + #define V4L2_PIX_FMT_MT21C v4l2_fourcc('M', 'T', '2', '1') /* Mediatek compressed block mode */ + #define V4L2_PIX_FMT_MM21 v4l2_fourcc('M', 'M', '2', '1') /* Mediatek 8-bit block mode, two non-contiguous planes */ + #define V4L2_PIX_FMT_MT2110T v4l2_fourcc('M', 'T', '2', 'T') /* Mediatek 10-bit block tile mode */ + #define V4L2_PIX_FMT_MT2110R v4l2_fourcc('M', 'T', '2', 'R') /* Mediatek 10-bit block raster mode */ + #define V4L2_PIX_FMT_INZI v4l2_fourcc('I', 'N', 'Z', 'I') /* Intel Planar Greyscale 10-bit and Depth 16-bit */ + #define V4L2_PIX_FMT_CNF4 v4l2_fourcc('C', 'N', 'F', '4') /* Intel 4-bit packed depth confidence information */ + #define V4L2_PIX_FMT_HI240 v4l2_fourcc('H', 'I', '2', '4') /* BTTV 8-bit dithered RGB */ + #define V4L2_PIX_FMT_QC08C v4l2_fourcc('Q', '0', '8', 'C') /* Qualcomm 8-bit compressed */ + #define V4L2_PIX_FMT_QC10C v4l2_fourcc('Q', '1', '0', 'C') /* Qualcomm 10-bit compressed */ + #define V4L2_PIX_FMT_AJPG v4l2_fourcc('A', 'J', 'P', 'G') /* Aspeed JPEG */ + #define V4L2_PIX_FMT_HEXTILE v4l2_fourcc('H', 'X', 'T', 'L') /* Hextile compressed */ ++#define V4L2_PIX_FMT_RW16 v4l2_fourcc('R', 'W', '1', '6') /* Raw data 16-bit */ ++#define V4L2_PIX_FMT_W10 v4l2_fourcc('W', '1', '0', ' ') /* Packed raw data 10-bit */ ++#define V4L2_PIX_FMT_CONFIDENCE_MAP v4l2_fourcc('C', ' ', ' ', ' ') /* Two pixels in one byte */ ++/* Librealsense development*/ ++#define V4L2_PIX_FMT_FG v4l2_fourcc('F', 'G', ' ', ' ') /* Frame Grabber */ ++#define V4L2_PIX_FMT_INZC v4l2_fourcc('I', 'N', 'Z', 'C') /* Planar Depth/Confidence */ ++#define V4L2_PIX_FMT_PAIR v4l2_fourcc('P', 'A', 'I', 'R') /* Relative IR */ ++#define V4L2_PIX_FMT_Z16H v4l2_fourcc('Z', '1', '6', 'H') /* Depth Z16 custom Huffman Code compression*/ + + /* 10bit raw packed, 32 bytes for every 25 pixels, last LSB 6 bits unused */ + #define V4L2_PIX_FMT_IPU3_SBGGR10 v4l2_fourcc('i', 'p', '3', 'b') /* IPU3 packed 10-bit BGGR bayer */ +-- +2.37.1 + diff --git a/kernel/kernel-noble-src/7.0/0003-realsense-metadata-jammy-master.patch b/kernel/kernel-noble-src/7.0/0003-realsense-metadata-jammy-master.patch new file mode 100644 index 00000000..7dd09504 --- /dev/null +++ b/kernel/kernel-noble-src/7.0/0003-realsense-metadata-jammy-master.patch @@ -0,0 +1,306 @@ +From 68ebc4e3fb3729f2b6804ea4d72d5dfda356512f Mon Sep 17 00:00:00 2001 +From: Dmitry Perchanov +Date: Sun, 22 Jan 2023 12:58:19 +0200 +Subject: [PATCH] Enabling UVC Metadata attributes with Ubuntu 22.04. Kernel + 5.15 + +Co-developed-by: Yu MENG +Co-developed-by: Evgeni Raikhel +Signed-off-by: Dmitry Perchanov +--- + drivers/media/usb/uvc/uvc_driver.c | 279 +++++++++++++++++++++++++++++ + 2 files changed, 280 insertions(+), 1 deletion(-) + +diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c +index 2e7df1de0..848417912 100644 +--- a/drivers/media/usb/uvc/uvc_driver.c ++++ b/drivers/media/usb/uvc/uvc_driver.c +@@ -3152,6 +3152,285 @@ static const struct usb_device_id uvc_ids[] = { + .bInterfaceSubClass = 1, + .bInterfaceProtocol = 0, + .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel SR306 depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0aa3, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel SR300 depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0aa5, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D400/PSR depth camera*/ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0ad1, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D410/ASR depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0ad2, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D415/ASRC depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0ad3, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D430/AWG depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0ad4, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D450/AWGT depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0ad5, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* USB2 Descriptor, Depth Sensor */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0ad6, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D400 IMU Module */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0af2, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D420/PWG depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0af6, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D420_MM/PWGT depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0afe, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D410_MM/ASRT depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0aff, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D400_MM/PSRT depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b00, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D430_MM/AWGCT depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b01, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D460/DS5U depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b03, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D435/AWGC depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b07, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D405 S depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b0c, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel L500 depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b0d, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D435i depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b3a, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel L515 Pre-PRQ */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b3d, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel SR305 Depth Camera*/ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b48, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D416 Depth Camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b49, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D430i depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b4b, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D465 */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b4d, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D555e Depth Camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b56, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = UVC_PC_PROTOCOL_15, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D405 */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b5b, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D455 */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b5c, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel L515 */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b64, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel L535 */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b68, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D585 Depth Camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b6a, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = UVC_PC_PROTOCOL_15, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel 585 Camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b6b, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = UVC_PC_PROTOCOL_15, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, + /* Generic USB Video Class */ + { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, UVC_PC_PROTOCOL_UNDEFINED) }, + { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, UVC_PC_PROTOCOL_15) }, +-- +2.34.1 + diff --git a/kernel/kernel-noble-src/7.0/0004-add-d4xx-camera-overlays.patch b/kernel/kernel-noble-src/7.0/0004-add-d4xx-camera-overlays.patch new file mode 100644 index 00000000..37400851 --- /dev/null +++ b/kernel/kernel-noble-src/7.0/0004-add-d4xx-camera-overlays.patch @@ -0,0 +1,12 @@ +Index: kernel-noble-src/arch/arm64/boot/dts/nvidia/Makefile +=================================================================== +--- kernel-noble-src.orig/arch/arm64/boot/dts/nvidia/Makefile ++++ kernel-noble-src/arch/arm64/boot/dts/nvidia/Makefile +@@ -30,3 +30,7 @@ dtb-$(CONFIG_ARCH_TEGRA_234_SOC) += tegr + dtb-$(CONFIG_ARCH_TEGRA_234_SOC) += tegra234-p3740-0002+p3701-0008.dtb + dtb-$(CONFIG_ARCH_TEGRA_234_SOC) += tegra234-p3768-0000+p3767-0000.dtb + dtb-$(CONFIG_ARCH_TEGRA_234_SOC) += tegra234-p3768-0000+p3767-0005.dtb ++ ++dtb-$(CONFIG_ARCH_TEGRA_264_SOC) += tegra264-camera-d4xx-overlay-advantech.dtbo ++dtb-$(CONFIG_ARCH_TEGRA_264_SOC) += tegra264-camera-d4xx-overlay-max96712-EVB.dtbo ++dtb-$(CONFIG_ARCH_TEGRA_264_SOC) += tegra264-camera-d4xx-overlay.dtbo diff --git a/kernel/kernel-noble-src/7.0/0005-support-for-dynamic-change-of-i2c-bus-clk-rate.patch b/kernel/kernel-noble-src/7.0/0005-support-for-dynamic-change-of-i2c-bus-clk-rate.patch new file mode 100644 index 00000000..8cc3d063 --- /dev/null +++ b/kernel/kernel-noble-src/7.0/0005-support-for-dynamic-change-of-i2c-bus-clk-rate.patch @@ -0,0 +1,104 @@ +From ce6faaedef68204e8b132bf44a0e4d2432dfb7ad Mon Sep 17 00:00:00 2001 +From: Arun-Prasad-V +Date: Mon, 4 Nov 2024 12:52:39 +0530 +Subject: [PATCH] Support for dynamic change of i2c bus-clk-rate + +Signed-off-by: Arun Prasad V +--- + drivers/i2c/i2c-core-base.c | 45 ++++++++++++++++++++++++++++++++++ + include/linux/i2c.h | 5 ++++ + 3 files changed, 92 insertions(+) + +diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c +index c232535ca8f4..2edd24973cca 100644 +--- a/drivers/i2c/i2c-core-base.c ++++ b/drivers/i2c/i2c-core-base.c +@@ -1285,10 +1285,33 @@ delete_device_store(struct device *dev, struct device_attribute *attr, + static DEVICE_ATTR_IGNORE_LOCKDEP(delete_device, S_IWUSR, NULL, + delete_device_store); + ++static ssize_t show_bus_clk_rate(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct i2c_adapter *adap = to_i2c_adapter(dev); ++ ++ return sprintf(buf, "%ld\n", adap->bus_clk_rate); ++} ++ ++static ssize_t set_bus_clk_rate(struct device *dev, ++ struct device_attribute *attr, const char *buf, size_t count) ++{ ++ struct i2c_adapter *adap = to_i2c_adapter(dev); ++ char *p = (char *)buf; ++ int bus_clk_rate; ++ ++ bus_clk_rate = memparse(p, &p); ++ dev_info(dev, "Setting clock rate %d on next transfer\n", bus_clk_rate); ++ adap->bus_clk_rate = bus_clk_rate; ++ return count; ++} ++static DEVICE_ATTR(bus_clk_rate, 0644, show_bus_clk_rate, set_bus_clk_rate); ++ + static struct attribute *i2c_adapter_attrs[] = { + &dev_attr_name.attr, + &dev_attr_new_device.attr, + &dev_attr_delete_device.attr, ++ &dev_attr_bus_clk_rate.attr, + NULL + }; + ATTRIBUTE_GROUPS(i2c_adapter); +@@ -1401,6 +1424,28 @@ static int i2c_setup_host_notify_irq_domain(struct i2c_adapter *adap) + return 0; + } + ++int i2c_set_adapter_bus_clk_rate(struct i2c_adapter *adap, int bus_rate) ++{ ++ i2c_lock_bus(adap, I2C_LOCK_ROOT_ADAPTER); ++ adap->bus_clk_rate = bus_rate; ++ i2c_unlock_bus(adap, I2C_LOCK_ROOT_ADAPTER); ++ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(i2c_set_adapter_bus_clk_rate); ++ ++int i2c_get_adapter_bus_clk_rate(struct i2c_adapter *adap) ++{ ++ int bus_clk_rate; ++ ++ i2c_lock_bus(adap, I2C_LOCK_ROOT_ADAPTER); ++ bus_clk_rate = adap->bus_clk_rate; ++ i2c_unlock_bus(adap, I2C_LOCK_ROOT_ADAPTER); ++ ++ return bus_clk_rate; ++} ++EXPORT_SYMBOL_GPL(i2c_get_adapter_bus_clk_rate); ++ + /** + * i2c_handle_smbus_host_notify - Forward a Host Notify event to the correct + * I2C client. +diff --git a/include/linux/i2c.h b/include/linux/i2c.h +index 2ce3efbe9198..9d876ad6373c 100644 +--- a/include/linux/i2c.h ++++ b/include/linux/i2c.h +@@ -131,6 +131,10 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); + /* Unlocked flavor */ + int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); + ++/* Change bus clock rate for i2c adapter */ ++extern int i2c_set_adapter_bus_clk_rate(struct i2c_adapter *adap, int bus_rate); ++extern int i2c_get_adapter_bus_clk_rate(struct i2c_adapter *adap); ++ + /* This is the very generalized SMBus access routine. You probably do not + want to use this, though; one of the functions below may be much easier, + and probably just as fast. +@@ -737,6 +741,7 @@ struct i2c_adapter { + const struct i2c_adapter_quirks *quirks; + + struct irq_domain *host_notify_domain; ++ unsigned long bus_clk_rate; + struct regulator *bus_regulator; + + struct dentry *debugfs; +-- +2.34.1 + diff --git a/kernel/kernel-noble-src/7.0/0006-fix-null-pointer-exception.patch b/kernel/kernel-noble-src/7.0/0006-fix-null-pointer-exception.patch new file mode 100644 index 00000000..697ae054 --- /dev/null +++ b/kernel/kernel-noble-src/7.0/0006-fix-null-pointer-exception.patch @@ -0,0 +1,13 @@ +diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c +index 19d20871afef..8d748404976b 100644 +--- a/drivers/media/v4l2-core/v4l2-subdev.c ++++ b/drivers/media/v4l2-core/v4l2-subdev.c +@@ -1568,7 +1568,7 @@ __v4l2_subdev_state_get_format(struct v4l2_subdev_state *state, + if (stream) + return NULL; + +- if (pad >= state->sd->entity.num_pads) ++ if (state->sd && pad >= state->sd->entity.num_pads) + return NULL; + + return &state->pads[pad].format; diff --git a/kernel/kernel-noble-src/7.1/0001-kernel-enable-HID_SENSOR-without-USB-impact.patch b/kernel/kernel-noble-src/7.1/0001-kernel-enable-HID_SENSOR-without-USB-impact.patch new file mode 100644 index 00000000..18af0d95 --- /dev/null +++ b/kernel/kernel-noble-src/7.1/0001-kernel-enable-HID_SENSOR-without-USB-impact.patch @@ -0,0 +1,47 @@ +From a28c524638e88665f3757002703a7add3e95643b Mon Sep 17 00:00:00 2001 +From: ejgoldik +Date: Sun, 8 Jun 2025 11:08:56 +0300 +Subject: [PATCH] kernel: enable HID_SENSOR without USB impact + +Signed-off-by: Ehud J. Goldik +--- + arch/arm64/configs/defconfig | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig +index 57e2a364e..8fffc0a60 100644 +--- a/arch/arm64/configs/defconfig ++++ b/arch/arm64/configs/defconfig +@@ -862,9 +862,11 @@ CONFIG_SND_SOC_LPASS_WSA_MACRO=m + CONFIG_SND_SIMPLE_CARD=m + CONFIG_SND_AUDIO_GRAPH_CARD=m + CONFIG_SND_AUDIO_GRAPH_CARD2=m ++CONFIG_HID=m + CONFIG_HIDRAW=y + CONFIG_UHID=m + CONFIG_HID_MULTITOUCH=m ++CONFIG_HID_SENSOR_HUB=m + CONFIG_I2C_HID_ACPI=m + CONFIG_I2C_HID_OF=m + CONFIG_USB=y +@@ -1148,6 +1150,7 @@ CONFIG_EXTCON_USB_GPIO=y + CONFIG_EXTCON_USBC_CROS_EC=y + CONFIG_RENESAS_RPCIF=m + CONFIG_IIO=y ++CONFIG_HID_SENSOR_ACCEL_3D=m + CONFIG_EXYNOS_ADC=y + CONFIG_IMX93_ADC=m + CONFIG_MAX9611=m +@@ -1155,6 +1158,9 @@ CONFIG_QCOM_SPMI_ADC5=m + CONFIG_TI_AM335X_ADC=m + CONFIG_IIO_CROS_EC_SENSORS_CORE=m + CONFIG_IIO_CROS_EC_SENSORS=m ++CONFIG_HID_SENSOR_IIO_COMMON=m ++CONFIG_HID_SENSOR_IIO_TRIGGER=m ++CONFIG_HID_SENSOR_GYRO_3D=m + CONFIG_IIO_ST_LSM6DSX=m + CONFIG_IIO_CROS_EC_LIGHT_PROX=m + CONFIG_SENSORS_ISL29018=m +-- +2.43.0 + diff --git a/kernel/kernel-noble-src/7.1/0002-realsense-camera-formats-jammy-master.patch b/kernel/kernel-noble-src/7.1/0002-realsense-camera-formats-jammy-master.patch new file mode 100644 index 00000000..4932310a --- /dev/null +++ b/kernel/kernel-noble-src/7.1/0002-realsense-camera-formats-jammy-master.patch @@ -0,0 +1,194 @@ +From a82c166d13d5ad2b1837e68123f5e25ea81c458e Mon Sep 17 00:00:00 2001 +From: Dmitry Perchanov +Date: Thu, 1 Sep 2022 18:14:43 +0300 +Subject: [PATCH] Streaming formats for Ubuntu 22.04 (jammy). Kernel 5.15 + +Author: Yu MENG + +Signed-off-by: Dmitry Perchanov +--- + drivers/media/common/uvc.c | 57 ++++++++++++++++++++++++++++ + drivers/include/linux/usb/uvc.h | 34 +++++++++++++++++ + drivers/media/v4l2-core/v4l2-ioctl.c | 9 +++++ + include/uapi/linux/videodev2.h | 9 +++++ + 4 files changed, 109 insertions(+) + +diff --git a/drivers/media/common/uvc.c b/drivers/media/common/uvc.c +index 9a791d8ef200..205d524128da 100644 +--- a/drivers/media/common/uvc.c ++++ b/drivers/media/common/uvc.c +@@ -165,6 +165,10 @@ static struct uvc_format_desc uvc_fmts[] = { + .guid = UVC_GUID_FORMAT_Y12I, + .fcc = V4L2_PIX_FMT_Y12I, + }, ++ { ++ .guid = UVC_GUID_FORMAT_Y16I, ++ .fcc = V4L2_PIX_FMT_Y16I, ++ }, + { + .guid = UVC_GUID_FORMAT_Z16, + .fcc = V4L2_PIX_FMT_Z16, +@@ -220,6 +225,48 @@ static struct uvc_format_desc uvc_fmts[] = { + .guid = UVC_GUID_FORMAT_HEVC, + .fcc = V4L2_PIX_FMT_HEVC, + }, ++ { ++ .guid = UVC_GUID_FORMAT_D16, ++ .fcc = V4L2_PIX_FMT_Z16, ++ }, ++ { ++ .guid = UVC_GUID_FORMAT_W10, ++ .fcc = V4L2_PIX_FMT_W10, ++ }, ++ { ++ .guid = UVC_GUID_FORMAT_CONFIDENCE_MAP, ++ .fcc = V4L2_PIX_FMT_CONFIDENCE_MAP, ++ }, ++ /* FishEye 8-bit monochrome */ ++ { ++ .guid = UVC_GUID_FORMAT_RAW8, ++ .fcc = V4L2_PIX_FMT_GREY, ++ }, ++ /* Legacy formats for backward-compatibility*/ ++ { ++ .guid = UVC_GUID_FORMAT_RW16, ++ .fcc = V4L2_PIX_FMT_RW16, ++ }, ++ { ++ .guid = UVC_GUID_FORMAT_BAYER16, ++ .fcc = V4L2_PIX_FMT_SBGGR16, ++ }, ++ { ++ .guid = UVC_GUID_FORMAT_Z16H, ++ .fcc = V4L2_PIX_FMT_Z16H, ++ }, ++ { ++ .guid = UVC_GUID_FORMAT_FG, ++ .fcc = V4L2_PIX_FMT_FG, ++ }, ++ { ++ .guid = UVC_GUID_FORMAT_INZC, ++ .fcc = V4L2_PIX_FMT_INZC, ++ }, ++ { ++ .guid = UVC_GUID_FORMAT_PAIR, ++ .fcc = V4L2_PIX_FMT_PAIR, ++ }, + }; + + const struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16]) +diff --git a/include/linux/usb/uvc.h b/include/linux/usb/uvc.h +index c3ea6a53869f..3a551e3fa262 100644 +--- a/include/linux/usb/uvc.h ++++ b/include/linux/usb/uvc.h +@@ -145,6 +145,9 @@ + #define UVC_GUID_FORMAT_Y12I \ + { 'Y', '1', '2', 'I', 0x00, 0x00, 0x10, 0x00, \ + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} ++#define UVC_GUID_FORMAT_Y16I \ ++ { 'Y', '1', '6', 'I', 0x00, 0x00, 0x10, 0x00, \ ++ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} + #define UVC_GUID_FORMAT_Z16 \ + { 'Z', '1', '6', ' ', 0x00, 0x00, 0x10, 0x00, \ + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} +@@ -175,6 +178,38 @@ + { 'H', 'E', 'V', 'C', 0x00, 0x00, 0x10, 0x00, \ + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} + ++ #define UVC_GUID_FORMAT_D16 \ ++ { 'P', 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, \ ++ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} ++ #define UVC_GUID_FORMAT_W10 \ ++ { 'W', '1', '0', ' ', 0x00, 0x00, 0x10, 0x00, \ ++ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} ++ #define UVC_GUID_FORMAT_RAW8 \ ++ { 'R', 'A', 'W', '8', 0x66, 0x1a, 0x42, 0xa2, \ ++ 0x90, 0x65, 0xd0, 0x18, 0x14, 0xa8, 0xef, 0x8a} ++ #define UVC_GUID_FORMAT_CONFIDENCE_MAP \ ++ { 'C', ' ', ' ', ' ', 0x00, 0x00, 0x10, 0x00, \ ++ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} ++ /* Legacy formats */ ++ #define UVC_GUID_FORMAT_RW16 \ ++ { 'R', 'W', '1', '6', 0x00, 0x00, 0x10, 0x00, \ ++ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} ++ #define UVC_GUID_FORMAT_BAYER16 \ ++ { 'R', 'W', '1', '6', 0x66, 0x1a, 0x42, 0xa2, \ ++ 0x90, 0x65, 0xd0, 0x18, 0x14, 0xa8, 0xef, 0x8a} ++ #define UVC_GUID_FORMAT_Z16H \ ++ { 'Z', '1', '6', 'H', 0x00, 0x00, 0x10, 0x00, \ ++ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} ++ #define UVC_GUID_FORMAT_FG \ ++ { 'F', 'G', ' ', ' ', 0x00, 0x00, 0x10, 0x00, \ ++ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} ++ #define UVC_GUID_FORMAT_INZC \ ++ { 'I', 'N', 'Z', 'C', 0x02, 0xb6, 0x0f, 0x48, \ ++ 0x97, 0x8c, 0xe4, 0xe8, 0x8a, 0xe8, 0x9b, 0x89} ++ #define UVC_GUID_FORMAT_PAIR \ ++ { 'P', 'A', 'I', 'R', 0x36, 0x85, 0x41, 0x48, \ ++ 0xb6, 0xbf, 0x8f, 0xc6, 0xff, 0xb0, 0x83, 0xa8} ++ + struct uvc_format_desc { + u8 guid[16]; + u32 fcc; +diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c +index 7c596a85f34f..7c36ba1bb35a 100644 +--- a/drivers/media/v4l2-core/v4l2-ioctl.c ++++ b/drivers/media/v4l2-core/v4l2-ioctl.c +@@ -1267,6 +1267,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) + case V4L2_PIX_FMT_IPU3_Y10: descr = "10-bit greyscale (IPU3 Packed)"; break; + case V4L2_PIX_FMT_Y8I: descr = "Interleaved 8-bit Greyscale"; break; + case V4L2_PIX_FMT_Y12I: descr = "Interleaved 12-bit Greyscale"; break; ++ case V4L2_PIX_FMT_Y16I: descr = "Interleaved 16-bit Greyscale"; break; + case V4L2_PIX_FMT_Z16: descr = "16-bit Depth"; break; + case V4L2_PIX_FMT_INZI: descr = "Planar 10:16 Greyscale Depth"; break; + case V4L2_PIX_FMT_CNF4: descr = "4-bit Depth Confidence (Packed)"; break; +@@ -1387,6 +1388,14 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) + case V4L2_PIX_FMT_Y210: descr = "10-bit YUYV Packed"; break; + case V4L2_PIX_FMT_Y212: descr = "12-bit YUYV Packed"; break; + case V4L2_PIX_FMT_Y216: descr = "16-bit YUYV Packed"; break; ++ /* Librealsense formats*/ ++ case V4L2_PIX_FMT_RW16: descr = "16-bit Raw data"; break; ++ case V4L2_PIX_FMT_W10: descr = "10-bit packed 8888[2222]"; break; ++ case V4L2_PIX_FMT_CONFIDENCE_MAP: descr = "Packed [44] confidence data"; break; ++ case V4L2_PIX_FMT_FG: descr = "Frame Grabber (FG )"; break; ++ case V4L2_PIX_FMT_INZC: descr = "Planar Depth/Confidence (INZC)"; break; ++ case V4L2_PIX_FMT_PAIR: descr = "Relative IR (PAIR)"; break; ++ case V4L2_PIX_FMT_Z16H: descr = "Z16 Huffman Compression"; break; + + default: + /* Compressed formats */ +diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h +index 9260791b8438..fd50e9c34a0e 100644 +--- a/include/uapi/linux/videodev2.h ++++ b/include/uapi/linux/videodev2.h +@@ -731,18 +731,27 @@ struct v4l2_pix_format { + #define V4L2_PIX_FMT_S5C_UYVY_JPG v4l2_fourcc('S', '5', 'C', 'I') /* S5C73M3 interleaved UYVY/JPEG */ + #define V4L2_PIX_FMT_Y8I v4l2_fourcc('Y', '8', 'I', ' ') /* Greyscale 8-bit L/R interleaved */ + #define V4L2_PIX_FMT_Y12I v4l2_fourcc('Y', '1', '2', 'I') /* Greyscale 12-bit L/R interleaved */ ++#define V4L2_PIX_FMT_Y16I v4l2_fourcc('Y', '1', '6', 'I') /* Greyscale 16-bit L/R interleaved */ + #define V4L2_PIX_FMT_Z16 v4l2_fourcc('Z', '1', '6', ' ') /* Depth data 16-bit */ + #define V4L2_PIX_FMT_MT21C v4l2_fourcc('M', 'T', '2', '1') /* Mediatek compressed block mode */ + #define V4L2_PIX_FMT_MM21 v4l2_fourcc('M', 'M', '2', '1') /* Mediatek 8-bit block mode, two non-contiguous planes */ + #define V4L2_PIX_FMT_MT2110T v4l2_fourcc('M', 'T', '2', 'T') /* Mediatek 10-bit block tile mode */ + #define V4L2_PIX_FMT_MT2110R v4l2_fourcc('M', 'T', '2', 'R') /* Mediatek 10-bit block raster mode */ + #define V4L2_PIX_FMT_INZI v4l2_fourcc('I', 'N', 'Z', 'I') /* Intel Planar Greyscale 10-bit and Depth 16-bit */ + #define V4L2_PIX_FMT_CNF4 v4l2_fourcc('C', 'N', 'F', '4') /* Intel 4-bit packed depth confidence information */ + #define V4L2_PIX_FMT_HI240 v4l2_fourcc('H', 'I', '2', '4') /* BTTV 8-bit dithered RGB */ + #define V4L2_PIX_FMT_QC08C v4l2_fourcc('Q', '0', '8', 'C') /* Qualcomm 8-bit compressed */ + #define V4L2_PIX_FMT_QC10C v4l2_fourcc('Q', '1', '0', 'C') /* Qualcomm 10-bit compressed */ + #define V4L2_PIX_FMT_AJPG v4l2_fourcc('A', 'J', 'P', 'G') /* Aspeed JPEG */ + #define V4L2_PIX_FMT_HEXTILE v4l2_fourcc('H', 'X', 'T', 'L') /* Hextile compressed */ ++#define V4L2_PIX_FMT_RW16 v4l2_fourcc('R', 'W', '1', '6') /* Raw data 16-bit */ ++#define V4L2_PIX_FMT_W10 v4l2_fourcc('W', '1', '0', ' ') /* Packed raw data 10-bit */ ++#define V4L2_PIX_FMT_CONFIDENCE_MAP v4l2_fourcc('C', ' ', ' ', ' ') /* Two pixels in one byte */ ++/* Librealsense development*/ ++#define V4L2_PIX_FMT_FG v4l2_fourcc('F', 'G', ' ', ' ') /* Frame Grabber */ ++#define V4L2_PIX_FMT_INZC v4l2_fourcc('I', 'N', 'Z', 'C') /* Planar Depth/Confidence */ ++#define V4L2_PIX_FMT_PAIR v4l2_fourcc('P', 'A', 'I', 'R') /* Relative IR */ ++#define V4L2_PIX_FMT_Z16H v4l2_fourcc('Z', '1', '6', 'H') /* Depth Z16 custom Huffman Code compression*/ + + /* 10bit raw packed, 32 bytes for every 25 pixels, last LSB 6 bits unused */ + #define V4L2_PIX_FMT_IPU3_SBGGR10 v4l2_fourcc('i', 'p', '3', 'b') /* IPU3 packed 10-bit BGGR bayer */ +-- +2.37.1 + diff --git a/kernel/kernel-noble-src/7.1/0003-realsense-metadata-jammy-master.patch b/kernel/kernel-noble-src/7.1/0003-realsense-metadata-jammy-master.patch new file mode 100644 index 00000000..7dd09504 --- /dev/null +++ b/kernel/kernel-noble-src/7.1/0003-realsense-metadata-jammy-master.patch @@ -0,0 +1,306 @@ +From 68ebc4e3fb3729f2b6804ea4d72d5dfda356512f Mon Sep 17 00:00:00 2001 +From: Dmitry Perchanov +Date: Sun, 22 Jan 2023 12:58:19 +0200 +Subject: [PATCH] Enabling UVC Metadata attributes with Ubuntu 22.04. Kernel + 5.15 + +Co-developed-by: Yu MENG +Co-developed-by: Evgeni Raikhel +Signed-off-by: Dmitry Perchanov +--- + drivers/media/usb/uvc/uvc_driver.c | 279 +++++++++++++++++++++++++++++ + 2 files changed, 280 insertions(+), 1 deletion(-) + +diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c +index 2e7df1de0..848417912 100644 +--- a/drivers/media/usb/uvc/uvc_driver.c ++++ b/drivers/media/usb/uvc/uvc_driver.c +@@ -3152,6 +3152,285 @@ static const struct usb_device_id uvc_ids[] = { + .bInterfaceSubClass = 1, + .bInterfaceProtocol = 0, + .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel SR306 depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0aa3, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel SR300 depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0aa5, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D400/PSR depth camera*/ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0ad1, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D410/ASR depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0ad2, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D415/ASRC depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0ad3, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D430/AWG depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0ad4, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D450/AWGT depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0ad5, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* USB2 Descriptor, Depth Sensor */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0ad6, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D400 IMU Module */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0af2, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D420/PWG depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0af6, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D420_MM/PWGT depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0afe, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D410_MM/ASRT depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0aff, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D400_MM/PSRT depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b00, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D430_MM/AWGCT depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b01, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D460/DS5U depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b03, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D435/AWGC depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b07, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D405 S depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b0c, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel L500 depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b0d, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D435i depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b3a, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel L515 Pre-PRQ */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b3d, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel SR305 Depth Camera*/ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b48, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D416 Depth Camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b49, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D430i depth camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b4b, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D465 */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b4d, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D555e Depth Camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b56, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = UVC_PC_PROTOCOL_15, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D405 */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b5b, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D455 */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b5c, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel L515 */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b64, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel L535 */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b68, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = 0, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel D585 Depth Camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b6a, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = UVC_PC_PROTOCOL_15, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, ++ /* Intel 585 Camera */ ++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = 0x8086, ++ .idProduct = 0x0b6b, ++ .bInterfaceClass = USB_CLASS_VIDEO, ++ .bInterfaceSubClass = 1, ++ .bInterfaceProtocol = UVC_PC_PROTOCOL_15, ++ .driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) }, + /* Generic USB Video Class */ + { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, UVC_PC_PROTOCOL_UNDEFINED) }, + { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, UVC_PC_PROTOCOL_15) }, +-- +2.34.1 + diff --git a/kernel/kernel-noble-src/7.1/0004-add-d4xx-camera-overlays.patch b/kernel/kernel-noble-src/7.1/0004-add-d4xx-camera-overlays.patch new file mode 120000 index 00000000..27730c6b --- /dev/null +++ b/kernel/kernel-noble-src/7.1/0004-add-d4xx-camera-overlays.patch @@ -0,0 +1 @@ +../7.0/0004-add-d4xx-camera-overlays.patch \ No newline at end of file diff --git a/kernel/kernel-noble-src/7.1/0005-support-for-dynamic-change-of-i2c-bus-clk-rate.patch b/kernel/kernel-noble-src/7.1/0005-support-for-dynamic-change-of-i2c-bus-clk-rate.patch new file mode 100644 index 00000000..8cc3d063 --- /dev/null +++ b/kernel/kernel-noble-src/7.1/0005-support-for-dynamic-change-of-i2c-bus-clk-rate.patch @@ -0,0 +1,104 @@ +From ce6faaedef68204e8b132bf44a0e4d2432dfb7ad Mon Sep 17 00:00:00 2001 +From: Arun-Prasad-V +Date: Mon, 4 Nov 2024 12:52:39 +0530 +Subject: [PATCH] Support for dynamic change of i2c bus-clk-rate + +Signed-off-by: Arun Prasad V +--- + drivers/i2c/i2c-core-base.c | 45 ++++++++++++++++++++++++++++++++++ + include/linux/i2c.h | 5 ++++ + 3 files changed, 92 insertions(+) + +diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c +index c232535ca8f4..2edd24973cca 100644 +--- a/drivers/i2c/i2c-core-base.c ++++ b/drivers/i2c/i2c-core-base.c +@@ -1285,10 +1285,33 @@ delete_device_store(struct device *dev, struct device_attribute *attr, + static DEVICE_ATTR_IGNORE_LOCKDEP(delete_device, S_IWUSR, NULL, + delete_device_store); + ++static ssize_t show_bus_clk_rate(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct i2c_adapter *adap = to_i2c_adapter(dev); ++ ++ return sprintf(buf, "%ld\n", adap->bus_clk_rate); ++} ++ ++static ssize_t set_bus_clk_rate(struct device *dev, ++ struct device_attribute *attr, const char *buf, size_t count) ++{ ++ struct i2c_adapter *adap = to_i2c_adapter(dev); ++ char *p = (char *)buf; ++ int bus_clk_rate; ++ ++ bus_clk_rate = memparse(p, &p); ++ dev_info(dev, "Setting clock rate %d on next transfer\n", bus_clk_rate); ++ adap->bus_clk_rate = bus_clk_rate; ++ return count; ++} ++static DEVICE_ATTR(bus_clk_rate, 0644, show_bus_clk_rate, set_bus_clk_rate); ++ + static struct attribute *i2c_adapter_attrs[] = { + &dev_attr_name.attr, + &dev_attr_new_device.attr, + &dev_attr_delete_device.attr, ++ &dev_attr_bus_clk_rate.attr, + NULL + }; + ATTRIBUTE_GROUPS(i2c_adapter); +@@ -1401,6 +1424,28 @@ static int i2c_setup_host_notify_irq_domain(struct i2c_adapter *adap) + return 0; + } + ++int i2c_set_adapter_bus_clk_rate(struct i2c_adapter *adap, int bus_rate) ++{ ++ i2c_lock_bus(adap, I2C_LOCK_ROOT_ADAPTER); ++ adap->bus_clk_rate = bus_rate; ++ i2c_unlock_bus(adap, I2C_LOCK_ROOT_ADAPTER); ++ ++ return 0; ++} ++EXPORT_SYMBOL_GPL(i2c_set_adapter_bus_clk_rate); ++ ++int i2c_get_adapter_bus_clk_rate(struct i2c_adapter *adap) ++{ ++ int bus_clk_rate; ++ ++ i2c_lock_bus(adap, I2C_LOCK_ROOT_ADAPTER); ++ bus_clk_rate = adap->bus_clk_rate; ++ i2c_unlock_bus(adap, I2C_LOCK_ROOT_ADAPTER); ++ ++ return bus_clk_rate; ++} ++EXPORT_SYMBOL_GPL(i2c_get_adapter_bus_clk_rate); ++ + /** + * i2c_handle_smbus_host_notify - Forward a Host Notify event to the correct + * I2C client. +diff --git a/include/linux/i2c.h b/include/linux/i2c.h +index 2ce3efbe9198..9d876ad6373c 100644 +--- a/include/linux/i2c.h ++++ b/include/linux/i2c.h +@@ -131,6 +131,10 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); + /* Unlocked flavor */ + int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); + ++/* Change bus clock rate for i2c adapter */ ++extern int i2c_set_adapter_bus_clk_rate(struct i2c_adapter *adap, int bus_rate); ++extern int i2c_get_adapter_bus_clk_rate(struct i2c_adapter *adap); ++ + /* This is the very generalized SMBus access routine. You probably do not + want to use this, though; one of the functions below may be much easier, + and probably just as fast. +@@ -737,6 +741,7 @@ struct i2c_adapter { + const struct i2c_adapter_quirks *quirks; + + struct irq_domain *host_notify_domain; ++ unsigned long bus_clk_rate; + struct regulator *bus_regulator; + + struct dentry *debugfs; +-- +2.34.1 + diff --git a/kernel/kernel-noble-src/7.1/0006-fix-null-pointer-exception.patch b/kernel/kernel-noble-src/7.1/0006-fix-null-pointer-exception.patch new file mode 120000 index 00000000..5ccf48d8 --- /dev/null +++ b/kernel/kernel-noble-src/7.1/0006-fix-null-pointer-exception.patch @@ -0,0 +1 @@ +../7.0/0006-fix-null-pointer-exception.patch \ No newline at end of file diff --git a/kernel/kernel-noble-src/Makefile b/kernel/kernel-noble-src/Makefile new file mode 100644 index 00000000..f7e5e6d3 --- /dev/null +++ b/kernel/kernel-noble-src/Makefile @@ -0,0 +1,94 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: BSD-3-Clause + +KERNEL_SRC_DIR ?= kernel-noble-src +KERNEL_DEF_CONFIG ?= defconfig + +MAKEFILE_DIR := $(abspath $(shell dirname $(lastword $(MAKEFILE_LIST)))) +kernel_source_dir := $(MAKEFILE_DIR)/$(KERNEL_SRC_DIR) + +ifdef KERNEL_OUTPUT +O_OPT := O=$(KERNEL_OUTPUT) +$(mkdir -p $(KERNEL_OUTPUT)) +kernel_image := $(KERNEL_OUTPUT)/arch/arm64/boot/Image +else +kernel_image := $(kernel_source_dir)/arch/arm64/boot/Image +endif + +NPROC ?= $(shell nproc) + +# LOCALVERSION : -tegra or -rt-tegra +version = $(shell grep -q "CONFIG_PREEMPT_RT=y" \ + ${kernel_source_dir}/arch/arm64/configs/${KERNEL_DEF_CONFIG} && echo "-rt-tegra" || echo "-tegra") + +.PHONY : kernel install clean help + +kernel: + @echo "================================================================================" + @echo "Building $(KERNEL_SRC_DIR) sources" + @echo "================================================================================" + $(MAKE) \ + -C $(kernel_source_dir) $(O_OPT) \ + LOCALVERSION=$(version) \ + $(KERNEL_DEF_CONFIG) + + $(MAKE) -j $(NPROC) \ + -C $(kernel_source_dir) $(O_OPT) \ + LOCALVERSION=$(version) \ + --output-sync=target Image + + $(MAKE) -j $(NPROC) \ + -C $(kernel_source_dir) $(O_OPT) \ + LOCALVERSION=$(version) \ + --output-sync=target dtbs + + $(MAKE) -j $(NPROC) \ + -C $(kernel_source_dir) $(O_OPT) \ + LOCALVERSION=$(version) \ + --output-sync=target modules + + @echo "================================================================================" + @if [ -f "$(kernel_image)" ] ; then \ + echo "Kernel Image: $(kernel_image)"; \ + else \ + echo "Error: Missing kernel image: $(kernel_image)"; \ + false ; \ + fi + @echo "Kernel sources compiled successfully." + @echo "================================================================================" + + +install: + @echo "================================================================================" + @echo "Installing $(KERNEL_SRC_DIR) sources" + @echo "================================================================================" + install $(kernel_image) $(INSTALL_MOD_PATH)/boot/ + $(MAKE) \ + -C $(kernel_source_dir) $(O_OPT) \ + LOCALVERSION=$(version) \ + INSTALL_MOD_PATH=$(INSTALL_MOD_PATH) \ + modules_install + @echo "================================================================================" + @echo "Kernel and in-tree modules installed successfully." + @echo "================================================================================" + + +clean: + @echo "================================================================================" + @echo "Cleaning $(KERNEL_SRC_DIR) sources" + @echo "================================================================================" + $(MAKE) \ + -C $(kernel_source_dir) $(O_OPT) \ + mrproper + @echo "================================================================================" + @echo "Kernel and in-tree modules installed successfully." + @echo "================================================================================" + +# make help +help: + @echo "================================================================================" + @echo "Usage:" + @echo " make or make kernel # to build kernel" + @echo " make install # to install kernel image and in-tree modules" + @echo " make clean # to make clean kernel source" + @echo "================================================================================" diff --git a/kernel/realsense/d4xx.c b/kernel/realsense/d4xx.c index 3e662d0d..8fcae571 100644 --- a/kernel/realsense/d4xx.c +++ b/kernel/realsense/d4xx.c @@ -252,7 +252,7 @@ struct hwm_cmd { u32 param2; u32 param3; u32 param4; - unsigned char Data[0]; + unsigned char Data[]; }; static const struct hwm_cmd cmd_switch_to_dfu = { @@ -1531,11 +1531,11 @@ static int ds5_sensor_enum_mbus_code(struct v4l2_subdev *sd, static int ds5_sensor_enum_frame_size(struct v4l2_subdev *sd, #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 10) - struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_pad_config *cfg, #else - struct v4l2_subdev_state *v4l2_state, + struct v4l2_subdev_state *v4l2_state, #endif - struct v4l2_subdev_frame_size_enum *fse) + struct v4l2_subdev_frame_size_enum *fse) { struct ds5_sensor *sensor = container_of(sd, struct ds5_sensor, sd); struct ds5 *state = v4l2_get_subdevdata(sd); @@ -1563,11 +1563,11 @@ static int ds5_sensor_enum_frame_size(struct v4l2_subdev *sd, static int ds5_sensor_enum_frame_interval(struct v4l2_subdev *sd, #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 10) - struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_pad_config *cfg, #else - struct v4l2_subdev_state *v4l2_state, + struct v4l2_subdev_state *v4l2_state, #endif - struct v4l2_subdev_frame_interval_enum *fie) + struct v4l2_subdev_frame_interval_enum *fie) { struct ds5_sensor *sensor = container_of(sd, struct ds5_sensor, sd); const struct ds5_format *fmt; @@ -1599,14 +1599,15 @@ static int ds5_sensor_enum_frame_interval(struct v4l2_subdev *sd, static int ds5_sensor_get_fmt(struct v4l2_subdev *sd, #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 10) - struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_pad_config *cfg, #else - struct v4l2_subdev_state *v4l2_state, + struct v4l2_subdev_state *v4l2_state, #endif - struct v4l2_subdev_format *fmt) + struct v4l2_subdev_format *fmt) { struct ds5_sensor *sensor = container_of(sd, struct ds5_sensor, sd); struct ds5 *state = v4l2_get_subdevdata(sd); + int ret = 0; if (fmt->pad) return -EINVAL; @@ -1616,8 +1617,17 @@ static int ds5_sensor_get_fmt(struct v4l2_subdev *sd, if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 10) fmt->format = *v4l2_subdev_get_try_format(sd, cfg, fmt->pad); -#else +#elif LINUX_VERSION_CODE < KERNEL_VERSION(6, 8, 0) fmt->format = *v4l2_subdev_get_try_format(sd, v4l2_state, fmt->pad); +#else + { + struct v4l2_mbus_framefmt* framefmt; + framefmt = v4l2_subdev_state_get_format(v4l2_state, fmt->pad); + if (framefmt) + fmt->format = *framefmt; + else + ret = -EINVAL; + } #endif else fmt->format = sensor->format; @@ -1628,7 +1638,7 @@ static int ds5_sensor_get_fmt(struct v4l2_subdev *sd, __func__, fmt->pad, fmt->format.code, fmt->format.width, fmt->format.height); - return 0; + return ret; } /* Called with lock held */ @@ -1693,13 +1703,14 @@ static const struct ds5_format *ds5_sensor_find_format( static int __ds5_sensor_set_fmt(struct ds5 *state, struct ds5_sensor *sensor, #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 10) - struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_pad_config *cfg, #else - struct v4l2_subdev_state *v4l2_state, + struct v4l2_subdev_state *v4l2_state, #endif - struct v4l2_subdev_format *fmt) + struct v4l2_subdev_format *fmt) { struct v4l2_mbus_framefmt *mf;// = &fmt->format; + int ret = 0; //unsigned r; dev_dbg(sensor->sd.dev, "%s(): state %p, " @@ -1725,7 +1736,17 @@ static int __ds5_sensor_set_fmt(struct ds5 *state, struct ds5_sensor *sensor, *v4l2_subdev_get_try_format(&sensor->sd, cfg, fmt->pad) = *mf; #else if (v4l2_state && fmt->which == V4L2_SUBDEV_FORMAT_TRY) +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 8, 0) *v4l2_subdev_get_try_format(&sensor->sd, v4l2_state, fmt->pad) = *mf; +#else + { + struct v4l2_mbus_framefmt* framefmt = v4l2_subdev_state_get_format(v4l2_state, fmt->pad); + if (framefmt) + *framefmt = *mf; + else + ret = -EINVAL; + } +#endif #endif else @@ -1735,16 +1756,16 @@ static int __ds5_sensor_set_fmt(struct ds5 *state, struct ds5_sensor *sensor, state->mux.last_set = sensor; mutex_unlock(&state->lock); - return 0; + return ret; } static int ds5_sensor_set_fmt(struct v4l2_subdev *sd, #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 10) - struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_pad_config *cfg, #else - struct v4l2_subdev_state *v4l2_state, + struct v4l2_subdev_state *v4l2_state, #endif - struct v4l2_subdev_format *fmt) + struct v4l2_subdev_format *fmt) { struct ds5_sensor *sensor = container_of(sd, struct ds5_sensor, sd); struct ds5 *state = v4l2_get_subdevdata(sd); @@ -1979,15 +2000,10 @@ static int ds5_configure(struct ds5 *state) return 0; } -static const struct v4l2_subdev_pad_ops ds5_depth_pad_ops = { - .enum_mbus_code = ds5_sensor_enum_mbus_code, - .enum_frame_size = ds5_sensor_enum_frame_size, - .enum_frame_interval = ds5_sensor_enum_frame_interval, - .get_fmt = ds5_sensor_get_fmt, - .set_fmt = ds5_sensor_set_fmt, -}; - static int ds5_sensor_g_frame_interval(struct v4l2_subdev *sd, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 8, 0) + struct v4l2_subdev_state *state, +#endif struct v4l2_subdev_frame_interval *fi) { struct ds5_sensor *sensor = container_of(sd, struct ds5_sensor, sd); @@ -2006,6 +2022,9 @@ static int ds5_sensor_g_frame_interval(struct v4l2_subdev *sd, static u16 __ds5_probe_framerate(const struct ds5_resolution *res, u16 target); static int ds5_sensor_s_frame_interval(struct v4l2_subdev *sd, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 8, 0) + struct v4l2_subdev_state *state, +#endif struct v4l2_subdev_frame_interval *fi) { struct ds5_sensor *sensor = container_of(sd, struct ds5_sensor, sd); @@ -2038,34 +2057,18 @@ static int ds5_sensor_s_stream(struct v4l2_subdev *sd, int on) } static const struct v4l2_subdev_video_ops ds5_sensor_video_ops = { +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 8, 0) .g_frame_interval = ds5_sensor_g_frame_interval, .s_frame_interval = ds5_sensor_s_frame_interval, +#endif .s_stream = ds5_sensor_s_stream, }; -static const struct v4l2_subdev_ops ds5_depth_subdev_ops = { - .pad = &ds5_depth_pad_ops, - .video = &ds5_sensor_video_ops, -}; - -/* InfraRed stream Y8/Y16 */ - -/* FIXME: identical to ds5_depth_pad_ops, use one for both */ -static const struct v4l2_subdev_pad_ops ds5_ir_pad_ops = { - .enum_mbus_code = ds5_sensor_enum_mbus_code, - .enum_frame_size = ds5_sensor_enum_frame_size, - .enum_frame_interval = ds5_sensor_enum_frame_interval, - .get_fmt = ds5_sensor_get_fmt, - .set_fmt = ds5_sensor_set_fmt, -}; - -static const struct v4l2_subdev_ops ds5_ir_subdev_ops = { - .pad = &ds5_ir_pad_ops, - .video = &ds5_sensor_video_ops, -}; - -/* FIXME: identical to ds5_depth_pad_ops, use one for both? */ -static const struct v4l2_subdev_pad_ops ds5_rgb_pad_ops = { +static const struct v4l2_subdev_pad_ops ds5_pad_ops = { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 8, 0) + .get_frame_interval = ds5_sensor_g_frame_interval, + .set_frame_interval = ds5_sensor_s_frame_interval, +#endif .enum_mbus_code = ds5_sensor_enum_mbus_code, .enum_frame_size = ds5_sensor_enum_frame_size, .enum_frame_interval = ds5_sensor_enum_frame_interval, @@ -2073,23 +2076,12 @@ static const struct v4l2_subdev_pad_ops ds5_rgb_pad_ops = { .set_fmt = ds5_sensor_set_fmt, }; -static const struct v4l2_subdev_ops ds5_rgb_subdev_ops = { - .pad = &ds5_rgb_pad_ops, +static const struct v4l2_subdev_ops ds5_subdev_ops = { + .pad = &ds5_pad_ops, .video = &ds5_sensor_video_ops, }; -static const struct v4l2_subdev_pad_ops ds5_imu_pad_ops = { - .enum_mbus_code = ds5_sensor_enum_mbus_code, - .enum_frame_size = ds5_sensor_enum_frame_size, - .enum_frame_interval = ds5_sensor_enum_frame_interval, - .get_fmt = ds5_sensor_get_fmt, - .set_fmt = ds5_sensor_set_fmt, -}; - -static const struct v4l2_subdev_ops ds5_imu_subdev_ops = { - .pad = &ds5_imu_pad_ops, - .video = &ds5_sensor_video_ops, -}; +/* InfraRed stream Y8/Y16 */ static int ds5_hw_set_auto_exposure(struct ds5 *state, u32 base, s32 val) { @@ -4837,28 +4829,28 @@ static int ds5_depth_init(struct i2c_client *c, struct ds5 *state) /* Which mux pad we're connecting to */ state->depth.sensor.mux_pad = DS5_MUX_PAD_DEPTH; return ds5_sensor_init(c, state, &state->depth.sensor, - &ds5_depth_subdev_ops, "depth"); + &ds5_subdev_ops, "depth"); } static int ds5_ir_init(struct i2c_client *c, struct ds5 *state) { state->ir.sensor.mux_pad = DS5_MUX_PAD_IR; return ds5_sensor_init(c, state, &state->ir.sensor, - &ds5_ir_subdev_ops, "ir"); + &ds5_subdev_ops, "ir"); } static int ds5_rgb_init(struct i2c_client *c, struct ds5 *state) { state->rgb.sensor.mux_pad = DS5_MUX_PAD_RGB; return ds5_sensor_init(c, state, &state->rgb.sensor, - &ds5_rgb_subdev_ops, "rgb"); + &ds5_subdev_ops, "rgb"); } static int ds5_imu_init(struct i2c_client *c, struct ds5 *state) { state->imu.sensor.mux_pad = DS5_MUX_PAD_IMU; return ds5_sensor_init(c, state, &state->imu.sensor, - &ds5_imu_subdev_ops, "imu"); + &ds5_subdev_ops, "imu"); } /* No locking needed */ @@ -5079,11 +5071,16 @@ static int ds5_mux_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_format *fmt) { struct ds5 *state = container_of(sd, struct ds5, mux.sd.subdev); - struct v4l2_subdev_format tmp = *fmt; + struct v4l2_subdev_format tmp; struct v4l2_subdev *remote_sd; - u32 pad = fmt->pad; + u32 pad; int ret = 0; + + if (!state) return -EINVAL; + if (!fmt) return -EINVAL; + pad = ds5_state_to_pad(state); + tmp = *fmt; dev_dbg(sd->dev, "%s(): pad: %x %x: %ux%u\n", __func__, pad, fmt->format.code, @@ -5130,20 +5127,26 @@ static int ds5_mux_set_fmt(struct v4l2_subdev *sd, /* No locking needed */ static int ds5_mux_get_fmt(struct v4l2_subdev *sd, #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 10) - struct v4l2_subdev_pad_config *cfg, + struct v4l2_subdev_pad_config *cfg, #else - struct v4l2_subdev_state *v4l2_state, + struct v4l2_subdev_state *v4l2_state, #endif - struct v4l2_subdev_format *fmt) + struct v4l2_subdev_format *fmt) { struct ds5 *state = container_of(sd, struct ds5, mux.sd.subdev); - struct v4l2_subdev_format tmp = *fmt; + struct v4l2_subdev_format tmp; struct v4l2_subdev *remote_sd; - u32 pad = fmt->pad; + u32 pad; int ret = 0; - struct ds5_sensor *sensor = state->mux.last_set; - pad = ds5_state_to_pad(state); + struct ds5_sensor *sensor; + + if (!state) return -EINVAL; + if (!fmt) return -EINVAL; + sensor = state->mux.last_set; + tmp = *fmt; + pad = ds5_state_to_pad(state); + dev_dbg(sd->dev, "%s(): %u %s %p\n", __func__, pad, ds5_get_sensor_name(state), state->mux.last_set); switch (pad) { @@ -5186,15 +5189,18 @@ static int ds5_mux_get_fmt(struct v4l2_subdev *sd, /* Video ops */ static int ds5_mux_g_frame_interval(struct v4l2_subdev *sd, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 8, 0) + struct v4l2_subdev_state *state, +#endif struct v4l2_subdev_frame_interval *fi) { - struct ds5 *state = container_of(sd, struct ds5, mux.sd.subdev); + struct ds5 *ds5_state = container_of(sd, struct ds5, mux.sd.subdev); struct ds5_sensor *sensor = NULL; if (NULL == sd || NULL == fi) return -EINVAL; - sensor = state->mux.last_set; + sensor = ds5_state->mux.last_set; fi->interval.numerator = 1; fi->interval.denominator = sensor->config.framerate; @@ -5220,16 +5226,19 @@ static u16 __ds5_probe_framerate(const struct ds5_resolution *res, u16 target) } static int ds5_mux_s_frame_interval(struct v4l2_subdev *sd, +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) || LINUX_VERSION_CODE >= KERNEL_VERSION(6, 8, 0) + struct v4l2_subdev_state *state, +#endif struct v4l2_subdev_frame_interval *fi) { - struct ds5 *state = container_of(sd, struct ds5, mux.sd.subdev); + struct ds5 *ds5_state = container_of(sd, struct ds5, mux.sd.subdev); struct ds5_sensor *sensor = NULL; u16 framerate = 1; if (NULL == sd || NULL == fi || fi->interval.numerator == 0) return -EINVAL; - sensor = state->mux.last_set; + sensor = ds5_state->mux.last_set; framerate = fi->interval.denominator / fi->interval.numerator; framerate = __ds5_probe_framerate(sensor->config.resolution, framerate); @@ -5580,6 +5589,10 @@ static int ds5_mux_get_frame_desc(struct v4l2_subdev *sd, } static const struct v4l2_subdev_pad_ops ds5_mux_pad_ops = { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 8, 0) + .get_frame_interval = ds5_mux_g_frame_interval, + .set_frame_interval = ds5_mux_s_frame_interval, +#endif .enum_mbus_code = ds5_mux_enum_mbus_code, .enum_frame_size = ds5_mux_enum_frame_size, .enum_frame_interval = ds5_mux_enum_frame_interval, @@ -5594,8 +5607,10 @@ static const struct v4l2_subdev_core_ops ds5_mux_core_ops = { }; static const struct v4l2_subdev_video_ops ds5_mux_video_ops = { +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 8, 0) .g_frame_interval = ds5_mux_g_frame_interval, .s_frame_interval = ds5_mux_s_frame_interval, +#endif .s_stream = ds5_mux_s_stream, }; @@ -6513,7 +6528,11 @@ static int ds5_chrdev_init(struct i2c_client *c, struct ds5 *state) dev_dbg(&c->dev, "%s(): : <%d, %d>\n", __func__, MAJOR(*dev_num), MINOR(*dev_num)); /* Create a class : appears at /sys/class */ +#if defined(NV_CLASS_CREATE_HAS_NO_OWNER_ARG) || LINUX_VERSION_CODE < KERNEL_VERSION(6, 8, 0) *ds5_class = class_create(THIS_MODULE, DS5_DRIVER_NAME_CLASS); +#else + *ds5_class = class_create(DS5_DRIVER_NAME_CLASS); +#endif dev_warn(&state->client->dev, "%s() class_create\n", __func__); if (IS_ERR(*ds5_class)) { dev_err(&c->dev, "Could not create class device\n"); @@ -6689,9 +6708,16 @@ static const struct attribute_group ds5_attr_group = { }; #endif -static int ds5_probe(struct i2c_client *c, const struct i2c_device_id *id) +static int ds5_probe(struct i2c_client *c +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 3, 0) + , const struct i2c_device_id *id +#endif + ) { struct ds5 *state = devm_kzalloc(&c->dev, sizeof(*state), GFP_KERNEL); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0) + const struct i2c_device_id *id = i2c_client_get_device_id(c); +#endif u16 rec_state; int ret, retry, err = 0; #ifdef CONFIG_OF @@ -6705,6 +6731,7 @@ static int ds5_probe(struct i2c_client *c, const struct i2c_device_id *id) mutex_init(&state->lock); state->client = c; + dev_warn(&c->dev, "Probing driver for D4xx\n"); #ifdef CONFIG_OF ret = of_property_read_u32(c->dev.of_node, "override_reg", &override_addr); @@ -6908,7 +6935,11 @@ static int ds5_probe(struct i2c_client *c, const struct i2c_device_id *id) return ret; } +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 8, 12) static int ds5_remove(struct i2c_client *c) +#else +static void ds5_remove(struct i2c_client *c) +#endif { struct ds5 *state = container_of(i2c_get_clientdata(c), struct ds5, mux.sd.subdev); if (state && !state->mux.sd.subdev.v4l2_dev) { @@ -6978,7 +7009,9 @@ static int ds5_remove(struct i2c_client *c) ds5_chrdev_remove(state); } +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 8, 12) return 0; +#endif } static const struct i2c_device_id ds5_id[] = { @@ -6998,6 +7031,7 @@ MODULE_DEVICE_TABLE(of, d4xx_of_match); static struct i2c_driver ds5_i2c_driver = { .driver = { .owner = THIS_MODULE, + .of_match_table = of_match_ptr(d4xx_of_match), .name = DS5_DRIVER_NAME }, .probe = ds5_probe, @@ -7018,4 +7052,4 @@ MODULE_AUTHOR("Guennadi Liakhovetski ,\n\ Shikun Ding ,\n\ Dmitry Perchanov "); MODULE_LICENSE("GPL v2"); -MODULE_VERSION("1.0.2.23"); +MODULE_VERSION("1.0.2.24"); diff --git a/nvidia-oot/6.0/0004-Adding-max96712-support-for-D4xx.patch b/nvidia-oot/6.0/0005-Adding-max96712-support-for-D4xx.patch similarity index 100% rename from nvidia-oot/6.0/0004-Adding-max96712-support-for-D4xx.patch rename to nvidia-oot/6.0/0005-Adding-max96712-support-for-D4xx.patch diff --git a/nvidia-oot/6.1/0004-Adding-max96712-support-for-D4xx.patch b/nvidia-oot/6.1/0004-Adding-max96712-support-for-D4xx.patch deleted file mode 120000 index f82b7e20..00000000 --- a/nvidia-oot/6.1/0004-Adding-max96712-support-for-D4xx.patch +++ /dev/null @@ -1 +0,0 @@ -../6.0/0004-Adding-max96712-support-for-D4xx.patch \ No newline at end of file diff --git a/nvidia-oot/6.1/0005-Adding-max96712-support-for-D4xx.patch b/nvidia-oot/6.1/0005-Adding-max96712-support-for-D4xx.patch new file mode 120000 index 00000000..28d80cc3 --- /dev/null +++ b/nvidia-oot/6.1/0005-Adding-max96712-support-for-D4xx.patch @@ -0,0 +1 @@ +../6.0/0005-Adding-max96712-support-for-D4xx.patch \ No newline at end of file diff --git a/nvidia-oot/6.2.1/0005-Adding-max96712-support-for-D4xx.patch b/nvidia-oot/6.2.1/0005-Adding-max96712-support-for-D4xx.patch new file mode 120000 index 00000000..28d80cc3 --- /dev/null +++ b/nvidia-oot/6.2.1/0005-Adding-max96712-support-for-D4xx.patch @@ -0,0 +1 @@ +../6.0/0005-Adding-max96712-support-for-D4xx.patch \ No newline at end of file diff --git a/nvidia-oot/6.2/0004-Adding-max96712-support-for-D4xx.patch b/nvidia-oot/6.2/0004-Adding-max96712-support-for-D4xx.patch deleted file mode 120000 index f82b7e20..00000000 --- a/nvidia-oot/6.2/0004-Adding-max96712-support-for-D4xx.patch +++ /dev/null @@ -1 +0,0 @@ -../6.0/0004-Adding-max96712-support-for-D4xx.patch \ No newline at end of file diff --git a/nvidia-oot/6.2/0005-Adding-max96712-support-for-D4xx.patch b/nvidia-oot/6.2/0005-Adding-max96712-support-for-D4xx.patch new file mode 120000 index 00000000..28d80cc3 --- /dev/null +++ b/nvidia-oot/6.2/0005-Adding-max96712-support-for-D4xx.patch @@ -0,0 +1 @@ +../6.0/0005-Adding-max96712-support-for-D4xx.patch \ No newline at end of file diff --git a/nvidia-oot/7.0/0001-Porting-nvidia-driver-patches-to-jetpack-6.0.patch b/nvidia-oot/7.0/0001-Porting-nvidia-driver-patches-to-jetpack-6.0.patch new file mode 100644 index 00000000..3ff103ee --- /dev/null +++ b/nvidia-oot/7.0/0001-Porting-nvidia-driver-patches-to-jetpack-6.0.patch @@ -0,0 +1,1264 @@ +From 1ce2b2e647c63724bfd1434f963eabbe4aa83941 Mon Sep 17 00:00:00 2001 +From: Dmitry Perchanov +Date: Mon, 20 May 2024 18:08:02 +0300 +Subject: [PATCH] Porting nvidia driver patches to jetpack 6.0 + +Signed-off-by: Dmitry Perchanov +--- + drivers/media/i2c/Makefile | 3 + + drivers/media/i2c/max9295.c | 139 ++++++ + drivers/media/i2c/max9296.c | 190 +++++++++ + .../platform/tegra/camera/sensor_common.c | 4 + + .../media/platform/tegra/camera/vi/channel.c | 401 +++++++++++++++++- + .../media/platform/tegra/camera/vi/graph.c | 38 +- + .../platform/tegra/camera/vi/mc_common.c | 27 ++ + .../media/platform/tegra/camera/vi/vi5_fops.c | 36 ++ + .../platform/tegra/camera/vi/vi5_formats.h | 30 +- + include/media/gmsl-link.h | 3 + + include/media/max9295.h | 4 + + include/media/max9296.h | 8 + + include/media/mc_common.h | 22 + + include/media/tegra_camera_core.h | 8 + + 14 files changed, 902 insertions(+), 11 deletions(-) + +diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile +index 7c5913c6..396b9bc3 100644 +--- a/drivers/media/i2c/Makefile ++++ b/drivers/media/i2c/Makefile +@@ -5,6 +5,9 @@ subdir-ccflags-y += -Werror + ifneq ($(NV_BUILD_SYSTEM_TYPE),embedded-linux) + obj-m += max9295.o + obj-m += max9296.o ++subdir-ccflags-y += -DCONFIG_VIDEO_D4XX_SERDES ++subdir-ccflags-y += -DCONFIG_TEGRA_CAMERA_PLATFORM ++obj-m += d4xx.o + ifndef CONFIG_TEGRA_SYSTEM_TYPE_ACK + obj-m += max96712.o + +diff --git a/drivers/media/i2c/max9295.c b/drivers/media/i2c/max9295.c +index b363d5f6..e7c77845 100644 +--- a/drivers/media/i2c/max9295.c ++++ b/drivers/media/i2c/max9295.c +@@ -465,6 +465,145 @@ static struct regmap_config max9295_regmap_config = { + .cache_type = REGCACHE_RBTREE, + }; + ++struct reg_pair { ++ u16 addr; ++ u8 val; ++}; ++ ++static int max9295_set_registers(struct device *dev, struct reg_pair *map, ++ u32 count) ++{ ++ int err = 0; ++ u32 j = 0; ++ ++ for (j = 0; j < count; j++) { ++ err = max9295_write_reg(dev, ++ map[j].addr, map[j].val); ++ if (err != 0) ++ break; ++ } ++ ++ return err; ++} ++ ++static int __max9295_set_pipe(struct device *dev, int pipe_id, u8 data_type1, ++ u8 data_type2, u32 vc_id) ++{ ++ int err = 0; ++ u8 bpp = 0x30; ++ static u8 pipe_x_val = 0x0; ++ struct reg_pair map_multi_pipe_en[] = { ++ {0x0315, 0x80}, ++ }; ++ struct reg_pair map_bpp8dbl[] = { ++ {0x0312, 0x0F}, ++ }; ++ struct reg_pair map_pipe_control[] = { ++ /* addr, val */ ++ {MAX9295_PIPE_X_DT_ADDR, 0x5E}, // Pipe X pulls data_type1 ++ {0x0315, 0x52}, // Pipe X pulls data_type2 ++ {0x0309, 0x01}, // # Pipe X pulls vc_id ++ {0x030A, 0x00}, ++ {0x031C, 0x30}, // BPP in pipe X ++ {0x0102, 0x0E}, // LIM_HEART Pipe X: Disabled ++ }; ++ ++ if (data_type1 == GMSL_CSI_DT_RAW_8 || data_type1 == GMSL_CSI_DT_EMBED ++ || data_type2 == GMSL_CSI_DT_RAW_8 || data_type2 == GMSL_CSI_DT_EMBED) { ++ map_bpp8dbl[0].val |= (1 << pipe_id); ++ } else { ++ map_bpp8dbl[0].val &= ~(1 << pipe_id); ++ } ++ err |= max9295_set_registers(dev, map_bpp8dbl, ARRAY_SIZE(map_bpp8dbl)); ++ ++ if (data_type1 == GMSL_CSI_DT_RGB_888) ++ bpp = 0x18; ++ ++ map_pipe_control[0].addr += 0x2 * pipe_id; ++ map_pipe_control[1].addr += 0x2 * pipe_id; ++ map_pipe_control[2].addr += 0x2 * pipe_id; ++ map_pipe_control[3].addr += 0x2 * pipe_id; ++ map_pipe_control[4].addr += 0x1 * pipe_id; ++ map_pipe_control[5].addr += 0x8 * pipe_id; ++ ++ map_pipe_control[0].val = 0x40 | data_type1; ++ map_pipe_control[1].val = 0x40 | data_type2; ++ map_pipe_control[2].val = 1 << vc_id; ++ map_pipe_control[3].val = 0x00; ++ map_pipe_control[4].val = bpp; ++ map_pipe_control[5].val = 0x0E; ++ ++ if (pipe_id == 0) ++ pipe_x_val = map_pipe_control[1].val; ++ ++ err |= max9295_set_registers(dev, map_pipe_control, ++ ARRAY_SIZE(map_pipe_control)); ++ ++ map_multi_pipe_en[0].val = 0x80 | pipe_x_val; ++ err |= max9295_set_registers(dev, map_multi_pipe_en, ++ ARRAY_SIZE(map_multi_pipe_en)); ++ ++ return err; ++} ++ ++int max9295_init_settings(struct device *dev) ++{ ++ int err = 0; ++ int i; ++ struct max9295 *priv = dev_get_drvdata(dev); ++ ++ struct reg_pair map_pipe_opt[] = { ++ // Enable all pipes ++ {MAX9295_PIPE_EN_ADDR, 0xF3}, ++ // Write 0x33 for 4 lanes ++ {MAX9295_MIPI_RX1_ADDR, 0x11}, ++ // All pipes pull clock from port B ++ {MAX9295_CSI_PORT_SEL_ADDR, 0x6F}, ++ // All pipes pull data from port B ++ {MAX9295_START_PIPE_ADDR, 0xF0}, ++ }; ++ ++ mutex_lock(&priv->lock); ++ ++ // Init control ++ err |= max9295_set_registers(dev, map_pipe_opt, ++ ARRAY_SIZE(map_pipe_opt)); ++ ++ for (i = 0; i < MAX9295_MAX_PIPES; i++) ++ err |= __max9295_set_pipe(dev, i, GMSL_CSI_DT_YUV422_8, ++ GMSL_CSI_DT_EMBED, i); ++ ++ mutex_unlock(&priv->lock); ++ ++ return err; ++} ++EXPORT_SYMBOL(max9295_init_settings); ++ ++int max9295_set_pipe(struct device *dev, int pipe_id, ++ u8 data_type1, u8 data_type2, u32 vc_id) ++{ ++ struct max9295 *priv = dev_get_drvdata(dev); ++ int err = 0; ++ ++ if (pipe_id > (MAX9295_MAX_PIPES - 1)) { ++ dev_info(dev, "%s, input pipe_id: %d exceed max9295 max pipes\n", ++ __func__, pipe_id); ++ return -EINVAL; ++ } ++ ++ dev_dbg(dev, "%s pipe_id %d, data_type1 %u, data_type2 %u, vc_id %u\n", ++ __func__, pipe_id, data_type1, data_type2, vc_id); ++ ++ mutex_lock(&priv->lock); ++ ++ err = __max9295_set_pipe(dev, pipe_id, data_type1, data_type2, vc_id); ++ ++ mutex_unlock(&priv->lock); ++ ++ return err; ++} ++EXPORT_SYMBOL(max9295_set_pipe); ++ + #if defined(NV_I2C_DRIVER_STRUCT_PROBE_WITHOUT_I2C_DEVICE_ID_ARG) /* Linux 6.3 */ + static int max9295_probe(struct i2c_client *client) + #else +diff --git a/drivers/media/i2c/max9296.c b/drivers/media/i2c/max9296.c +index 1ceaf3cd..97559460 100644 +--- a/drivers/media/i2c/max9296.c ++++ b/drivers/media/i2c/max9296.c +@@ -34,6 +34,8 @@ + #define MAX9296_PIPE_X_DST_1_MAP_ADDR 0x410 + #define MAX9296_PIPE_X_SRC_2_MAP_ADDR 0x411 + #define MAX9296_PIPE_X_DST_2_MAP_ADDR 0x412 ++#define MAX9296_PIPE_X_SRC_3_MAP_ADDR 0x413 ++#define MAX9296_PIPE_X_DST_3_MAP_ADDR 0x414 + + #define MAX9296_PIPE_X_ST_SEL_ADDR 0x50 + +@@ -250,6 +252,9 @@ void max9296_power_off(struct device *dev) + mutex_lock(&priv->lock); + priv->pw_ref--; + ++ if (priv->pw_ref < 0) ++ priv->pw_ref = 0; ++ + if (priv->pw_ref == 0) { + /* enter reset mode: XCLR */ + usleep_range(1, 2); +@@ -769,6 +774,191 @@ ret: + } + EXPORT_SYMBOL(max9296_setup_streaming); + ++static int max9296_set_registers(struct device *dev, struct reg_pair *map, ++ u32 count) ++{ ++ int err = 0; ++ u32 j = 0; ++ ++ for (j = 0; j < count; j++) { ++ err = max9296_write_reg(dev, ++ map[j].addr, map[j].val); ++ if (err != 0) ++ break; ++ } ++ ++ return err; ++} ++ ++int max9296_get_available_pipe_id(struct device *dev, int vc_id) ++{ ++ int i; ++ int pipe_id = -ENOMEM; ++ struct max9296 *priv = dev_get_drvdata(dev); ++ ++ mutex_lock(&priv->lock); ++ for (i = 0; i < MAX9296_MAX_PIPES; i++) { ++ if (i == vc_id && !priv->pipe[i].st_count) { ++ priv->pipe[i].st_count++; ++ pipe_id = i; ++ break; ++ } ++ } ++ mutex_unlock(&priv->lock); ++ ++ return pipe_id; ++} ++EXPORT_SYMBOL(max9296_get_available_pipe_id); ++ ++int max9296_release_pipe(struct device *dev, int pipe_id) ++{ ++ struct max9296 *priv = dev_get_drvdata(dev); ++ ++ if (pipe_id < 0 || pipe_id >= MAX9296_MAX_PIPES) ++ return -EINVAL; ++ ++ mutex_lock(&priv->lock); ++ priv->pipe[pipe_id].st_count = 0; ++ mutex_unlock(&priv->lock); ++ ++ return 0; ++} ++EXPORT_SYMBOL(max9296_release_pipe); ++ ++void max9296_reset_oneshot(struct device *dev) ++{ ++ struct max9296 *priv = dev_get_drvdata(dev); ++ ++ mutex_lock(&priv->lock); ++ if (priv->splitter_enabled) { ++ max9296_write_reg(dev, MAX9296_CTRL0_ADDR, 0x03); ++ max9296_write_reg(dev, MAX9296_CTRL0_ADDR, 0x23); ++ } else { ++ max9296_write_reg(dev, MAX9296_CTRL0_ADDR, 0x31); ++ } ++ /* delay to settle link */ ++ msleep(100); ++ mutex_unlock(&priv->lock); ++} ++EXPORT_SYMBOL(max9296_reset_oneshot); ++ ++static int __max9296_set_pipe(struct device *dev, int pipe_id, u8 data_type1, ++ u8 data_type2, u32 vc_id) ++{ ++ int err = 0; ++ int i = 0; ++ u8 en_mapping_num = 0x0F; ++ u8 all_mapping_phy = 0x55; ++ struct reg_pair map_pipe_opt[] = { ++ {0x1458, 0x28}, // PHY A Optimization ++ {0x1459, 0x68}, // PHY A Optimization ++ {0x1558, 0x28}, // PHY B Optimization ++ {0x1559, 0x68}, // PHY B Optimization ++ // 4 lanes on port A, write 0x50 for 2 lanes ++ {MAX9296_LANE_CTRL1_ADDR, 0x50}, ++ // 1500Mbps/lane on port A ++ {MAX9296_PHY1_CLK_ADDR, 0x2F}, ++ // Do not un-double 8bpp (Un-double 8bpp data) ++ //{0x031C, 0x00}, ++ // Do not un-double 8bpp ++ //{0x031F, 0x00}, ++ // 0x02: ALT_MEM_MAP8, 0x10: ALT2_MEM_MAP8 ++ {0x0473, 0x10}, ++ }; ++ struct reg_pair map_pipe_control[] = { ++ // Enable 4 mappings for Pipe X ++ {MAX9296_TX11_PIPE_X_EN_ADDR, 0x0F}, ++ // Map data_type1 on vc_id ++ {MAX9296_PIPE_X_SRC_0_MAP_ADDR, 0x1E}, ++ {MAX9296_PIPE_X_DST_0_MAP_ADDR, 0x1E}, ++ // Map frame_start on vc_id ++ {MAX9296_PIPE_X_SRC_1_MAP_ADDR, 0x00}, ++ {MAX9296_PIPE_X_DST_1_MAP_ADDR, 0x00}, ++ // Map frame end on vc_id ++ {MAX9296_PIPE_X_SRC_2_MAP_ADDR, 0x01}, ++ {MAX9296_PIPE_X_DST_2_MAP_ADDR, 0x01}, ++ // Map data_type2 on vc_id ++ {MAX9296_PIPE_X_SRC_3_MAP_ADDR, 0x12}, ++ {MAX9296_PIPE_X_DST_3_MAP_ADDR, 0x12}, ++ // All mappings to PHY1 (master for port A) ++ {MAX9296_TX45_PIPE_X_DST_CTRL_ADDR, 0x55}, ++ // SEQ_MISS_EN: Disabled / DIS_PKT_DET: Disabled ++ {0x0100, 0x23}, // pipe X ++ }; ++ ++ for (i = 0; i < 10; i++) { ++ map_pipe_control[i].addr += 0x40 * pipe_id; ++ } ++ map_pipe_control[10].addr += 0x12 * pipe_id; ++ ++ if (data_type2 == 0x0) { ++ en_mapping_num = 0x07; ++ all_mapping_phy = 0x15; ++ } ++ map_pipe_control[0].val = en_mapping_num; ++ map_pipe_control[1].val = (vc_id << 6) | data_type1; ++ map_pipe_control[2].val = (vc_id << 6) | data_type1; ++ map_pipe_control[3].val = (vc_id << 6) | 0x00; ++ map_pipe_control[4].val = (vc_id << 6) | 0x00; ++ map_pipe_control[5].val = (vc_id << 6) | 0x01; ++ map_pipe_control[6].val = (vc_id << 6) | 0x01; ++ map_pipe_control[7].val = (vc_id << 6) | data_type2; ++ map_pipe_control[8].val = (vc_id << 6) | data_type2; ++ map_pipe_control[9].val = all_mapping_phy; ++ map_pipe_control[10].val = 0x23; ++ ++ err |= max9296_set_registers(dev, map_pipe_control, ++ ARRAY_SIZE(map_pipe_control)); ++ ++ err |= max9296_set_registers(dev, map_pipe_opt, ++ ARRAY_SIZE(map_pipe_opt)); ++ ++ return err; ++} ++ ++int max9296_init_settings(struct device *dev) ++{ ++ int err = 0; ++ int i; ++ struct max9296 *priv = dev_get_drvdata(dev); ++ ++ mutex_lock(&priv->lock); ++ ++ for (i = 0; i < MAX9296_MAX_PIPES; i++) ++ err |= __max9296_set_pipe(dev, i, GMSL_CSI_DT_YUV422_8, ++ GMSL_CSI_DT_EMBED, i); ++ ++ mutex_unlock(&priv->lock); ++ ++ return err; ++} ++EXPORT_SYMBOL(max9296_init_settings); ++ ++int max9296_set_pipe(struct device *dev, int pipe_id, ++ u8 data_type1, u8 data_type2, u32 vc_id) ++{ ++ struct max9296 *priv = dev_get_drvdata(dev); ++ int err = 0; ++ ++ if (pipe_id > (MAX9296_MAX_PIPES - 1)) { ++ dev_info(dev, "%s, input pipe_id: %d exceed max9296 max pipes\n", ++ __func__, pipe_id); ++ return -EINVAL; ++ } ++ ++ dev_dbg(dev, "%s pipe_id %d, data_type1 %u, data_type2 %u, vc_id %u\n", ++ __func__, pipe_id, data_type1, data_type2, vc_id); ++ ++ mutex_lock(&priv->lock); ++ ++ err = __max9296_set_pipe(dev, pipe_id, data_type1, data_type2, vc_id); ++ ++ mutex_unlock(&priv->lock); ++ ++ return err; ++} ++EXPORT_SYMBOL(max9296_set_pipe); ++ + static const struct of_device_id max9296_of_match[] = { + { .compatible = "maxim,max9296", }, + { }, +diff --git a/drivers/media/platform/tegra/camera/sensor_common.c b/drivers/media/platform/tegra/camera/sensor_common.c +index 92cc2fdf..69139eee 100644 +--- a/drivers/media/platform/tegra/camera/sensor_common.c ++++ b/drivers/media/platform/tegra/camera/sensor_common.c +@@ -267,6 +267,10 @@ static int extract_pixel_format( + *format = V4L2_PIX_FMT_UYVY; + else if (strncmp(pixel_t, "yuv_vyuy16", size) == 0) + *format = V4L2_PIX_FMT_VYUY; ++ else if (strncmp(pixel_t, "grey_y8", size) == 0) ++ *format = V4L2_PIX_FMT_GREY; ++ else if (strncmp(pixel_t, "grey_y16", size) == 0) ++ *format = V4L2_PIX_FMT_Y16; + else { + pr_err("%s: Need to extend format%s\n", __func__, pixel_t); + return -EINVAL; +diff --git a/drivers/media/platform/tegra/camera/vi/channel.c b/drivers/media/platform/tegra/camera/vi/channel.c +index 91f8d5f8..d9be2677 100644 +--- a/drivers/media/platform/tegra/camera/vi/channel.c ++++ b/drivers/media/platform/tegra/camera/vi/channel.c +@@ -202,7 +202,12 @@ static void tegra_channel_fmt_align(struct tegra_channel *chan, + * different. Aligned width also may force a sensor mode change other + * than the requested one + */ +- *height = clamp(*height, TEGRA_MIN_HEIGHT, TEGRA_MAX_HEIGHT); ++ /* For D4XX IMU, the total size of one frame is 32 while the width:height ++ * should be set to 32:1. Therefore, ignored the clamping on height here by ++ * replacing TEGRA_MIN_HEIGHT with 1U ((unsigned int) 1). ++ */ ++ *height = clamp(*height, 1U /*TEGRA_MIN_HEIGHT*/, TEGRA_MAX_HEIGHT); ++ + + /* Clamp the requested bytes per line value. If the maximum bytes per + * line value is zero, the module doesn't support user configurable line +@@ -1027,7 +1032,8 @@ tegra_channel_querycap(struct file *file, void *fh, struct v4l2_capability *cap) + + cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; + cap->device_caps |= V4L2_CAP_EXT_PIX_FORMAT; +- cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; ++ cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS | ++ V4L2_CAP_META_CAPTURE; + + len = strscpy(cap->driver, "tegra-video", sizeof(cap->driver)); + if (len < 0) +@@ -2224,6 +2230,66 @@ static long tegra_channel_default_ioctl(struct file *file, void *fh, + return v4l2_g_parm_cap(chan->video, sd, a); + } + ++static int ++__tegra_channel_get_parm(struct tegra_channel *chan, ++ struct v4l2_streamparm *a) ++{ ++ struct v4l2_subdev *sd = chan->subdev_on_csi; ++ int ret = 0; ++ struct v4l2_subdev_frame_interval interval; ++ ++ struct v4l2_subdev_pad_config pad_cfg; ++ struct v4l2_subdev_state state = {.pads = &pad_cfg}; ++ /* dmipx: fixing G_PARM EINVAL error */ ++ ret = v4l2_subdev_call(sd, pad, get_frame_interval, &state, &interval); ++ // ret = sd->ops->pad->get_frame_interval(sd, &state, &interval); ++ ++ a->parm.capture.timeperframe.numerator = interval.interval.numerator; ++ a->parm.capture.timeperframe.denominator = interval.interval.denominator; ++ ++ return ret; ++} ++ ++static int tegra_channel_get_parm(struct file *file, void *fh, struct v4l2_streamparm *a) ++{ ++ struct tegra_channel *chan = video_drvdata(file); ++ ++ a->parm.capture.timeperframe.numerator = 1; ++ a->parm.capture.timeperframe.denominator = 12; ++ ++ return __tegra_channel_get_parm(chan, a); ++} ++ ++static int ++__tegra_channel_set_parm(struct tegra_channel *chan, ++ struct v4l2_streamparm *a) ++{ ++ struct v4l2_subdev *sd = chan->subdev_on_csi; ++ int ret = 0; ++ ++ struct v4l2_subdev_pad_config pad_cfg; ++ struct v4l2_subdev_state state = {.pads = &pad_cfg}; ++ struct v4l2_subdev_frame_interval interval; ++ interval.pad = 1; ++ interval.interval.numerator = a->parm.capture.timeperframe.numerator; ++ interval.interval.denominator = a->parm.capture.timeperframe.denominator; ++ ++ ret = v4l2_subdev_call(sd, pad, set_frame_interval, &state, &interval); ++ if (ret == -ENOIOCTLCMD) ++ return -ENOTTY; ++ ++ return ret; ++} ++static int tegra_channel_set_parm(struct file *file, void *fh, struct v4l2_streamparm *a) ++{ ++ struct tegra_channel *chan = video_drvdata(file); ++ ++ if (vb2_is_busy(&chan->queue)) ++ return -EBUSY; ++ ++ return __tegra_channel_set_parm(chan, a); ++} ++ + static const struct v4l2_ioctl_ops tegra_channel_ioctl_ops = { + .vidioc_querycap = tegra_channel_querycap, + .vidioc_enum_framesizes = tegra_channel_enum_framesizes, +@@ -2255,6 +2317,9 @@ static const struct v4l2_ioctl_ops tegra_channel_ioctl_ops = { + .vidioc_s_input = tegra_channel_s_input, + .vidioc_log_status = tegra_channel_log_status, + .vidioc_default = tegra_channel_default_ioctl, ++ .vidioc_g_parm = tegra_channel_get_parm, ++ .vidioc_s_parm = tegra_channel_set_parm, ++ + }; + + static int tegra_channel_close(struct file *fp); +@@ -2470,6 +2535,331 @@ static int tegra_channel_csi_init(struct tegra_channel *chan) + return ret; + } + ++static int tegra_metadata_open(struct file *fp) ++{ ++ struct video_device *vdev = video_devdata(fp); ++ struct tegra_channel *chan = video_get_drvdata(vdev); ++ int ret; ++ ++ mutex_lock(&chan->embedded.lock); ++ ret = v4l2_fh_open(fp); ++ mutex_unlock(&chan->embedded.lock); ++ ++ return ret; ++} ++ ++static int tegra_metadata_close(struct file *fp) ++{ ++ struct video_device *vdev = video_devdata(fp); ++ struct tegra_channel *chan = video_get_drvdata(vdev); ++ int ret = _vb2_fop_release(fp, &chan->embedded.lock); ++ ++ return ret; ++} ++ ++static const struct v4l2_file_operations tegra_metadata_fops = { ++ .owner = THIS_MODULE, ++ .unlocked_ioctl = video_ioctl2, ++ .open = tegra_metadata_open, ++ .release = tegra_metadata_close, ++ .read = vb2_fop_read, ++ .poll = vb2_fop_poll, ++ .mmap = vb2_fop_mmap, ++}; ++ ++static int tegra_metadata_querycap(struct file *file, void *fh, ++ struct v4l2_capability *cap) ++{ ++ struct v4l2_fh *vfh = file->private_data; ++ struct tegra_channel *chan = video_drvdata(file); ++ ++ /* FIXME: why do Device Caps show V4L2_CAP_EXT_PIX_FORMAT? */ ++ cap->device_caps = V4L2_CAP_META_CAPTURE | V4L2_CAP_STREAMING; ++ cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS | ++ V4L2_CAP_EXT_PIX_FORMAT | V4L2_CAP_VIDEO_CAPTURE; ++ ++ strscpy(cap->driver, "tegra-embedded", sizeof(cap->driver)); ++ strscpy(cap->card, vfh->vdev->name, sizeof(cap->card)); ++ snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s:%u", ++ dev_name(chan->vi->dev), chan->port[0]); ++ ++ return 0; ++} ++ ++static int tegra_metadata_enum_format(struct file *file, void *fh, ++ struct v4l2_fmtdesc *f) ++{ ++ if (f->index) ++ return -EINVAL; ++ ++ f->pixelformat = V4L2_META_FMT_D4XX; ++ strscpy(f->description, "D4XX metadata format", sizeof(f->description)); ++ ++ return 0; ++} ++ ++static int tegra_metadata_get_format(struct file *file, void *fh, ++ struct v4l2_format *format) ++{ ++ struct v4l2_fh *vfh = file->private_data; ++ struct v4l2_meta_format *fmt = &format->fmt.meta; ++ ++ if (format->type != vfh->vdev->queue->type) ++ return -EINVAL; ++ ++ memset(fmt, 0, sizeof(*fmt)); ++ ++ fmt->dataformat = V4L2_META_FMT_D4XX; ++ fmt->buffersize = 255; ++ ++ return 0; ++} ++static int tegra_metadata_set_format(struct file *file, void *fh, ++ struct v4l2_format *format) ++{ ++ return 0; ++} ++ ++static int tegra_metadata_try_format(struct file *file, void *fh, ++ struct v4l2_format *format) ++{ ++ return 0; ++} ++static const struct v4l2_ioctl_ops tegra_metadata_ioctl_ops = { ++ .vidioc_querycap = tegra_metadata_querycap, ++ .vidioc_enum_fmt_meta_cap = tegra_metadata_enum_format, ++ .vidioc_g_fmt_meta_cap = tegra_metadata_get_format, ++ .vidioc_s_fmt_meta_cap = tegra_metadata_set_format, ++ .vidioc_try_fmt_meta_cap = tegra_metadata_try_format, ++ .vidioc_reqbufs = vb2_ioctl_reqbufs, ++ .vidioc_querybuf = vb2_ioctl_querybuf, ++ .vidioc_qbuf = vb2_ioctl_qbuf, ++ .vidioc_dqbuf = vb2_ioctl_dqbuf, ++ .vidioc_create_bufs = vb2_ioctl_create_bufs, ++ .vidioc_expbuf = vb2_ioctl_expbuf, ++ .vidioc_streamon = vb2_ioctl_streamon, ++ .vidioc_streamoff = vb2_ioctl_streamoff, ++}; ++ ++static int tegra_metadata_queue_setup(struct vb2_queue *vq, ++ unsigned int *nbuffers, unsigned int *nplanes, ++ unsigned int sizes[], struct device *alloc_devs[]) ++{ ++ struct tegra_channel *chan = vb2_get_drv_priv(vq); ++ ++ if (*nplanes) { ++ if (*nplanes != 1) ++ return -EINVAL; ++ ++ if (sizes[0] < 255) ++ return -EINVAL; ++ ++ return 0; ++ } ++ ++ *nplanes = 1; ++ sizes[0] = 255; ++ alloc_devs[0] = chan->vi->dev; ++ ++ ++ return 0; ++} ++ ++static int tegra_metadata_buffer_prepare(struct vb2_buffer *vb) ++{ ++ if (vb->num_planes != 1) ++ return -EINVAL; ++ ++ if (vb2_plane_size(vb, 0) < 255) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static void tegra_metadata_buffer_queue(struct vb2_buffer *vb) ++{ ++ struct tegra_channel *chan = vb2_get_drv_priv(vb->vb2_queue); ++ ++ spin_lock(&chan->embedded.spin_lock); ++ if (chan->embedded.num_buffers < 16) { ++ chan->embedded.buffers[chan->embedded.head] = vb; ++ chan->embedded.head++; ++ if (chan->embedded.head > 15) ++ chan->embedded.head = chan->embedded.head - 16; ++ chan->embedded.num_buffers++; ++ } ++ spin_unlock(&chan->embedded.spin_lock); ++} ++ ++static int tegra_metadata_start_streaming(struct vb2_queue *vq, unsigned int count) ++{ ++ return 0; ++} ++ ++static void tegra_metadata_stop_streaming(struct vb2_queue *vq) ++{ ++ struct tegra_channel *chan = vb2_get_drv_priv(vq); ++ int i = 0; ++ ++ spin_lock(&chan->embedded.spin_lock); ++ for (i = 0; i < chan->embedded.num_buffers; i++) { ++ struct vb2_buffer *evb; ++ evb = chan->embedded.buffers[chan->embedded.tail]; ++ chan->embedded.buffers[chan->embedded.tail] = NULL; ++ chan->embedded.tail++; ++ if (chan->embedded.tail > 15) ++ chan->embedded.tail = chan->embedded.tail - 16; ++ vb2_buffer_done(evb, VB2_BUF_STATE_ERROR); ++ } ++ spin_unlock(&chan->embedded.spin_lock); ++ ++ chan->embedded.head = 0; ++ chan->embedded.tail = 0;; ++ chan->embedded.num_buffers = 0; ++} ++ ++static const struct vb2_ops tegra_metadata_qops = { ++ .queue_setup = tegra_metadata_queue_setup, ++ .buf_prepare = tegra_metadata_buffer_prepare, ++ .buf_queue = tegra_metadata_buffer_queue, ++ .wait_prepare = vb2_ops_wait_prepare, ++ .wait_finish = vb2_ops_wait_finish, ++ .start_streaming = tegra_metadata_start_streaming, ++ .stop_streaming = tegra_metadata_stop_streaming, ++}; ++ ++int tegra_channel_init_video_embedded(struct tegra_channel *chan) ++{ ++ struct video_device *video; ++ struct vb2_queue *queue = &chan->embedded.queue; ++ struct tegra_mc_vi *vi = chan->vi; ++ int ret; ++ ++ mutex_init(&chan->embedded.lock); ++ spin_lock_init(&chan->embedded.spin_lock); ++ ++ video = chan->embedded.video = video_device_alloc(); ++ chan->embedded.pad.flags = MEDIA_PAD_FL_SINK; ++ ++ ret = tegra_media_entity_init(&video->entity, 1, ++ &chan->embedded.pad, false, false); ++ if (ret < 0) { ++ video_device_release(video); ++ dev_err(vi->dev, "%s(): metadata entity init: %d\n", ++ __func__, ret); ++ return ret; ++ } ++ ++ ret = v4l2_ctrl_handler_init(&chan->embedded.ctrl_handler, ++ MAX_CID_CONTROLS); ++ if (chan->embedded.ctrl_handler.error) { ++ dev_err(&video->dev, "failed to init control handler\n"); ++ return ret; ++ } ++ ++ video->fops = &tegra_metadata_fops; ++ video->v4l2_dev = &vi->v4l2_dev; ++ video->queue = queue; ++ snprintf(video->name, sizeof(video->name), "%s-metadata-%u", ++ dev_name(vi->dev), chan->port[0]); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0) ++ video->vfl_type = VFL_TYPE_GRABBER; ++#else ++ video->vfl_type = VFL_TYPE_VIDEO; ++ video->device_caps = V4L2_CAP_META_CAPTURE | V4L2_CAP_STREAMING; ++#endif ++ video->vfl_dir = VFL_DIR_RX; ++ video->release = video_device_release_empty; ++ video->ioctl_ops = &tegra_metadata_ioctl_ops; ++ video->ctrl_handler = &chan->embedded.ctrl_handler; ++ video->lock = &chan->embedded.lock; ++ ++ video_set_drvdata(video, chan); ++ ++#if defined(CONFIG_VIDEOBUF2_DMA_CONTIG) ++ /* get the buffers queue... */ ++ ret = tegra_vb2_dma_init(vi->dev, &chan->embedded.alloc_ctx, ++ SZ_64K, &vi->vb2_dma_alloc_refcnt); ++ if (ret < 0) ++ goto ctx_alloc_error; ++ ++#endif ++//#if defined(CONFIG_VIDEOBUF2_DMA_CONTIG) ++ /* get the buffers queue... */ ++// chan->embedded.alloc_ctx = vb2_dma_contig_init_ctx(vi->dev); ++// if (IS_ERR(chan->embedded.alloc_ctx)) { ++// dev_err(vi->dev, "%s(): vb2 buffer init: %ld\n", __func__, ++// PTR_ERR(chan->embedded.alloc_ctx)); ++// goto ctx_alloc_error; ++// } ++//#endif ++ ++ queue->type = V4L2_BUF_TYPE_META_CAPTURE; ++ queue->io_modes = VB2_MMAP | VB2_DMABUF | VB2_READ | VB2_USERPTR; ++ queue->lock = &chan->embedded.lock; ++ queue->drv_priv = chan; ++ queue->buf_struct_size = sizeof(struct tegra_channel_buffer); ++ queue->ops = &tegra_metadata_qops; ++#if defined(CONFIG_VIDEOBUF2_DMA_CONTIG) ++ queue->mem_ops = &vb2_dma_contig_memops; ++#endif ++ queue->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC | ++ V4L2_BUF_FLAG_TSTAMP_SRC_EOF; ++ ret = vb2_queue_init(queue); ++ if (ret < 0) { ++ dev_err(vi->dev, "%s(): metadata queue initialize: %d\n", ++ __func__, ret); ++ goto vb2_queue_error; ++ } ++ ++ return 0; ++ ++vb2_queue_error: ++#if defined(CONFIG_VIDEOBUF2_DMA_CONTIG) ++ tegra_vb2_dma_cleanup(vi->dev, chan->embedded.alloc_ctx, ++ &vi->vb2_dma_alloc_refcnt); ++ctx_alloc_error: ++#endif ++ media_entity_cleanup(&video->entity); ++ ++ return ret; ++} ++ ++int tegra_channel_cleanup_video_embedded(struct tegra_channel *chan) ++{ ++ struct video_device *video = chan->embedded.video; ++ struct vb2_queue *queue = &chan->embedded.queue; ++ struct device *vi_unit_dev = tegra_channel_get_vi_unit(chan); ++ ++ if (!video) ++ return -EINVAL; ++ ++ video_unregister_device(video); ++ ++ /* release embedded data buffer */ ++ if (chan->emb_buf_size > 0) { ++ dma_free_coherent(vi_unit_dev, ++ chan->emb_buf_size, ++ chan->emb_buf_addr, chan->emb_buf); ++ chan->emb_buf_size = 0; ++ vb2_queue_release(queue); ++#if defined(CONFIG_VIDEOBUF2_DMA_CONTIG) ++ tegra_vb2_dma_cleanup(vi_unit_dev, chan->embedded.alloc_ctx, ++ &chan->vi->vb2_dma_alloc_refcnt); ++#endif ++ } ++ ++ v4l2_ctrl_handler_free(&chan->embedded.ctrl_handler); ++ ++#if defined(CONFIG_MEDIA_CONTROLLER) ++ media_entity_cleanup(&video->entity); ++#endif ++ ++ video_device_release(video); ++ ++ return 0; ++} ++ + int tegra_channel_init_video(struct tegra_channel *chan) + { + struct tegra_mc_vi *vi = chan->vi; +@@ -2656,6 +3046,13 @@ int tegra_channel_cleanup(struct tegra_channel *chan) + chan->emb_buf_size, + chan->emb_buf_addr, chan->emb_buf); + chan->emb_buf_size = 0; ++ vb2_queue_release(&chan->embedded.queue); ++#if IS_ENABLED(CONFIG_VIDEOBUF2_DMA_CONTIG) ++ tegra_vb2_dma_cleanup(vi_unit_dev, chan->embedded.alloc_ctx, ++ &chan->vi->vb2_dma_alloc_refcnt); ++ //vb2_dma_contig_cleanup_ctx(chan->embedded.alloc_ctx); ++#endif ++ media_entity_cleanup(&chan->embedded.video->entity); + } + + tegra_channel_dealloc_buffer_queue(chan); +diff --git a/drivers/media/platform/tegra/camera/vi/graph.c b/drivers/media/platform/tegra/camera/vi/graph.c +index 7c2d05e7..5e25cf6a 100644 +--- a/drivers/media/platform/tegra/camera/vi/graph.c ++++ b/drivers/media/platform/tegra/camera/vi/graph.c +@@ -292,6 +292,11 @@ static int tegra_vi_graph_notify_complete(struct v4l2_async_notifier *notifier) + struct tegra_channel *chan = + container_of(notifier, struct tegra_channel, notifier); + struct tegra_vi_graph_entity *entity; ++ struct camera_common_data *s_data; ++ struct device_node *node; ++ struct sensor_mode_properties *sensor_mode = NULL; ++ int idx; ++ + int ret; + + dev_dbg(chan->vi->dev, "notify complete, all subdevs registered\n"); +@@ -325,16 +330,46 @@ static int tegra_vi_graph_notify_complete(struct v4l2_async_notifier *notifier) + if (ret < 0) + goto graph_error; + ++ /* Init embedded channel only if embedded is set in DT*/ ++ s_data = to_camera_common_data(chan->subdev_on_csi->dev); ++ node = chan->subdev_on_csi->dev->of_node; ++ if (s_data && node) { ++ idx = s_data->mode_prop_idx; ++ if (idx < s_data->sensor_props.num_modes) ++ sensor_mode = &s_data->sensor_props.sensor_modes[idx]; ++ } ++ ++ if (sensor_mode && ++ sensor_mode->image_properties.embedded_metadata_height > 0) { ++ ret = tegra_channel_init_video_embedded(chan); ++ if (ret < 0) { ++ dev_err(chan->vi->dev, ++ "failed to initialize embedded channel\n"); ++ goto register_embedded_device_error; ++ } ++ ret = video_register_device(chan->embedded.video, VFL_TYPE_VIDEO, -1); ++ if (ret < 0) { ++ dev_err(&chan->video->dev, "failed to register embedded %s: %d\n", ++ chan->embedded.video->name, ret); ++ goto register_embedded_device_error; ++ } ++ } ++ ++ + ret = v4l2_device_register_subdev_nodes(&chan->vi->v4l2_dev); + if (ret < 0) { + dev_err(chan->vi->dev, "failed to register subdev nodes\n"); +- goto graph_error; ++ goto register_nodes_error; + } + + chan->link_status++; + + return 0; + ++register_nodes_error: ++ video_unregister_device(chan->embedded.video); ++register_embedded_device_error: ++ tegra_vi_graph_remove_links(chan); + graph_error: + video_unregister_device(chan->video); + register_device_error: +@@ -398,6 +433,7 @@ static void tegra_vi_graph_notify_unbind(struct v4l2_async_notifier *notifier, + + /* cleanup for complete */ + if (chan->link_status) { ++ tegra_channel_cleanup_video_embedded(chan); + tegra_vi_graph_remove_links(chan); + tegra_channel_cleanup_video(chan); + chan->link_status--; +diff --git a/drivers/media/platform/tegra/camera/vi/mc_common.c b/drivers/media/platform/tegra/camera/vi/mc_common.c +index ae6b4927..6288d712 100644 +--- a/drivers/media/platform/tegra/camera/vi/mc_common.c ++++ b/drivers/media/platform/tegra/camera/vi/mc_common.c +@@ -164,6 +164,10 @@ static int vi_parse_dt(struct tegra_mc_vi *vi, struct platform_device *dev) + struct device_node *port; + int value = 0xFF; + int ret = 0; ++ struct device_node *dser_node = NULL; ++ struct i2c_client *dser_i2c = NULL; ++ struct device_node *ser_node = NULL; ++ struct i2c_client *ser_i2c = NULL; + + err = of_property_read_u32(node, "num-channels", &num_channels); + if (err) { +@@ -173,6 +177,29 @@ static int vi_parse_dt(struct tegra_mc_vi *vi, struct platform_device *dev) + } + vi->num_channels = num_channels; + ++ vi->dser_dev = NULL; ++ dser_node = of_parse_phandle(node, "nvidia,gmsl-dser-device", 0); ++ if (dser_node) { ++ dser_i2c = of_find_i2c_device_by_node(dser_node); ++ of_node_put(dser_node); ++ if (dser_i2c) { ++ dev_info(&dev->dev, "dser_i2c->addr 0x%x", dser_i2c->addr); ++ vi->dser_dev = &dser_i2c->dev; ++ } ++ } ++ ++ vi->ser_dev = NULL; ++ ser_node = of_parse_phandle(node, "nvidia,gmsl-ser-device", 0); ++ if (ser_node) { ++ ser_i2c = of_find_i2c_device_by_node(ser_node); ++ of_node_put(ser_node); ++ if (ser_i2c) { ++ dev_info(&dev->dev, "ser_i2c->addr 0x%x", ser_i2c->addr); ++ vi->ser_dev = &ser_i2c->dev; ++ } ++ } ++ ++ vi->num_channels = num_channels; + ports = of_get_child_by_name(node, "ports"); + if (ports == NULL) + ports = node; +diff --git a/drivers/media/platform/tegra/camera/vi/vi5_fops.c b/drivers/media/platform/tegra/camera/vi/vi5_fops.c +index 7b16dcaf..487ae44b 100644 +--- a/drivers/media/platform/tegra/camera/vi/vi5_fops.c ++++ b/drivers/media/platform/tegra/camera/vi/vi5_fops.c +@@ -426,6 +426,39 @@ static void vi5_setup_surface(struct tegra_channel *chan, + chan->capture_descr_sequence += 1; + } + ++static void vi5_release_metadata_buffer(struct tegra_channel *chan, ++ struct vb2_v4l2_buffer *vbuf) ++{ ++ struct vb2_buffer *evb = NULL; ++ struct vb2_v4l2_buffer *evbuf; ++ void* frm_buffer; ++ ++ spin_lock(&chan->embedded.spin_lock); ++ if (0 < chan->embedded.num_buffers) { ++ evb = chan->embedded.buffers[chan->embedded.tail]; ++ chan->embedded.buffers[chan->embedded.tail] = NULL; ++ chan->embedded.tail++; ++ if (chan->embedded.tail > 15) ++ chan->embedded.tail = chan->embedded.tail - 16; ++ chan->embedded.num_buffers--; ++ } ++ spin_unlock(&chan->embedded.spin_lock); ++ ++ if (!evb) ++ return; ++ ++ frm_buffer = vb2_plane_vaddr(evb, 0); ++ if (!frm_buffer) ++ return; ++ ++ memcpy(frm_buffer, chan->emb_buf_addr, 255); ++ evbuf = to_vb2_v4l2_buffer(evb); ++ evbuf->sequence = vbuf->sequence; ++ vb2_set_plane_payload(evb, 0, 68); ++ evb->timestamp = vbuf->vb2_buf.timestamp; ++ vb2_buffer_done(evb, VB2_BUF_STATE_DONE); ++} ++ + static void vi5_release_buffer(struct tegra_channel *chan, + struct tegra_channel_buffer *buf) + { +@@ -436,6 +469,9 @@ static void vi5_release_buffer(struct tegra_channel *chan, + vb2_set_plane_payload(&vbuf->vb2_buf, 0, chan->format.sizeimage); + + vb2_buffer_done(&vbuf->vb2_buf, buf->vb2_state); ++ ++ if (chan->embedded_data_height == 1 && buf->vb2_state == VB2_BUF_STATE_DONE) ++ vi5_release_metadata_buffer(chan, vbuf); + } + + static void vi5_capture_enqueue(struct tegra_channel *chan, +diff --git a/drivers/media/platform/tegra/camera/vi/vi5_formats.h b/drivers/media/platform/tegra/camera/vi/vi5_formats.h +index 1d0c1133..1d375de5 100644 +--- a/drivers/media/platform/tegra/camera/vi/vi5_formats.h ++++ b/drivers/media/platform/tegra/camera/vi/vi5_formats.h +@@ -82,6 +82,8 @@ static const struct tegra_video_format vi5_video_formats[] = { + /* RAW 7: TODO */ + + /* RAW 8 */ ++ TEGRA_VIDEO_FORMAT(RAW8, 8, Y8_1X8, 1, 1, T_R8, ++ RAW8, GREY, "Greyscale 8"), + TEGRA_VIDEO_FORMAT(RAW8, 8, SRGGB8_1X8, 1, 1, T_R8, + RAW8, SRGGB8, "RGRG.. GBGB.."), + TEGRA_VIDEO_FORMAT(RAW8, 8, SGRBG8_1X8, 1, 1, T_R8, +@@ -112,22 +114,22 @@ static const struct tegra_video_format vi5_video_formats[] = { + RAW12, SBGGR12, "BGBG.. GRGR.."), + + /* RGB888 */ +- TEGRA_VIDEO_FORMAT(RGB888, 24, RGB888_1X24, 4, 1, T_A8R8G8B8, +- RGB888, RGBA32, "RGBA-8-8-8-8"), ++ // TEGRA_VIDEO_FORMAT(RGB888, 24, RGB888_1X24, 4, 1, T_A8R8G8B8, ++ // RGB888, RGBA32, "RGBA-8-8-8-8"), + TEGRA_VIDEO_FORMAT(RGB888, 24, RGB888_1X32_PADHI, 4, 1, T_A8B8G8R8, + RGB888, RGB32, "RGB-8-8-8-8"), + + /* YUV422 */ +- TEGRA_VIDEO_FORMAT(YUV422, 16, UYVY8_1X16, 2, 1, T_U8_Y8__V8_Y8, +- YUV422_8, UYVY, "YUV 4:2:2"), +- TEGRA_VIDEO_FORMAT(YUV422, 16, VYUY8_1X16, 2, 1, T_V8_Y8__U8_Y8, +- YUV422_8, VYUY, "YUV 4:2:2"), ++ // TEGRA_VIDEO_FORMAT(YUV422, 16, UYVY8_1X16, 2, 1, T_U8_Y8__V8_Y8, ++ // YUV422_8, UYVY, "YUV 4:2:2"), ++ // TEGRA_VIDEO_FORMAT(YUV422, 16, VYUY8_1X16, 2, 1, T_V8_Y8__U8_Y8, ++ // YUV422_8, VYUY, "YUV 4:2:2"), + TEGRA_VIDEO_FORMAT(YUV422, 16, YUYV8_1X16, 2, 1, T_Y8_U8__Y8_V8, + YUV422_8, YUYV, "YUV 4:2:2"), + TEGRA_VIDEO_FORMAT(YUV422, 16, YVYU8_1X16, 2, 1, T_Y8_V8__Y8_U8, + YUV422_8, YVYU, "YUV 4:2:2"), +- TEGRA_VIDEO_FORMAT(YUV422, 16, UYVY8_1X16, 1, 1, T_Y8__V8U8_N422, +- YUV422_8, NV16, "NV16"), ++ // TEGRA_VIDEO_FORMAT(YUV422, 16, UYVY8_1X16, 1, 1, T_Y8__V8U8_N422, ++ // YUV422_8, NV16, "NV16"), + TEGRA_VIDEO_FORMAT(YUV422, 16, UYVY8_2X8, 2, 1, T_U8_Y8__V8_Y8, + YUV422_8, UYVY, "YUV 4:2:2 UYVY"), + TEGRA_VIDEO_FORMAT(YUV422, 16, VYUY8_2X8, 2, 1, T_V8_Y8__U8_Y8, +@@ -136,6 +138,18 @@ static const struct tegra_video_format vi5_video_formats[] = { + YUV422_8, YUYV, "YUV 4:2:2 YUYV"), + TEGRA_VIDEO_FORMAT(YUV422, 16, YVYU8_2X8, 2, 1, T_Y8_V8__Y8_U8, + YUV422_8, YVYU, "YUV 4:2:2 YVYU"), ++ ++ TEGRA_VIDEO_FORMAT(YUV422, 16, UYVY8_1X16, 2, 1, T_U8_Y8__V8_Y8, ++ YUV422_8, Z16, "Depth 16"), ++ TEGRA_VIDEO_FORMAT(YUV422, 16, VYUY8_1X16, 2, 1, T_V8_Y8__U8_Y8, ++ YUV422_8, Y8I, "Y8I 16"), ++ // TODO: RealSesne calibration format Y12I should be 3-byte, ++ // R[7:3]R[3:0] | L[3:0]R[11:8] | L[11:8]L[7:4] ++ // but, currently, it's 4-byte, one byte is added as alignment ++ // R[7:3]R[3:0] | L[3:0]R[11:8] | L[11:8]L[7:4] | ALIGN[7:0] ++ TEGRA_VIDEO_FORMAT(RGB888, 24, RGB888_1X24, 4, 1, T_A8R8G8B8, ++ RGB888, Y12I, "Y12I 24"), ++ + }; + + #endif +diff --git a/include/media/gmsl-link.h b/include/media/gmsl-link.h +index ad902d0a..7dce2356 100644 +--- a/include/media/gmsl-link.h ++++ b/include/media/gmsl-link.h +@@ -40,6 +40,9 @@ + #define GMSL_CSI_DT_RAW_12 0x2C + #define GMSL_CSI_DT_UED_U1 0x30 + #define GMSL_CSI_DT_EMBED 0x12 ++#define GMSL_CSI_DT_YUV422_8 0x1E ++#define GMSL_CSI_DT_RGB_888 0x24 ++#define GMSL_CSI_DT_RAW_8 0x2A + + #define GMSL_ST_ID_UNUSED 0xFF + +diff --git a/include/media/max9295.h b/include/media/max9295.h +index bf801aa2..c576e3e5 100644 +--- a/include/media/max9295.h ++++ b/include/media/max9295.h +@@ -12,6 +12,7 @@ + #ifndef __MAX9295_H__ + #define __MAX9295_H__ + ++#include + #include + /** + * \defgroup max9295 MAX9295 serializer driver +@@ -22,6 +23,8 @@ + * @{ + */ + ++int max9295_set_pipe(struct device *dev, int pipe_id, u8 data_type1, ++ u8 data_type2, u32 vc_id); + + /** + * @brief Powers on a serializer device and performs the I2C overrides +@@ -82,6 +85,7 @@ int max9295_sdev_unpair(struct device *dev, struct device *s_dev); + */ + int max9295_setup_streaming(struct device *dev); + ++int max9295_init_settings(struct device *dev); + /** @} */ + + #endif /* __MAX9295_H__ */ +diff --git a/include/media/max9296.h b/include/media/max9296.h +index 210dbc80..6b4c796e 100644 +--- a/include/media/max9296.h ++++ b/include/media/max9296.h +@@ -12,6 +12,7 @@ + #ifndef __MAX9296_H__ + #define __MAX9296_H__ + ++#include + #include + /** + * \defgroup max9296 MAX9296 deserializer driver +@@ -22,6 +23,12 @@ + * @{ + */ + ++int max9296_get_available_pipe_id(struct device *dev, int vc_id); ++int max9296_set_pipe(struct device *dev, int pipe_id, u8 data_type1, ++ u8 data_type2, u32 vc_id); ++int max9296_release_pipe(struct device *dev, int pipe_id); ++void max9296_reset_oneshot(struct device *dev); ++ + /** + * Puts a deserializer device in single exclusive link mode, so link-specific + * I2C overrides can be performed for sensor and serializer devices. +@@ -146,6 +153,7 @@ int max9296_power_on(struct device *dev); + */ + void max9296_power_off(struct device *dev); + ++int max9296_init_settings(struct device *dev); + /** @} */ + + #endif /* __MAX9296_H__ */ +diff --git a/include/media/mc_common.h b/include/media/mc_common.h +index 0408ba67..1252fb3f 100644 +--- a/include/media/mc_common.h ++++ b/include/media/mc_common.h +@@ -224,6 +224,23 @@ struct tegra_channel { + unsigned int embedded_data_width; + unsigned int embedded_data_height; + ++ struct { ++ struct video_device *video; ++ struct mutex lock; ++ spinlock_t spin_lock; ++ struct vb2_queue queue; ++ /*FIXME: 16 is max queued metadata buffers ++ * define 16 ++ */ ++ struct vb2_buffer *buffers[16]; ++ unsigned int head; ++ unsigned int tail; ++ unsigned int num_buffers; ++ void *alloc_ctx; ++ struct media_pad pad; ++ struct v4l2_ctrl_handler ctrl_handler; ++ } embedded; ++ + DECLARE_BITMAP(fmts_bitmap, MAX_FORMAT_NUM); + atomic_t power_on_refcnt; + struct v4l2_fh *fh; +@@ -304,6 +321,9 @@ struct tegra_mc_vi { + unsigned int num_channels; + unsigned int num_subdevs; + ++ struct device *dser_dev; ++ struct device *ser_dev; ++ + struct tegra_csi_device *csi; + struct list_head vi_chans; + struct tegra_channel *tpg_start; +@@ -400,7 +420,9 @@ struct tegra_channel_buffer *dequeue_inflight(struct tegra_channel *chan); + int tegra_channel_set_power(struct tegra_channel *chan, bool on); + + int tegra_channel_init_video(struct tegra_channel *chan); ++int tegra_channel_init_video_embedded(struct tegra_channel *chan); + int tegra_channel_cleanup_video(struct tegra_channel *chan); ++int tegra_channel_cleanup_video_embedded(struct tegra_channel *chan); + + struct tegra_vi_fops { + int (*vi_power_on)(struct tegra_channel *chan); +diff --git a/include/media/tegra_camera_core.h b/include/media/tegra_camera_core.h +index e6d9a2b1..38634b77 100644 +--- a/include/media/tegra_camera_core.h ++++ b/include/media/tegra_camera_core.h +@@ -18,7 +18,7 @@ + /* Width alignment */ + #define TEGRA_WIDTH_ALIGNMENT 1 + /* Stride alignment */ +-#define TEGRA_STRIDE_ALIGNMENT 1 ++#define TEGRA_STRIDE_ALIGNMENT 64 + /* Height alignment */ + #define TEGRA_HEIGHT_ALIGNMENT 1 + /* Size alignment */ +@@ -32,6 +32,8 @@ + #define TEGRA_IMAGE_FORMAT_DEF 32 + + enum tegra_image_dt { ++ TEGRA_IMAGE_DT_EMBEDDED_8 = 18, ++ + TEGRA_IMAGE_DT_YUV420_8 = 24, + TEGRA_IMAGE_DT_YUV420_10, + +@@ -51,6 +53,12 @@ enum tegra_image_dt { + TEGRA_IMAGE_DT_RAW10, + TEGRA_IMAGE_DT_RAW12, + TEGRA_IMAGE_DT_RAW14, ++ ++ TEGRA_IMAGE_DT_USER_1 = 48, ++ TEGRA_IMAGE_DT_USER_2, ++ TEGRA_IMAGE_DT_USER_3, ++ TEGRA_IMAGE_DT_USER_4, ++ + }; + + /* Supported CSI to VI Data Formats */ +-- +2.34.1 + diff --git a/nvidia-oot/7.0/0002-Adding-stream-restart-upon-capture-timeout.patch b/nvidia-oot/7.0/0002-Adding-stream-restart-upon-capture-timeout.patch new file mode 100644 index 00000000..e443abe1 --- /dev/null +++ b/nvidia-oot/7.0/0002-Adding-stream-restart-upon-capture-timeout.patch @@ -0,0 +1,57 @@ +From ccdb810c2454b30ddf8016666f38a334bb7038eb Mon Sep 17 00:00:00 2001 +From: ejgoldik +Date: Thu, 18 Sep 2025 15:36:36 +0300 +Subject: [PATCH] Adding stream restart upon capture timeout + +Ehud J. Goldik +--- + .../media/platform/tegra/camera/vi/vi5_fops.c | 25 ++++++++++++++++++- + 1 file changed, 24 insertions(+), 1 deletion(-) + +diff --git a/drivers/media/platform/tegra/camera/vi/vi5_fops.c b/drivers/media/platform/tegra/camera/vi/vi5_fops.c +index b990c09f..9304751f 100644 +--- a/drivers/media/platform/tegra/camera/vi/vi5_fops.c ++++ b/drivers/media/platform/tegra/camera/vi/vi5_fops.c +@@ -542,6 +542,24 @@ uncorr_err: + spin_unlock_irqrestore(&chan->capture_state_lock, flags); + } + ++static int vi5_attempt_restart_stream(struct tegra_channel *chan) ++{ ++ int err = -EPERM; ++ ++ if (chan->num_subdevs > 1) { ++ /* Restart meant for D4xx devices where device 1 is DS5 mux */ ++ if (strncmp(chan->subdev[1]->name, "DS5 mux", 7) == 0) { ++ /* Stream OFF */ ++ err = v4l2_subdev_call(chan->subdev[1], video, s_stream, 0); ++ if (err == 0) { ++ /* Stream ON */ ++ err = v4l2_subdev_call(chan->subdev[1], video, s_stream, 1); ++ } ++ } ++ } ++ return err; ++} ++ + static void vi5_capture_dequeue(struct tegra_channel *chan, + struct tegra_channel_buffer *buf) + { +@@ -575,8 +591,13 @@ static void vi5_capture_dequeue(struct tegra_channel *chan, + goto rel_buf; + } else { + dev_err(vi->dev, +- "uncorr_err: request timed out after %d ms\n", ++ "uncorr_err: request timed out after %d ms - attempting restart\n", + timeout_ms); ++ err = vi5_attempt_restart_stream(chan); ++ if (err != 0) { ++ dev_err(vi->dev, ++ "uncorr_err: Restart failed\n"); ++ } + } + } else { + dev_err(vi->dev, "uncorr_err: request err %d\n", err); +-- +2.43.0 + diff --git a/nvidia-oot/7.0/0003-Fix-y12i-calibration-stream.patch b/nvidia-oot/7.0/0003-Fix-y12i-calibration-stream.patch new file mode 120000 index 00000000..16be63f3 --- /dev/null +++ b/nvidia-oot/7.0/0003-Fix-y12i-calibration-stream.patch @@ -0,0 +1 @@ +../6.0/0003-Fix-y12i-calibration-stream.patch \ No newline at end of file diff --git a/nvidia-oot/7.0/0004-Add-GPIO-tunneling-for-the-external-sync-support.patch b/nvidia-oot/7.0/0004-Add-GPIO-tunneling-for-the-external-sync-support.patch new file mode 100644 index 00000000..4ff17da7 --- /dev/null +++ b/nvidia-oot/7.0/0004-Add-GPIO-tunneling-for-the-external-sync-support.patch @@ -0,0 +1,86 @@ +From 71e364f579128502a796b19ad929d95bd42139e2 Mon Sep 17 00:00:00 2001 +From: Nikolai-L +Date: Tue, 3 Feb 2026 17:06:10 +0200 +Subject: [PATCH] Add GPIO tunneling for the external sync support + +--- + drivers/media/i2c/max9295.c | 11 +++++++++-- + drivers/media/i2c/max9296.c | 11 +++++++++++ + 3 files changed, 27 insertions(+), 2 deletions(-) + +diff --git a/drivers/media/i2c/max9295.c b/drivers/media/i2c/max9295.c +index e7c77845..40568147 100644 +--- a/drivers/media/i2c/max9295.c ++++ b/drivers/media/i2c/max9295.c +@@ -24,6 +24,7 @@ + #define MAX9295_CTRL0_ADDR 0x10 + #define MAX9295_SRC_CTRL_ADDR 0x2BF + #define MAX9295_SRC_PWDN_ADDR 0x02BE ++#define MAX9295_2C0_ADDR 0x02C0 + #define MAX9295_SRC_OUT_RCLK_ADDR 0x3F1 + #define MAX9295_START_PIPE_ADDR 0x311 + #define MAX9295_PIPE_EN_ADDR 0x2 +@@ -84,7 +85,12 @@ + + #define MAX9295_RESET_ALL 0x80 + #define MAX9295_RESET_SRC 0x60 ++#define MAX9295_RESET_ESYNC 0x77 ++ + #define MAX9295_PWDN_GPIO 0x90 ++#define MAX9295_PWDN_ESYNC 0x04 ++ ++#define MAX9295_2C0_ESYNC 0x57 + + #define MAX9295_MAX_PIPES 0x4 + +@@ -354,8 +360,9 @@ int max9295_setup_control(struct device *dev) + max9295_write_reg(dev, MAX9295_I2C4_ADDR, (g_ctx->sdev_reg << 1)); + max9295_write_reg(dev, MAX9295_I2C5_ADDR, (g_ctx->sdev_def << 1)); + +- max9295_write_reg(dev, MAX9295_SRC_PWDN_ADDR, MAX9295_PWDN_GPIO); +- max9295_write_reg(dev, MAX9295_SRC_CTRL_ADDR, MAX9295_RESET_SRC); ++ max9295_write_reg(dev, MAX9295_SRC_PWDN_ADDR, MAX9295_PWDN_ESYNC); ++ max9295_write_reg(dev, MAX9295_SRC_CTRL_ADDR, MAX9295_RESET_ESYNC); ++ max9295_write_reg(dev, MAX9295_2C0_ADDR, MAX9295_2C0_ESYNC); + max9295_write_reg(dev, MAX9295_SRC_OUT_RCLK_ADDR, MAX9295_SRC_RCLK); + + g_ctx->serdev_found = true; +diff --git a/drivers/media/i2c/max9296.c b/drivers/media/i2c/max9296.c +index 97559460..d50bea51 100644 +--- a/drivers/media/i2c/max9296.c ++++ b/drivers/media/i2c/max9296.c +@@ -16,6 +16,10 @@ + #include + + /* register specifics */ ++#define MAX9296_2C5_ADDR 0x2C5 ++#define MAX9296_2C6_ADDR 0x2C6 ++#define MAX9296_2C7_ADDR 0x2C7 ++ + #define MAX9296_DST_CSI_MODE_ADDR 0x330 + #define MAX9296_LANE_MAP1_ADDR 0x333 + #define MAX9296_LANE_MAP2_ADDR 0x334 +@@ -44,6 +48,10 @@ + #define MAX9296_CTRL0_ADDR 0x10 + + /* data defines */ ++#define MAX9296_2C5_ESYNC 0xAA ++#define MAX9296_2C6_ESYNC 0x17 ++#define MAX9296_2C7_ESYNC 0x47 ++ + #define MAX9296_CSI_MODE_4X2 0x1 + #define MAX9296_CSI_MODE_2X4 0x4 + #define MAX9296_LANE_MAP1_4X2 0x44 +@@ -354,6 +362,9 @@ int max9296_setup_control(struct device *dev, struct device *s_dev) + + max9296_write_reg(dev, + MAX9296_PWDN_PHYS_ADDR, MAX9296_ALLPHYS_NOSTDBY); ++ max9296_write_reg(dev, MAX9296_2C5_ADDR, MAX9296_2C5_ESYNC); ++ max9296_write_reg(dev, MAX9296_2C6_ADDR, MAX9296_2C6_ESYNC); ++ max9296_write_reg(dev, MAX9296_2C7_ADDR, MAX9296_2C7_ESYNC); + + priv->sdev_ref++; + +-- +2.43.0 + diff --git a/nvidia-oot/7.0/0005-Adding-max96712-support-for-D4xx.patch b/nvidia-oot/7.0/0005-Adding-max96712-support-for-D4xx.patch new file mode 120000 index 00000000..28d80cc3 --- /dev/null +++ b/nvidia-oot/7.0/0005-Adding-max96712-support-for-D4xx.patch @@ -0,0 +1 @@ +../6.0/0005-Adding-max96712-support-for-D4xx.patch \ No newline at end of file diff --git a/nvidia-oot/7.1/0001-Porting-nvidia-driver-patches-to-jetpack-6.0.patch b/nvidia-oot/7.1/0001-Porting-nvidia-driver-patches-to-jetpack-6.0.patch new file mode 100644 index 00000000..b51a8fb1 --- /dev/null +++ b/nvidia-oot/7.1/0001-Porting-nvidia-driver-patches-to-jetpack-6.0.patch @@ -0,0 +1,1264 @@ +From 1ce2b2e647c63724bfd1434f963eabbe4aa83941 Mon Sep 17 00:00:00 2001 +From: Dmitry Perchanov +Date: Mon, 20 May 2024 18:08:02 +0300 +Subject: [PATCH] Porting nvidia driver patches to jetpack 6.0 + +Signed-off-by: Dmitry Perchanov +--- + drivers/media/i2c/Makefile | 3 + + drivers/media/i2c/max9295.c | 139 ++++++ + drivers/media/i2c/max9296.c | 190 +++++++++ + .../platform/tegra/camera/sensor_common.c | 4 + + .../media/platform/tegra/camera/vi/channel.c | 401 +++++++++++++++++- + .../media/platform/tegra/camera/vi/graph.c | 38 +- + .../platform/tegra/camera/vi/mc_common.c | 27 ++ + .../media/platform/tegra/camera/vi/vi5_fops.c | 36 ++ + .../platform/tegra/camera/vi/vi5_formats.h | 30 +- + include/media/gmsl-link.h | 3 + + include/media/max9295.h | 4 + + include/media/max9296.h | 8 + + include/media/mc_common.h | 22 + + include/media/tegra_camera_core.h | 8 + + 14 files changed, 902 insertions(+), 11 deletions(-) + +diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile +index 7c5913c6..396b9bc3 100644 +--- a/drivers/media/i2c/Makefile ++++ b/drivers/media/i2c/Makefile +@@ -5,6 +5,9 @@ subdir-ccflags-y += -Werror + ifneq ($(NV_BUILD_SYSTEM_TYPE),embedded-linux) + obj-m += max9295.o + obj-m += max9296.o ++subdir-ccflags-y += -DCONFIG_VIDEO_D4XX_SERDES ++subdir-ccflags-y += -DCONFIG_TEGRA_CAMERA_PLATFORM ++obj-m += d4xx.o + ifndef CONFIG_TEGRA_SYSTEM_TYPE_ACK + obj-m += max96712.o + +diff --git a/drivers/media/i2c/max9295.c b/drivers/media/i2c/max9295.c +index b363d5f6..e7c77845 100644 +--- a/drivers/media/i2c/max9295.c ++++ b/drivers/media/i2c/max9295.c +@@ -465,6 +465,145 @@ static struct regmap_config max9295_regmap_config = { + .cache_type = REGCACHE_RBTREE, + }; + ++struct reg_pair { ++ u16 addr; ++ u8 val; ++}; ++ ++static int max9295_set_registers(struct device *dev, struct reg_pair *map, ++ u32 count) ++{ ++ int err = 0; ++ u32 j = 0; ++ ++ for (j = 0; j < count; j++) { ++ err = max9295_write_reg(dev, ++ map[j].addr, map[j].val); ++ if (err != 0) ++ break; ++ } ++ ++ return err; ++} ++ ++static int __max9295_set_pipe(struct device *dev, int pipe_id, u8 data_type1, ++ u8 data_type2, u32 vc_id) ++{ ++ int err = 0; ++ u8 bpp = 0x30; ++ static u8 pipe_x_val = 0x0; ++ struct reg_pair map_multi_pipe_en[] = { ++ {0x0315, 0x80}, ++ }; ++ struct reg_pair map_bpp8dbl[] = { ++ {0x0312, 0x0F}, ++ }; ++ struct reg_pair map_pipe_control[] = { ++ /* addr, val */ ++ {MAX9295_PIPE_X_DT_ADDR, 0x5E}, // Pipe X pulls data_type1 ++ {0x0315, 0x52}, // Pipe X pulls data_type2 ++ {0x0309, 0x01}, // # Pipe X pulls vc_id ++ {0x030A, 0x00}, ++ {0x031C, 0x30}, // BPP in pipe X ++ {0x0102, 0x0E}, // LIM_HEART Pipe X: Disabled ++ }; ++ ++ if (data_type1 == GMSL_CSI_DT_RAW_8 || data_type1 == GMSL_CSI_DT_EMBED ++ || data_type2 == GMSL_CSI_DT_RAW_8 || data_type2 == GMSL_CSI_DT_EMBED) { ++ map_bpp8dbl[0].val |= (1 << pipe_id); ++ } else { ++ map_bpp8dbl[0].val &= ~(1 << pipe_id); ++ } ++ err |= max9295_set_registers(dev, map_bpp8dbl, ARRAY_SIZE(map_bpp8dbl)); ++ ++ if (data_type1 == GMSL_CSI_DT_RGB_888) ++ bpp = 0x18; ++ ++ map_pipe_control[0].addr += 0x2 * pipe_id; ++ map_pipe_control[1].addr += 0x2 * pipe_id; ++ map_pipe_control[2].addr += 0x2 * pipe_id; ++ map_pipe_control[3].addr += 0x2 * pipe_id; ++ map_pipe_control[4].addr += 0x1 * pipe_id; ++ map_pipe_control[5].addr += 0x8 * pipe_id; ++ ++ map_pipe_control[0].val = 0x40 | data_type1; ++ map_pipe_control[1].val = 0x40 | data_type2; ++ map_pipe_control[2].val = 1 << vc_id; ++ map_pipe_control[3].val = 0x00; ++ map_pipe_control[4].val = bpp; ++ map_pipe_control[5].val = 0x0E; ++ ++ if (pipe_id == 0) ++ pipe_x_val = map_pipe_control[1].val; ++ ++ err |= max9295_set_registers(dev, map_pipe_control, ++ ARRAY_SIZE(map_pipe_control)); ++ ++ map_multi_pipe_en[0].val = 0x80 | pipe_x_val; ++ err |= max9295_set_registers(dev, map_multi_pipe_en, ++ ARRAY_SIZE(map_multi_pipe_en)); ++ ++ return err; ++} ++ ++int max9295_init_settings(struct device *dev) ++{ ++ int err = 0; ++ int i; ++ struct max9295 *priv = dev_get_drvdata(dev); ++ ++ struct reg_pair map_pipe_opt[] = { ++ // Enable all pipes ++ {MAX9295_PIPE_EN_ADDR, 0xF3}, ++ // Write 0x33 for 4 lanes ++ {MAX9295_MIPI_RX1_ADDR, 0x11}, ++ // All pipes pull clock from port B ++ {MAX9295_CSI_PORT_SEL_ADDR, 0x6F}, ++ // All pipes pull data from port B ++ {MAX9295_START_PIPE_ADDR, 0xF0}, ++ }; ++ ++ mutex_lock(&priv->lock); ++ ++ // Init control ++ err |= max9295_set_registers(dev, map_pipe_opt, ++ ARRAY_SIZE(map_pipe_opt)); ++ ++ for (i = 0; i < MAX9295_MAX_PIPES; i++) ++ err |= __max9295_set_pipe(dev, i, GMSL_CSI_DT_YUV422_8, ++ GMSL_CSI_DT_EMBED, i); ++ ++ mutex_unlock(&priv->lock); ++ ++ return err; ++} ++EXPORT_SYMBOL(max9295_init_settings); ++ ++int max9295_set_pipe(struct device *dev, int pipe_id, ++ u8 data_type1, u8 data_type2, u32 vc_id) ++{ ++ struct max9295 *priv = dev_get_drvdata(dev); ++ int err = 0; ++ ++ if (pipe_id > (MAX9295_MAX_PIPES - 1)) { ++ dev_info(dev, "%s, input pipe_id: %d exceed max9295 max pipes\n", ++ __func__, pipe_id); ++ return -EINVAL; ++ } ++ ++ dev_dbg(dev, "%s pipe_id %d, data_type1 %u, data_type2 %u, vc_id %u\n", ++ __func__, pipe_id, data_type1, data_type2, vc_id); ++ ++ mutex_lock(&priv->lock); ++ ++ err = __max9295_set_pipe(dev, pipe_id, data_type1, data_type2, vc_id); ++ ++ mutex_unlock(&priv->lock); ++ ++ return err; ++} ++EXPORT_SYMBOL(max9295_set_pipe); ++ + #if defined(NV_I2C_DRIVER_STRUCT_PROBE_WITHOUT_I2C_DEVICE_ID_ARG) /* Linux 6.3 */ + static int max9295_probe(struct i2c_client *client) + #else +diff --git a/drivers/media/i2c/max9296.c b/drivers/media/i2c/max9296.c +index 1ceaf3cd..97559460 100644 +--- a/drivers/media/i2c/max9296.c ++++ b/drivers/media/i2c/max9296.c +@@ -34,6 +34,8 @@ + #define MAX9296_PIPE_X_DST_1_MAP_ADDR 0x410 + #define MAX9296_PIPE_X_SRC_2_MAP_ADDR 0x411 + #define MAX9296_PIPE_X_DST_2_MAP_ADDR 0x412 ++#define MAX9296_PIPE_X_SRC_3_MAP_ADDR 0x413 ++#define MAX9296_PIPE_X_DST_3_MAP_ADDR 0x414 + + #define MAX9296_PIPE_X_ST_SEL_ADDR 0x50 + +@@ -250,6 +252,9 @@ void max9296_power_off(struct device *dev) + mutex_lock(&priv->lock); + priv->pw_ref--; + ++ if (priv->pw_ref < 0) ++ priv->pw_ref = 0; ++ + if (priv->pw_ref == 0) { + /* enter reset mode: XCLR */ + usleep_range(1, 2); +@@ -769,6 +774,191 @@ ret: + } + EXPORT_SYMBOL(max9296_setup_streaming); + ++static int max9296_set_registers(struct device *dev, struct reg_pair *map, ++ u32 count) ++{ ++ int err = 0; ++ u32 j = 0; ++ ++ for (j = 0; j < count; j++) { ++ err = max9296_write_reg(dev, ++ map[j].addr, map[j].val); ++ if (err != 0) ++ break; ++ } ++ ++ return err; ++} ++ ++int max9296_get_available_pipe_id(struct device *dev, int vc_id) ++{ ++ int i; ++ int pipe_id = -ENOMEM; ++ struct max9296 *priv = dev_get_drvdata(dev); ++ ++ mutex_lock(&priv->lock); ++ for (i = 0; i < MAX9296_MAX_PIPES; i++) { ++ if (i == vc_id && !priv->pipe[i].st_count) { ++ priv->pipe[i].st_count++; ++ pipe_id = i; ++ break; ++ } ++ } ++ mutex_unlock(&priv->lock); ++ ++ return pipe_id; ++} ++EXPORT_SYMBOL(max9296_get_available_pipe_id); ++ ++int max9296_release_pipe(struct device *dev, int pipe_id) ++{ ++ struct max9296 *priv = dev_get_drvdata(dev); ++ ++ if (pipe_id < 0 || pipe_id >= MAX9296_MAX_PIPES) ++ return -EINVAL; ++ ++ mutex_lock(&priv->lock); ++ priv->pipe[pipe_id].st_count = 0; ++ mutex_unlock(&priv->lock); ++ ++ return 0; ++} ++EXPORT_SYMBOL(max9296_release_pipe); ++ ++void max9296_reset_oneshot(struct device *dev) ++{ ++ struct max9296 *priv = dev_get_drvdata(dev); ++ ++ mutex_lock(&priv->lock); ++ if (priv->splitter_enabled) { ++ max9296_write_reg(dev, MAX9296_CTRL0_ADDR, 0x03); ++ max9296_write_reg(dev, MAX9296_CTRL0_ADDR, 0x23); ++ } else { ++ max9296_write_reg(dev, MAX9296_CTRL0_ADDR, 0x31); ++ } ++ /* delay to settle link */ ++ msleep(100); ++ mutex_unlock(&priv->lock); ++} ++EXPORT_SYMBOL(max9296_reset_oneshot); ++ ++static int __max9296_set_pipe(struct device *dev, int pipe_id, u8 data_type1, ++ u8 data_type2, u32 vc_id) ++{ ++ int err = 0; ++ int i = 0; ++ u8 en_mapping_num = 0x0F; ++ u8 all_mapping_phy = 0x55; ++ struct reg_pair map_pipe_opt[] = { ++ {0x1458, 0x28}, // PHY A Optimization ++ {0x1459, 0x68}, // PHY A Optimization ++ {0x1558, 0x28}, // PHY B Optimization ++ {0x1559, 0x68}, // PHY B Optimization ++ // 4 lanes on port A, write 0x50 for 2 lanes ++ {MAX9296_LANE_CTRL1_ADDR, 0x50}, ++ // 1500Mbps/lane on port A ++ {MAX9296_PHY1_CLK_ADDR, 0x2F}, ++ // Do not un-double 8bpp (Un-double 8bpp data) ++ //{0x031C, 0x00}, ++ // Do not un-double 8bpp ++ //{0x031F, 0x00}, ++ // 0x02: ALT_MEM_MAP8, 0x10: ALT2_MEM_MAP8 ++ {0x0473, 0x10}, ++ }; ++ struct reg_pair map_pipe_control[] = { ++ // Enable 4 mappings for Pipe X ++ {MAX9296_TX11_PIPE_X_EN_ADDR, 0x0F}, ++ // Map data_type1 on vc_id ++ {MAX9296_PIPE_X_SRC_0_MAP_ADDR, 0x1E}, ++ {MAX9296_PIPE_X_DST_0_MAP_ADDR, 0x1E}, ++ // Map frame_start on vc_id ++ {MAX9296_PIPE_X_SRC_1_MAP_ADDR, 0x00}, ++ {MAX9296_PIPE_X_DST_1_MAP_ADDR, 0x00}, ++ // Map frame end on vc_id ++ {MAX9296_PIPE_X_SRC_2_MAP_ADDR, 0x01}, ++ {MAX9296_PIPE_X_DST_2_MAP_ADDR, 0x01}, ++ // Map data_type2 on vc_id ++ {MAX9296_PIPE_X_SRC_3_MAP_ADDR, 0x12}, ++ {MAX9296_PIPE_X_DST_3_MAP_ADDR, 0x12}, ++ // All mappings to PHY1 (master for port A) ++ {MAX9296_TX45_PIPE_X_DST_CTRL_ADDR, 0x55}, ++ // SEQ_MISS_EN: Disabled / DIS_PKT_DET: Disabled ++ {0x0100, 0x23}, // pipe X ++ }; ++ ++ for (i = 0; i < 10; i++) { ++ map_pipe_control[i].addr += 0x40 * pipe_id; ++ } ++ map_pipe_control[10].addr += 0x12 * pipe_id; ++ ++ if (data_type2 == 0x0) { ++ en_mapping_num = 0x07; ++ all_mapping_phy = 0x15; ++ } ++ map_pipe_control[0].val = en_mapping_num; ++ map_pipe_control[1].val = (vc_id << 6) | data_type1; ++ map_pipe_control[2].val = (vc_id << 6) | data_type1; ++ map_pipe_control[3].val = (vc_id << 6) | 0x00; ++ map_pipe_control[4].val = (vc_id << 6) | 0x00; ++ map_pipe_control[5].val = (vc_id << 6) | 0x01; ++ map_pipe_control[6].val = (vc_id << 6) | 0x01; ++ map_pipe_control[7].val = (vc_id << 6) | data_type2; ++ map_pipe_control[8].val = (vc_id << 6) | data_type2; ++ map_pipe_control[9].val = all_mapping_phy; ++ map_pipe_control[10].val = 0x23; ++ ++ err |= max9296_set_registers(dev, map_pipe_control, ++ ARRAY_SIZE(map_pipe_control)); ++ ++ err |= max9296_set_registers(dev, map_pipe_opt, ++ ARRAY_SIZE(map_pipe_opt)); ++ ++ return err; ++} ++ ++int max9296_init_settings(struct device *dev) ++{ ++ int err = 0; ++ int i; ++ struct max9296 *priv = dev_get_drvdata(dev); ++ ++ mutex_lock(&priv->lock); ++ ++ for (i = 0; i < MAX9296_MAX_PIPES; i++) ++ err |= __max9296_set_pipe(dev, i, GMSL_CSI_DT_YUV422_8, ++ GMSL_CSI_DT_EMBED, i); ++ ++ mutex_unlock(&priv->lock); ++ ++ return err; ++} ++EXPORT_SYMBOL(max9296_init_settings); ++ ++int max9296_set_pipe(struct device *dev, int pipe_id, ++ u8 data_type1, u8 data_type2, u32 vc_id) ++{ ++ struct max9296 *priv = dev_get_drvdata(dev); ++ int err = 0; ++ ++ if (pipe_id > (MAX9296_MAX_PIPES - 1)) { ++ dev_info(dev, "%s, input pipe_id: %d exceed max9296 max pipes\n", ++ __func__, pipe_id); ++ return -EINVAL; ++ } ++ ++ dev_dbg(dev, "%s pipe_id %d, data_type1 %u, data_type2 %u, vc_id %u\n", ++ __func__, pipe_id, data_type1, data_type2, vc_id); ++ ++ mutex_lock(&priv->lock); ++ ++ err = __max9296_set_pipe(dev, pipe_id, data_type1, data_type2, vc_id); ++ ++ mutex_unlock(&priv->lock); ++ ++ return err; ++} ++EXPORT_SYMBOL(max9296_set_pipe); ++ + static const struct of_device_id max9296_of_match[] = { + { .compatible = "maxim,max9296", }, + { }, +diff --git a/drivers/media/platform/tegra/camera/sensor_common.c b/drivers/media/platform/tegra/camera/sensor_common.c +index 92cc2fdf..69139eee 100644 +--- a/drivers/media/platform/tegra/camera/sensor_common.c ++++ b/drivers/media/platform/tegra/camera/sensor_common.c +@@ -267,6 +267,10 @@ static int extract_pixel_format( + *format = V4L2_PIX_FMT_UYVY; + else if (strncmp(pixel_t, "yuv_vyuy16", size) == 0) + *format = V4L2_PIX_FMT_VYUY; ++ else if (strncmp(pixel_t, "grey_y8", size) == 0) ++ *format = V4L2_PIX_FMT_GREY; ++ else if (strncmp(pixel_t, "grey_y16", size) == 0) ++ *format = V4L2_PIX_FMT_Y16; + else { + pr_err("%s: Need to extend format%s\n", __func__, pixel_t); + return -EINVAL; +diff --git a/drivers/media/platform/tegra/camera/vi/channel.c b/drivers/media/platform/tegra/camera/vi/channel.c +index 91f8d5f8..d9be2677 100644 +--- a/drivers/media/platform/tegra/camera/vi/channel.c ++++ b/drivers/media/platform/tegra/camera/vi/channel.c +@@ -202,7 +202,12 @@ static void tegra_channel_fmt_align(struct tegra_channel *chan, + * different. Aligned width also may force a sensor mode change other + * than the requested one + */ +- *height = clamp(*height, TEGRA_MIN_HEIGHT, TEGRA_MAX_HEIGHT); ++ /* For D4XX IMU, the total size of one frame is 32 while the width:height ++ * should be set to 32:1. Therefore, ignored the clamping on height here by ++ * replacing TEGRA_MIN_HEIGHT with 1U ((unsigned int) 1). ++ */ ++ *height = clamp(*height, 1U /*TEGRA_MIN_HEIGHT*/, TEGRA_MAX_HEIGHT); ++ + + /* Clamp the requested bytes per line value. If the maximum bytes per + * line value is zero, the module doesn't support user configurable line +@@ -1027,7 +1032,8 @@ tegra_channel_querycap(struct file *file, void *fh, struct v4l2_capability *cap) + + cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; + cap->device_caps |= V4L2_CAP_EXT_PIX_FORMAT; +- cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; ++ cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS | ++ V4L2_CAP_META_CAPTURE; + + len = strscpy(cap->driver, "tegra-video", sizeof(cap->driver)); + if (len < 0) +@@ -2224,6 +2230,66 @@ static long tegra_channel_default_ioctl(struct file *file, void *fh, + return v4l2_g_parm_cap(chan->video, sd, a); + } + ++static int ++__tegra_channel_get_parm(struct tegra_channel *chan, ++ struct v4l2_streamparm *a) ++{ ++ struct v4l2_subdev *sd = chan->subdev_on_csi; ++ int ret = 0; ++ struct v4l2_subdev_frame_interval interval; ++ ++ struct v4l2_subdev_pad_config pad_cfg; ++ struct v4l2_subdev_state state = {.pads = &pad_cfg}; ++ /* dmipx: fixing G_PARM EINVAL error */ ++ ret = v4l2_subdev_call(sd, pad, get_frame_interval, &state, &interval); ++ // ret = sd->ops->pad->get_frame_interval(sd, &state, &interval); ++ ++ a->parm.capture.timeperframe.numerator = interval.interval.numerator; ++ a->parm.capture.timeperframe.denominator = interval.interval.denominator; ++ ++ return ret; ++} ++ ++static int tegra_channel_get_parm(struct file *file, void *fh, struct v4l2_streamparm *a) ++{ ++ struct tegra_channel *chan = video_drvdata(file); ++ ++ a->parm.capture.timeperframe.numerator = 1; ++ a->parm.capture.timeperframe.denominator = 12; ++ ++ return __tegra_channel_get_parm(chan, a); ++} ++ ++static int ++__tegra_channel_set_parm(struct tegra_channel *chan, ++ struct v4l2_streamparm *a) ++{ ++ struct v4l2_subdev *sd = chan->subdev_on_csi; ++ int ret = 0; ++ ++ struct v4l2_subdev_pad_config pad_cfg; ++ struct v4l2_subdev_state state = {.pads = &pad_cfg}; ++ struct v4l2_subdev_frame_interval interval; ++ interval.pad = 1; ++ interval.interval.numerator = a->parm.capture.timeperframe.numerator; ++ interval.interval.denominator = a->parm.capture.timeperframe.denominator; ++ ++ ret = v4l2_subdev_call(sd, pad, set_frame_interval, &state, &interval); ++ if (ret == -ENOIOCTLCMD) ++ return -ENOTTY; ++ ++ return ret; ++} ++static int tegra_channel_set_parm(struct file *file, void *fh, struct v4l2_streamparm *a) ++{ ++ struct tegra_channel *chan = video_drvdata(file); ++ ++ if (vb2_is_busy(&chan->queue)) ++ return -EBUSY; ++ ++ return __tegra_channel_set_parm(chan, a); ++} ++ + static const struct v4l2_ioctl_ops tegra_channel_ioctl_ops = { + .vidioc_querycap = tegra_channel_querycap, + .vidioc_enum_framesizes = tegra_channel_enum_framesizes, +@@ -2255,6 +2317,9 @@ static const struct v4l2_ioctl_ops tegra_channel_ioctl_ops = { + .vidioc_s_input = tegra_channel_s_input, + .vidioc_log_status = tegra_channel_log_status, + .vidioc_default = tegra_channel_default_ioctl, ++ .vidioc_g_parm = tegra_channel_get_parm, ++ .vidioc_s_parm = tegra_channel_set_parm, ++ + }; + + static int tegra_channel_close(struct file *fp); +@@ -2470,6 +2535,331 @@ static int tegra_channel_csi_init(struct tegra_channel *chan) + return ret; + } + ++static int tegra_metadata_open(struct file *fp) ++{ ++ struct video_device *vdev = video_devdata(fp); ++ struct tegra_channel *chan = video_get_drvdata(vdev); ++ int ret; ++ ++ mutex_lock(&chan->embedded.lock); ++ ret = v4l2_fh_open(fp); ++ mutex_unlock(&chan->embedded.lock); ++ ++ return ret; ++} ++ ++static int tegra_metadata_close(struct file *fp) ++{ ++ struct video_device *vdev = video_devdata(fp); ++ struct tegra_channel *chan = video_get_drvdata(vdev); ++ int ret = _vb2_fop_release(fp, &chan->embedded.lock); ++ ++ return ret; ++} ++ ++static const struct v4l2_file_operations tegra_metadata_fops = { ++ .owner = THIS_MODULE, ++ .unlocked_ioctl = video_ioctl2, ++ .open = tegra_metadata_open, ++ .release = tegra_metadata_close, ++ .read = vb2_fop_read, ++ .poll = vb2_fop_poll, ++ .mmap = vb2_fop_mmap, ++}; ++ ++static int tegra_metadata_querycap(struct file *file, void *fh, ++ struct v4l2_capability *cap) ++{ ++ struct v4l2_fh *vfh = file->private_data; ++ struct tegra_channel *chan = video_drvdata(file); ++ ++ /* FIXME: why do Device Caps show V4L2_CAP_EXT_PIX_FORMAT? */ ++ cap->device_caps = V4L2_CAP_META_CAPTURE | V4L2_CAP_STREAMING; ++ cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS | ++ V4L2_CAP_EXT_PIX_FORMAT | V4L2_CAP_VIDEO_CAPTURE; ++ ++ strscpy(cap->driver, "tegra-embedded", sizeof(cap->driver)); ++ strscpy(cap->card, vfh->vdev->name, sizeof(cap->card)); ++ snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s:%u", ++ dev_name(chan->vi->dev), chan->port[0]); ++ ++ return 0; ++} ++ ++static int tegra_metadata_enum_format(struct file *file, void *fh, ++ struct v4l2_fmtdesc *f) ++{ ++ if (f->index) ++ return -EINVAL; ++ ++ f->pixelformat = V4L2_META_FMT_D4XX; ++ strscpy(f->description, "D4XX metadata format", sizeof(f->description)); ++ ++ return 0; ++} ++ ++static int tegra_metadata_get_format(struct file *file, void *fh, ++ struct v4l2_format *format) ++{ ++ struct v4l2_fh *vfh = file->private_data; ++ struct v4l2_meta_format *fmt = &format->fmt.meta; ++ ++ if (format->type != vfh->vdev->queue->type) ++ return -EINVAL; ++ ++ memset(fmt, 0, sizeof(*fmt)); ++ ++ fmt->dataformat = V4L2_META_FMT_D4XX; ++ fmt->buffersize = 255; ++ ++ return 0; ++} ++static int tegra_metadata_set_format(struct file *file, void *fh, ++ struct v4l2_format *format) ++{ ++ return 0; ++} ++ ++static int tegra_metadata_try_format(struct file *file, void *fh, ++ struct v4l2_format *format) ++{ ++ return 0; ++} ++static const struct v4l2_ioctl_ops tegra_metadata_ioctl_ops = { ++ .vidioc_querycap = tegra_metadata_querycap, ++ .vidioc_enum_fmt_meta_cap = tegra_metadata_enum_format, ++ .vidioc_g_fmt_meta_cap = tegra_metadata_get_format, ++ .vidioc_s_fmt_meta_cap = tegra_metadata_set_format, ++ .vidioc_try_fmt_meta_cap = tegra_metadata_try_format, ++ .vidioc_reqbufs = vb2_ioctl_reqbufs, ++ .vidioc_querybuf = vb2_ioctl_querybuf, ++ .vidioc_qbuf = vb2_ioctl_qbuf, ++ .vidioc_dqbuf = vb2_ioctl_dqbuf, ++ .vidioc_create_bufs = vb2_ioctl_create_bufs, ++ .vidioc_expbuf = vb2_ioctl_expbuf, ++ .vidioc_streamon = vb2_ioctl_streamon, ++ .vidioc_streamoff = vb2_ioctl_streamoff, ++}; ++ ++static int tegra_metadata_queue_setup(struct vb2_queue *vq, ++ unsigned int *nbuffers, unsigned int *nplanes, ++ unsigned int sizes[], struct device *alloc_devs[]) ++{ ++ struct tegra_channel *chan = vb2_get_drv_priv(vq); ++ ++ if (*nplanes) { ++ if (*nplanes != 1) ++ return -EINVAL; ++ ++ if (sizes[0] < 255) ++ return -EINVAL; ++ ++ return 0; ++ } ++ ++ *nplanes = 1; ++ sizes[0] = 255; ++ alloc_devs[0] = chan->vi->dev; ++ ++ ++ return 0; ++} ++ ++static int tegra_metadata_buffer_prepare(struct vb2_buffer *vb) ++{ ++ if (vb->num_planes != 1) ++ return -EINVAL; ++ ++ if (vb2_plane_size(vb, 0) < 255) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static void tegra_metadata_buffer_queue(struct vb2_buffer *vb) ++{ ++ struct tegra_channel *chan = vb2_get_drv_priv(vb->vb2_queue); ++ ++ spin_lock(&chan->embedded.spin_lock); ++ if (chan->embedded.num_buffers < 16) { ++ chan->embedded.buffers[chan->embedded.head] = vb; ++ chan->embedded.head++; ++ if (chan->embedded.head > 15) ++ chan->embedded.head = chan->embedded.head - 16; ++ chan->embedded.num_buffers++; ++ } ++ spin_unlock(&chan->embedded.spin_lock); ++} ++ ++static int tegra_metadata_start_streaming(struct vb2_queue *vq, unsigned int count) ++{ ++ return 0; ++} ++ ++static void tegra_metadata_stop_streaming(struct vb2_queue *vq) ++{ ++ struct tegra_channel *chan = vb2_get_drv_priv(vq); ++ int i = 0; ++ ++ spin_lock(&chan->embedded.spin_lock); ++ for (i = 0; i < chan->embedded.num_buffers; i++) { ++ struct vb2_buffer *evb; ++ evb = chan->embedded.buffers[chan->embedded.tail]; ++ chan->embedded.buffers[chan->embedded.tail] = NULL; ++ chan->embedded.tail++; ++ if (chan->embedded.tail > 15) ++ chan->embedded.tail = chan->embedded.tail - 16; ++ vb2_buffer_done(evb, VB2_BUF_STATE_ERROR); ++ } ++ spin_unlock(&chan->embedded.spin_lock); ++ ++ chan->embedded.head = 0; ++ chan->embedded.tail = 0;; ++ chan->embedded.num_buffers = 0; ++} ++ ++static const struct vb2_ops tegra_metadata_qops = { ++ .queue_setup = tegra_metadata_queue_setup, ++ .buf_prepare = tegra_metadata_buffer_prepare, ++ .buf_queue = tegra_metadata_buffer_queue, ++ .wait_prepare = vb2_ops_wait_prepare, ++ .wait_finish = vb2_ops_wait_finish, ++ .start_streaming = tegra_metadata_start_streaming, ++ .stop_streaming = tegra_metadata_stop_streaming, ++}; ++ ++int tegra_channel_init_video_embedded(struct tegra_channel *chan) ++{ ++ struct video_device *video; ++ struct vb2_queue *queue = &chan->embedded.queue; ++ struct tegra_mc_vi *vi = chan->vi; ++ int ret; ++ ++ mutex_init(&chan->embedded.lock); ++ spin_lock_init(&chan->embedded.spin_lock); ++ ++ video = chan->embedded.video = video_device_alloc(); ++ chan->embedded.pad.flags = MEDIA_PAD_FL_SINK; ++ ++ ret = tegra_media_entity_init(&video->entity, 1, ++ &chan->embedded.pad, false, false); ++ if (ret < 0) { ++ video_device_release(video); ++ dev_err(vi->dev, "%s(): metadata entity init: %d\n", ++ __func__, ret); ++ return ret; ++ } ++ ++ ret = v4l2_ctrl_handler_init(&chan->embedded.ctrl_handler, ++ MAX_CID_CONTROLS); ++ if (chan->embedded.ctrl_handler.error) { ++ dev_err(&video->dev, "failed to init control handler\n"); ++ return ret; ++ } ++ ++ video->fops = &tegra_metadata_fops; ++ video->v4l2_dev = &vi->v4l2_dev; ++ video->queue = queue; ++ snprintf(video->name, sizeof(video->name), "%s-metadata-%u", ++ dev_name(vi->dev), chan->port[0]); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0) ++ video->vfl_type = VFL_TYPE_GRABBER; ++#else ++ video->vfl_type = VFL_TYPE_VIDEO; ++ video->device_caps = V4L2_CAP_META_CAPTURE | V4L2_CAP_STREAMING; ++#endif ++ video->vfl_dir = VFL_DIR_RX; ++ video->release = video_device_release_empty; ++ video->ioctl_ops = &tegra_metadata_ioctl_ops; ++ video->ctrl_handler = &chan->embedded.ctrl_handler; ++ video->lock = &chan->embedded.lock; ++ ++ video_set_drvdata(video, chan); ++ ++#if defined(CONFIG_VIDEOBUF2_DMA_CONTIG) ++ /* get the buffers queue... */ ++ ret = tegra_vb2_dma_init(vi->dev, &chan->embedded.alloc_ctx, ++ SZ_64K, &vi->vb2_dma_alloc_refcnt); ++ if (ret < 0) ++ goto ctx_alloc_error; ++ ++#endif ++//#if defined(CONFIG_VIDEOBUF2_DMA_CONTIG) ++ /* get the buffers queue... */ ++// chan->embedded.alloc_ctx = vb2_dma_contig_init_ctx(vi->dev); ++// if (IS_ERR(chan->embedded.alloc_ctx)) { ++// dev_err(vi->dev, "%s(): vb2 buffer init: %ld\n", __func__, ++// PTR_ERR(chan->embedded.alloc_ctx)); ++// goto ctx_alloc_error; ++// } ++//#endif ++ ++ queue->type = V4L2_BUF_TYPE_META_CAPTURE; ++ queue->io_modes = VB2_MMAP | VB2_DMABUF | VB2_READ | VB2_USERPTR; ++ queue->lock = &chan->embedded.lock; ++ queue->drv_priv = chan; ++ queue->buf_struct_size = sizeof(struct tegra_channel_buffer); ++ queue->ops = &tegra_metadata_qops; ++#if defined(CONFIG_VIDEOBUF2_DMA_CONTIG) ++ queue->mem_ops = &vb2_dma_contig_memops; ++#endif ++ queue->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC | ++ V4L2_BUF_FLAG_TSTAMP_SRC_EOF; ++ ret = vb2_queue_init(queue); ++ if (ret < 0) { ++ dev_err(vi->dev, "%s(): metadata queue initialize: %d\n", ++ __func__, ret); ++ goto vb2_queue_error; ++ } ++ ++ return 0; ++ ++vb2_queue_error: ++#if defined(CONFIG_VIDEOBUF2_DMA_CONTIG) ++ tegra_vb2_dma_cleanup(vi->dev, chan->embedded.alloc_ctx, ++ &vi->vb2_dma_alloc_refcnt); ++ctx_alloc_error: ++#endif ++ media_entity_cleanup(&video->entity); ++ ++ return ret; ++} ++ ++int tegra_channel_cleanup_video_embedded(struct tegra_channel *chan) ++{ ++ struct video_device *video = chan->embedded.video; ++ struct vb2_queue *queue = &chan->embedded.queue; ++ struct device *vi_unit_dev = tegra_channel_get_vi_unit(chan); ++ ++ if (!video) ++ return -EINVAL; ++ ++ video_unregister_device(video); ++ ++ /* release embedded data buffer */ ++ if (chan->emb_buf_size > 0) { ++ dma_free_coherent(vi_unit_dev, ++ chan->emb_buf_size, ++ chan->emb_buf_addr, chan->emb_buf); ++ chan->emb_buf_size = 0; ++ vb2_queue_release(queue); ++#if defined(CONFIG_VIDEOBUF2_DMA_CONTIG) ++ tegra_vb2_dma_cleanup(vi_unit_dev, chan->embedded.alloc_ctx, ++ &chan->vi->vb2_dma_alloc_refcnt); ++#endif ++ } ++ ++ v4l2_ctrl_handler_free(&chan->embedded.ctrl_handler); ++ ++#if defined(CONFIG_MEDIA_CONTROLLER) ++ media_entity_cleanup(&video->entity); ++#endif ++ ++ video_device_release(video); ++ ++ return 0; ++} ++ + int tegra_channel_init_video(struct tegra_channel *chan) + { + struct tegra_mc_vi *vi = chan->vi; +@@ -2656,6 +3046,13 @@ int tegra_channel_cleanup(struct tegra_channel *chan) + chan->emb_buf_size, + chan->emb_buf_addr, chan->emb_buf); + chan->emb_buf_size = 0; ++ vb2_queue_release(&chan->embedded.queue); ++#if IS_ENABLED(CONFIG_VIDEOBUF2_DMA_CONTIG) ++ tegra_vb2_dma_cleanup(vi_unit_dev, chan->embedded.alloc_ctx, ++ &chan->vi->vb2_dma_alloc_refcnt); ++ //vb2_dma_contig_cleanup_ctx(chan->embedded.alloc_ctx); ++#endif ++ media_entity_cleanup(&chan->embedded.video->entity); + } + + tegra_channel_dealloc_buffer_queue(chan); +diff --git a/drivers/media/platform/tegra/camera/vi/graph.c b/drivers/media/platform/tegra/camera/vi/graph.c +index 7c2d05e7..5e25cf6a 100644 +--- a/drivers/media/platform/tegra/camera/vi/graph.c ++++ b/drivers/media/platform/tegra/camera/vi/graph.c +@@ -292,6 +292,11 @@ static int tegra_vi_graph_notify_complete(struct v4l2_async_notifier *notifier) + struct tegra_channel *chan = + container_of(notifier, struct tegra_channel, notifier); + struct tegra_vi_graph_entity *entity; ++ struct camera_common_data *s_data; ++ struct device_node *node; ++ struct sensor_mode_properties *sensor_mode = NULL; ++ int idx; ++ + int ret; + + dev_dbg(chan->vi->dev, "notify complete, all subdevs registered\n"); +@@ -325,16 +330,46 @@ static int tegra_vi_graph_notify_complete(struct v4l2_async_notifier *notifier) + if (ret < 0) + goto graph_error; + ++ /* Init embedded channel only if embedded is set in DT*/ ++ s_data = to_camera_common_data(chan->subdev_on_csi->dev); ++ node = chan->subdev_on_csi->dev->of_node; ++ if (s_data && node) { ++ idx = s_data->mode_prop_idx; ++ if (idx < s_data->sensor_props.num_modes) ++ sensor_mode = &s_data->sensor_props.sensor_modes[idx]; ++ } ++ ++ if (sensor_mode && ++ sensor_mode->image_properties.embedded_metadata_height > 0) { ++ ret = tegra_channel_init_video_embedded(chan); ++ if (ret < 0) { ++ dev_err(chan->vi->dev, ++ "failed to initialize embedded channel\n"); ++ goto register_embedded_device_error; ++ } ++ ret = video_register_device(chan->embedded.video, VFL_TYPE_VIDEO, -1); ++ if (ret < 0) { ++ dev_err(&chan->video->dev, "failed to register embedded %s: %d\n", ++ chan->embedded.video->name, ret); ++ goto register_embedded_device_error; ++ } ++ } ++ ++ + ret = v4l2_device_register_subdev_nodes(&chan->vi->v4l2_dev); + if (ret < 0) { + dev_err(chan->vi->dev, "failed to register subdev nodes\n"); +- goto graph_error; ++ goto register_nodes_error; + } + + chan->link_status++; + + return 0; + ++register_nodes_error: ++ video_unregister_device(chan->embedded.video); ++register_embedded_device_error: ++ tegra_vi_graph_remove_links(chan); + graph_error: + video_unregister_device(chan->video); + register_device_error: +@@ -398,6 +433,7 @@ static void tegra_vi_graph_notify_unbind(struct v4l2_async_notifier *notifier, + + /* cleanup for complete */ + if (chan->link_status) { ++ tegra_channel_cleanup_video_embedded(chan); + tegra_vi_graph_remove_links(chan); + tegra_channel_cleanup_video(chan); + chan->link_status--; +diff --git a/drivers/media/platform/tegra/camera/vi/mc_common.c b/drivers/media/platform/tegra/camera/vi/mc_common.c +index ae6b4927..6288d712 100644 +--- a/drivers/media/platform/tegra/camera/vi/mc_common.c ++++ b/drivers/media/platform/tegra/camera/vi/mc_common.c +@@ -164,6 +164,10 @@ static int vi_parse_dt(struct tegra_mc_vi *vi, struct platform_device *dev) + struct device_node *port; + int value = 0xFF; + int ret = 0; ++ struct device_node *dser_node = NULL; ++ struct i2c_client *dser_i2c = NULL; ++ struct device_node *ser_node = NULL; ++ struct i2c_client *ser_i2c = NULL; + + err = of_property_read_u32(node, "num-channels", &num_channels); + if (err) { +@@ -173,6 +177,29 @@ static int vi_parse_dt(struct tegra_mc_vi *vi, struct platform_device *dev) + } + vi->num_channels = num_channels; + ++ vi->dser_dev = NULL; ++ dser_node = of_parse_phandle(node, "nvidia,gmsl-dser-device", 0); ++ if (dser_node) { ++ dser_i2c = of_find_i2c_device_by_node(dser_node); ++ of_node_put(dser_node); ++ if (dser_i2c) { ++ dev_info(&dev->dev, "dser_i2c->addr 0x%x", dser_i2c->addr); ++ vi->dser_dev = &dser_i2c->dev; ++ } ++ } ++ ++ vi->ser_dev = NULL; ++ ser_node = of_parse_phandle(node, "nvidia,gmsl-ser-device", 0); ++ if (ser_node) { ++ ser_i2c = of_find_i2c_device_by_node(ser_node); ++ of_node_put(ser_node); ++ if (ser_i2c) { ++ dev_info(&dev->dev, "ser_i2c->addr 0x%x", ser_i2c->addr); ++ vi->ser_dev = &ser_i2c->dev; ++ } ++ } ++ ++ vi->num_channels = num_channels; + ports = of_get_child_by_name(node, "ports"); + if (ports == NULL) + ports = node; +diff --git a/drivers/media/platform/tegra/camera/vi/vi5_fops.c b/drivers/media/platform/tegra/camera/vi/vi5_fops.c +index 7b16dcaf..487ae44b 100644 +--- a/drivers/media/platform/tegra/camera/vi/vi5_fops.c ++++ b/drivers/media/platform/tegra/camera/vi/vi5_fops.c +@@ -426,6 +426,39 @@ static void vi5_setup_surface(struct tegra_channel *chan, + chan->capture_descr_sequence += 1; + } + ++static void vi5_release_metadata_buffer(struct tegra_channel *chan, ++ struct vb2_v4l2_buffer *vbuf) ++{ ++ struct vb2_buffer *evb = NULL; ++ struct vb2_v4l2_buffer *evbuf; ++ void* frm_buffer; ++ ++ spin_lock(&chan->embedded.spin_lock); ++ if (0 < chan->embedded.num_buffers) { ++ evb = chan->embedded.buffers[chan->embedded.tail]; ++ chan->embedded.buffers[chan->embedded.tail] = NULL; ++ chan->embedded.tail++; ++ if (chan->embedded.tail > 15) ++ chan->embedded.tail = chan->embedded.tail - 16; ++ chan->embedded.num_buffers--; ++ } ++ spin_unlock(&chan->embedded.spin_lock); ++ ++ if (!evb) ++ return; ++ ++ frm_buffer = vb2_plane_vaddr(evb, 0); ++ if (!frm_buffer) ++ return; ++ ++ memcpy(frm_buffer, chan->emb_buf_addr, 255); ++ evbuf = to_vb2_v4l2_buffer(evb); ++ evbuf->sequence = vbuf->sequence; ++ vb2_set_plane_payload(evb, 0, 68); ++ evb->timestamp = vbuf->vb2_buf.timestamp; ++ vb2_buffer_done(evb, VB2_BUF_STATE_DONE); ++} ++ + static void vi5_release_buffer(struct tegra_channel *chan, + struct tegra_channel_buffer *buf) + { +@@ -436,6 +469,9 @@ static void vi5_release_buffer(struct tegra_channel *chan, + vb2_set_plane_payload(&vbuf->vb2_buf, 0, chan->format.sizeimage); + + vb2_buffer_done(&vbuf->vb2_buf, buf->vb2_state); ++ ++ if (chan->embedded_data_height == 1 && buf->vb2_state == VB2_BUF_STATE_DONE) ++ vi5_release_metadata_buffer(chan, vbuf); + } + + static void vi5_capture_enqueue(struct tegra_channel *chan, +diff --git a/drivers/media/platform/tegra/camera/vi/vi5_formats.h b/drivers/media/platform/tegra/camera/vi/vi5_formats.h +index 1d0c1133..1d375de5 100644 +--- a/drivers/media/platform/tegra/camera/vi/vi5_formats.h ++++ b/drivers/media/platform/tegra/camera/vi/vi5_formats.h +@@ -82,6 +82,8 @@ static const struct tegra_video_format vi5_video_formats[] = { + /* RAW 7: TODO */ + + /* RAW 8 */ ++ TEGRA_VIDEO_FORMAT(RAW8, 8, Y8_1X8, 1, 1, T_R8, ++ RAW8, GREY, "Greyscale 8"), + TEGRA_VIDEO_FORMAT(RAW8, 8, SRGGB8_1X8, 1, 1, T_R8, + RAW8, SRGGB8, "RGRG.. GBGB.."), + TEGRA_VIDEO_FORMAT(RAW8, 8, SGRBG8_1X8, 1, 1, T_R8, +@@ -112,22 +114,22 @@ static const struct tegra_video_format vi5_video_formats[] = { + RAW16, SBGGR16, "BGBG.. GRGR.."), + + /* RGB888 */ +- TEGRA_VIDEO_FORMAT(RGB888, 24, RGB888_1X24, 4, 1, T_A8R8G8B8, +- RGB888, RGBA32, "RGBA-8-8-8-8"), ++ // TEGRA_VIDEO_FORMAT(RGB888, 24, RGB888_1X24, 4, 1, T_A8R8G8B8, ++ // RGB888, RGBA32, "RGBA-8-8-8-8"), + TEGRA_VIDEO_FORMAT(RGB888, 24, RGB888_1X32_PADHI, 4, 1, T_A8B8G8R8, + RGB888, RGB32, "RGB-8-8-8-8"), + + /* YUV422 */ +- TEGRA_VIDEO_FORMAT(YUV422, 16, UYVY8_1X16, 2, 1, T_U8_Y8__V8_Y8, +- YUV422_8, UYVY, "YUV 4:2:2"), +- TEGRA_VIDEO_FORMAT(YUV422, 16, VYUY8_1X16, 2, 1, T_V8_Y8__U8_Y8, +- YUV422_8, VYUY, "YUV 4:2:2"), ++ // TEGRA_VIDEO_FORMAT(YUV422, 16, UYVY8_1X16, 2, 1, T_U8_Y8__V8_Y8, ++ // YUV422_8, UYVY, "YUV 4:2:2"), ++ // TEGRA_VIDEO_FORMAT(YUV422, 16, VYUY8_1X16, 2, 1, T_V8_Y8__U8_Y8, ++ // YUV422_8, VYUY, "YUV 4:2:2"), + TEGRA_VIDEO_FORMAT(YUV422, 16, YUYV8_1X16, 2, 1, T_Y8_U8__Y8_V8, + YUV422_8, YUYV, "YUV 4:2:2"), + TEGRA_VIDEO_FORMAT(YUV422, 16, YVYU8_1X16, 2, 1, T_Y8_V8__Y8_U8, + YUV422_8, YVYU, "YUV 4:2:2"), +- TEGRA_VIDEO_FORMAT(YUV422, 16, UYVY8_1X16, 1, 1, T_Y8__V8U8_N422, +- YUV422_8, NV16, "NV16"), ++ // TEGRA_VIDEO_FORMAT(YUV422, 16, UYVY8_1X16, 1, 1, T_Y8__V8U8_N422, ++ // YUV422_8, NV16, "NV16"), + TEGRA_VIDEO_FORMAT(YUV422, 16, UYVY8_2X8, 2, 1, T_U8_Y8__V8_Y8, + YUV422_8, UYVY, "YUV 4:2:2 UYVY"), + TEGRA_VIDEO_FORMAT(YUV422, 16, VYUY8_2X8, 2, 1, T_V8_Y8__U8_Y8, +@@ -136,6 +138,18 @@ static const struct tegra_video_format vi5_video_formats[] = { + YUV422_8, YUYV, "YUV 4:2:2 YUYV"), + TEGRA_VIDEO_FORMAT(YUV422, 16, YVYU8_2X8, 2, 1, T_Y8_V8__Y8_U8, + YUV422_8, YVYU, "YUV 4:2:2 YVYU"), ++ ++ TEGRA_VIDEO_FORMAT(YUV422, 16, UYVY8_1X16, 2, 1, T_U8_Y8__V8_Y8, ++ YUV422_8, Z16, "Depth 16"), ++ TEGRA_VIDEO_FORMAT(YUV422, 16, VYUY8_1X16, 2, 1, T_V8_Y8__U8_Y8, ++ YUV422_8, Y8I, "Y8I 16"), ++ // TODO: RealSesne calibration format Y12I should be 3-byte, ++ // R[7:3]R[3:0] | L[3:0]R[11:8] | L[11:8]L[7:4] ++ // but, currently, it's 4-byte, one byte is added as alignment ++ // R[7:3]R[3:0] | L[3:0]R[11:8] | L[11:8]L[7:4] | ALIGN[7:0] ++ TEGRA_VIDEO_FORMAT(RGB888, 24, RGB888_1X24, 4, 1, T_A8R8G8B8, ++ RGB888, Y12I, "Y12I 24"), ++ + }; + + #endif +diff --git a/include/media/gmsl-link.h b/include/media/gmsl-link.h +index ad902d0a..7dce2356 100644 +--- a/include/media/gmsl-link.h ++++ b/include/media/gmsl-link.h +@@ -40,6 +40,9 @@ + #define GMSL_CSI_DT_RAW_12 0x2C + #define GMSL_CSI_DT_UED_U1 0x30 + #define GMSL_CSI_DT_EMBED 0x12 ++#define GMSL_CSI_DT_YUV422_8 0x1E ++#define GMSL_CSI_DT_RGB_888 0x24 ++#define GMSL_CSI_DT_RAW_8 0x2A + + #define GMSL_ST_ID_UNUSED 0xFF + +diff --git a/include/media/max9295.h b/include/media/max9295.h +index bf801aa2..c576e3e5 100644 +--- a/include/media/max9295.h ++++ b/include/media/max9295.h +@@ -12,6 +12,7 @@ + #ifndef __MAX9295_H__ + #define __MAX9295_H__ + ++#include + #include + /** + * \defgroup max9295 MAX9295 serializer driver +@@ -22,6 +23,8 @@ + * @{ + */ + ++int max9295_set_pipe(struct device *dev, int pipe_id, u8 data_type1, ++ u8 data_type2, u32 vc_id); + + /** + * @brief Powers on a serializer device and performs the I2C overrides +@@ -82,6 +85,7 @@ int max9295_sdev_unpair(struct device *dev, struct device *s_dev); + */ + int max9295_setup_streaming(struct device *dev); + ++int max9295_init_settings(struct device *dev); + /** @} */ + + #endif /* __MAX9295_H__ */ +diff --git a/include/media/max9296.h b/include/media/max9296.h +index 210dbc80..6b4c796e 100644 +--- a/include/media/max9296.h ++++ b/include/media/max9296.h +@@ -12,6 +12,7 @@ + #ifndef __MAX9296_H__ + #define __MAX9296_H__ + ++#include + #include + /** + * \defgroup max9296 MAX9296 deserializer driver +@@ -22,6 +23,12 @@ + * @{ + */ + ++int max9296_get_available_pipe_id(struct device *dev, int vc_id); ++int max9296_set_pipe(struct device *dev, int pipe_id, u8 data_type1, ++ u8 data_type2, u32 vc_id); ++int max9296_release_pipe(struct device *dev, int pipe_id); ++void max9296_reset_oneshot(struct device *dev); ++ + /** + * Puts a deserializer device in single exclusive link mode, so link-specific + * I2C overrides can be performed for sensor and serializer devices. +@@ -146,6 +153,7 @@ int max9296_power_on(struct device *dev); + */ + void max9296_power_off(struct device *dev); + ++int max9296_init_settings(struct device *dev); + /** @} */ + + #endif /* __MAX9296_H__ */ +diff --git a/include/media/mc_common.h b/include/media/mc_common.h +index 0408ba67..1252fb3f 100644 +--- a/include/media/mc_common.h ++++ b/include/media/mc_common.h +@@ -224,6 +224,23 @@ struct tegra_channel { + unsigned int embedded_data_width; + unsigned int embedded_data_height; + ++ struct { ++ struct video_device *video; ++ struct mutex lock; ++ spinlock_t spin_lock; ++ struct vb2_queue queue; ++ /*FIXME: 16 is max queued metadata buffers ++ * define 16 ++ */ ++ struct vb2_buffer *buffers[16]; ++ unsigned int head; ++ unsigned int tail; ++ unsigned int num_buffers; ++ void *alloc_ctx; ++ struct media_pad pad; ++ struct v4l2_ctrl_handler ctrl_handler; ++ } embedded; ++ + DECLARE_BITMAP(fmts_bitmap, MAX_FORMAT_NUM); + atomic_t power_on_refcnt; + struct v4l2_fh *fh; +@@ -304,6 +321,9 @@ struct tegra_mc_vi { + unsigned int num_channels; + unsigned int num_subdevs; + ++ struct device *dser_dev; ++ struct device *ser_dev; ++ + struct tegra_csi_device *csi; + struct list_head vi_chans; + struct tegra_channel *tpg_start; +@@ -400,7 +420,9 @@ struct tegra_channel_buffer *dequeue_inflight(struct tegra_channel *chan); + int tegra_channel_set_power(struct tegra_channel *chan, bool on); + + int tegra_channel_init_video(struct tegra_channel *chan); ++int tegra_channel_init_video_embedded(struct tegra_channel *chan); + int tegra_channel_cleanup_video(struct tegra_channel *chan); ++int tegra_channel_cleanup_video_embedded(struct tegra_channel *chan); + + struct tegra_vi_fops { + int (*vi_power_on)(struct tegra_channel *chan); +diff --git a/include/media/tegra_camera_core.h b/include/media/tegra_camera_core.h +index e6d9a2b1..38634b77 100644 +--- a/include/media/tegra_camera_core.h ++++ b/include/media/tegra_camera_core.h +@@ -18,7 +18,7 @@ + /* Width alignment */ + #define TEGRA_WIDTH_ALIGNMENT 1 + /* Stride alignment */ +-#define TEGRA_STRIDE_ALIGNMENT 1 ++#define TEGRA_STRIDE_ALIGNMENT 64 + /* Height alignment */ + #define TEGRA_HEIGHT_ALIGNMENT 1 + /* Size alignment */ +@@ -32,6 +32,8 @@ + #define TEGRA_IMAGE_FORMAT_DEF 32 + + enum tegra_image_dt { ++ TEGRA_IMAGE_DT_EMBEDDED_8 = 18, ++ + TEGRA_IMAGE_DT_YUV420_8 = 24, + TEGRA_IMAGE_DT_YUV420_10, + +@@ -51,6 +53,12 @@ enum tegra_image_dt { + TEGRA_IMAGE_DT_RAW12, + TEGRA_IMAGE_DT_RAW14, + TEGRA_IMAGE_DT_RAW16, ++ ++ TEGRA_IMAGE_DT_USER_1 = 48, ++ TEGRA_IMAGE_DT_USER_2, ++ TEGRA_IMAGE_DT_USER_3, ++ TEGRA_IMAGE_DT_USER_4, ++ + }; + + /* Supported CSI to VI Data Formats */ +-- +2.34.1 + diff --git a/nvidia-oot/7.1/0002-Adding-stream-restart-upon-capture-timeout.patch b/nvidia-oot/7.1/0002-Adding-stream-restart-upon-capture-timeout.patch new file mode 120000 index 00000000..4144614c --- /dev/null +++ b/nvidia-oot/7.1/0002-Adding-stream-restart-upon-capture-timeout.patch @@ -0,0 +1 @@ +../7.0/0002-Adding-stream-restart-upon-capture-timeout.patch \ No newline at end of file diff --git a/nvidia-oot/7.1/0003-Fix-y12i-calibration-stream.patch b/nvidia-oot/7.1/0003-Fix-y12i-calibration-stream.patch new file mode 120000 index 00000000..2257717b --- /dev/null +++ b/nvidia-oot/7.1/0003-Fix-y12i-calibration-stream.patch @@ -0,0 +1 @@ +../7.0/0003-Fix-y12i-calibration-stream.patch \ No newline at end of file diff --git a/nvidia-oot/7.1/0004-Add-GPIO-tunneling-for-the-external-sync-support.patch b/nvidia-oot/7.1/0004-Add-GPIO-tunneling-for-the-external-sync-support.patch new file mode 120000 index 00000000..2b9bb1f2 --- /dev/null +++ b/nvidia-oot/7.1/0004-Add-GPIO-tunneling-for-the-external-sync-support.patch @@ -0,0 +1 @@ +../7.0/0004-Add-GPIO-tunneling-for-the-external-sync-support.patch \ No newline at end of file diff --git a/nvidia-oot/7.1/0005-Adding-max96712-support-for-D4xx.patch b/nvidia-oot/7.1/0005-Adding-max96712-support-for-D4xx.patch new file mode 120000 index 00000000..28d80cc3 --- /dev/null +++ b/nvidia-oot/7.1/0005-Adding-max96712-support-for-D4xx.patch @@ -0,0 +1 @@ +../6.0/0005-Adding-max96712-support-for-D4xx.patch \ No newline at end of file diff --git a/nvidia-oot/Makefile b/nvidia-oot/Makefile index 5499ee71..b47f5a20 100644 --- a/nvidia-oot/Makefile +++ b/nvidia-oot/Makefile @@ -82,6 +82,8 @@ nvidia-oot: conftest hwpm srctree.nvidia-oot=$(MAKEFILE_DIR)/nvidia-oot \ srctree.hwpm=$(MAKEFILE_DIR)/hwpm \ srctree.nvconftest=$(NVIDIA_CONFTEST) \ + NV_OOT_IVC_EXT_SKIP_BUILD=y \ + NV_OOT_TEGRA_HV_SKIP_BUILD=y \ KBUILD_EXTRA_SYMBOLS=$(MAKEFILE_DIR)/hwpm/drivers/tegra/hwpm/Module.symvers \ $(MAKECMDGOALS) @@ -107,7 +109,6 @@ nvgpu: conftest nvidia-oot define display-cmd $(MAKE) -j $(NPROC) ARCH=arm64 TARGET_ARCH=aarch64 \ -C $(MAKEFILE_DIR)/nvdisplay \ - LOCALVERSION=$(version) \ NV_VERBOSE=0 \ KERNELRELEASE="" \ SYSSRC=$(NVIDIA_HEADERS) \ diff --git a/scripts/deploy_kernel.sh b/scripts/deploy_kernel.sh index f80642dc..01dcba28 100755 --- a/scripts/deploy_kernel.sh +++ b/scripts/deploy_kernel.sh @@ -8,7 +8,7 @@ if [ "$#" -eq 0 ] || [ "$1" == "-h" ] || [ "$1" == "--help" ]; then echo "Package kernel modules, optionally copy them to the TARGET, update boot files and reboot the TARGET." echo "" echo "Arguments:" - echo " JETPACK_VERSION JetPack version (e.g., 5.0.2, 5.1.2, 6.0, 6.1, 6.2, 6.2.1) - REQUIRED" + echo " JETPACK_VERSION JetPack version (e.g., 5.0.2, 5.1.2, 6.0, 6.1, 6.2, 6.2.1, 7.0, 7.1) - REQUIRED" echo " TARGET Target device hostname or IP address" echo " USERNAME SSH username for TARGET (default: administrator)" echo " REMOTE_PATH Remote path to copy files to (default: dev)" @@ -58,7 +58,7 @@ if [ "${JETPACK_VERSION}" = "5.0.2" ]; then cp "${IMG_DIR}/drivers/media/usb/uvc/uvcvideo.ko" "${DEST_DIR}/" 2>/dev/null || true cp "${IMG_DIR}/drivers/media/v4l2-core/videobuf-core.ko" "${DEST_DIR}/" 2>/dev/null || true cp "${IMG_DIR}/drivers/media/v4l2-core/videobuf-vmalloc.ko" "${DEST_DIR}/" 2>/dev/null || true -elif [ "${JETPACK_VERSION}" = "6.0" ] || [ "${JETPACK_VERSION}" = "6.1" ] || [ "${JETPACK_VERSION}" = "6.2" ] || [ "${JETPACK_VERSION}" = "6.2.1" ]; then +elif [ "${JETPACK_VERSION}" = "6.0" ] || [ "${JETPACK_VERSION}" = "6.1" ] || [ "${JETPACK_VERSION}" = "6.2" ] || [ "${JETPACK_VERSION}" = "6.2.1" ] || [ "${JETPACK_VERSION}" = "7.0" ] || [ "${JETPACK_VERSION}" = "7.1" ]; then echo "Packing ${DEST_DIR}/rootfs.tar.gz" tar czf ${DEST_DIR}/rootfs.tar.gz -C images/${JETPACK_VERSION}/rootfs boot lib fi diff --git a/scripts/install_to_kernel.sh b/scripts/install_to_kernel.sh index 80f571f4..546398e1 100644 --- a/scripts/install_to_kernel.sh +++ b/scripts/install_to_kernel.sh @@ -7,7 +7,7 @@ if [ "$#" -lt 1 ] || [ "$1" == "-h" ] || [ "$1" == "--help" ]; then echo "Update the kernel modules and boot files on the local device for a specific JetPack version." echo "" echo "Arguments:" - echo " JETPACK_VERSION JetPack version (e.g., 5.0.2, 5.1.2, 6.0, 6.1, 6.2, 6.2.1)" + echo " JETPACK_VERSION JetPack version (e.g., 5.0.2, 5.1.2, 6.0, 6.1, 6.2, 6.2.1, 7.0, 7.1)" echo " BOOT_FOLDER Folder name under /boot to copy Image (default: dev)" echo "" echo "Example:" @@ -41,7 +41,7 @@ if [ "${JETPACK_VERSION}" = "5.0.2" ]; then sudo cp videobuf-core.ko /lib/modules/$(uname -r)/updates/ echo "sudo cp videobuf-vmalloc.ko /lib/modules/$(uname -r)/updates/" sudo cp videobuf-vmalloc.ko /lib/modules/$(uname -r)/updates/ -elif [ "${JETPACK_VERSION}" = "6.0" ] || [ "${JETPACK_VERSION}" = "6.1" ] || [ "${JETPACK_VERSION}" = "6.2" ] || [ "${JETPACK_VERSION}" = "6.2.1" ]; then +elif [ "${JETPACK_VERSION}" = "6.0" ] || [ "${JETPACK_VERSION}" = "6.1" ] || [ "${JETPACK_VERSION}" = "6.2" ] || [ "${JETPACK_VERSION}" = "6.2.1" ] || [ "${JETPACK_VERSION}" = "7.0" ] || [ "${JETPACK_VERSION}" = "7.1" ]; then tar xf rootfs.tar.gz echo "sudo cp -r lib/modules/$(uname -r) /lib/modules/." sudo cp -r lib/modules/$(uname -r) /lib/modules/. diff --git a/scripts/setup-common b/scripts/setup-common old mode 100755 new mode 100644 index c2151391..deff9b6e --- a/scripts/setup-common +++ b/scripts/setup-common @@ -1,40 +1,80 @@ #!/bin/bash -export JETPACK_VERSION="$1" -export REVISION="35.1" -export L4T_VERSION=jetson_"${REVISION}" -export KERNEL_DIR="kernel/kernel-5.10" -export LICENSE=release +SUPPORTED_JP="7.1, 7.0, 6.2.1, 6.2, 6.1, 6.0, 5.1.2, 5.0.2, 4.6.1" -if [[ "$JETPACK_VERSION" =~ ^6\.[0-2](\.[0-9]+)?$ ]]; then +if [[ $1 == "-h" ]]; then + echo supported JetPack versions: ${SUPPORTED_JP} + exit 0 +fi + +JP_INPUT_VERSION="$1" +if [[ -z "${JP_INPUT_VERSION}" ]]; then + JP_INPUT_VERSION="${SUPPORTED_JP%%,*}" + if [[ -f "jetpack_version" ]]; then + JP_INPUT_VERSION="$(cat jetpack_version)" + fi +fi + +export JP_INPUT_VERSION +export JETPACK_VERSION="${JP_INPUT_VERSION}" +REVISION="35.1" +L4T_VERSION=jetson_"${REVISION}" +KERNEL_DIR="kernel/kernel-5.10" +LICENSE=release +export ARCH=arm64 +BUILD_SRCS="sources_${JP_INPUT_VERSION}" + +function version_lt { + IFS='.' read -r -a v1 <<< "$1" + IFS='.' read -r -a v2 <<< "$2" + for i in 0 1 2; do + [[ v1[i] -lt v2[i] ]] && return 0 + [[ v1[i] -gt v2[i] ]] && return 1 + done + return 1 +} + +echo "JetPack version ${JP_INPUT_VERSION}..." +if [[ "$JETPACK_VERSION" =~ ^7\.[0-1]$ ]]; then + if [[ $JETPACK_VERSION == "7.1" ]]; then + REVISION="38.4" + elif [[ $JETPACK_VERSION == "7.0" ]]; then + REVISION="38.2" + fi; + KERNEL_DIR="kernel/kernel-noble-src" + JETPACK_VERSION="7.x" + L4T_VERSION=jetson_"${REVISION}" +elif [[ "$JETPACK_VERSION" =~ ^6\.[0-2](\.[0-9]+)?$ ]]; then if [[ $JETPACK_VERSION == "6.2.1" ]]; then - REVISION="36.4.4" + REVISION="36.4.4" elif [[ $JETPACK_VERSION == "6.2" ]]; then - REVISION="36.4.3" + REVISION="36.4.3" elif [[ $JETPACK_VERSION == "6.1" ]]; then - REVISION="36.4" + REVISION="36.4" elif [[ $JETPACK_VERSION == "6.0" ]]; then - REVISION="36.3" + REVISION="36.3" fi; KERNEL_DIR="kernel/kernel-jammy-src" JETPACK_VERSION="6.x" - L4T_VERSION=jetson_"${REVISION}" + L4T_VERSION=jetson_"${REVISION}" elif [[ "$JETPACK_VERSION" =~ ^5.[0-1].2$ ]]; then if [[ $JETPACK_VERSION == "5.1.2" ]]; then - REVISION="35.4.1" + REVISION="35.4.1" elif [[ $JETPACK_VERSION == "5.0.2" ]]; then - REVISION="35.1" - LICENSE=Release + REVISION="35.1" + LICENSE=Release fi KERNEL_DIR="kernel/kernel-5.10" JETPACK_VERSION="5.x" - L4T_VERSION=jetson_"${REVISION}" + L4T_VERSION=jetson_"${REVISION}" elif [[ $JETPACK_VERSION == "4.6.1" ]]; then KERNEL_DIR="kernel/kernel-4.9" REVISION="32.7.1" L4T_VERSION="tegra-l4t-r${REVISION}" - LICENSE=T186 + LICENSE=T186 + JETPACK_VERSION="4.x" else - echo "Wrong JetPack version ($JETPACK_VERSION)! Only 6.2.1, 6.2, 6.1, 6.0, 5.1.2, 5.0.2 and 4.6.1 supported." + echo "Wrong JetPack version ($JETPACK_VERSION)! Supported version: ${SUPPORTED_JP}" exit 1 fi +echo "${JP_INPUT_VERSION}" > jetpack_version diff --git a/scripts/source_sync_4.6.1.sh b/scripts/source_sync_4.6.1.sh deleted file mode 100755 index 5b23ae49..00000000 --- a/scripts/source_sync_4.6.1.sh +++ /dev/null @@ -1,326 +0,0 @@ -#!/bin/bash -set -e - -# Copyright (c) 2012-2021 NVIDIA CORPORATION. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of NVIDIA CORPORATION nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -# -# This script sync's NVIDIA's version of -# 1. the kernel source -# 2. the u-boot source -# from nv-tegra, NVIDIA's public git repository. -# The script also provides opportunities to the sync to a specific tag -# so that the binaries shipped with a release can be replicated. -# -# Usage: -# By default it will download all the listed sources -# ./source_sync.sh -# Use the -t option to provide the TAG to be used to sync all the sources. -# Use the -k option to download only the kernel and device tree repos and optionally sync to TAG -# Use the -u option to download only the u-boot repo and optionally sync to TAG -# For detailed usage information run with -h option. -# - - -# verify that git is installed -if ! which git > /dev/null ; then - echo "ERROR: git is not installed. If your linux distro is 10.04 or later," - echo "git can be installed by 'sudo apt-get install git-core'." - exit 1 -fi - -# source dir -LDK_DIR=$(cd `dirname $0` && pwd) -LDK_DIR="${LDK_DIR}/sources" -# script name -SCRIPT_NAME=`basename $0` -# info about sources. -# NOTE: *Add only kernel repos here. Add new repos separately below. Keep related repos together* -SOURCE_INFO=" -k:kernel/kernel-4.9:nv-tegra.nvidia.com/linux-4.9.git: -k:kernel/nvgpu:nv-tegra.nvidia.com/linux-nvgpu.git: -k:kernel/nvidia:nv-tegra.nvidia.com/linux-nvidia.git: -k:hardware/nvidia/soc/t18x:nv-tegra.nvidia.com/device/hardware/nvidia/soc/t18x.git: -k:hardware/nvidia/platform/tegra/common:nv-tegra.nvidia.com/device/hardware/nvidia/platform/tegra/common.git: -k:hardware/nvidia/platform/t18x/common:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t18x/common.git: -k:hardware/nvidia/platform/t18x/quill:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t18x/quill.git: -k:hardware/nvidia/platform/t18x/lanai:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t18x/lanai.git: -k:hardware/nvidia/soc/t210:nv-tegra.nvidia.com/device/hardware/nvidia/soc/t210.git: -k:hardware/nvidia/platform/t210/common:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t210/common.git: -k:hardware/nvidia/platform/t210/jetson:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t210/jetson.git: -k:hardware/nvidia/platform/t210/porg:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t210/porg.git: -k:hardware/nvidia/platform/t210/batuu/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t210/batuu-dts.git: -k:hardware/nvidia/soc/t19x:nv-tegra.nvidia.com/device/hardware/nvidia/soc/t19x.git: -k:hardware/nvidia/platform/t19x/common:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/common.git: -k:hardware/nvidia/platform/t19x/galen/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/stardust-dts.git: -k:hardware/nvidia/platform/t19x/jakku/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/jakku-dts.git: -k:hardware/nvidia/platform/t19x/mccoy/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/mccoy-dts.git: -k:hardware/nvidia/platform/t19x/galen-industrial-dts/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/galen-industrial-dts.git: -k:hardware/nvidia/soc/tegra:nv-tegra.nvidia.com/device/hardware/nvidia/soc/tegra.git: -" -SOURCE_INFO+=" -u:u-boot:nv-tegra.nvidia.com/3rdparty/u-boot.git: -" - -# after processing SOURCE_INFO -NSOURCES=0 -declare -a SOURCE_INFO_PROCESSED -# download all? -DALL=1 - -function Usages { - local ScriptName=$1 - local LINE - local OP - local DESC - local PROCESSED=() - local i - - echo "Use: $1 [options]" - echo "Available general options are," - echo " -h : help" - echo " -d [DIR] : root of source is DIR" - echo " -t [TAG] : git tag that will be used to sync all the sources" - echo "" - echo "By default, all sources are downloaded." - echo "Only specified sources are downloaded, if one or more of the following options are mentioned." - echo "" - echo "$SOURCE_INFO" | while read LINE; do - if [ ! -z "$LINE" ]; then - OP=$(echo "$LINE" | cut -f 1 -d ':') - DESC=$(echo "$LINE" | cut -f 2 -d ':') - if [[ ! " ${PROCESSED[@]} " =~ " ${OP} " ]]; then - echo " -${OP} [TAG]: Download $DESC source and optionally sync to TAG" - PROCESSED+=("${OP}") - else - echo " and download $DESC source and sync to the same TAG" - fi - fi - done - echo "" -} - -function ProcessSwitch { - local SWITCH="$1" - local TAG="$2" - local i - local found=0 - - for ((i=0; i < NSOURCES; i++)); do - local OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - if [ "-${OP}" == "$SWITCH" ]; then - SOURCE_INFO_PROCESSED[i]="${SOURCE_INFO_PROCESSED[i]}${TAG}:y" - DALL=0 - found=1 - fi - done - - if [ "$found" == 1 ]; then - return 0 - fi - - echo "Terminating... wrong switch: ${SWITCH}" >&2 - Usages "$SCRIPT_NAME" - exit 1 -} - -function UpdateTags { - local SWITCH="$1" - local TAG="$2" - local i - - for ((i=0; i < NSOURCES; i++)); do - local OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - if [ "${OP}" == "$SWITCH" ]; then - SOURCE_INFO_PROCESSED[i]=$(echo "${SOURCE_INFO_PROCESSED[i]}" \ - | awk -F: -v OFS=: -v var="${TAG}" '{$4=var; print}') - fi - done -} - -function DownloadAndSync { - local WHAT_SOURCE="$1" - local LDK_SOURCE_DIR="$2" - local REPO_URL="$3" - local TAG="$4" - local OPT="$5" - - if [ -d "${LDK_SOURCE_DIR}" ]; then - echo "Directory for $WHAT, ${LDK_SOURCE_DIR}, already exists!" - if ! git -C $LDK_SOURCE_DIR status 2>&1 >/dev/null; then - echo "But the directory is not a git repository -- clean it up first" - echo "" - return 1 - fi - if ! git -C $LDK_SOURCE_DIR fetch --all 2>&1 >/dev/null; then - echo "$2 source sync failed" - return 2 - fi - else - echo "Downloading default $WHAT source..." - - if ! git clone -n "$REPO_URL" ${LDK_SOURCE_DIR} 2>&1 >/dev/null; then - echo "$2 source sync failed" - return 3 - fi - - echo "The default $WHAT source is downloaded in: ${LDK_SOURCE_DIR}" - fi - - if [ -z "$TAG" ]; then - echo "Please enter a tag to sync $2 source to" - echo -n "(enter nothing to skip): " - read TAG - TAG=$(echo $TAG) - UpdateTags $OPT $TAG - fi - - if [[ -n "$TAG" ]]; then - if [ -n $(git -C $LDK_SOURCE_DIR tag -l "^$TAG\$") ]; then - echo "Syncing up with tag $TAG..." - if git -C $LDK_SOURCE_DIR checkout -b mybranch_$(date +%Y-%m-%d-%s) $TAG; then - echo "$2 source sync'ed to tag $TAG successfully!" - else - echo "$2 could not sync to tag $TAG!" - echo - return 4 - fi - else - echo "Couldn't find tag $TAG" - echo "$2 source sync to tag $TAG failed!" - echo - return 5 - fi - fi - echo -} - -# prepare processing .... -GETOPT=":hd:t:" - -OIFS="$IFS" -IFS=$(echo -en "\n\b") -SOURCE_INFO_PROCESSED=($(echo "$SOURCE_INFO")) -IFS="$OIFS" -NSOURCES=${#SOURCE_INFO_PROCESSED[*]} - -for ((i=0; i < NSOURCES; i++)); do - OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - GETOPT="${GETOPT}${OP}:" -done - -# parse the command line first -while getopts "$GETOPT" opt; do - case $opt in - d) - case $OPTARG in - -[A-Za-z]*) - Usages "$SCRIPT_NAME" - exit 1 - ;; - *) - LDK_DIR="$OPTARG" - ;; - esac - ;; - h) - Usages "$SCRIPT_NAME" - exit 1 - ;; - t) - TAG="$OPTARG" - PROCESSED=() - for ((i=0; i < NSOURCES; i++)); do - OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - if [[ ! " ${PROCESSED[@]} " =~ " ${OP} " ]]; then - UpdateTags $OP $TAG - PROCESSED+=("${OP}") - fi - done - ;; - [A-Za-z]) - case $OPTARG in - -[A-Za-z]*) - eval arg=\$$((OPTIND-1)) - case $arg in - -[A-Za-Z]-*) - Usages "$SCRIPT_NAME" - exit 1 - ;; - *) - ProcessSwitch "-$opt" "" - OPTIND=$((OPTIND-1)) - ;; - esac - ;; - *) - ProcessSwitch "-$opt" "$OPTARG" - ;; - esac - ;; - :) - case $OPTARG in - #required arguments - d) - Usages "$SCRIPT_NAME" - exit 1 - ;; - #optional arguments - [A-Za-z]) - ProcessSwitch "-$OPTARG" "" - ;; - esac - ;; - \?) - echo "Terminating... wrong switch: $@" >&2 - Usages "$SCRIPT_NAME" - exit 1 - ;; - esac -done -shift $((OPTIND-1)) - -for ((i=0; i < NSOURCES; i++)); do - OPT=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - WHAT=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 2 -d ':') - REPO=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 3 -d ':') - TAG=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 4 -d ':') - DNLOAD=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 5 -d ':') - - if [ $DALL -eq 1 -o "x${DNLOAD}" == "xy" ]; then - if DownloadAndSync "$WHAT" "${LDK_DIR}/${WHAT}" "git://${REPO}" "${TAG}" "${OPT}"; then - true - else - if [[ $? == 3 ]]; then - echo "Trying https protocol" - DownloadAndSync "$WHAT" "${LDK_DIR}/${WHAT}" "https://${REPO}" "${TAG}" "${OPT}" - else - exit 1 - fi - fi - fi -done diff --git a/scripts/source_sync_5.0.2.sh b/scripts/source_sync_5.0.2.sh deleted file mode 100755 index 8f24030e..00000000 --- a/scripts/source_sync_5.0.2.sh +++ /dev/null @@ -1,337 +0,0 @@ -#!/bin/bash -set -e - -# Copyright (c) 2012-2022 NVIDIA CORPORATION. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of NVIDIA CORPORATION nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -# -# This script sync's NVIDIA's version of -# 1. the kernel source -# from nv-tegra, NVIDIA's public git repository. -# The script also provides opportunities to the sync to a specific tag -# so that the binaries shipped with a release can be replicated. -# -# Usage: -# By default it will download all the listed sources -# ./source_sync.sh -# Use the -t option to provide the TAG to be used to sync all the sources. -# Use the -k option to download only the kernel and device tree repos and optionally sync to TAG -# For detailed usage information run with -h option. -# - - -# verify that git is installed -if ! which git > /dev/null ; then - echo "ERROR: git is not installed. If your linux distro is 10.04 or later," - echo "git can be installed by 'sudo apt-get install git-core'." - exit 1 -fi - -# source dir -LDK_DIR=$(cd `dirname $0` && pwd) -LDK_DIR="${LDK_DIR}/sources" -# script name -SCRIPT_NAME=`basename $0` -# info about sources. -# NOTE: *Add only kernel repos here. Add new repos separately below. Keep related repos together* -# NOTE: nvethrnetrm.git should be listed after "linux-nvidia.git" due to nesting of sync path -SOURCE_INFO=" -k:kernel/kernel-5.10:nv-tegra.nvidia.com/linux-5.10.git: -k:kernel/nvgpu:nv-tegra.nvidia.com/linux-nvgpu.git: -k:kernel/nvidia:nv-tegra.nvidia.com/linux-nvidia.git: -k:kernel/nvidia/drivers/net/ethernet/nvidia/nvethernet/nvethernetrm:nv-tegra.nvidia.com/kernel/nvethernetrm.git: -k:hardware/nvidia/platform/tegra/common:nv-tegra.nvidia.com/device/hardware/nvidia/platform/tegra/common.git: -k:hardware/nvidia/soc/t19x:nv-tegra.nvidia.com/device/hardware/nvidia/soc/t19x.git: -k:hardware/nvidia/platform/t19x/common:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/common.git: -k:hardware/nvidia/platform/t19x/galen/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/stardust-dts.git: -k:hardware/nvidia/platform/t19x/jakku/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/jakku-dts.git: -k:hardware/nvidia/platform/t19x/mccoy/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/mccoy-dts.git: -k:hardware/nvidia/platform/t19x/galen-industrial/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/galen-industrial-dts.git: -k:hardware/nvidia/platform/t23x/common/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t23x/common-dts.git: -k:hardware/nvidia/platform/t23x/concord/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t23x/concord-dts.git: -k:hardware/nvidia/soc/t23x:nv-tegra.nvidia.com/device/hardware/nvidia/soc/t23x.git: -k:hardware/nvidia/soc/tegra:nv-tegra.nvidia.com/device/hardware/nvidia/soc/tegra.git: -k:tegra/kernel-src/nv-kernel-display-driver:nv-tegra.nvidia.com/tegra/kernel-src/nv-kernel-display-driver.git: -o:3rdparty/libnl/3.5.0:nv-tegra.nvidia.com/3rdparty/libnl/3.5.0.git: -o:tegra/cuda-src/nvsample_cudaprocess:nv-tegra.nvidia.com/tegra/cuda-src/nvsample_cudaprocess.git: -o:tegra/gfx-src/nv-xconfig:nv-tegra.nvidia.com/tegra/gfx-src/nv-xconfig.git: -o:tegra/gst-src/gst-egl:nv-tegra.nvidia.com/tegra/gst-src/gst-egl.git: -o:tegra/gst-src/gst-jpeg:nv-tegra.nvidia.com/tegra/gst-src/gst-jpeg.git: -o:tegra/gst-src/gst-nvarguscamera:nv-tegra.nvidia.com/tegra/gst-src/gst-nvarguscamera.git: -o:tegra/gst-src/gst-nvcompositor:nv-tegra.nvidia.com/tegra/gst-src/gst-nvcompositor.git: -o:tegra/gst-src/gst-nvtee:nv-tegra.nvidia.com/tegra/gst-src/gst-nvtee.git: -o:tegra/gst-src/gst-nvv4l2camera:nv-tegra.nvidia.com/tegra/gst-src/gst-nvv4l2camera.git: -o:tegra/gst-src/gst-nvvidconv:nv-tegra.nvidia.com/tegra/gst-src/gst-nvvidconv.git: -o:tegra/gst-src/gst-nvvideo4linux2:nv-tegra.nvidia.com/tegra/gst-src/gst-nvvideo4linux2.git: -o:tegra/gst-src/nvgstapps:nv-tegra.nvidia.com/tegra/gst-src/nvgstapps.git: -o:tegra/gst-src/libgstnvdrmvideosink:nv-tegra.nvidia.com/tegra/gst-src/libgstnvdrmvideosink.git: -o:tegra/gst-src/libgstnvvideosinks:nv-tegra.nvidia.com/tegra/gst-src/libgstnvvideosinks.git: -o:tegra/gst-src/libnvgstreamer:nv-tegra.nvidia.com/tegra/gst-src/libnvgstreamer.git: -o:tegra/nv-sci-src/nvsci_headers:nv-tegra.nvidia.com/tegra/nv-sci-src/nvsci_headers.git: -o:tegra/optee-src/atf:nv-tegra.nvidia.com/tegra/optee-src/atf.git: -o:tegra/optee-src/nv-optee:nv-tegra.nvidia.com/tegra/optee-src/nv-optee.git: -o:tegra/v4l2-src/v4l2_libs:nv-tegra.nvidia.com/tegra/v4l2-src/v4l2_libs.git: -" - -# after processing SOURCE_INFO -NSOURCES=0 -declare -a SOURCE_INFO_PROCESSED -# download all? -DALL=1 - -function Usages { - local ScriptName=$1 - local LINE - local OP - local DESC - local PROCESSED=() - local i - - echo "Use: $1 [options]" - echo "Available general options are," - echo " -h : help" - echo " -d [DIR] : root of source is DIR" - echo " -t [TAG] : git tag that will be used to sync all the sources" - echo "" - echo "By default, all sources are downloaded." - echo "Only specified sources are downloaded, if one or more of the following options are mentioned." - echo "" - echo "$SOURCE_INFO" | while read LINE; do - if [ ! -z "$LINE" ]; then - OP=$(echo "$LINE" | cut -f 1 -d ':') - DESC=$(echo "$LINE" | cut -f 2 -d ':') - if [[ ! " ${PROCESSED[@]} " =~ " ${OP} " ]]; then - echo " -${OP} [TAG]: Download $DESC source and optionally sync to TAG" - PROCESSED+=("${OP}") - else - echo " and download $DESC source and sync to the same TAG" - fi - fi - done - echo "" -} - -function ProcessSwitch { - local SWITCH="$1" - local TAG="$2" - local i - local found=0 - - for ((i=0; i < NSOURCES; i++)); do - local OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - if [ "-${OP}" == "$SWITCH" ]; then - SOURCE_INFO_PROCESSED[i]="${SOURCE_INFO_PROCESSED[i]}${TAG}:y" - DALL=0 - found=1 - fi - done - - if [ "$found" == 1 ]; then - return 0 - fi - - echo "Terminating... wrong switch: ${SWITCH}" >&2 - Usages "$SCRIPT_NAME" - exit 1 -} - -function UpdateTags { - local SWITCH="$1" - local TAG="$2" - local i - - for ((i=0; i < NSOURCES; i++)); do - local OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - if [ "${OP}" == "$SWITCH" ]; then - SOURCE_INFO_PROCESSED[i]=$(echo "${SOURCE_INFO_PROCESSED[i]}" \ - | awk -F: -v OFS=: -v var="${TAG}" '{$4=var; print}') - fi - done -} - -function DownloadAndSync { - local WHAT_SOURCE="$1" - local LDK_SOURCE_DIR="$2" - local REPO_URL="$3" - local TAG="$4" - local OPT="$5" - - if [ -d "${LDK_SOURCE_DIR}" ]; then - echo "Directory for $WHAT, ${LDK_SOURCE_DIR}, already exists!" - if ! git -C $LDK_SOURCE_DIR status 2>&1 >/dev/null; then - echo "But the directory is not a git repository -- clean it up first" - echo "" - return 1 - fi - if ! git -C $LDK_SOURCE_DIR fetch --all 2>&1 >/dev/null; then - echo "$2 source sync failed" - return 2 - fi - else - echo "Downloading default $WHAT source..." - - if ! git clone -n "$REPO_URL" ${LDK_SOURCE_DIR} 2>&1 >/dev/null; then - echo "$2 source sync failed" - return 3 - fi - - echo "The default $WHAT source is downloaded in: ${LDK_SOURCE_DIR}" - fi - - if [ -z "$TAG" ]; then - echo "Please enter a tag to sync $2 source to" - echo -n "(enter nothing to skip): " - read TAG - TAG=$(echo $TAG) - UpdateTags $OPT $TAG - fi - - if [[ -n "$TAG" ]]; then - if [ -n $(git -C $LDK_SOURCE_DIR tag -l "^$TAG\$") ]; then - echo "Syncing up with tag $TAG..." - if git -C $LDK_SOURCE_DIR checkout -b mybranch_$(date +%Y-%m-%d-%s) $TAG; then - echo "$2 source sync'ed to tag $TAG successfully!" - else - echo "$2 could not sync to tag $TAG!" - echo - return 4 - fi - else - echo "Couldn't find tag $TAG" - echo "$2 source sync to tag $TAG failed!" - echo - return 5 - fi - fi - echo -} - -# prepare processing .... -GETOPT=":hd:t:" - -OIFS="$IFS" -IFS=$(echo -en "\n\b") -SOURCE_INFO_PROCESSED=($(echo "$SOURCE_INFO")) -IFS="$OIFS" -NSOURCES=${#SOURCE_INFO_PROCESSED[*]} - -for ((i=0; i < NSOURCES; i++)); do - OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - GETOPT="${GETOPT}${OP}:" -done - -# parse the command line first -while getopts "$GETOPT" opt; do - case $opt in - d) - case $OPTARG in - -[A-Za-z]*) - Usages "$SCRIPT_NAME" - exit 1 - ;; - *) - LDK_DIR="$OPTARG" - ;; - esac - ;; - h) - Usages "$SCRIPT_NAME" - exit 1 - ;; - t) - TAG="$OPTARG" - PROCESSED=() - for ((i=0; i < NSOURCES; i++)); do - OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - if [[ ! " ${PROCESSED[@]} " =~ " ${OP} " ]]; then - UpdateTags $OP $TAG - PROCESSED+=("${OP}") - fi - done - ;; - [A-Za-z]) - case $OPTARG in - -[A-Za-z]*) - eval arg=\$$((OPTIND-1)) - case $arg in - -[A-Za-Z]-*) - Usages "$SCRIPT_NAME" - exit 1 - ;; - *) - ProcessSwitch "-$opt" "" - OPTIND=$((OPTIND-1)) - ;; - esac - ;; - *) - ProcessSwitch "-$opt" "$OPTARG" - ;; - esac - ;; - :) - case $OPTARG in - #required arguments - d) - Usages "$SCRIPT_NAME" - exit 1 - ;; - #optional arguments - [A-Za-z]) - ProcessSwitch "-$OPTARG" "" - ;; - esac - ;; - \?) - echo "Terminating... wrong switch: $@" >&2 - Usages "$SCRIPT_NAME" - exit 1 - ;; - esac -done -shift $((OPTIND-1)) - -for ((i=0; i < NSOURCES; i++)); do - OPT=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - WHAT=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 2 -d ':') - REPO=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 3 -d ':') - TAG=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 4 -d ':') - DNLOAD=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 5 -d ':') - - if [ $DALL -eq 1 -o "x${DNLOAD}" == "xy" ]; then - if DownloadAndSync "$WHAT" "${LDK_DIR}/${WHAT}" "git://${REPO}" "${TAG}" "${OPT}"; then - true - else - if [[ $? == 3 ]]; then - echo "Trying https protocol" - DownloadAndSync "$WHAT" "${LDK_DIR}/${WHAT}" "https://${REPO}" "${TAG}" "${OPT}" - else - exit 1 - fi - fi - fi -done diff --git a/scripts/source_sync_5.1.2.sh b/scripts/source_sync_5.1.2.sh deleted file mode 100755 index c715ff6a..00000000 --- a/scripts/source_sync_5.1.2.sh +++ /dev/null @@ -1,341 +0,0 @@ -#!/bin/bash -set -e - -# Copyright (c) 2012-2023 NVIDIA CORPORATION. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of NVIDIA CORPORATION nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -# -# This script sync's NVIDIA's version of -# 1. the kernel source -# from nv-tegra, NVIDIA's public git repository. -# The script also provides opportunities to the sync to a specific tag -# so that the binaries shipped with a release can be replicated. -# -# Usage: -# By default it will download all the listed sources -# ./source_sync.sh -# Use the -t option to provide the TAG to be used to sync all the sources. -# Use the -k option to download only the kernel and device tree repos and optionally sync to TAG -# For detailed usage information run with -h option. -# - - -# verify that git is installed -if ! which git > /dev/null ; then - echo "ERROR: git is not installed. If your linux distro is 10.04 or later," - echo "git can be installed by 'sudo apt-get install git-core'." - exit 1 -fi - -# source dir -LDK_DIR=$(cd `dirname $0` && pwd) -LDK_DIR="${LDK_DIR}/sources" -# script name -SCRIPT_NAME=`basename $0` -# info about sources. -# NOTE: *Add only kernel repos here. Add new repos separately below. Keep related repos together* -# NOTE: nvethrnetrm.git should be listed after "linux-nvidia.git" due to nesting of sync path -SOURCE_INFO=" -k:kernel/kernel-5.10:nv-tegra.nvidia.com/linux-5.10.git: -k:kernel/nvgpu:nv-tegra.nvidia.com/linux-nvgpu.git: -k:kernel/nvidia:nv-tegra.nvidia.com/linux-nvidia.git: -k:kernel/nvidia/drivers/net/ethernet/nvidia/nvethernet/nvethernetrm:nv-tegra.nvidia.com/kernel/nvethernetrm.git: -k:hardware/nvidia/platform/tegra/common:nv-tegra.nvidia.com/device/hardware/nvidia/platform/tegra/common.git: -k:hardware/nvidia/soc/t19x:nv-tegra.nvidia.com/device/hardware/nvidia/soc/t19x.git: -k:hardware/nvidia/platform/t19x/common:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/common.git: -k:hardware/nvidia/platform/t19x/galen/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/stardust-dts.git: -k:hardware/nvidia/platform/t19x/jakku/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/jakku-dts.git: -k:hardware/nvidia/platform/t19x/mccoy/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/mccoy-dts.git: -k:hardware/nvidia/platform/t19x/galen-industrial/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t19x/galen-industrial-dts.git: -k:hardware/nvidia/platform/t23x/common/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t23x/common-dts.git: -k:hardware/nvidia/platform/t23x/p3768/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t23x/p3768-dts.git: -k:hardware/nvidia/platform/t23x/concord/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t23x/concord-dts.git: -k:hardware/nvidia/platform/t23x/prometheus/kernel-dts:nv-tegra.nvidia.com/device/hardware/nvidia/platform/t23x/prometheus-dts: -k:hardware/nvidia/soc/t23x:nv-tegra.nvidia.com/device/hardware/nvidia/soc/t23x.git: -k:hardware/nvidia/soc/tegra:nv-tegra.nvidia.com/device/hardware/nvidia/soc/tegra.git: -k:tegra/kernel-src/nv-kernel-display-driver:nv-tegra.nvidia.com/tegra/kernel-src/nv-kernel-display-driver.git: -o:3rdparty/libnl/3.5.0:nv-tegra.nvidia.com/3rdparty/libnl/3.5.0.git: -o:tegra/argus-cam-libav/argus_cam_libavencoder:nv-tegra.nvidia.com/tegra/argus-cam-libav/argus_cam_libavencoder.git: -o:tegra/cuda-src/nvsample_cudaprocess:nv-tegra.nvidia.com/tegra/cuda-src/nvsample_cudaprocess.git: -o:tegra/gfx-src/nv-xconfig:nv-tegra.nvidia.com/tegra/gfx-src/nv-xconfig.git: -o:tegra/gst-src/gst-egl:nv-tegra.nvidia.com/tegra/gst-src/gst-egl.git: -o:tegra/gst-src/gst-jpeg:nv-tegra.nvidia.com/tegra/gst-src/gst-jpeg.git: -o:tegra/gst-src/gst-nvarguscamera:nv-tegra.nvidia.com/tegra/gst-src/gst-nvarguscamera.git: -o:tegra/gst-src/gst-nvcompositor:nv-tegra.nvidia.com/tegra/gst-src/gst-nvcompositor.git: -o:tegra/gst-src/gst-nvtee:nv-tegra.nvidia.com/tegra/gst-src/gst-nvtee.git: -o:tegra/gst-src/gst-nvv4l2camera:nv-tegra.nvidia.com/tegra/gst-src/gst-nvv4l2camera.git: -o:tegra/gst-src/gst-nvvidconv:nv-tegra.nvidia.com/tegra/gst-src/gst-nvvidconv.git: -o:tegra/gst-src/gst-nvvideo4linux2:nv-tegra.nvidia.com/tegra/gst-src/gst-nvvideo4linux2.git: -o:tegra/gst-src/nvgstapps:nv-tegra.nvidia.com/tegra/gst-src/nvgstapps.git: -o:tegra/gst-src/libgstnvcustomhelper:nv-tegra.nvidia.com/tegra/gst-src/libgstnvcustomhelper.git: -o:tegra/gst-src/libgstnvdrmvideosink:nv-tegra.nvidia.com/tegra/gst-src/libgstnvdrmvideosink.git: -o:tegra/gst-src/libgstnvvideosinks:nv-tegra.nvidia.com/tegra/gst-src/libgstnvvideosinks.git: -o:tegra/v4l2-src/libv4l2_nvargus:nv-tegra.nvidia.com/tegra/v4l2-src/libv4l2_nvargus.git: -o:tegra/nv-sci-src/nvsci_headers:nv-tegra.nvidia.com/tegra/nv-sci-src/nvsci_headers.git: -o:tegra/optee-src/atf:nv-tegra.nvidia.com/tegra/optee-src/atf.git: -o:tegra/optee-src/nv-optee:nv-tegra.nvidia.com/tegra/optee-src/nv-optee.git: -o:tegra/v4l2-src/v4l2_libs:nv-tegra.nvidia.com/tegra/v4l2-src/v4l2_libs.git: -" - -# after processing SOURCE_INFO -NSOURCES=0 -declare -a SOURCE_INFO_PROCESSED -# download all? -DALL=1 - -function Usages { - local ScriptName=$1 - local LINE - local OP - local DESC - local PROCESSED=() - local i - - echo "Use: $1 [options]" - echo "Available general options are," - echo " -h : help" - echo " -d [DIR] : root of source is DIR" - echo " -t [TAG] : git tag that will be used to sync all the sources" - echo "" - echo "By default, all sources are downloaded." - echo "Only specified sources are downloaded, if one or more of the following options are mentioned." - echo "" - echo "$SOURCE_INFO" | while read LINE; do - if [ ! -z "$LINE" ]; then - OP=$(echo "$LINE" | cut -f 1 -d ':') - DESC=$(echo "$LINE" | cut -f 2 -d ':') - if [[ ! " ${PROCESSED[@]} " =~ " ${OP} " ]]; then - echo " -${OP} [TAG]: Download $DESC source and optionally sync to TAG" - PROCESSED+=("${OP}") - else - echo " and download $DESC source and sync to the same TAG" - fi - fi - done - echo "" -} - -function ProcessSwitch { - local SWITCH="$1" - local TAG="$2" - local i - local found=0 - - for ((i=0; i < NSOURCES; i++)); do - local OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - if [ "-${OP}" == "$SWITCH" ]; then - SOURCE_INFO_PROCESSED[i]="${SOURCE_INFO_PROCESSED[i]}${TAG}:y" - DALL=0 - found=1 - fi - done - - if [ "$found" == 1 ]; then - return 0 - fi - - echo "Terminating... wrong switch: ${SWITCH}" >&2 - Usages "$SCRIPT_NAME" - exit 1 -} - -function UpdateTags { - local SWITCH="$1" - local TAG="$2" - local i - - for ((i=0; i < NSOURCES; i++)); do - local OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - if [ "${OP}" == "$SWITCH" ]; then - SOURCE_INFO_PROCESSED[i]=$(echo "${SOURCE_INFO_PROCESSED[i]}" \ - | awk -F: -v OFS=: -v var="${TAG}" '{$4=var; print}') - fi - done -} - -function DownloadAndSync { - local WHAT_SOURCE="$1" - local LDK_SOURCE_DIR="$2" - local REPO_URL="$3" - local TAG="$4" - local OPT="$5" - - if [ -d "${LDK_SOURCE_DIR}" ]; then - echo "Directory for $WHAT, ${LDK_SOURCE_DIR}, already exists!" - if ! git -C $LDK_SOURCE_DIR status 2>&1 >/dev/null; then - echo "But the directory is not a git repository -- clean it up first" - echo "" - return 1 - fi - if ! git -C $LDK_SOURCE_DIR fetch --all 2>&1 >/dev/null; then - echo "$2 source sync failed" - return 2 - fi - else - echo "Downloading default $WHAT source..." - - if ! git clone -n "$REPO_URL" ${LDK_SOURCE_DIR} 2>&1 >/dev/null; then - echo "$2 source sync failed" - return 3 - fi - - echo "The default $WHAT source is downloaded in: ${LDK_SOURCE_DIR}" - fi - - if [ -z "$TAG" ]; then - echo "Please enter a tag to sync $2 source to" - echo -n "(enter nothing to skip): " - read TAG - TAG=$(echo $TAG) - UpdateTags $OPT $TAG - fi - - if [[ -n "$TAG" ]]; then - if [ -n $(git -C $LDK_SOURCE_DIR tag -l "^$TAG\$") ]; then - echo "Syncing up with tag $TAG..." - if git -C $LDK_SOURCE_DIR checkout -b mybranch_$(date +%Y-%m-%d-%s) $TAG; then - echo "$2 source sync'ed to tag $TAG successfully!" - else - echo "$2 could not sync to tag $TAG!" - echo - return 4 - fi - else - echo "Couldn't find tag $TAG" - echo "$2 source sync to tag $TAG failed!" - echo - return 5 - fi - fi - echo -} - -# prepare processing .... -GETOPT=":hd:t:" - -OIFS="$IFS" -IFS=$(echo -en "\n\b") -SOURCE_INFO_PROCESSED=($(echo "$SOURCE_INFO")) -IFS="$OIFS" -NSOURCES=${#SOURCE_INFO_PROCESSED[*]} - -for ((i=0; i < NSOURCES; i++)); do - OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - GETOPT="${GETOPT}${OP}:" -done - -# parse the command line first -while getopts "$GETOPT" opt; do - case $opt in - d) - case $OPTARG in - -[A-Za-z]*) - Usages "$SCRIPT_NAME" - exit 1 - ;; - *) - LDK_DIR="$OPTARG" - ;; - esac - ;; - h) - Usages "$SCRIPT_NAME" - exit 1 - ;; - t) - TAG="$OPTARG" - PROCESSED=() - for ((i=0; i < NSOURCES; i++)); do - OP=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - if [[ ! " ${PROCESSED[@]} " =~ " ${OP} " ]]; then - UpdateTags $OP $TAG - PROCESSED+=("${OP}") - fi - done - ;; - [A-Za-z]) - case $OPTARG in - -[A-Za-z]*) - eval arg=\$$((OPTIND-1)) - case $arg in - -[A-Za-Z]-*) - Usages "$SCRIPT_NAME" - exit 1 - ;; - *) - ProcessSwitch "-$opt" "" - OPTIND=$((OPTIND-1)) - ;; - esac - ;; - *) - ProcessSwitch "-$opt" "$OPTARG" - ;; - esac - ;; - :) - case $OPTARG in - #required arguments - d) - Usages "$SCRIPT_NAME" - exit 1 - ;; - #optional arguments - [A-Za-z]) - ProcessSwitch "-$OPTARG" "" - ;; - esac - ;; - \?) - echo "Terminating... wrong switch: $@" >&2 - Usages "$SCRIPT_NAME" - exit 1 - ;; - esac -done -shift $((OPTIND-1)) - -for ((i=0; i < NSOURCES; i++)); do - OPT=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') - WHAT=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 2 -d ':') - REPO=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 3 -d ':') - TAG=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 4 -d ':') - DNLOAD=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 5 -d ':') - - if [ $DALL -eq 1 -o "x${DNLOAD}" == "xy" ]; then - if DownloadAndSync "$WHAT" "${LDK_DIR}/${WHAT}" "git://${REPO}" "${TAG}" "${OPT}"; then - true - else - if [[ $? == 3 ]]; then - echo "Trying https protocol" - DownloadAndSync "$WHAT" "${LDK_DIR}/${WHAT}" "https://${REPO}" "${TAG}" "${OPT}" - else - exit 1 - fi - fi - fi -done diff --git a/scripts/sources_4.x b/scripts/sources_4.x new file mode 100644 index 00000000..fc95a716 --- /dev/null +++ b/scripts/sources_4.x @@ -0,0 +1,20 @@ +k:kernel/kernel-4.9:nv-tegra/linux-4.9.git: +k:kernel/nvgpu:nv-tegra/linux-nvgpu.git: +k:kernel/nvidia:nv-tegra/linux-nvidia.git: +k:hardware/nvidia/soc/t18x:nv-tegra/device/hardware/nvidia/soc/t18x.git: +k:hardware/nvidia/platform/tegra/common:nv-tegra/device/hardware/nvidia/platform/tegra/common.git: +k:hardware/nvidia/platform/t18x/common:nv-tegra/device/hardware/nvidia/platform/t18x/common.git: +k:hardware/nvidia/platform/t18x/quill:nv-tegra/device/hardware/nvidia/platform/t18x/quill.git: +k:hardware/nvidia/platform/t18x/lanai:nv-tegra/device/hardware/nvidia/platform/t18x/lanai.git: +k:hardware/nvidia/soc/t210:nv-tegra/device/hardware/nvidia/soc/t210.git: +k:hardware/nvidia/platform/t210/common:nv-tegra/device/hardware/nvidia/platform/t210/common.git: +k:hardware/nvidia/platform/t210/jetson:nv-tegra/device/hardware/nvidia/platform/t210/jetson.git: +k:hardware/nvidia/platform/t210/porg:nv-tegra/device/hardware/nvidia/platform/t210/porg.git: +k:hardware/nvidia/platform/t210/batuu/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t210/batuu-dts.git: +k:hardware/nvidia/soc/t19x:nv-tegra/device/hardware/nvidia/soc/t19x.git: +k:hardware/nvidia/platform/t19x/common:nv-tegra/device/hardware/nvidia/platform/t19x/common.git: +k:hardware/nvidia/platform/t19x/galen/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t19x/stardust-dts.git: +k:hardware/nvidia/platform/t19x/jakku/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t19x/jakku-dts.git: +k:hardware/nvidia/platform/t19x/mccoy/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t19x/mccoy-dts.git: +k:hardware/nvidia/platform/t19x/galen-industrial-dts/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t19x/galen-industrial-dts.git: +k:hardware/nvidia/soc/tegra:nv-tegra/device/hardware/nvidia/soc/tegra.git: diff --git a/scripts/sources_5.0.2 b/scripts/sources_5.0.2 new file mode 100644 index 00000000..fef93111 --- /dev/null +++ b/scripts/sources_5.0.2 @@ -0,0 +1,37 @@ +k:kernel/kernel-5.10:nv-tegra/linux-5.10.git: +k:kernel/nvgpu:nv-tegra/linux-nvgpu.git: +k:kernel/nvidia:nv-tegra/linux-nvidia.git: +k:kernel/nvidia/drivers/net/ethernet/nvidia/nvethernet/nvethernetrm:nv-tegra/kernel/nvethernetrm.git: +k:hardware/nvidia/platform/tegra/common:nv-tegra/device/hardware/nvidia/platform/tegra/common.git: +k:hardware/nvidia/soc/t19x:nv-tegra/device/hardware/nvidia/soc/t19x.git: +k:hardware/nvidia/platform/t19x/common:nv-tegra/device/hardware/nvidia/platform/t19x/common.git: +k:hardware/nvidia/platform/t19x/galen/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t19x/stardust-dts.git: +k:hardware/nvidia/platform/t19x/jakku/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t19x/jakku-dts.git: +k:hardware/nvidia/platform/t19x/mccoy/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t19x/mccoy-dts.git: +k:hardware/nvidia/platform/t19x/galen-industrial/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t19x/galen-industrial-dts.git: +k:hardware/nvidia/soc/t23x:nv-tegra/device/hardware/nvidia/soc/t23x.git: +k:hardware/nvidia/platform/t23x/common/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t23x/common-dts.git: +k:hardware/nvidia/platform/t23x/concord/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t23x/concord-dts.git: +k:hardware/nvidia/soc/tegra:nv-tegra/device/hardware/nvidia/soc/tegra.git: +k:tegra/kernel-src/nv-kernel-display-driver:nv-tegra/tegra/kernel-src/nv-kernel-display-driver.git: +o:3rdparty/libnl/3.5.0:nv-tegra/3rdparty/libnl/3.5.0.git: +o:tegra/argus-cam-libav/argus_cam_libavencoder:nv-tegra/tegra/argus-cam-libav/argus_cam_libavencoder.git: +o:tegra/cuda-src/nvsample_cudaprocess:nv-tegra/tegra/cuda-src/nvsample_cudaprocess.git: +o:tegra/gfx-src/nv-xconfig:nv-tegra/tegra/gfx-src/nv-xconfig.git: +o:tegra/gst-src/gst-egl:nv-tegra/tegra/gst-src/gst-egl.git: +o:tegra/gst-src/gst-jpeg:nv-tegra/tegra/gst-src/gst-jpeg.git: +o:tegra/gst-src/gst-nvarguscamera:nv-tegra/tegra/gst-src/gst-nvarguscamera.git: +o:tegra/gst-src/gst-nvcompositor:nv-tegra/tegra/gst-src/gst-nvcompositor.git: +o:tegra/gst-src/gst-nvtee:nv-tegra/tegra/gst-src/gst-nvtee.git: +o:tegra/gst-src/gst-nvv4l2camera:nv-tegra/tegra/gst-src/gst-nvv4l2camera.git: +o:tegra/gst-src/gst-nvvidconv:nv-tegra/tegra/gst-src/gst-nvvidconv.git: +o:tegra/gst-src/gst-nvvideo4linux2:nv-tegra/tegra/gst-src/gst-nvvideo4linux2.git: +o:tegra/gst-src/nvgstapps:nv-tegra/tegra/gst-src/nvgstapps.git: +o:tegra/gst-src/libgstnvcustomhelper:nv-tegra/tegra/gst-src/libgstnvcustomhelper.git: +o:tegra/gst-src/libgstnvdrmvideosink:nv-tegra/tegra/gst-src/libgstnvdrmvideosink.git: +o:tegra/gst-src/libgstnvvideosinks:nv-tegra/tegra/gst-src/libgstnvvideosinks.git: +o:tegra/v4l2-src/libv4l2_nvargus:nv-tegra/tegra/v4l2-src/libv4l2_nvargus.git: +o:tegra/nv-sci-src/nvsci_headers:nv-tegra/tegra/nv-sci-src/nvsci_headers.git: +o:tegra/optee-src/atf:nv-tegra/tegra/optee-src/atf.git: +o:tegra/optee-src/nv-optee:nv-tegra/tegra/optee-src/nv-optee.git: +o:tegra/v4l2-src/v4l2_libs:nv-tegra/tegra/v4l2-src/v4l2_libs.git: diff --git a/scripts/sources_5.1.2 b/scripts/sources_5.1.2 new file mode 100644 index 00000000..19c93781 --- /dev/null +++ b/scripts/sources_5.1.2 @@ -0,0 +1,39 @@ +k:kernel/kernel-5.10:nv-tegra/linux-5.10.git: +k:kernel/nvgpu:nv-tegra/linux-nvgpu.git: +k:kernel/nvidia:nv-tegra/linux-nvidia.git: +k:kernel/nvidia/drivers/net/ethernet/nvidia/nvethernet/nvethernetrm:nv-tegra/kernel/nvethernetrm.git: +k:hardware/nvidia/platform/tegra/common:nv-tegra/device/hardware/nvidia/platform/tegra/common.git: +k:hardware/nvidia/soc/t19x:nv-tegra/device/hardware/nvidia/soc/t19x.git: +k:hardware/nvidia/platform/t19x/common:nv-tegra/device/hardware/nvidia/platform/t19x/common.git: +k:hardware/nvidia/platform/t19x/galen/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t19x/stardust-dts.git: +k:hardware/nvidia/platform/t19x/jakku/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t19x/jakku-dts.git: +k:hardware/nvidia/platform/t19x/mccoy/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t19x/mccoy-dts.git: +k:hardware/nvidia/platform/t19x/galen-industrial/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t19x/galen-industrial-dts.git: +k:hardware/nvidia/soc/t23x:nv-tegra/device/hardware/nvidia/soc/t23x.git: +k:hardware/nvidia/platform/t23x/common/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t23x/common-dts.git: +k:hardware/nvidia/platform/t23x/p3768/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t23x/p3768-dts.git: +k:hardware/nvidia/platform/t23x/concord/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t23x/concord-dts.git: +k:hardware/nvidia/platform/t23x/prometheus/kernel-dts:nv-tegra/device/hardware/nvidia/platform/t23x/prometheus-dts: +k:hardware/nvidia/soc/tegra:nv-tegra/device/hardware/nvidia/soc/tegra.git: +k:tegra/kernel-src/nv-kernel-display-driver:nv-tegra/tegra/kernel-src/nv-kernel-display-driver.git: +o:3rdparty/libnl/3.5.0:nv-tegra/3rdparty/libnl/3.5.0.git: +o:tegra/argus-cam-libav/argus_cam_libavencoder:nv-tegra/tegra/argus-cam-libav/argus_cam_libavencoder.git: +o:tegra/cuda-src/nvsample_cudaprocess:nv-tegra/tegra/cuda-src/nvsample_cudaprocess.git: +o:tegra/gfx-src/nv-xconfig:nv-tegra/tegra/gfx-src/nv-xconfig.git: +o:tegra/gst-src/gst-egl:nv-tegra/tegra/gst-src/gst-egl.git: +o:tegra/gst-src/gst-jpeg:nv-tegra/tegra/gst-src/gst-jpeg.git: +o:tegra/gst-src/gst-nvarguscamera:nv-tegra/tegra/gst-src/gst-nvarguscamera.git: +o:tegra/gst-src/gst-nvcompositor:nv-tegra/tegra/gst-src/gst-nvcompositor.git: +o:tegra/gst-src/gst-nvtee:nv-tegra/tegra/gst-src/gst-nvtee.git: +o:tegra/gst-src/gst-nvv4l2camera:nv-tegra/tegra/gst-src/gst-nvv4l2camera.git: +o:tegra/gst-src/gst-nvvidconv:nv-tegra/tegra/gst-src/gst-nvvidconv.git: +o:tegra/gst-src/gst-nvvideo4linux2:nv-tegra/tegra/gst-src/gst-nvvideo4linux2.git: +o:tegra/gst-src/nvgstapps:nv-tegra/tegra/gst-src/nvgstapps.git: +o:tegra/gst-src/libgstnvcustomhelper:nv-tegra/tegra/gst-src/libgstnvcustomhelper.git: +o:tegra/gst-src/libgstnvdrmvideosink:nv-tegra/tegra/gst-src/libgstnvdrmvideosink.git: +o:tegra/gst-src/libgstnvvideosinks:nv-tegra/tegra/gst-src/libgstnvvideosinks.git: +o:tegra/v4l2-src/libv4l2_nvargus:nv-tegra/tegra/v4l2-src/libv4l2_nvargus.git: +o:tegra/nv-sci-src/nvsci_headers:nv-tegra/tegra/nv-sci-src/nvsci_headers.git: +o:tegra/optee-src/atf:nv-tegra/tegra/optee-src/atf.git: +o:tegra/optee-src/nv-optee:nv-tegra/tegra/optee-src/nv-optee.git: +o:tegra/v4l2-src/v4l2_libs:nv-tegra/tegra/v4l2-src/v4l2_libs.git: diff --git a/scripts/sources_6.x b/scripts/sources_6.x new file mode 100644 index 00000000..bf31f934 --- /dev/null +++ b/scripts/sources_6.x @@ -0,0 +1,29 @@ +k:kernel/kernel-jammy-src:nv-tegra/3rdparty/canonical/linux-jammy.git: +k:nvgpu:nv-tegra/linux-nvgpu.git: +k:nvidia-oot:nv-tegra/linux-nv-oot.git: +k:hwpm:nv-tegra/linux-hwpm.git: +k:nvethernetrm:nv-tegra/kernel/nvethernetrm.git: +k:hardware/nvidia/t23x/nv-public:nv-tegra/device/hardware/nvidia/t23x-public-dts.git: +k:hardware/nvidia/tegra/nv-public:nv-tegra/device/hardware/nvidia/tegra-public-dts.git: +k:nvdisplay:nv-tegra/tegra/kernel-src/nv-kernel-display-driver.git: +k:dtc-src/1.4.5:nv-tegra/3rdparty/dtc-src/1.4.5.git: +o:tegra/argus-cam-libav/argus_cam_libavencoder:nv-tegra/tegra/argus-cam-libav/argus_cam_libavencoder.git: +o:tegra/cuda-src/nvsample_cudaprocess:nv-tegra/tegra/cuda-src/nvsample_cudaprocess.git: +o:tegra/gfx-src/nv-xconfig:nv-tegra/tegra/gfx-src/nv-xconfig.git: +o:tegra/gst-src/gst-egl:nv-tegra/tegra/gst-src/gst-egl.git: +o:tegra/gst-src/gst-jpeg:nv-tegra/tegra/gst-src/gst-jpeg.git: +o:tegra/gst-src/gst-nvarguscamera:nv-tegra/tegra/gst-src/gst-nvarguscamera.git: +o:tegra/gst-src/gst-nvcompositor:nv-tegra/tegra/gst-src/gst-nvcompositor.git: +o:tegra/gst-src/gst-nvtee:nv-tegra/tegra/gst-src/gst-nvtee.git: +o:tegra/gst-src/gst-nvv4l2camera:nv-tegra/tegra/gst-src/gst-nvv4l2camera.git: +o:tegra/gst-src/gst-nvvidconv:nv-tegra/tegra/gst-src/gst-nvvidconv.git: +o:tegra/gst-src/gst-nvvideo4linux2:nv-tegra/tegra/gst-src/gst-nvvideo4linux2.git: +o:tegra/gst-src/nvgstapps:nv-tegra/tegra/gst-src/nvgstapps.git: +o:tegra/gst-src/libgstnvcustomhelper:nv-tegra/tegra/gst-src/libgstnvcustomhelper.git: +o:tegra/gst-src/libgstnvdrmvideosink:nv-tegra/tegra/gst-src/libgstnvdrmvideosink.git: +o:tegra/gst-src/libgstnvvideosinks:nv-tegra/tegra/gst-src/libgstnvvideosinks.git: +o:tegra/v4l2-src/libv4l2_nvargus:nv-tegra/tegra/v4l2-src/libv4l2_nvargus.git: +o:tegra/nv-sci-src/nvsci_headers:nv-tegra/tegra/nv-sci-src/nvsci_headers.git: +o:tegra/optee-src/atf:nv-tegra/tegra/optee-src/atf.git: +o:tegra/optee-src/nv-optee:nv-tegra/tegra/optee-src/nv-optee.git: +o:tegra/v4l2-src/v4l2_libs:nv-tegra/tegra/v4l2-src/v4l2_libs.git: diff --git a/scripts/sources_7.x b/scripts/sources_7.x new file mode 100644 index 00000000..9f2b0d0d --- /dev/null +++ b/scripts/sources_7.x @@ -0,0 +1,29 @@ +k:kernel/kernel-noble-src:nv-tegra/3rdparty/canonical/linux-noble.git: +k:nvgpu:nv-tegra/tegra/kernel-src/linux-nvgpu.git: +k:nvidia-oot:nv-tegra/linux-nv-oot.git: +k:hwpm:nv-tegra/linux-hwpm.git: +k:nvethernetrm:nv-tegra/kernel/nvethernetrm.git: +k:hardware/nvidia/t264/nv-public:nv-tegra/device/hardware/nvidia/t264-public-dts.git: +k:hardware/nvidia/tegra/nv-public:nv-tegra/device/hardware/nvidia/tegra-public-dts.git: +k:nvdisplay:nv-tegra/tegra/kernel-src/nv-kernel-display-driver.git: +k:dtc-src/1.4.5:nv-tegra/3rdparty/dtc-src/1.4.5.git: +o:tegra/argus-cam-libav/argus_cam_libavencoder:nv-tegra/tegra/argus-cam-libav/argus_cam_libavencoder.git: +o:tegra/cuda-src/nvsample_cudaprocess:nv-tegra/tegra/cuda-src/nvsample_cudaprocess.git: +o:tegra/gfx-src/nv-xconfig:nv-tegra/tegra/gfx-src/nv-xconfig.git: +o:tegra/gst-src/gst-egl:nv-tegra/tegra/gst-src/gst-egl.git: +o:tegra/gst-src/gst-jpeg:nv-tegra/tegra/gst-src/gst-jpeg.git: +o:tegra/gst-src/gst-nvarguscamera:nv-tegra/tegra/gst-src/gst-nvarguscamera.git: +o:tegra/gst-src/gst-nvcompositor:nv-tegra/tegra/gst-src/gst-nvcompositor.git: +o:tegra/gst-src/gst-nvtee:nv-tegra/tegra/gst-src/gst-nvtee.git: +o:tegra/gst-src/gst-nvv4l2camera:nv-tegra/tegra/gst-src/gst-nvv4l2camera.git: +o:tegra/gst-src/gst-nvvidconv:nv-tegra/tegra/gst-src/gst-nvvidconv.git: +o:tegra/gst-src/gst-nvvideo4linux2:nv-tegra/tegra/gst-src/gst-nvvideo4linux2.git: +o:tegra/gst-src/nvgstapps:nv-tegra/tegra/gst-src/nvgstapps.git: +o:tegra/gst-src/libgstnvcustomhelper:nv-tegra/tegra/gst-src/libgstnvcustomhelper.git: +o:tegra/gst-src/libgstnvdrmvideosink:nv-tegra/tegra/gst-src/libgstnvdrmvideosink.git: +o:tegra/gst-src/libgstnvvideosinks:nv-tegra/tegra/gst-src/libgstnvvideosinks.git: +o:tegra/v4l2-src/libv4l2_nvargus:nv-tegra/tegra/v4l2-src/libv4l2_nvargus.git: +o:tegra/nv-sci-src/nvsci_headers:nv-tegra/tegra/nv-sci-src/nvsci_headers.git: +o:tegra/optee-src/atf:nv-tegra/tegra/optee-src/atf.git: +o:tegra/optee-src/nv-optee:nv-tegra/tegra/optee-src/nv-optee.git: +o:tegra/v4l2-src/v4l2_libs:nv-tegra/tegra/v4l2-src/v4l2_libs.git: diff --git a/scripts/source_sync_6.x.sh b/scripts/sync-sources.sh similarity index 69% rename from scripts/source_sync_6.x.sh rename to scripts/sync-sources.sh index 801bbdb6..a99910f2 100755 --- a/scripts/source_sync_6.x.sh +++ b/scripts/sync-sources.sh @@ -61,37 +61,14 @@ SCRIPT_NAME=`basename $0` # info about sources. # NOTE: *Add only kernel repos here. Add new repos separately below. Keep related repos together* # NOTE: nvethrnetrm.git should be listed after "linux-nv-oot.git" due to nesting of sync path -SOURCE_INFO=" -k:kernel/kernel-jammy-src:nv-tegra.nvidia.com/3rdparty/canonical/linux-jammy.git: -k:nvgpu:nv-tegra.nvidia.com/linux-nvgpu.git: -k:nvidia-oot:nv-tegra.nvidia.com/linux-nv-oot.git: -k:hwpm:nv-tegra.nvidia.com/linux-hwpm.git: -k:nvethernetrm:nv-tegra.nvidia.com/kernel/nvethernetrm.git: -k:hardware/nvidia/t23x/nv-public:nv-tegra.nvidia.com/device/hardware/nvidia/t23x-public-dts.git: -k:hardware/nvidia/tegra/nv-public:nv-tegra.nvidia.com/device/hardware/nvidia/tegra-public-dts.git: -k:nvdisplay:nv-tegra.nvidia.com/tegra/kernel-src/nv-kernel-display-driver.git: -k:dtc-src/1.4.5:nv-tegra.nvidia.com/3rdparty/dtc-src/1.4.5.git: -o:tegra/argus-cam-libav/argus_cam_libavencoder:nv-tegra.nvidia.com/tegra/argus-cam-libav/argus_cam_libavencoder.git: -o:tegra/cuda-src/nvsample_cudaprocess:nv-tegra.nvidia.com/tegra/cuda-src/nvsample_cudaprocess.git: -o:tegra/gfx-src/nv-xconfig:nv-tegra.nvidia.com/tegra/gfx-src/nv-xconfig.git: -o:tegra/gst-src/gst-egl:nv-tegra.nvidia.com/tegra/gst-src/gst-egl.git: -o:tegra/gst-src/gst-jpeg:nv-tegra.nvidia.com/tegra/gst-src/gst-jpeg.git: -o:tegra/gst-src/gst-nvarguscamera:nv-tegra.nvidia.com/tegra/gst-src/gst-nvarguscamera.git: -o:tegra/gst-src/gst-nvcompositor:nv-tegra.nvidia.com/tegra/gst-src/gst-nvcompositor.git: -o:tegra/gst-src/gst-nvtee:nv-tegra.nvidia.com/tegra/gst-src/gst-nvtee.git: -o:tegra/gst-src/gst-nvv4l2camera:nv-tegra.nvidia.com/tegra/gst-src/gst-nvv4l2camera.git: -o:tegra/gst-src/gst-nvvidconv:nv-tegra.nvidia.com/tegra/gst-src/gst-nvvidconv.git: -o:tegra/gst-src/gst-nvvideo4linux2:nv-tegra.nvidia.com/tegra/gst-src/gst-nvvideo4linux2.git: -o:tegra/gst-src/nvgstapps:nv-tegra.nvidia.com/tegra/gst-src/nvgstapps.git: -o:tegra/gst-src/libgstnvcustomhelper:nv-tegra.nvidia.com/tegra/gst-src/libgstnvcustomhelper.git: -o:tegra/gst-src/libgstnvdrmvideosink:nv-tegra.nvidia.com/tegra/gst-src/libgstnvdrmvideosink.git: -o:tegra/gst-src/libgstnvvideosinks:nv-tegra.nvidia.com/tegra/gst-src/libgstnvvideosinks.git: -o:tegra/v4l2-src/libv4l2_nvargus:nv-tegra.nvidia.com/tegra/v4l2-src/libv4l2_nvargus.git: -o:tegra/nv-sci-src/nvsci_headers:nv-tegra.nvidia.com/tegra/nv-sci-src/nvsci_headers.git: -o:tegra/optee-src/atf:nv-tegra.nvidia.com/tegra/optee-src/atf.git: -o:tegra/optee-src/nv-optee:nv-tegra.nvidia.com/tegra/optee-src/nv-optee.git: -o:tegra/v4l2-src/v4l2_libs:nv-tegra.nvidia.com/tegra/v4l2-src/v4l2_libs.git: -" +if [[ -f scripts/sources_${JETPACK_VERSION} ]]; then + SOURCE_INFO=$(cat scripts/sources_${JETPACK_VERSION}) +elif [[ -f scripts/sources_${JP_INPUT_VERSION} ]]; then + SOURCE_INFO=$(cat scripts/sources_${JP_INPUT_VERSION}) +else + echo "Sources information file, scripts/sources_${JETPACK_VERSION}, is missing!" + exit 1 +fi # exit on error on sync # after processing SOURCE_INFO @@ -110,7 +87,7 @@ function Usages { echo "Use: $1 [options]" echo "Available general options are," - echo " -h : help" + echo " -h : help" echo " -d [DIR] : root of source is DIR" echo " -t [TAG] : git tag that will be used to sync all the sources" echo "" @@ -177,29 +154,28 @@ function DownloadAndSync { local TAG="$4" local OPT="$5" - if [ -d "${LDK_SOURCE_DIR}" ]; then + if [[ -d "${LDK_SOURCE_DIR}" ]]; then echo "Directory for $WHAT, ${LDK_SOURCE_DIR}, already exists!" if ! git -C $LDK_SOURCE_DIR status 2>&1 >/dev/null; then - echo "But the directory is not a git repository -- clean it up first" - echo "" + echo -e "\e[33m...but the directory is not a git repository -- clean it up first\e[0m\n" return 1 fi - if ! git -C $LDK_SOURCE_DIR fetch --all 2>&1 >/dev/null; then - echo "$2 source sync failed" + if ! git -C $LDK_SOURCE_DIR fetch $REPO_URL 2>&1 >/dev/null; then + echo -e "\e[33msource sync with ${REPO_URL} failed!\e[0m" return 2 fi else echo "Downloading default $WHAT source..." if ! git clone -n "$REPO_URL" ${LDK_SOURCE_DIR} 2>&1 >/dev/null; then - echo "$2 source sync failed" - return 3 + echo -e "\e[33msource sync with ${REPO_URL} failed!\e[0m" + return 2 fi echo "The default $WHAT source is downloaded in: ${LDK_SOURCE_DIR}" fi - if [ -z "$TAG" ]; then + if [[ -z "$TAG" ]]; then echo "Please enter a tag to sync $2 source to" echo -n "(enter nothing to skip): " read TAG @@ -207,24 +183,19 @@ function DownloadAndSync { UpdateTags $OPT $TAG fi - if [[ -n "$TAG" ]]; then - if [ -n $(git -C $LDK_SOURCE_DIR tag -l "^$TAG\$") ]; then + [[ -n "$TAG" ]] && + if [[ -n $(git -C $LDK_SOURCE_DIR tag -l "$TAG") ]]; then echo "Syncing up with tag $TAG..." - if git -C $LDK_SOURCE_DIR checkout -b mybranch_$(date +%Y-%m-%d-%s) $TAG; then - echo "$2 source sync'ed to tag $TAG successfully!" + if git -C $LDK_SOURCE_DIR checkout -b mybranch_$(date +%Y-%m-%d-%s) $TAG 2>&1 >/dev/null; then + echo -e "\e[32m$2 source sync'ed to tag $TAG successfully!\e[0m" else - echo "$2 could not sync to tag $TAG!" - echo + echo -e "\e[31m$2 could not sync to tag $TAG!\e[0m\n" return 4 fi else - echo "Couldn't find tag $TAG" - echo "$2 source sync to tag $TAG failed!" - echo + echo -e "\e[31mCouldn't find tag $TAG. $2 source sync to tag $TAG failed!\e[0m" return 5 fi - fi - echo } # prepare processing .... @@ -312,6 +283,11 @@ while getopts "$GETOPT" opt; do done shift $((OPTIND-1)) +PROTOCOL="git:/" +if [[ -f protocol ]]; then + PROTOCOL=$(cat protocol) +fi + for ((i=0; i < NSOURCES; i++)); do OPT=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 1 -d ':') WHAT=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 2 -d ':') @@ -320,13 +296,20 @@ for ((i=0; i < NSOURCES; i++)); do DNLOAD=$(echo "${SOURCE_INFO_PROCESSED[i]}" | cut -f 5 -d ':') if [ $DALL -eq 1 -o "x${DNLOAD}" == "xy" ]; then - if DownloadAndSync "$WHAT" "${LDK_DIR}/${WHAT}" "git://${REPO}" "${TAG}" "${OPT}"; then - true + if DownloadAndSync "$WHAT" "${LDK_DIR}/${WHAT}" "$PROTOCOL/gitlab.com/nvidia/${REPO}" "${TAG}" "${OPT}"; then + echo $PROTOCOL > protocol else - if [[ $? == 3 ]]; then + if [[ $? == 2 ]]; then + PROTOCOL="https:/" echo "Trying https protocol" - DownloadAndSync "$WHAT" "${LDK_DIR}/${WHAT}" "https://${REPO}" "${TAG}" "${OPT}" + if DownloadAndSync "${WHAT}" "${LDK_DIR}/${WHAT}" "${PROTOCOL}/gitlab.com/nvidia/${REPO}" "${TAG}" "${OPT}"; then + echo $PROTOCOL > protocol + else + echo -e "\e[31m${WHAT} source sync with both git and https protocol failed!\e[0m\n" + exit 2 + fi else + echo -e "\e[31m${WHAT} source sync failed with!\e[0m\n" exit 1 fi fi diff --git a/setup_workspace.sh b/setup_workspace.sh index 32d0bf0d..a1d547ff 100755 --- a/setup_workspace.sh +++ b/setup_workspace.sh @@ -11,36 +11,33 @@ function DisplayNvidiaLicense { exit 1 fi - local release; - IFS='.' read -a release <<< "$1" - + local release; + IFS='.' read -a release <<< "$1" + RELEASE="r${release[0]}_Release_v${release[1]}.${release[2]:-0}" - + local URL="https://developer.download.nvidia.com/embedded/L4T/${RELEASE}/$2/Tegra_Software_License_Agreement-Tegra-Linux.txt" echo -e "\nPlease notice: This script will download the kernel source (from nv-tegra, NVIDIA's public git repository) which is subject to the following license:\n${URL}\n" - local LICENSE=$(curl -Ls ${URL}) + local LICENSE=$(curl -Ls ${URL}) + [[ -z $LICENSE || "$LICENSE" == "Not found" ]] && echo "License link not found" && exit 2 ## display the page ## - echo -e "${LICENSE}\n\n" + echo -e "${LICENSE}\n" - read -t 30 -n 1 -s -r -e -p 'Press any key to continue (or wait 30 seconds..)' + read -n 1 -s -r -e -p $'\e[33mPress any key to ACCEPT and continue...\e[0m' echo } - -if [[ "$1" == "-h" ]]; then - echo "setup_workspace.sh [JetPack_version]" - echo "setup_workspace.sh -h" - echo "JetPack_version can be 4.6.1, 5.0.2, 5.1.2, 6.0, 6.1, 6.2, 6.2.1" - exit 1 +if [[ $1 == "-h" ]]; then + echo Usage: + echo $0 [JetPack] fi -export DEVDIR=$(cd `dirname $0` && pwd) +. scripts/setup-common -. $DEVDIR/scripts/setup-common "$1" -echo "Setup JetPack $1 to sources_$1" +echo "Setup JetPack ${JP_INPUT_VERSION} to ${BUILD_SRCS}" # Display NVIDIA license DisplayNvidiaLicense "${REVISION}" "${LICENSE}" @@ -51,75 +48,72 @@ if [[ $(uname -m) == aarch64 ]]; then echo Native build echo else - if [[ ! -d "$DEVDIR/l4t-gcc/$JETPACK_VERSION/bin/" ]]; then - mkdir -p $DEVDIR/l4t-gcc/$JETPACK_VERSION - cd $DEVDIR/l4t-gcc/$JETPACK_VERSION - if [[ "$JETPACK_VERSION" == "6.x" ]]; then + if [[ ! -d "l4t-gcc/$JETPACK_VERSION/bin/" ]]; then + echo "Installing build toolchain" + mkdir -p "l4t-gcc/$JETPACK_VERSION" + pushd l4t-gcc/$JETPACK_VERSION + if [[ "$JETPACK_VERSION" == "7.x" ]]; then + wget --quiet --show-progress https://developer.nvidia.com/downloads/embedded/L4T/r38_Release_v2.0/release/x-tools.tbz2 -O x-tools.tbz2 + tar xf x-tools.tbz2 ./x-tools/aarch64-none-linux-gnu --strip-components 3 + elif [[ "$JETPACK_VERSION" == "6.x" ]]; then wget --quiet --show-progress https://developer.nvidia.com/downloads/embedded/l4t/r36_release_v3.0/toolchain/aarch64--glibc--stable-2022.08-1.tar.bz2 -O aarch64--glibc--stable-final.tar.bz2 tar xf aarch64--glibc--stable-final.tar.bz2 --strip-components 1 elif [[ "$JETPACK_VERSION" == "5.x" ]]; then wget --quiet --show-progress https://developer.nvidia.com/embedded/jetson-linux/bootlin-toolchain-gcc-93 -O aarch64--glibc--stable-final.tar.gz tar xf aarch64--glibc--stable-final.tar.gz - elif [[ "$JETPACK_VERSION" == "4.6.1" ]]; then + elif [[ "$JETPACK_VERSION" == "4.x" ]]; then wget --quiet --show-progress http://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz tar xf gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz --strip-components 1 fi + popd fi - echo fi -echo "In a case you have local changes you may reset them with ./apply_patches.sh $1 reset" -echo +[[ -d ${BUILD_SRCS} ]] && echo -e "\e[33mIn a case you have local changes you may reset them with ./apply_patches.sh reset\e[0m\n" # Clone L4T kernel source repo -cd $DEVDIR # Check if local tar ball exists in /home/nvidia_sources_cache NVIDIA_CACHE_DIR="/home/nvidia_sources_cache" -TARBALL_NAME="backup_sources_$1.tar.gz" +TARBALL_NAME="backup_${BUILD_SRCS}.tar.gz" TARBALL_PATH="$NVIDIA_CACHE_DIR/$TARBALL_NAME" -if [[ -f "$TARBALL_PATH" ]]; then +if [[ ! -d "${BUILD_SRCS}" && -f "$TARBALL_PATH" ]]; then echo "Found local tar ball: $TARBALL_PATH" echo "Extracting sources from local cache instead of cloning from NVIDIA repository..." - + # Remove existing sources directory if it exists - if [[ -d "sources_$1" ]]; then - echo "Removing existing sources_$1 directory..." - rm -rf "sources_$1" + if [[ -d "${BUILD_SRCS}" ]]; then + echo "Removing existing ${BUILD_SRCS} directory..." + rm -rf "${BUILD_SRCS}" fi - + # Extract tar ball echo "Extracting $TARBALL_NAME..." tar -xzf "$TARBALL_PATH" - + # Check what directory was extracted and rename if necessary # The tar ball might contain sources_6.x instead of sources_6.0 EXTRACTED_DIR=$(tar -tzf "$TARBALL_PATH" | head -1 | cut -d'/' -f1) - if [[ "$EXTRACTED_DIR" != "sources_$1" ]]; then - echo "Renaming extracted directory from $EXTRACTED_DIR to sources_$1..." - mv "$EXTRACTED_DIR" "sources_$1" + if [[ "$EXTRACTED_DIR" != "${BUILD_SRCS}" ]]; then + echo "Renaming extracted directory from $EXTRACTED_DIR to ${BUILD_SRCS}..." + mv "$EXTRACTED_DIR" "${BUILD_SRCS}" fi - - echo "Sources extracted successfully from local cache." + + echo -e "\e[32mSources extracted successfully from local cache\e[0m" else - echo "Local tar ball not found at $TARBALL_PATH" echo "Cloning sources from NVIDIA repository..." - if [[ -f "./scripts/source_sync_$1.sh" ]]; then - "./scripts/source_sync_$1.sh" -t "$L4T_VERSION" -d "sources_$1" - elif [[ -f "./scripts/source_sync_$JETPACK_VERSION.sh" ]]; then - ./scripts/source_sync_$JETPACK_VERSION.sh -t $L4T_VERSION -d sources_$1 - fi + ./scripts/sync-sources.sh -t $L4T_VERSION -d ${BUILD_SRCS} -k fi # copy Makefile for jp6 -if [[ "$JETPACK_VERSION" == "6.x" ]]; then - cp ./nvidia-oot/Makefile "sources_$1/" - cp ./kernel/kernel-jammy-src/Makefile "sources_$1/kernel" +if ! version_lt "$JETPACK_VERSION" "6.0"; then + cp ./nvidia-oot/Makefile "${BUILD_SRCS}/" + cp ./$KERNEL_DIR/Makefile "${BUILD_SRCS}/kernel/" fi # remove BUILD_NUMBER env dependency kernel vermagic -if [[ "${JETPACK_VERSION}" == "4.6.1" ]]; then - sed -i s/'UTS_RELEASE=\$(KERNELRELEASE)-ab\$(BUILD_NUMBER)'/'UTS_RELEASE=\$(KERNELRELEASE)'/g ./sources_$1/kernel/kernel-4.9/Makefile - sed -i 's/the-space :=/E =/g' ./sources_$1/kernel/kernel-4.9/scripts/Kbuild.include - sed -i 's/the-space += /the-space = \$E \$E/g' ./sources_$1/kernel/kernel-4.9/scripts/Kbuild.include +if [[ "${JETPACK_VERSION}" == "4.x" ]]; then + sed -i s/'UTS_RELEASE=\$(KERNELRELEASE)-ab\$(BUILD_NUMBER)'/'UTS_RELEASE=\$(KERNELRELEASE)'/g ./${BUILD_SRCS}/kernel/kernel-4.9/Makefile + sed -i 's/the-space :=/E =/g' ./${BUILD_SRCS}/kernel/kernel-4.9/scripts/Kbuild.include + sed -i 's/the-space += /the-space = \$E \$E/g' ./${BUILD_SRCS}/kernel/kernel-4.9/scripts/Kbuild.include fi