天天看點

ROC-RK3308-CC開發執行個體總結--HC-SR04超音波測距子產品調試

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[sr04->number] = gpio_get_value(sr04->echo);
    if (current_echo_value[sr04->number] != last_echo_value[sr04->number]) {
      if(sr04_flag[sr04->number]==0){
            do_gettimeofday(&start[sr04->number]);
            sr04_flag[sr04->number] = 1;
            last_echo_value[sr04->number] = current_echo_value[sr04->number];
      }
      else{
            do_gettimeofday(&end[sr04->number]);
            time_lag[sr04->number] = (end[sr04->number].tv_usec-start[sr04->number].tv_usec);
            sr04_flag[sr04->number] = 0;
            last_echo_value[sr04->number] = current_echo_value[sr04->number];
      }
      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
           

進入Firefly開發者社群,可下載下傳驅動檔案。

———————————————

更多資訊請關注Firefly公衆微信号fireflytee:

ROC-RK3308-CC開發執行個體總結--HC-SR04超音波測距子產品調試

———————————————

Firefly官網:http://www.t-firefly.com

Firefly開源社群:http://developer.t-firefly.com