(Qualcomm Snapdragon 625) is an SoC widely used in mobile devices and embedded systems
. Driving this hardware requires distinct approaches depending on whether you are working with official vendor (downstream) kernels or modern open-source (mainline) Linux. Key Driver Categories for MSM8953
Development for MSM8953 drivers typically falls into three main buckets: Mainline Kernel Support : Community efforts like the msm8953-mainline GitHub
provide work-in-progress patches for running standard Linux kernels on Snapdragon 625 devices. PostmarketOS Drivers : This project maintains Snapdragon 625 driver status
, tracking support for critical components like GPU (Adreno 506), Audio (Cajon-v2), and the Venus video encoder/decoder. Android Downstream Drivers
: These are the original vendor drivers found in repositories like Xiaomi MSM8953 Android kernel sources msm8953 for arm64 driver
. They offer full hardware support but are often tied to older kernel versions (e.g., 3.18 or 4.9). Building ARM64 Drivers
Compiling drivers for the MSM8953 platform requires an ARM64-capable toolchain and a specific environment setup. msm8953-mainline - GitHub
/
compatible = "qcom,msm8953";
soc
compatible = "qcom,msm8953-soc";
reg = <0x0 0x...>;
clocks = <&gcc ...>;
;
kgsl@...
compatible = "qcom,kgsl";
reg = <...>;
interrupt-parent = <&msm_gic>;
;
mdss@... /* display controller */ ;
mdss_panel@0 compatible = "manufacturer,panel-model"; /* timing */ ;
;
The Image Signal Processor (ISP) on MSM8953 is the most painful driver for ARM64. Qualcomm’s camera HAL (mm-camera) is a monolithic user-space blob that expects 32-bit pointers.
camera.msm8953.so) is 32-bit. On a 64-bit system, you cannot directly load it.libcamera (emerging, but immature for MSM8953)cameraserver process (requires SELinux adjustments)camx (Camera eXtension) HAL from SDM660 – partially possible but time-consuming.Let’s demonstrate a simple virtual character driver for MSM8953 on ARM64. This logs the CPU architecture at insmod time.
// msm8953_arm64_dummy.c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h>static int __init dummy_init(void) #ifdef CONFIG_ARM64 pr_info("MSM8953 ARM64 driver loaded on 64-bit kernel\n"); #else pr_info("MSM8953 driver loaded on non-ARM64 kernel (check config)\n"); #endif return 0; (Qualcomm Snapdragon 625) is an SoC widely used
static void __exit dummy_exit(void) pr_info("MSM8953 ARM64 driver unloaded\n");
module_init(dummy_init); module_exit(dummy_exit); MODULE_LICENSE("GPL");
Makefile for ARM64 cross-compilation:
obj-m += msm8953_arm64_dummy.oKERNELDIR ?= ~/android/kernel/msm-4.9 CROSS_COMPILE := aarch64-linux-android- CC := $(CROSS_COMPILE)gcc Mainline Linux historically lags in full MSM support;
all: make -C $(KERNELDIR) M=$(PWD) ARCH=arm64 modules clean: make -C $(KERNELDIR) M=$(PWD) ARCH=arm64 clean
Build and test on an MSM8953 device running an ARM64 kernel.
Add these config flags to your defconfig:
CONFIG_ARM64=y
CONFIG_COMPAT=y # Enables 32-bit userspace compatibility
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
The COMPAT flag allows 32-bit drivers to communicate with 64-bit kernel via ioctl wrappers.