功能:应用层去访问驱动给的一个设备节点
1、在init.uis8581a2h10.rc文件中添加该设备的权限
on post-fs-data
setprop fpga.target.enable 1
setprop debug.delaytime.min 10
setprop debug.delaytime.mid 100
setprop debug.delaytime.max 1000
setprop debug.android_watchdog.disable 1
chmod 666 /sys/devices/virtual/power_state
chmod 666 /sys/devices/virtual/tunetoch
验证是否添加成功:
整编译软件在out目录下面搜索该文件:find -name init.uis8581a2h10.rc,如果该文件中存在添加加节点的代码,那就说明添加成功了
2、应用层向该设备节点写入值
public static final String FM_POWER_PATH = "/sys/devices/virtual/power_state";
public static final String FM_TUNETOCH_PATH = "/sys/devices/virtual/tunetoch";
private void setFmOn() {
String frequency = getFmFrequency();
if(DEBUG) Log.i(TAG, "setFmOn() frequency = " + frequency);
try {
Writer fm_tunetoch = new FileWriter(FM_TUNETOCH_PATH);
fm_tunetoch.write(frequency);
fm_tunetoch.flush();
fm_tunetoch.close();
if (!isFmOn()) {
Writer fm_power = new FileWriter(FM_POWER_PATH);
fm_power.write(FM_ON);
fm_power.flush();
fm_power.close();
}
} catch (IOException e) {
Log.i(TAG, "setFmOn() IOException e = "+e.getMessage());
e.printStackTrace();
}
}
}
这样写入值出现问题点如下:
应用层往设备节点写值出现了没有权限问题,日志如下
IOException e = /sys/devices/virtual/tunetoch: open failed: EACCES (Permission denied)
解决方法:
方法1、关闭selinux
方法2、添加权限
代码路径:
device/sprd/sharkl3/common/sepolicy/platform_app.te
device/sprd/sharkl3/common/sepolicy/file.te
device/sprd/sharkl3/common/sepolicy/file_contexts
在platform_app.te文件中添加如下
allow platform_app sysfs_fm:file {getattr open write read};
在file.te文件添加自己自定义的文件名,并给予文件类型
type sysfs_fm, fs_type,sysfs_type;
在file_contexts文件中让代码中的节点与自定义文件名关联 [u:object_r表示当前用户 s0表示等级,最低权限等级]
/sys/devices/virtual//power_state u:object_r:sysfs_fm:s0 /sys/devices/virtual//tunetoch u:object_r:sysfs_fm:s0
备注说明:在添加权限过程中,缺什么权限就补什么权限



