Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .github/workflows/build-jp6.1.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Build JP 6.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 6.1
- name: apply patches
run: git config --global user.email "builder@example.com" && git config --global user.name "builder" && ./apply_patches.sh apply 6.1
- name: build
run: ./build_all.sh 6.1
25 changes: 25 additions & 0 deletions .github/workflows/build-jp6.2.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Build JP 6.2

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 6.2
- name: apply patches
run: git config --global user.email "builder@example.com" && git config --global user.name "builder" && ./apply_patches.sh apply 6.2
- name: build
run: ./build_all.sh 6.2
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,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.0, 5.1.2, 5.0.2, 4.6.1)
* NVIDIA® Jetson platform (Currently Supported JetPack versions are: 6.2, 6.1, 6.0, 5.1.2, 5.0.2, 4.6.1)
* RealSense De-Serialize board (https://store.intelrealsense.com/buy-intel-realsense-des457.html)
* 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.intelrealsense.com/buy-intel-realsense-depth-camera-d457.html)
Expand All @@ -15,7 +15,7 @@ The system shall include:

# Documentation

- NVIDIA® Jetson AGX Orin™ board setup - AGX Orin™ [JetPack 6.0](./README_JP6.md) setup guide
- NVIDIA® Jetson AGX Orin™ board setup - AGX Orin™ [JetPack 6.x](./README_JP6.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)
Expand All @@ -29,7 +29,7 @@ Please follow the [instruction](https://docs.nvidia.com/sdk-manager/install-with

# JetPack build

- [JetPack 6.0](./README_JP6.md#build-environment-prerequisites)
- [JetPack 6.x](./README_JP6.md#build-environment-prerequisites)
- [JetPack 5.1.2](./README_JP5.md#build-kernel-dtb-and-d457-driver)
- [JetPack 5.0.2](./README_JP5.md#build-kernel-dtb-and-d457-driver)
- [JetPack 4.6.1](./README_JP4.md#build-kernel-dtb-and-d457-driver)
Expand Down
65 changes: 34 additions & 31 deletions README_JP6.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
# Intel® RealSense™ camera driver for GMSL* interface

# D457 MIPI on NVIDIA® Jetson AGX Orin™ JetPack 6.0
# D457 MIPI on NVIDIA® Jetson AGX Orin™ JetPack 6.x
The Intel® 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: [6.0 production release](https://developer.nvidia.com/embedded/jetpack-sdk-60)
* NVIDIA® Jetson™ platform Supported JetPack versions are:
[6.2 production release](https://developer.nvidia.com/embedded/jetpack-sdk-62)
[6.1 production release](https://developer.nvidia.com/embedded/jetpack-sdk-61)
[6.0 production release](https://developer.nvidia.com/embedded/jetpack-sdk-60)
* RealSense™ [De-Serialize board](https://store.intelrealsense.com/buy-intel-realsense-des457.html)
* 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.intelrealsense.com/buy-intel-realsense-depth-camera-d457.html)
Expand All @@ -15,7 +18,7 @@ The system shall include:

### Links
- Intel® RealSense™ camera driver for GMSL* interface [Front Page](./README.md)
- NVIDIA® Jetson AGX Orin™ board setup - AGX Orin™ [JetPack 6.0](./README_JP6.md) setup guide
- NVIDIA® Jetson AGX Orin™ board setup - AGX Orin™ [JetPack 6.x](./README_JP6.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)
Expand Down Expand Up @@ -43,13 +46,13 @@ sudo apt-get install -y build-essential bc wget flex bison curl libssl-dev xxd
```
git clone https://github.com/IntelRealSense/realsense_mipi_platform_driver.git
cd realsense_mipi_platform_driver
./setup_workspace.sh 6.0
./apply_patches.sh apply 6.0
./build_all.sh 6.0
./setup_workspace.sh 6.2
./apply_patches.sh apply 6.2
./build_all.sh 6.2
```
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 6.0
./build_all.sh --dev-dbg 6.2
```


Expand All @@ -65,9 +68,9 @@ Note: dev_dbg() log support will not be enabled by default. If needed, run the `
6. Configure target.

```
# JetPack 6.0
mkdir -p l4t-gcc/6.0
cd ./l4t-gcc/6.0
# JetPack 6.x
mkdir -p l4t-gcc/6.x
cd ./l4t-gcc/6.x
wget 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
cd ../..
Expand All @@ -79,33 +82,33 @@ tar xjf kernel_oot_modules_src.tbz2
tar xjf nvidia_kernel_display_driver_source.tbz2
cd ../..

./apply_patches_ext.sh ./Linux_for_Tegra/source 6.0
./apply_patches_ext.sh 6.2 Linux_for_Tegra/source

# build kernel, dtb and D457 driver
./build_all.sh 6.0 ./Linux_for_Tegra/source
./build_all.sh 6.2 ./Linux_for_Tegra/source
```
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 6.0 ./Linux_for_Tegra/source
./build_all.sh --dev-dbg 6.2 ./Linux_for_Tegra/source
```

## Archive JetPack 6.0 build results (optional) on build host
- kernel image : `images/6.0/rootfs/boot/Image`
- dtb: `images/6.0/rootfs/boot/dtb/tegra234-p3737-0000+p3701-0000-nv.dtb`
- dtb overlay: `images/6.0/rootfs/boot/tegra234-camera-d4xx-overlay.dtbo`
- dtb dual camera overlay: `images/6.0/rootfs/boot/tegra234-camera-d4xx-overlay-dual.dtbo`
- nvidia-oot modules: `images/6.0/rootfs/lib/modules/5.15.136-tegra/updates`
- kernel modules: `images/6.0/rootfs/lib/modules/5.15.136-tegra/extra`
## Archive JetPack 6.x build results (optional) on build host
- kernel image : `images/6.x/rootfs/boot/Image`
- dtb: `images/6.x/rootfs/boot/dtb/tegra234-p3737-0000+p3701-0000-nv.dtb`
- dtb overlay: `images/6.x/rootfs/boot/tegra234-camera-d4xx-overlay.dtbo`
- dtb dual camera overlay: `images/6.x/rootfs/boot/tegra234-camera-d4xx-overlay-dual.dtbo`
- nvidia-oot modules: `images/6.x/rootfs/lib/modules/5.15.136-tegra/updates`
- kernel modules: `images/6.x/rootfs/lib/modules/5.15.136-tegra/extra`

```
echo "Archiving boot configuration build results"
tar -czf ./images/6.0/boot-config.tar.gz -C "./images/6.0/rootfs/" ./boot
tar -czf ./images/6.x/boot-config.tar.gz -C "./images/6.x/rootfs/" ./boot
echo "Archiving nvidia-oot modules"
tar -czf ./images/6.0/nvidia-oot-modules.tar.gz -C "./images/6.0/rootfs/" ./lib/modules/5.15.136-tegra/updates
tar -czf ./images/6.x/nvidia-oot-modules.tar.gz -C "./images/6.x/rootfs/" ./lib/modules/5.15.136-tegra/updates
echo "Archiving kernel HID modules"
tar -czf ./images/6.0/kernel-hid-modules.tar.gz -C "./images/6.0/rootfs/" ./lib/modules/5.15.136-tegra/extra
tar -czf ./images/6.x/kernel-hid-modules.tar.gz -C "./images/6.x/rootfs/" ./lib/modules/5.15.136-tegra/extra
```
## Backup JetPack 6.0 boot configuration and drivers (optional)
## Backup JetPack 6.x boot configuration and drivers (optional)
```
echo "Backup boot configuration"
sudo cp /boot/tegra234-p3737-0000+p3701-0000-nv.dtb /boot/tegra234-p3737-0000+p3701-0000-nv-bkp.dtb
Expand All @@ -121,13 +124,13 @@ sudo tar -czf /lib/modules/$(uname -r)/updates.tar.gz -C /lib/modules/$(uname -r

Following steps required:

1. Copy entire directory `images/6.0/rootfs/lib/modules/5.15.136-tegra/updates` from host to `/lib/modules/5.15.136-tegra/` on Orin target
2. Copy entire directory `images/6.0/rootfs/lib/modules/5.15.136-tegra/extra` from host to `/lib/modules/5.15.136-tegra/` on Orin target
1. Copy entire directory `images/6.x/rootfs/lib/modules/5.15.136-tegra/updates` from host to `/lib/modules/5.15.136-tegra/` on Orin target
2. Copy entire directory `images/6.x/rootfs/lib/modules/5.15.136-tegra/extra` from host to `/lib/modules/5.15.136-tegra/` on Orin target
3. Copy `tegra234-camera-d4xx-overlay.dtbo` from host to `/boot/tegra234-camera-d4xx-overlay.dtbo` on Orin target
4. For dual camera, copy `tegra234-camera-d4xx-overlay-dual.dtbo` from host to `/boot/tegra234-camera-d4xx-overlay-dual.dtbo` on Orin target
5. Copy `tegra234-p3737-0000+p3701-0000-nv.dtb` from host to `/boot/` on Orin
6. Copy `Image` from host to `/boot/` on Orin
7. Copy entire directory `images/6.0/rootfs/lib/modules/5.15.136-tegra/kernel` from host to `/lib/modules/5.15.136-tegra/` on Orin target
7. Copy entire directory `images/6.x/rootfs/lib/modules/5.15.136-tegra/kernel` from host to `/lib/modules/5.15.136-tegra/` on Orin target
8. Run $ `sudo /opt/nvidia/jetson-io/jetson-io.py`
1. Configure Jetson AGX CSI Connector
2. Configure for compatible hardware
Expand Down Expand Up @@ -163,13 +166,13 @@ Assuming Jetson has ip: `10.0.0.116`

```
# Configuration files
scp -r images/6.0/rootfs/boot nvidia@10.0.0.116:~/
scp -r images/6.x/rootfs/boot nvidia@10.0.0.116:~/
# RealSense support for NVIDIA Tegra
scp -r images/6.0/rootfs/lib/modules/5.15.136-tegra/updates nvidia@10.0.0.116:~/
scp -r images/6.x/rootfs/lib/modules/5.15.136-tegra/updates nvidia@10.0.0.116:~/
# RealSense metadata patched kernel modules and IMU HID support
scp -r images/6.0/rootfs/lib/modules/5.15.136-tegra/extra nvidia@10.0.0.116:~/
scp -r images/6.x/rootfs/lib/modules/5.15.136-tegra/extra nvidia@10.0.0.116:~/
# Updated kernel modules to match the new compiled kernel image
scp -r images/6.0/rootfs/lib/modules/5.15.136-tegra/kernel nvidia@10.0.0.116:~/
scp -r images/6.x/rootfs/lib/modules/5.15.136-tegra/kernel nvidia@10.0.0.116:~/
```

On Jetson target, assuming backup step was followed:
Expand Down
44 changes: 33 additions & 11 deletions apply_patches.sh
Original file line number Diff line number Diff line change
Expand Up @@ -31,45 +31,67 @@ cd "$DEVDIR"
if [[ "$JETPACK_VERSION" == "4.6.1" ]]; then
JP5_D4XX_DTSI="tegra194-camera-d4xx.dtsi"
fi
if [[ "$JETPACK_VERSION" == "6.0" ]]; then
if [[ "$JETPACK_VERSION" == "6.x" ]]; then
D4XX_SRC_DST=nvidia-oot
else
D4XX_SRC_DST=kernel/nvidia
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 [ -d sources_$JETPACK_VERSION/hardware/nvidia/platform/t19x/galen-industrial-dts ]; then
if [[ $1 == apply && -d sources_$JETPACK_VERSION/hardware/nvidia/platform/t19x/galen-industrial-dts ]]; then
mv sources_$JETPACK_VERSION/hardware/nvidia/platform/t19x/galen-industrial-dts sources_$JETPACK_VERSION/hardware/nvidia/platform/t19x/galen-industrial
fi
if [[ $1 == reset && -d sources_$JETPACK_VERSION/hardware/nvidia/platform/t19x/galen-industrial ]]; then
rm -rfv sources_$JETPACK_VERSION/hardware/nvidia/platform/t19x/galen-industrial > /dev/null
fi

apply_external_patches() {
git -C sources_$JETPACK_VERSION/$3 status > /dev/null
if [ $1 = 'apply' ]; then
git -C sources_$JETPACK_VERSION/$2 am ${PWD}/$2/$JETPACK_VERSION/*
if ! git -C sources_$JETPACK_VERSION/$3 diff --quiet || ! git -C sources_$JETPACK_VERSION/$3 diff --cached --quiet; then
read -p "Repo sources_$JETPACK_VERSION/$3 has changes that may disturb applying patches. Continue (y/N)? " confirm
if [[ ! "$confirm" == "y" && ! "$confirm" == "Y" ]]; then
exit 1
fi
fi
ls -Ld ${PWD}/$3/$2
ls -Lw1 ${PWD}/$3/$2
git -C sources_$JETPACK_VERSION/$3 apply ${PWD}/$3/$2/*
elif [ $1 = 'reset' ]; then
git -C sources_$JETPACK_VERSION/$2 reset --hard $L4T_VERSION
if ! git -C sources_$JETPACK_VERSION/$3 diff --quiet || ! git -C sources_$JETPACK_VERSION/$3 diff --cached --quiet; then
read -p "Repo sources_$JETPACK_VERSION/$3 has changes that will be hard reset. Continue (y/N)? " confirm
if [[ ! "$confirm" == "y" && ! "$confirm" == "Y" ]]; then
exit 1
fi
fi
echo -n $(ls -d sources_$JETPACK_VERSION/$3):\
git -C sources_$JETPACK_VERSION/$3 reset --hard $4
fi
}

apply_external_patches $1 $D4XX_SRC_DST
apply_external_patches $1 $2 $D4XX_SRC_DST $L4T_VERSION

if [ -d ${KERNEL_DIR}/${JETPACK_VERSION} ]; then
apply_external_patches $1 $KERNEL_DIR
if [ -d sources_$JETPACK_VERSION/$KERNEL_DIR ]; then
apply_external_patches $1 $2 $KERNEL_DIR $L4T_VERSION
fi

if [[ "$JETPACK_VERSION" == "6.0" ]]; then
apply_external_patches $1 hardware/nvidia/t23x/nv-public
if [[ "$JETPACK_VERSION" == "6.x" ]]; then
apply_external_patches $1 $JETPACK_VERSION hardware/nvidia/t23x/nv-public $L4T_VERSION
else
apply_external_patches $1 hardware/nvidia/platform/t19x/galen/kernel-dts
apply_external_patches $1 $2 hardware/nvidia/platform/t19x/galen/kernel-dts $L4T_VERSION
fi

if [ $1 = 'apply' ]; then
cp $DEVDIR/kernel/realsense/d4xx.c $DEVDIR/sources_$JETPACK_VERSION/${D4XX_SRC_DST}/drivers/media/i2c/
if [[ "$JETPACK_VERSION" == "6.0" ]]; then
if [[ "$JETPACK_VERSION" == "6.x" ]]; then
# jp6 overlay
cp $DEVDIR/hardware/realsense/tegra234-camera-d4xx-overlay*.dts $DEVDIR/sources_$JETPACK_VERSION/hardware/nvidia/t23x/nv-public/overlay/
else
cp $DEVDIR/hardware/realsense/$JP5_D4XX_DTSI $DEVDIR/sources_$JETPACK_VERSION/hardware/nvidia/platform/t19x/galen/kernel-dts/common/tegra194-camera-d4xx.dtsi
fi
elif [ $1 = 'reset' ]; then
[[ -f $DEVDIR/sources_$JETPACK_VERSION/${D4XX_SRC_DST}/drivers/media/i2c/d4xx.c ]] && rm $DEVDIR/sources_$JETPACK_VERSION/${D4XX_SRC_DST}/drivers/media/i2c/d4xx.c
[[ -f $DEVDIR/sources_$JETPACK_VERSION/hardware/nvidia/platform/t19x/galen/kernel-dts/common/tegra194-camera-d4xx.dtsi ]] && rm $DEVDIR/sources_$JETPACK_VERSION/hardware/nvidia/platform/t19x/galen/kernel-dts/common/tegra194-camera-d4xx.dtsi
true
fi
45 changes: 29 additions & 16 deletions apply_patches_ext.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
set -e

if [[ $# < 1 ]]; then
echo "apply_patches_ext.sh [--one-cam | --dual-cam] source_dir [JetPack_version]"
echo "apply_patches_ext.sh [--one-cam | --dual-cam] [JetPack_version] [JetPack_source]"
exit 1
fi

Expand All @@ -23,44 +23,57 @@ fi

DEVDIR=$(cd `dirname $0` && pwd)

. $DEVDIR/scripts/setup-common "$2"
. $DEVDIR/scripts/setup-common "$1"

cd "$DEVDIR"

# set JP4 devicetree
if [[ "$JETPACK_VERSION" == "4.6.1" ]]; then
JP5_D4XX_DTSI="tegra194-camera-d4xx.dtsi"
fi
if [[ "$JETPACK_VERSION" == "6.0" ]]; then
if [[ "$JETPACK_VERSION" == "6.x" ]]; then
D4XX_SRC_DST=nvidia-oot
else
D4XX_SRC_DST=kernel/nvidia
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 [ -d $1/hardware/nvidia/platform/t19x/galen-industrial-dts ]; then
mv $1/hardware/nvidia/platform/t19x/galen-industrial-dts $1/hardware/nvidia/platform/t19x/galen-industrial
if [ -d $JETPACK_VERSION/hardware/nvidia/platform/t19x/galen-industrial-dts ]; then
mv $1/hardware/nvidia/platform/t19x/galen-industrial-dts $JETPACK_VERSION/hardware/nvidia/platform/t19x/galen-industrial
fi

apply_external_patches() {
cat ${PWD}/$2/$JETPACK_VERSION/* | patch -p1 --directory=${PWD}/$1/$2/
TARGET=sources_$JETPACK_VERSION
[[ -n $3 ]] && TARGET=$3
git -C $PWD/$TARGET/$2 status > /dev/null
if ! git -C $PWD/$TARGET/$2 diff --quiet || ! git -C $PWD/$TARGET/$2 diff --cached --quiet; then
read -p "Repo $PWD/$TARGET/$2 has changes that may disturb applying patches. Continue (y/N)? " confirm
if [[ ! "$confirm" == "y" && ! "$confirm" == "Y" ]]; then
exit 1
fi
fi
ls -Ld ${PWD}/$2/$1
ls -Lw1 ${PWD}/$2/$1
cat ${PWD}/$2/$1/* | patch --quiet -p1 --directory=${PWD}/$TARGET/$2
}

apply_external_patches $1 $D4XX_SRC_DST
if [ -d ${KERNEL_DIR}/${JETPACK_VERSION} ]; then
apply_external_patches $1 $KERNEL_DIR
apply_external_patches $1 $D4XX_SRC_DST $2

if [ -d sources_$JETPACK_VERSION/$KERNEL_DIR ]; then
apply_external_patches $1 $KERNEL_DIR $2
fi
if [[ "$JETPACK_VERSION" == "6.0" ]]; then
apply_external_patches $1 hardware/nvidia/t23x/nv-public

if [[ "$JETPACK_VERSION" == "6.x" ]]; then
apply_external_patches $JETPACK_VERSION hardware/nvidia/t23x/nv-public $2
else
apply_external_patches $1 hardware/nvidia/platform/t19x/galen/kernel-dts
apply_external_patches $1 hardware/nvidia/platform/t19x/galen/kernel-dts $2
fi

# For a common driver for JP4 + JP5 we override the i2c driver and ignore the previous that was created from patches
cp $DEVDIR/kernel/realsense/d4xx.c $DEVDIR/$1/${D4XX_SRC_DST}/drivers/media/i2c/
if [[ "$JETPACK_VERSION" == "6.0" ]]; then
cp $DEVDIR/kernel/realsense/d4xx.c $DEVDIR/sources_$JETPACK_VERSION/${D4XX_SRC_DST}/drivers/media/i2c/
if [[ "$JETPACK_VERSION" == "6.x" ]]; then
# jp6 overlay
cp $DEVDIR/hardware/realsense/tegra234-camera-d4xx-overlay*.dts $DEVDIR/$1/hardware/nvidia/t23x/nv-public/overlay/
cp $DEVDIR/hardware/realsense/tegra234-camera-d4xx-overlay*.dts $DEVDIR/sources_$JETPACK_VERSION/hardware/nvidia/t23x/nv-public/overlay/
else
cp $DEVDIR/hardware/realsense/$JP5_D4XX_DTSI $DEVDIR/$1/hardware/nvidia/platform/t19x/galen/kernel-dts/common/tegra194-camera-d4xx.dtsi
cp $DEVDIR/hardware/realsense/$JP5_D4XX_DTSI $DEVDIR/sources_$JETPACK_VERSION/hardware/nvidia/platform/t19x/galen/kernel-dts/common/tegra194-camera-d4xx.dtsi
fi
Loading