Android通过rc文件控制GPIO口启动车载功放

自制的车载导航连接到功放,在系统启动期间,主板未初始化完成,音频口输出的噪音直接输出到功放上,非常影响感知,解决的方法就是在系统启动完成后再开启功放。

因为车载功放是带启动端口(REM)的,只要给这个端口12V供电,就可以开启功放。所以在系统启动完成后,通过主板的GPIO口控制继电器闭合,给功放的控制口加12V电压,启动功放,就可以解决启动过程中的噪声问题了。

Android通过rc文件控制GPIO口启动车载功放

所用的开源主板带的安卓系统底层已经有GPIO驱动了,所需要作的就是编写脚本控制系统在系统启动完成后将指定的GPIO口电平从0变成1就好了。

我用的主板是Orange Pi 4(RK3399芯片),Android 8.1系统。

大致步骤如下:

1.编写GPIO口控制脚本,命名为setup_gpio.sh

#!/system/bin/sh 
echo 33 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio33/direction
echo 1 > /sys/class/gpio/gpio33/value

上面33号GPIO口对应我的主板是GPIO1_A1,用跳线接到继电器的输入口。

2.编写rc文件

修改device/rockchip/common/init.rockchip.rc,在末尾添加如下脚本:

on property:sys.boot_completed=1  
	chmod 0777 /system/vendor/bin/setup_gpio.sh
	start init_gpio_33

#init gpio33
service init_gpio_33 /system/vendor/bin/setup_gpio.sh
    user root
    group root
    disabled
    oneshot
	seclabel u:r:init_gpio_33:s0

把setup_gpio.sh作为一个服务,并且在系统启动完成后(sys.boot_completed=1),启动这个服务,执行setup_gpio.sh这个脚本

3.编写selinux安全策略

(1)在system/sepolicy/vendor/file_contexts文件中添加一行:

/(vendor|system/vendor)/bin/init_gpio_33 u:object_r:init_gpio_33_exec:s0

(2)在system/sepolicy/vendor/文件夹下添加init_gpio_33.te文件:

type init_gpio_33, domain;
type init_gpio_33_exec,exec_type,file_type,vendor_file_type;

init_daemon_domain(init_gpio_33)

allow init_gpio_33 self:capability { dac_override};
allow init_gpio_33 shell_exec:file { getattr read};
allow init_gpio_33 sysfs:file { open write};

4.修改板配置文件:device/rockchip/rk3399/rk3399_mid/BoardConfig.mk,添加一行:

PRODUCT_COPY_FILES += device/rockchip/rk3399/rk3399_mid/setup_gpio.sh:vendor/bin/setup_gpio.sh

安装系统的时候自动复制setup_gpio.sh脚本文件到目标目录下。

经过上述步骤后,重新编译一次系统,等系统启动完成后,继电器闭合,启动功放,问题完美解决。

上一篇:【CF702F】T-Shirts


下一篇:ES8对对象的扩展