Other issue

Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.


What should I do if the device becomes excessively hot?

Confirm whether the temperature is actually too high

Run the following command to obtain the current device temperature:

qpi-config dump temperature

If the temperature exceeds 80 °C, take cooling measures immediately.

Identify the heat source

Check CPU utilization and frequency:

# Check CPU utilization.
top -b -n 1 | head -20

# Check the operating frequency of each CPU core to determine whether it remains at the maximum frequency.
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq

# Check whether the performance governor is enabled.
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

Check GPU utilization:

cat /sys/class/kgsl/kgsl-3d0/gpu_busy_percentage 2>/dev/null
cat /sys/class/kgsl/kgsl-3d0/max_gpuclk 2>/dev/null

Check storage utilization:

iostat -x 1 3   # Display %util.

Software cooling measures

Reduce the maximum CPU frequency:

# Display available frequencies.
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies

# Set the maximum frequency, for example, to 1.6 GHz.
echo 1651200 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

Switch the CPU governor to schedutil:

echo schedutil > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Reduce the maximum GPU frequency:

# Display available frequencies.
cat /sys/class/kgsl/kgsl-3d0/devfreq/available_frequencies

# Set the maximum frequency, for example, to 550 MHz.
echo 550000000 > /sys/class/kgsl/kgsl-3d0/devfreq/max_freq

Check for processes with abnormal CPU usage:

ps aux --sort=-%cpu | head -10

Physical cooling measures

  • Place the development board in a well-ventilated environment.

  • Install an active cooling module. The fan should increase its speed automatically when the device temperature exceeds the configured threshold.

What should I do if a library does not work correctly?

Identify and classify the issue

  • Link error: The compiler reports cannot find -lxxx, or the error cannot open shared object file occurs at runtime.

  • Runtime crash: The application reports undefined symbol: xxx or triggers a Segmentation fault.

  • Functional error: The library loads successfully, but a specific API does not respond or returns an unexpected error code.

Check whether the library file exists and verify the library search path

# 1. Locate the library.
find /usr/lib /usr/local/lib /lib -name "libxxx.so*"

# 2. Check whether the dynamic linker recognizes the library.
ldconfig -p | grep libxxx

# 3. Check whether LD_LIBRARY_PATH contains the directory.
echo $LD_LIBRARY_PATH

If the library is in a nonstandard directory, set LD_LIBRARY_PATH, or add the directory to a configuration file under /etc/ld.so.conf.d/ and run ldconfig to update the cache.

Check dependencies to resolve undefined symbols

# List the library dependencies (safer than ldd because it does not execute code).
readelf -d /path/to/libxxx.so | grep NEEDED

# Check whether a symbol is defined in the library.
nm -D /path/to/libxxx.so | grep "  T " | grep symbol_name

# Alternatively:
readelf -s /path/to/libxxx.so | grep symbol_name

An undefined symbol usually indicates a library version mismatch or a missing dependency. If the symbol exists but the application still reports an error, the cause may be link order or ABI incompatibility.

Check library version and ABI compatibility

# Display the embedded library version string.
strings /path/to/libxxx.so | grep -i version

# Display the library SONAME.
readelf -d /path/to/libxxx.so | grep SONAME

If the application was linked against libxxx.so.1 but only libxxx.so.2 is installed, an ABI change may cause a runtime crash even if the required symbol exists. A symbolic link, such as ln -s libxxx.so.2 libxxx.so.1, can be used as a temporary workaround. For a long-term solution, rebuild the application or install a compatible library version.

Trace dynamic loading at runtime

# 1. Display the libraries loaded by the dynamic linker.
LD_DEBUG=libs ./your_app 2>&1 | grep libxxx

# 2. Trace attempts to open library files.
strace -e openat,open ./your_app 2>&1 | grep libxxx

# 3. If the application crashes immediately, inspect it with gdb.
gdb ./your_app
(gdb) run
(gdb) bt   # Display the call stack after the crash.

How can I update a third-party driver?

  1. Obtain the official SDK. See Image Build for download instructions.

  2. Add the third-party driver source code under sources/quectel-src/kernel.

  3. Add the device tree node for the peripheral to sources/quectel-src/kernel/qcom-6.6/arch/arm64/boot/dts/qcom/qcs6490-idp-pi.dts.

  4. Build and flash the image, and then verify the driver.

What should I do if system performance is poor?

Poor performance is usually caused by a combination of CPU scheduling, memory pressure, storage I/O, thermal throttling, and software configuration.

Identify the bottleneck

# 1. Display the 1-, 5-, and 15-minute load averages.
uptime
# A sustained load average greater than the number of CPU cores indicates CPU pressure.

# 2. Display per-core CPU utilization by category (user, system, soft interrupt, and idle).
mpstat -P ALL 1 3

# 3. Display memory and swap usage.
free -h
# Less than 10% available memory with nonzero swap usage indicates memory pressure.

# 4. Check storage I/O. A %util value near 100% indicates a storage bottleneck.
iostat -x 1 3

# 5. Check temperature and CPU frequency for thermal throttling.
qpi-config dump temperature
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

Interpret the key metrics as follows:

  • High %us: CPU-intensive user-space workload.

  • High %sy: Excessive system call or driver overhead.

  • High %wa: Storage I/O bottleneck.

  • High %si: Excessive software interrupts.

  • Temperature above 80 °C: Potential thermal throttling.

  • Very little available memory in free -h: Memory pressure.

Apply targeted optimization

CPU bottleneck (%us or %sy consistently above 60%)

  • Identify the processes with the highest CPU utilization.

  • Reduce the load generated by cameras and other peripherals.

  • Increase the real-time priority of critical threads, for example, by adjusting the scheduling policy.

Memory bottleneck (very low available memory and nonzero swap usage)

  • Identify the ten processes with the highest memory usage.

  • Remove unnecessary log files.

  • Check for DMA-BUF or ION memory leaks.

Storage I/O bottleneck (%util in iostat close to 100%)

  • Identify the processes generating the most write I/O.

  • Reduce unnecessary log writes.

  • Check for processes that write files too frequently.

Thermal throttling (frequency reduction caused by high temperature)

  • Confirm whether the system has triggered frequency throttling.

  • Apply active physical or software cooling measures.

How can I configure a service to start at boot?

systemd is the standard init system used by most mainstream Linux distributions, including Yocto-based systems. It provides dependency management, automatic restart, and environment variable configuration.

Create a service unit file

Create a .service file under /etc/systemd/system/, for example, my-camera.service:

[Unit]
Description=My Camera Service
After=network.target   # Start after the network is available.

[Service]
Type=simple            # Other types include forking and oneshot.
ExecStart=/usr/bin/my_script.sh
Restart=on-failure     # Restart automatically after a failure.
User=root              # Run as root.
WorkingDirectory=/opt/my_app

[Install]
WantedBy=multi-user.target   # Start when the system enters multi-user mode.

Enable and start the service

# Reload the systemd configuration.
sudo systemctl daemon-reload

# Enable the service at boot.
sudo systemctl enable my-camera.service

# Start the service immediately, if required.
sudo systemctl start my-camera.service

# Display the service status.
sudo systemctl status my-camera.service

How can I install a third-party driver?

  1. Obtain the driver module: Obtain the third-party driver source code and cross-compile it in an environment that matches the development board’s kernel version to generate a .ko module.

  2. Transfer the driver module: Transfer the compiled .ko file to the development board through scp, adb, or a USB flash drive.

  3. Load and unload the driver:

Load the driver with insmod:

insmod your_driver.ko

Unload the driver with rmmod:

rmmod your_driver

Run lsmod to list all loaded modules:

lsmod

What should I do if no solution is available?

  1. Visit the Quectel FAQ page.

  2. Ask a question on the Quectel Developer Forum.