第一步修改设备树
kernel/arch/arm64/boot/dts/hobot/x5-rdk-v1p0.dts添加(spi1也可以 经过验证)
&spi2 {-
status = “okay”;-
pinctrl-names = “default”;-
pinctrl-0 = <&pinctrl_spi2>;-
dma-names = “tx”, “rx”;-
dmas = <&axi_dmac 25>, <&axi_dmac 24>;-
inv-icm42600@0 {-
compatible = “invensense,icm42688”;-
reg = <0>;-
spi-max-frequency = <32000000>;-
spi-cpha;-
spi-cpol;-
interrupt-parent = <&ls_gpio0_porta>;-
interrupts = <10 IRQ_TYPE_EDGE_FALLING>;-
// vdd-supply = <&vdd>;-
// vddio-supply = <&vddio>;-
pinctrl-names = “default”;-
pinctrl-0 = <&lsio_gpio1_10>;-
};-
};-
中断引脚 pwm3修改为-
&pwm3 {-
/* LSIO_PWM_OUT6 and LSIO_PWM_OUT7 */-
status = “disabled”;-
pinctrl-names = “default”;-
pinctrl-0 = <&pinctrl_pwm3_0 &pinctrl_pwm3_1>;-
};
kernel/arch/arm64/boot/dts/hobot/x5.dtsi下spi2修改为
spi2: spi@34020000 {-
compatible = “horizon,dwc-ssi-1.01a”;-
status = “disabled”;-
reg = <0x34020000 0x10000>;-
syscon-spi-cs = <&lsio_sys_con 0x120>;-
cs-bit-offset = <0>;-
clocks = <&hpsclks X5_LSIO_SPI2_CLK>;-
interrupt-parent = <&gic>;-
interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;-
num-cs = <1>;-
reg-io-width = <4>;-
#address-cells = <1>;-
#size-cells = <0>;-
resets = <&socrst LSIO_SPI2_RESET>;-
reset-names = “spi”;-
pinctrl-names = “default”;-
pinctrl-0 = <&pinctrl_spi2>;-
// spidev@0 {-
// compatible = “dr,x5-spidev”;-
// spi-max-frequency = <32000000>;-
// reg = <0>;-
// };-
};
第二步添加驱动,感谢iio
./mk_kernel.sh menuconfig打开配置
按/搜索icm42600
按照搜索到的目录 更改相关配置 y编译到内核 M编译成模块实验选M就行
第三步编译
sudo ./mk_kernel.sh
第四步拷贝
如果编译到内核需要编译镜像,刷镜像
如果编译成模块
拷贝设备树 scp ./deploy/kernel/dtb/* root@192.168.2.237:/boot/hobot/
拷贝.ko文件,然后insmod
第五步 验证
编译到内核的重启
dmesg |grep icm
[ 3.257705] SPI driver inv-icm42600-spi has no spi_device_id for invensense,icm42600
[ 3.265484] SPI driver inv-icm42600-spi has no spi_device_id for invensense,icm42602
[ 3.273238] SPI driver inv-icm42600-spi has no spi_device_id for invensense,icm42605
[ 3.281067] SPI driver inv-icm42600-spi has no spi_device_id for invensense,icm42622
[ 3.288832] SPI driver inv-icm42600-spi has no spi_device_id for invensense,icm40608
[ 3.296596] SPI driver inv-icm42600-spi has no spi_device_id for invensense,icm42688
[ 3.304358] SPI driver inv-icm42600-spi has no spi_device_id for invensense,icm42652
[ 3.312312] inv-icm42600-spi spi2.0: mounting matrix not found: using identity…
[ 3.319822] inv-icm42600-spi spi2.0: Looking up vdd-supply from device tree
[ 3.326812] inv-icm42600-spi spi2.0: Looking up vdd-supply property in node /soc/a55_apb0/spi@34020000/inv-icm42600@0 failed
[ 3.338070] inv-icm42600-spi spi2.0: supply vdd not found, using dummy regulator
[ 3.345562] inv-icm42600-spi spi2.0: Looking up vddio-supply from device tree
[ 3.352710] inv-icm42600-spi spi2.0: Looking up vddio-supply property in node /soc/a55_apb0/spi@34020000/inv-icm42600@0 failed
[ 3.364123] inv-icm42600-spi spi2.0: supply vddio not found, using dummy regulator
[ 3.526696] inv-icm42600-spi spi2.0: timestamp is DATA_RDY_INT time
两个failed无所谓 可能是低功耗 电源控制等
watch cat /sys/bus/spi/drivers/inv-icm42600-spi/spi2.0/iio\:device1/in_accel_x_raw
查看数据
中断引脚35号,其余对应spi2就可以
总结,修改spi设备树的例程不详细,改了很长时间5x-rdk.dts的设备树,一直不生效。
设备树需要交叉编译,这个完全没有必要,x5上有gcc和dtc,差个脚本的事。
x5.dtsi中spi2下有一个默认的设备,使更改的不生效。
总结下iio,驱动挺全的,驱动的功能也挺全的,而且有流和event事件的功能 推荐使用
下一步适配到ros2,ros2有imu的controller,适配过去就行


