背景介绍:
做系统工程师的,经常会遇到协同开发,驱动同事开发完成后,会给我设备节点,刚好公司新研发了一个项目,我需要在工程模式中开发一个蜂鸣器测试项。
一、蜂鸣器节点
驱动同事给了我蜂鸣器节点:/dev/input/event2 ,我们在adb shell中可以查看到event2的属性
root@yzm7330p0:/ # getevent
add device 1: /dev/input/event2
name: "pwm-beeper"
add device 2: /dev/input/event0
name: "comip-gpio-keys"
add device 3: /dev/input/event3
name: "comip_snd_soc Headset"
add device 4: /dev/input/event1
name: "comip-powerkey"
Android可以使用sendevent来模拟触屏,键盘以及其他类型的event事件,
sendevent /dev/input/eventX type code value
/dev/input/eventX 对应一个event设备,可以通过getevent获得可用的event设备
type, code, value的定义可参看kernel/include/Linux/input.h
type如下定义
格式为 device: type code value,即 设备、输入设备类型、按键扫描码、附加码,具体定义可从kernel/include/linux/input.h中获得,至于这个头文件,途径之一是从google官网源码中获取:
type: 输入设备类型,在手机系统中经常使用的键盘(keyboard)和小键盘(kaypad)属于按键设
备EV_KEY,轨迹球属于相对设备EV_REL,触摸屏属于绝对设备EV_ABS
code: 按键扫描码,区别于ASCII码和SDK中KeyEvent的键码
value: 附加码,1/0 down/up
按照此格式那么我们蜂鸣器的节点查询后得到:sendevent /dev/input/event2 18 1 1 及 sendevent /dev/input/event2 18 1 0
二、将数据写入节点
这边我实现了个cmd输入
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public static String execShellCommand(String cmd) {
String returnString = "";
Process pro = null;
Runtime runTime = Runtime.getRuntime();
Log.d(TAG, "execShellCommand : " + cmd);
if (runTime == null) {
Log.e(TAG, "Create runtime false!");
return null;
}
try {
pro = runTime.exec(cmd);
BufferedReader input = new BufferedReader(new InputStreamReader(pro.getInputStream()));
PrintWriter output = new PrintWriter(new OutputStreamWriter(pro.getOutputStream()));
String line;
while ((line = input.readLine()) != null) {
returnString = returnString + line + "\n";
}
input.close();
output.close();
pro.destroy();
} catch (IOException e) {
e.printStackTrace();
}
Log.d(TAG, "execShellCommand result : " + returnString);
return returnString;
}
三、权限问题
以上我的思路基本已经实现,然而自己调试的发现,在adb shell中输入节点蜂鸣器响应,而在我写的应用中不会响应,最后查询出来是权限问题。
为了解决这个问题,我取了个巧,将event2 这个节点的权限改为了system权限
具体操作是在device\leadcore\common 中的init.rc中修改了他的权限。init.rc 是当我们机器重启的第一时间会执行的文件。
# MAT just have system permissions,set event2 to system
chown root system /dev/input/event2