IR Sensor Data Access for Khadas VIM3

Hello everyone,

For research porposes, I’m trying to access raw data originated from the IR receiver (as Android app). I’ve reviewed the documentation but couldn’t find a way to access raw IR sensor data through the provided APIs.
Has anyone done this? Do you think this is possible on this device or does it require API adjustments?

Thank you for your time and assistance.

There are two ways to read raw data on IR Receiver on VIM3:

  1. Turn on the debug switch of ir
echo 1 > /sys/class/remote/amremote/debug_enable

After turning on debug, the serial port using the infrared receiver will print as shown below:


receive scancode=0x1d That israw data

2.Add receive_scancode node for easy reading

xiong@server:/users/xiong/work/amlogic/vim3/vim3_64bit/common$ git show 
commit d0f1f4fb62e0cb9b210897b6816e68b2f78e673d (HEAD -> khadas-vim3-p-64bit)
Author: Xiong Zhang <xiong.zhang@wesion.com>
Date:   2023-09-12 14:23:22 +0800

    IR: Add receive_scancode node to obtain raw data on IR Receiver
    
    Signed-off-by: Xiong Zhang <xiong.zhang@wesion.com>

diff --git a/drivers/amlogic/input/remote/remote_meson.c b/drivers/amlogic/input/remote/remote_meson.c
index 9cc0492cddf0..95c1b5f628fa 100644
--- a/drivers/amlogic/input/remote/remote_meson.c
+++ b/drivers/amlogic/input/remote/remote_meson.c
@@ -344,6 +344,7 @@ static void amlremote_tasklet(unsigned long data)
        if (chip->ir_contr[chip->ir_work].get_decode_status)
                status = chip->ir_contr[chip->ir_work].get_decode_status(chip);
        if (status == REMOTE_NORMAL) {
+               chip->receive_scancode = scancode;  //Assign scancode to the new node variable
                remote_dbg(chip->dev, "receive scancode=0x%x\n", scancode);
                remote_keydown(chip->r_dev, scancode, status);
        } else if (status & REMOTE_REPEAT) {
diff --git a/drivers/amlogic/input/remote/remote_meson.h b/drivers/amlogic/input/remote/remote_meson.h
index aa7538a74582..26aff7f4dc8b 100644
--- a/drivers/amlogic/input/remote/remote_meson.h
+++ b/drivers/amlogic/input/remote/remote_meson.h
@@ -117,6 +117,7 @@ struct remote_chip {
        struct cdev chrdev;
        struct mutex  file_lock;
        spinlock_t slock;
+       int receive_scancode;
 
        bool debug_enable;
        bool repeat_enable;
diff --git a/drivers/amlogic/input/remote/sysfs.c b/drivers/amlogic/input/remote/sysfs.c
index 03e8b887b4a2..4d33bb085bd2 100644
--- a/drivers/amlogic/input/remote/sysfs.c
+++ b/drivers/amlogic/input/remote/sysfs.c
@@ -481,6 +481,13 @@ static ssize_t use_fifo_store(struct device *dev, struct device_attribute *attr,
        return count;
 }
 
+static ssize_t receive_scancode_show(struct device *dev,
+                               struct device_attribute *attr, char *buf)
+{
+       struct remote_chip *chip = dev_get_drvdata(dev);
+       return sprintf(buf, "0x%x\n", chip->receive_scancode);
+}
+
 DEVICE_ATTR_RW(use_fifo);
 DEVICE_ATTR_RO(sum_cnt0);
 DEVICE_ATTR_RO(sum_cnt1);
@@ -494,6 +501,7 @@ DEVICE_ATTR_RW(keymap);
 DEVICE_ATTR_RW(debug_enable);
 DEVICE_ATTR_RW(debug_log);
 DEVICE_ATTR_RO(map_tables);
+DEVICE_ATTR_RO(receive_scancode);
 
 static struct attribute *remote_attrs[] = {
        &dev_attr_protocol.attr,
@@ -509,6 +517,7 @@ static struct attribute *remote_attrs[] = {
        &dev_attr_sum_cnt0.attr,
        &dev_attr_sum_cnt1.attr,
        &dev_attr_use_fifo.attr,
+       &dev_attr_receive_scancode.attr,
        NULL,
 };

Follow the code provided above and rebuild the Android firmware, add the receive_scancode node, and use the following adb command to read it

cat /sys/class/remote/amremote/receive_scancode

as the picture shows:


The displayed 0x1d is raw data

2 Likes

Thank you @xiong.zhang , it’s very helpful.

1 Like