目录
lsm6dsl硬件上没接中断管脚,iio驱动修改方法。
方法一
设备树
硬件上并未接中断管脚,设备树配置一没有被使用的GPIO管脚作为中断管脚。
&i2c2 {
status = "okay";
clock-frequency = <400000>;
lsm6dsl: lsm6dsl@6b {
status = "okay";
compatible = "st,lsm6dsl";
reg = <0x6b>;
interrupt-parent = <&gpio0>;
interrupts = <30 IRQ_TYPE_EDGE_RISING>;
};
};
否则st_lsm6dsx_fifo_setup不会被调用。不会出现/sys/bus/iio/devices/iio\:device1/buffer目录。
844 if (hw->irq > 0) {
845 err = st_lsm6dsx_fifo_setup(hw);
846 if (err < 0)
847 return err;
848 }
代码修改
由于没有连接中断管脚,增加内核线程来采集数据。
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
@@ -161,6 +161,7 @@ struct st_lsm6dsx_hw {
struct iio_dev *iio_devs[ST_LSM6DSX_ID_MAX];
const struct st_lsm6dsx_settings *settings;
+ struct task_struct *task;
};
extern const struct dev_pm_ops st_lsm6dsx_pm_ops;
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c
@@ -32,6 +32,7 @@
#include <linux/iio/buffer.h>
#include <linux/regmap.h>
#include <linux/bitfield.h>
+#include <