(1)添加文件 frameworks/base/services/core/jni/com_android_server_switch_SwitchusbAction.cpp com_android_server_switch_SwitchusbAction.cpp
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "LightsService"
#include "jni.h"
#include <nativehelper/JNIHelp.h>
//#include "android_runtime/AndroidRuntime.h"
#include <utils/misc.h>
#include <utils/Log.h>
#include <hardware/hardware.h>
#include <hardware/lights.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h>
#define SWITCH_USB_MAGIC 'k' //当然我们也å¯ä»¥å®šä¹‰ä¸€ä¸ªç›¸åº”的头文件,把ioctlçš„cmd放进里é¢ï¼Œç„¶åŽå†includeè¿› æ¥
#define SWITCH_USB_OFF _IO(SWITCH_USB_MAGIC,0x1A) // OFF
#define SWITCH_USB_ON _IO(SWITCH_USB_MAGIC,0x1B) // ON
int switchusb_fd=-1;
namespace android
{
static jint SwitchUsbOpen_native(JNIEnv* /* env */, jobject /* clazz */)
{
// int cmd=0;
//int arg =0;
switchusb_fd=open("/dev/switchusb",O_RDWR);
if(switchusb_fd==-1)
{
printf("open switchusb fail\r\n");
return -1;
}
/*
if(ioctl(fd,OPEN,&arg)<0)
{
printf("ioctl action fail");
return -3;
}
*/
return 0;
}
static jint SwitchUsbWrite_native(JNIEnv* /* env */, jobject /* clazz */,jint value)
{
return 0;
}
static jint SwitchUsbIoctl_native(JNIEnv* /* env */, jobject /* clazz */,jint cmd ,jint value)
{
printf("ddy ioctl action 进来了么");
int arg =value;
if(cmd==0)
{
if(ioctl(switchusb_fd,SWITCH_USB_OFF,&arg)<0)
{
printf("ioctl action fail");
return -3;
}
}
else
{
if(ioctl(switchusb_fd,SWITCH_USB_ON,&arg)<0)
{
printf("ioctl action fail");
return -3;
}
}
return 0;
}
static const JNINativeMethod method_table[] = {
{ "nativeSwitchUsbActionOpen", "()I", (void*)SwitchUsbOpen_native },
{ "nativeSwitchUsbActionWrite", "(I)I", (void*)SwitchUsbWrite_native },
{ "nativeSwitchUsbActionIoctl", "(II)I", (void*)SwitchUsbIoctl_native },
};
int register_android_server_SwitchUsb(JNIEnv *env)
{
return jniRegisterNativeMethods(env, "com/android/server/SwitchUsbAction",
method_table, NELEM(method_table));
}
};
(2)修改onload.cpp
----------------- frameworks/base/services/core/jni/onload.cpp -----------------
index 5d6ab96704..3db96d7c5b 100755
@@ -72,6 +72,8 @@ int register_android_server_RtcAlarmPowerOn(JNIEnv* env);
int register_android_server_VendorStorage(JNIEnv* env);
int register_android_server_utils_HdpkeyLoader(JNIEnv* env);
int register_android_server_utils_HdmiService(JNIEnv* env);
+int register_android_server_SwitchUsb(JNIEnv* env);
+
};
using namespace android;
@@ -137,5 +139,6 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
register_android_server_VendorStorage(env);
register_android_server_utils_HdpkeyLoader(env);
register_android_server_utils_HdmiService(env);
+ register_android_server_SwitchUsb(env);
return JNI_VERSION_1_4;
}
(3)修改Android.bp 文件,使添加的com_android_server_switch_SwitchusbAction.cpp编译进来
----------------- frameworks/base/services/core/jni/Android.bp -----------------
index 1fae787539..e98d6c446d 100755
@@ -66,6 +66,7 @@ cc_library_static {
"com_android_server_VendorStorage.cpp",
"com_android_server_utils_HdpkeyLoader.cpp",
"com_android_server_utils_HdmiService.cpp",
+ "com_android_server_switch_SwitchusbAction.cpp",
"onload.cpp",
":lib_networkStatsFactory_native",
],
(4)添加aidl 文件frameworks/base/core/java/android/os/ISwitchUsbAction.aidl
---------- frameworks/base/core/java/android/os/ISwitchUsbAction.aidl ----------
new file mode 100644
index 0000000000..16c6ec3d56
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+/**
+ * Direct interface to the UpdateLockService's functionality
+ *
+ * {@hide}
+ */
+interface ISwitchUsbAction {
+ int SwitchUsbActionOpen();
+ int SwitchUsbActionWrite(int value);
+ int SwitchUsbActionIoctl(int cmd, int value);
+}
(5)添加JAVA文件与JNI 接口链接上如下SwitchUsbAction.java
-- frameworks/base/services/core/java/com/android/server/SwitchUsbAction.java --
new file mode 100644
index 0000000000..85640c9572
@@ -0,0 +1,42 @@
+package com.android.server;
+
+import android.util.Slog;
+import android.os.ISwitchUsbAction;
+import android.content.Context;
+
+public class SwitchUsbAction extends ISwitchUsbAction.Stub{
+ private static final String TAG = "SwitchUsbAction";
+
+ private final Context mContext;
+ public static final String SWITCH_USB_STATS_SERVICE = "switchusbaction";
+
+ public SwitchUsbAction(Context context)
+ {
+ Slog.d(TAG,"SwitchUsbAction");
+ mContext = context;
+ }
+
+ @Override
+ public int SwitchUsbActionOpen() throws android.os.RemoteException
+ {
+ return nativeSwitchUsbActionOpen();
+ }
+
+
+ @Override
+ public int SwitchUsbActionWrite(int value) throws android.os.RemoteException
+ {
+ return nativeSwitchUsbActionWrite(value);
+ }
+
+ @Override
+ public int SwitchUsbActionIoctl(int cmd, int value) throws android.os.RemoteException
+ {
+ return nativeSwitchUsbActionIoctl(cmd,value);
+ }
+
+
+ public static native int nativeSwitchUsbActionOpen();
+ public static native int nativeSwitchUsbActionWrite(int value);
+ public static native int nativeSwitchUsbActionIoctl(int cmd,int value);
+}
(6)最后修改下权限如下init.connectivity.rc文件:
----------------- device/rockchip/common/init.connectivity.rc -----------------
index 113e242d09..341686b96d 100644
@@ -30,6 +30,7 @@ on zygote-start
chmod 0664 /dev/vendor_storage
chmod 0664 /sys/touchscreen/glove
chmod 0664 /sys/devices/platform/fe8a0000.usb2-phy/otg_mode
+ chmod 0664 /dev/switchusb
chown bluetooth net_bt /dev/vflash
chown bluetooth net_bt /dev/vendor_storage
@@ -46,6 +47,7 @@ on zygote-start
chown system system /sys/touchscreen/glove
chown system system /sys/devices/platform/fe8a0000.usb2-phy/otg_mode
chown system system /sys/class/boe_dev/boe_amp_dev/amplifier_control
+ chown system system /dev/switchusb