平台:展锐T760 系统:Ubuntu18.04 接近传感器同处理器i2c连接
背景:在Ubuntu18.04开机时刻将存储在prodnv分区中校准文件加载到驱动对应的节点,满足传感器功能需求
1.编写Unit配置文件
路径:/rootfs/lib/systemd/system/sensor_calidata_init.service
内容:
[Unit]
Description=sensor cali data init
[Service]
ExecStart=/usr/bin/sensor_calidata_init.sh
Type=oneshot
[Install]
WantedBy=multi-user.target
以上关键字意义在上篇博客中已经说明,这里主要说明开机加载的脚本文件
2.添加一个链接文件
在etc/systemd/system/multi-user.target.wants/路径下执行:
ln -s sensor_calidata_init.service /lib/systemd/system/sensor_calidata_init.service
不链接,开机不会去执行该服务。添加链接服务:
将链接后的文件保存到根文件系统/etc/systemd/system/multi-user.target.wants/路径下。
路径:/etc/systemd/system/multi-user.target.wants/sensor_calidata_init.service
内容:
/lib/systemd/system/sensor_calidata_init.service
添加链接文件等同于:systemctl enable sensor_calidata_init.service
3.开机执行的脚本文件
说明:读取/etc/productinfo/ps_cali_data中依次将值写入节点中。
内容:
#!/bin/bash
LOG_FILE_PATH="/var/log/sensor_cali_data_init.txt"
sudo sh -c "echo '' > $LOG_FILE_PATH"
sudo chmod 666 $LOG_FILE_PATH
num=1
IIO_DEVICE="/sys/bus/iio/devices/iio:device"
SENSOR_CALI_FILE="/etc/productinfo/ps_cali_data"
DEVICE_ID=-1
logger()
{
local TIME_NOW=`date`
echo "[sensor cali data][$TIME_NOW]$*" >> $LOG_FILE_PATH
}
# 检查校准文件或驱动节点是否存在
function check_existence() {
local path="$1"
if [ -e "$path" ]; then
return 0 # 存在
else
return 1 # 不存在
fi
}
function process_calibration_data() {
while IFS='=' read -r key value; do
case "$key" in
unblock)
echo "$value" > "$PS_CALI_UNLOCK"
;;
far)
echo "$value" > "$PS_CALI_FAR"
;;
near)
echo "$value" > "$PS_CALI_NEAR"
;;
esac
done < "$SENSOR_CALI_FILE"
logger "____sensor cali read data success ...."
}
logger "____start sensor cali data init ...."
while [[ "num" -eq 1 ]];
do
sleep 2
# 查询接近传感器设备编号
for (( i=0; i<3; i++ ))
do
sname=`cat $IIO_DEVICE$i/"name"`
if [ "$sname" == "ltr569" ];then
DEVICE_ID=$i
logger "____read proximity iio:device number $i ...."
break;
fi
done
if [ $DEVICE_ID == -1 ];then
logger "____read proximity iio:device number fail ...."
num=0
continue
fi
PS_CALI_UNLOCK="$IIO_DEVICE$DEVICE_ID/ps_cali_unblock"
PS_CALI_FAR="$IIO_DEVICE$DEVICE_ID/ps_cali_far"
PS_CALI_NEAR="$IIO_DEVICE$DEVICE_ID/ps_cali_near"
logger "____start sensor cali data enter ...."
# 检查所有文件节点是否存在
if check_existence "$SENSOR_CALI_FILE" && check_existence "$PS_CALI_UNLOCK" \
&& check_existence "$PS_CALI_FAR" && check_existence "$PS_CALI_NEAR"; then
# 向传感器节点写入校准数据
process_calibration_data
else
logger "____sensor cali data file or sensor cali node not exist ...."
fi
num=0
done
logger "____start sensor cali data end ...."
4.开机调试需要经常用到的指令
$ sudo systemctl start apache.service
# 立即停止一个服务
$ sudo systemctl stop apache.service
# 重启一个服务
$ sudo systemctl restart apache.service
# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service
# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service
# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload