Yzh 发表于 2018-11-28 17:09:01

ROC-RK3308-CC开发实例总结--HC-SR04超声波测距模块调试

本帖最后由 YAo 于 2018-11-28 17:12 编辑

HC-SR04是一款常见的超声波测距传感器,它可以提供2cm-400cm的非接触式测距功能,精度达到3mm,基本可以满足一般测距需求。该款模块的两个IO口,其中trig为触发信号输入,echo为回响信号输出。接下来说说调试方法。
1. dts设备注册
修改 kernel/arch/arm64/boot/dts/rockchip/rk3308-firefly.dtsi 该文件,增加以下资源描述:
sr04_test: sr04_test {
    compatible= "ultrasonic";
    trig-gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
    echo-gpios = <&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>;
    status = "okay";
};
2. 驱动编写,笔者在iio子系统下进行驱动编写,在路径 kernel/drivers/iio/下创建ultrasonic/,参考这款传感器的规格书,下面是部分驱动代码的实现:
信号触发
      
ret = gpio_direction_output(sr04->trig, 0);
      if (ret)
               goto err;
      udelay(2);
      ret = gpio_direction_output(sr04->trig, 1);
      if (ret)
               goto err;
      udelay(15);
      ret = gpio_direction_output(sr04->trig, 0);
      if (ret)
               goto err;
中断处理

static irqreturn_t sr04_handle_irq(int irq, void *data)
{
    struct iio_dev *iio = data;
    struct sr04 *sr04 = iio_priv(iio);

    current_echo_value = gpio_get_value(sr04->echo);
    if (current_echo_value != last_echo_value) {
      if(sr04_flag==0){
            do_gettimeofday(&start);
            sr04_flag = 1;
            last_echo_value = current_echo_value;
      }
      else{
            do_gettimeofday(&end);
            time_lag = (end.tv_usec-start.tv_usec);
            sr04_flag = 0;
            last_echo_value = current_echo_value;
      }
      ev_press = 1;
      wake_up_interruptible(&sr04_waitq);
    }

    return IRQ_HANDLED;
}

完整的驱动文件可见后面附件。


3. 完成驱动代码编写后,分别修改kernel/drivers/iio/Kconfig b/kernel/drivers/iio/Kconfig和kernel/drivers/iio/Makefile b/kernel/drivers/iio/Makefile
<font color="Black">diff --git a/kernel/drivers/iio/Kconfig b/kernel/drivers/iio/Kconfig
index 66792e7..07fdf91 100644
--- a/kernel/drivers/iio/Kconfig
+++ b/kernel/drivers/iio/Kconfig
@@ -53,6 +53,7 @@ source "drivers/iio/dac/Kconfig"
source "drivers/iio/frequency/Kconfig"
source "drivers/iio/gyro/Kconfig"
source "drivers/iio/humidity/Kconfig"
<font color="Red">+source "drivers/iio/ultrasonic/Kconfig"</font>
source "drivers/iio/imu/Kconfig"
source "drivers/iio/light/Kconfig"
source "drivers/iio/magnetometer/Kconfig"
diff --git a/kernel/drivers/iio/Makefile b/kernel/drivers/iio/Makefile
index aeca726..c409a89 100644
--- a/kernel/drivers/iio/Makefile
+++ b/kernel/drivers/iio/Makefile
@@ -19,6 +19,7 @@ obj-y += dac/
obj-y += gyro/
obj-y += frequency/
obj-y += humidity/
<font color="Red">+obj-y += ultrasonic/</font>
obj-y += imu/
obj-y += light/</font>
<font color="Black">cd kernel/
make menuconfig</font>
输入上面的命令,进入图形选择界面,/ 搜索sr04,选择、保存、退出。
--- a/kernel/arch/arm64/configs/firefly-rk3308_linux_defconfig
+++ b/kernel/arch/arm64/configs/firefly-rk3308_linux_defconfig
@@ -251,6 +251,7 @@ CONFIG_IIO=y
CONFIG_IIO_BUFFER=y
CONFIG_IIO_KFIFO_BUF=y
CONFIG_IIO_TRIGGER=y
<font color="Red">+CONFIG_SR04=y</font>
CONFIG_ROCKCHIP_SARADC=y
CONFIG_PWM=y
CONFIG_PWM_ROCKCHIP=y
配置好后,参考官方维基http://wiki.t-firefly.com/ROC-RK ... html#bian-yi-kernel进行编译即可。



编译烧录完成,可以找到我们挂载的设备节点
# cd /sys/bus/iio/devices/iio:device1
# ls
dev   in_temp_input   name   of_node   power   subsystem   uevent




升斗老民 发表于 2018-11-29 22:42:47

我想查看

Hegemony 发表于 2018-12-30 11:26:14

想看代码,怎么办。

qq1715497152 发表于 2019-1-5 15:59:14

学习一下,谢谢分享!

jjaacckk123 发表于 2019-1-11 09:33:45

不错

腾龙 发表于 2019-1-14 08:29:25

{:4_127:}

silver_mirror 发表于 2019-3-26 17:06:46

good!

978651195 发表于 2019-4-16 09:01:13

???

978651195 发表于 2019-4-16 09:03:33

。。。

978651195 发表于 2019-4-16 09:07:11

页: [1] 2
查看完整版本: ROC-RK3308-CC开发实例总结--HC-SR04超声波测距模块调试