前段时间公司要做一个用旋钮调节音量的手机,简单粗暴的做法是应用层用一个死循环读驱动文件,然后驱动一个死循环读硬件ADC并写文件。但是这样太low了。相信很多小伙伴都知道UEvent机制,我们Android系统电池上报相关的信息就是用的这个机制。好了废话不多说了,直接上代码。
我加的文件路径:
kernel-3.18driversinputkeyboardkpd.c
首先在kpd.c文件里面
上面代码只是大概流程,不是具体实现细节,小伙伴可根据自己的业务具体实现。
DEVICE_ATTR(volume_level, 0664, show_volume_level, store_volume_level) ,还有上面
store_volume_level ,show_volume_level 这2个方法是里面包含的volume_level 和黑体字标注是固定写法,可根据自己的业务重新命名。最大权限只能给0664 否则编译会出错。
kernel-3.18driversinputkeyboardMakefile这个文件
obj-$(CONFIG_KEYBOARD_MTK) := kpd.o
具体Makefile根据自己需求去写。
com_android_server_vm_VolumeControlService.cpp
jni 函数注册就不写了,自己不会百度一下。
需要用到的权限。
device.te里面定义
type volume_device, dev_type;
system_server.te里面添加
allow system_server volume_device:chr_file rw_file_perms;
allow system_server volume_device:dir r_dir_perms;
service.te里面添加
type volumecontrol_service, system_api_service, system_server_service, service_manager_type;
service_contexts里面添加
volumecontrol u:object_r:volumecontrol_service:s0