Table of content:
Compile NanoPi linux kernel with MPU9250 module
As of may 2020, only the official NanoPi kernel supports NanoPi Neo4 GPU and VPU.
The downside is this kernel does not include inv-mpu6050 that supports the MPU9250,
so we are going to compile the kernel with this module.
inv-mpu6050 is part of Linux Industrial I/O (IIO) subsystem driver
that provides an unified framework for sensors.
Learn more about IIO on the official Linux Kernel documentation.
Install an ARM64 toolchain and download NanoPi kernel source code,
sudo apt install build-essential gcc-aarch64-linux-gnu gcc-arm-none-eabi
git clone https://github.com/friendlyarm/kernel-rockchip --depth 1 -b nanopi4-linux-v4.4.y
cd kernel-rockchip
Load NanoPi Linux configuration, make ARCH=arm64 nanopi4_linux_defconfig.
Add MPU9250 module, make ARCH=arm64 menuconfig then
Device drivers > Industrial I/O support > Inertial measurement units > <*> Invensense MPU6050 devices.
Add the MPU9250 to the board device-tree, edit arch/arm64/boot/dts/rockchip/rk3399-nanopi4-common.dtsi
and change:
&i2c2 {
status = "okay";
mpu9250@68 {
//compatible = "invensense,mpu9250"; // requires Linux 4.12
compatible = "invensense,mpu6050";
reg = <0x68>;
interrupt-parent = <&gpio1>;
interrupts = <0 IRQ_TYPE_LEVEL_HIGH>;
/* Commented because requires Linux 4.12
i2c-gate {
#address-cells = <1>;
#size-cells = <0>;
ax8975@c {
compatible = "ak,ak8975";
reg = <0x0c>;
};
};*/
};
};
Compile with make ARCH=arm64 nanopi4-images.
This will generate kernel.img and resource.img files.
Note
You may need to change CONFIG_CROSS_COMPILE="aarch64-linux-gnu-" in .config
to point to the correct cross-compilation toolchain.
Note
You can directly update the running kernel without reflashing rootfs with
sudo dd if=kernel.img of=/dev/mmcblk1p5 and sudo dd if=resource.img of=/dev/mmcblk1p4.
Please use with caution, you may brick your device!
Install modified FriendlyCore
FriendlyCore uses an overlay filesystem, so removing software such as xorg after the flashing is useless.
Download FriendlyCore from http://download.friendlyarm.com/NanoPiNEO4.
At the time of wrtting this tutorial, it was rk3399-eflasher-friendlycore-bionic-4.4-arm64-20200409.img.
Dump image on a SD Card (at least 8GB), dd if=rk3399-eflasher...img of=/dev/mmcblk0 status=progress.
Remplace friendlycore-arm64/kernel.img and friendlycore-arm64/resource.img files on the SD card
with those generated in the previous section.

Boot and install FriendlyCore with screen and keyboard attached, then reboot without SD card.
Run npi-config and change user password and enable SSH access.
Disable PWM Fan service, udisk, polkit, Bluetooth and ModemManager,
sudo systemctl disable pwm-fan udisks2 polkit bluetooth ModemManager.
Also block Bluetooth sudo rfkill block 0.
Edit /etc/rc.local to:
#!/bin/sh -e
exit 0
Add Hotspot WiFi network,
sudo nmcli dev wifi hotspot ifname wlan0 ssid Hexapod password "tfpopcorns"
sudo nmcli connection modify Hotspot autoconnect yes
sudo nmcli connection up Hotspot
Reboot and connect to WiFi “Hexapod” with password “tfpopcorns”,
then ssh pi@10.42.0.1.
Note
You can plug wired Internet access and NetworkManager will automatically use and share this connection.
Test the MPU9250
The iio kernel driver makes the MPU9250 available in
/sys/bus/iio/devices/iio:device1 and /dev/iio:device1.
You can get the X-axis acceleration with
cat "/sys/bus/iio/devices/iio:device1/in_accel_x_raw"
Then you can try to stream a accelerometer axis,
echo 1 > "/sys/bus/iio/devices/iio:device1/scan_elements/in_accel_x_en"
echo 1 > "/sys/bus/iio/devices/iio:device1/buffer/enable"
hexdump -C /dev/iio\:device1
