跳转至

触摸屏与光传感器笔记

触摸屏获取不到真实光传感器的值

for d in /sys/bus/iio/devices/iio:device*; do
    echo "=== $d ==="
    cat "$d/name" 2>/dev/null
    ls "$d" | grep -E 'illuminance|light|lux'
done
=== /sys/bus/iio/devices/iio:device0 ===
fe720000.saradc
=== /sys/bus/iio/devices/iio:device1 ===
mpu6050
=== /sys/bus/iio/devices/iio:device2 ===
bh1750
in_illuminance_integration_time
in_illuminance_raw
in_illuminance_scale

WSL系统下

hyl@HYL:/tmp$ # 查看动态库依赖及搜索路径
readelf -d rk356x-demo | grep -E "NEEDED|RUNPATH|RPATH"
 0x00000001 (NEEDED)                     Shared library: [liblvgl.so]
 0x00000001 (NEEDED)                     Shared library: [libpthread.so.0]
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]

获取读取路径

hyl@HYL:/tmp$ strings rk356x-demo | grep -iE 'als|light|lux|proximity|illuminance|iio|/sys/|/dev/'
/dev/fb0
/dev/input/event6
Backlight
LightSensor
/sys/class/gpio/gpio120/value
/sys/class/gpio/gpio121/value
/sys/class/gpio/gpio123/value
/sys/class/gpio/gpio124/value
/sys/class/gpio/export
/sys/class/gpio/gpio120/direction
/sys/class/gpio/gpio121/direction
/sys/class/gpio/gpio123/direction
/sys/class/gpio/gpio124/direction
/sys/class/gpio/gpio111/value
/sys/class/gpio/gpio111/direction
/sys/class/backlight/backlight/brightness
/dev/input/event3
/dev/input/event0
/sys/devices/iio:device2/in_illuminance_raw
/sys/bus/iio/devices/iio:device0/in_voltage6_raw
/sys/bus/iio/devices/iio:device1/in_accel_x_raw
/sys/bus/iio/devices/iio:device1/in_accel_y_raw
/sys/bus/iio/devices/iio:device1/in_accel_z_raw
/sys/bus/iio/devices/iio:device1/in_anglvel_x_raw
/sys/bus/iio/devices/iio:device1/in_anglvel_y_raw
/sys/bus/iio/devices/iio:device1/in_anglvel_z_raw
/dev/ttyS0
/dev/ttyS1
/dev/ttyS3
/dev/ttyS4
killall bluealsa-aplay
killall bluealsa
echo 0 > /sys/class/rfkill/rfkill0/state
echo 1 > /sys/class/rfkill/rfkill0/state
rtk_hciattach -n -s 115200 /dev/ttyS8 rtk_h5 &
bluealsa --profile=a2dp-sink &
bluealsa-aplay --profile-a2dp 00:00:00:00:00:00 &
/sys/devices/platform/fe5b0000.i2c/i2c-2/2-0050/eeprom
/sys/devices/iio:device2/in_illuminance_raw

真实获取光传感器的值

[root@RK356X:/]# cat /sys/bus/iio/devices/iio:device2/in_illuminance_raw
478

因为 /sys/class/ 是内核动态生成的目录树,不允许用户直接在里面创建新的子目录(即使是 root 也不行)。这是内核文件系统的保护机制。

✅ 替代方案:把软链接创建到可写目录

你完全可以把链接放在 /tmp/var/run/root 下,这些目录可写,而且重启后可以通过启动脚本重新创建。

临时创建(立即生效)

ln -s /sys/bus/iio/devices/iio:device2/in_illuminance_raw /tmp/light
cat /tmp/light   # 测试

永久创建(开机自动重建)

方法一:在 /etc/rc.local 中添加(确保 /etc/rc.local 可执行)

#!/bin/sh
ln -sf /sys/bus/iio/devices/iio:device2/in_illuminance_raw /tmp/light
exit 0

方法二:创建一个 systemd 服务(更可靠) 创建 /etc/systemd/system/light-sensor-link.service

[Unit]
Description=Create symlink for light sensor
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/bin/ln -sf /sys/bus/iio/devices/iio:device2/in_illuminance_raw /tmp/light
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

然后启用:

systemctl enable light-sensor-link.service
systemctl start light-sensor-link.service

这样每次开机都会在 /tmp/light 创建软链接,你也可以把路径改成 /var/run/light

📌 如果不依赖链接,更简单的方法

  1. 环境变量

    export LIGHT_SENSOR=/sys/bus/iio/devices/iio:device2/in_illuminance_raw
    
    之后 cat $LIGHT_SENSOR 即可。

  2. 别名(在 ~/.bashrc 中加入):

    alias light='cat /sys/bus/iio/devices/iio:device2/in_illuminance_raw'
    

  3. 直接使用原路径,写个短脚本包装一下。

推荐使用 systemd 服务或 /etc/rc.local 创建软链接,这样既干净又符合你的预期。