Android Uevent使用
发布日期:2021-06-30 18:53:08
浏览次数:3
分类:技术文章
本文共 8498 字,大约阅读时间需要 28 分钟。
kernel:
diff --git a/android-lte/boot.img b/android-lte/boot.imgindex 8a1bdf2..b688dcf 100644Binary files a/android-lte/boot.img and b/android-lte/boot.img differdiff --git a/android-lte/kernel/drivers/usb/core/hub.c b/android-lte/kernel/drivers/usb/core/hub.cindex c0f6f45..c432f95 100755--- a/android-lte/kernel/drivers/usb/core/hub.c+++ b/android-lte/kernel/drivers/usb/core/hub.c@@ -57,6 +57,10 @@ EXPORT_SYMBOL(HostComplianceTest); int HostTest; EXPORT_SYMBOL(HostTest); #endif+static struct class *zte_usbcamera_class = NULL;//weiqifa modify add+static dev_t usbcamera_device_no;//weiqifa modify add+struct device *usbcamera_class_dev;//weiqifa modify add+ extern int extern_control_lte_suspend(int value); /* if we are in debug mode, always announce new devices */@@ -1764,9 +1768,9 @@ void usb_disconnect(struct usb_device **pdev) if(le16_to_cpu(udev->descriptor.idVendor) == 0x0c45){ char *envp[2]; int ret;- envp[0]= "USBCAMERA_PULLOUT";+ envp[0]= "USBCAMERA=pullout"; envp[1]=NULL;- ret = kobject_uevent_env(&udev->dev.kobj, KOBJ_CHANGE,envp);+ ret = kobject_uevent_env(&usbcamera_class_dev->kobj, KOBJ_CHANGE,envp); if(ret<0){ printk("%s kobject error\n",__func__); }else{@@ -1823,15 +1827,15 @@ static void announce_device(struct usb_device *udev) if(le16_to_cpu(udev->descriptor.idVendor) == 0x0c45){ char *envp[2]; int ret;- envp[0]= "USBCAMERA_INSERT";+ envp[0]= "USBCAMERA=pushin"; envp[1]=NULL;- ret = kobject_uevent_env(&udev->dev.kobj, KOBJ_CHANGE,envp);+ ret = kobject_uevent_env(&usbcamera_class_dev->kobj, KOBJ_CHANGE,envp); if(ret<0){ printk("%s kobject error\n",__func__); }else{ printk("%s new usb camera found seccess\n",__func__); }- printk("%s\n",kobject_get_path(&udev->dev.kobj,GFP_KERNEL));+ printk("%s\n",kobject_get_path(&usbcamera_class_dev->kobj,GFP_KERNEL)); }else{ //zte_modem_enable = 0; printk("%s the new USB devices is not usb camera\n",__func__);@@ -4378,6 +4382,21 @@ int usb_hub_init(void) class_destroy(zte_modem_class); } #endif +//weiqifa modify for usbcamera 现在是自己生成一个目录,就是一个sys文件,也可以用原来的kobject的对像+ zte_usbcamera_class = class_create(THIS_MODULE,"zte_usbcamera_class");+ if (IS_ERR(zte_usbcamera_class)) {+ pr_err("%s: class_create() failed zte_usbcamera_class\n", __func__);+ class_destroy(zte_usbcamera_class);+ }+ //add device to class + usbcamera_class_dev = device_create(zte_usbcamera_class, NULL,+ usbcamera_device_no, NULL, "usbcamera");+ if (!usbcamera_class_dev) {+ pr_err("%s: class_device_create failed usbcamera \n", __func__);+ device_destroy(zte_usbcamera_class, usbcamera_device_no);+ }++//weiqifa modify for usbcamera end if (usb_register(&hub_driver) < 0) { printk(KERN_ERR "%s: can't register hub driver\n", usbcore_name);diff --git a/android-lte/kernel/lib/kobject_uevent.c b/android-lte/kernel/lib/kobject_uevent.cindex 50f08ef..a9d89cd 100755--- a/android-lte/kernel/lib/kobject_uevent.c+++ b/android-lte/kernel/lib/kobject_uevent.c@@ -201,7 +201,7 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action, retval = -ENOENT; goto exit; }- printk("%s %s\n",__func__,devpath);+ //printk("%s %s\n",__func__,devpath); /* default keys */ retval = add_uevent_var(env, "ACTION=%s", action_string); if (retval)@@ -271,12 +271,13 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action, /* add header */ scratch = skb_put(skb, len); sprintf(scratch, "%s@%s", action_string, devpath);-//这里可以看得出打印的目录和值,这些值就是上层在framework里面可以监听的东西+ printk("weiqifa %s\n",scratch); /* copy keys to our continuous event payload buffer */ for (i = 0; i < env->envp_idx; i++) { len = strlen(env->envp[i]) + 1; scratch = skb_put(skb, len); strcpy(scratch, env->envp[i]);+ printk("weiqifa2 %s\n",scratch); } NETLINK_CB(skb).dst_group = 1;上层接收uevent发送广播
diff --git a/android-lte/frameworks/base/services/java/com/android/server/usb/UsbDeviceManager.java b/android-lte/frameworks/base/services/java/com/android/server/usb/UsbDeviceManager.javaindex 8e794e5..3e33792 100755--- a/android-lte/frameworks/base/services/java/com/android/server/usb/UsbDeviceManager.java+++ b/android-lte/frameworks/base/services/java/com/android/server/usb/UsbDeviceManager.java@@ -74,7 +74,7 @@ import com.qrd.plugin.feature_query.FeatureQuery; public class UsbDeviceManager { private static final String TAG = UsbDeviceManager.class.getSimpleName();- private static final boolean DEBUG = true;+ private static final boolean DEBUG = false; private static final String USB_HUB_MATCH = "DEVPATH=/devices/virtual/goso_hub/hub0";@@ -96,6 +96,11 @@ public class UsbDeviceManager { "/sys/class/android_usb/android0/f_rndis/ethaddr"; private static final String AUDIO_SOURCE_PCM_PATH = "/sys/class/android_usb/android0/f_audio_source/pcm";+ + private static final String USB_CAMERA_MATCH = "DEVPATH=/devices/virtual/zte_usbcamera_class/usbcamera";+ //"DEVPATH=/devices/platform/sm_hsusb_host.0/usb1/1-1/1-1.2";+ + private static final String USB_CAMERA_PATH = "/devices/platform/sm_hsusb_host.0/usb1/1-1/1-1.2"; private static final String USB_PLUG_PATH = "/sys/class/power_supply/usb/online";@@ -113,6 +118,7 @@ public class UsbDeviceManager { private static final int MSG_USB_PORT_SWITCH = 6; private static final int MSG_UPDATE_HUB_MODE_STATE = 7; private static final int MSG_UPDATE_HUB_PLUG_STATE = 8;+ private static final int MSG_USB_CAMERA = 9;//usb camera msg // Delay for debouncing USB disconnects. // We often get rapid connect/disconnect events when enabling USB functions,@@ -165,9 +171,13 @@ public class UsbDeviceManager { String hub_plug = event.get("HUB_PLUG"); String state = event.get("USB_STATE"); String accessory = event.get("ACCESSORY");+ String usb_camera = event.get("USBCAMERA"); if (hub_mode != null) { mHandler.updateModeState(hub_mode); }+ if (usb_camera != null) {+ mHandler.updateCameraState(usb_camera);+ } if (hub_plug != null) { mHandler.updatePlugState(hub_plug); }@@ -402,6 +412,7 @@ public class UsbDeviceManager { mUEventObserver.startObserving(USB_STATE_MATCH); mUEventObserver.startObserving(ACCESSORY_START_MATCH); mUEventObserver.startObserving(USB_HUB_MATCH);+ mUEventObserver.startObserving(USB_CAMERA_MATCH); mContext.registerReceiver(mBootCompletedReceiver, new IntentFilter(Intent.ACTION_BOOT_COMPLETED));@@ -452,6 +463,22 @@ public class UsbDeviceManager { sendMessage(MSG_UPDATE_HUB_MODE_STATE, mode == 1); }+ + //usb camera pluged event+ public void updateCameraState(String usb_camera) {+ boolean pluge = false;+ if (DEBUG) Slog.e(TAG, "updateCameraState:" + usb_camera);+ if ("PLUGIN".equals(usb_camera)) {+ pluge = true;+ } else if ("PLUGOUT".equals(usb_camera)) {+ pluge = false;+ } else {+ Slog.e(TAG, "unknown usb camera state " + usb_camera);+ return;+ }++ sendMessage(MSG_USB_CAMERA, pluge);+ } public void updatePlugState(String state) { int plug;@@ -682,6 +709,16 @@ public class UsbDeviceManager { intent.putExtra("usb_plug",isUSBConnection); mContext.sendStickyBroadcast(intent); }+ + //camera pluged + private void sendUsbCameraBroadcast(boolean pluged) {+ // send a sticky broadcast containing current USB state+ Intent intent = new Intent("com.ztegota.action.usb_camera");+ intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);+ intent.putExtra("usb_camera", pluged);+ if (DEBUG) Log.v(TAG, "sendUsbCameraBroadcast: " + intent.toString());+ mContext.sendStickyBroadcast(intent);+ } private void updateUsbState() { // send a sticky broadcast containing current USB state@@ -835,6 +872,10 @@ public class UsbDeviceManager { SystemProperties.set("persist.sys.usbfactory", "0"); } break;+ case MSG_USB_CAMERA:+ boolean pluged = (msg.arg1 == 1);+ Log.v(TAG, "MSG_USB_CAMERA, pluged = " + pluged);+ sendUsbCameraBroadcast(pluged); } }
转载地址:https://linus.blog.csdn.net/article/details/46547611 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月26日 09时50分32秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
tf model create
2019-04-30
tf dense layer两种创建方式的对比和numpy实现
2019-04-30
tf initializer
2019-04-30
tf 从RNN到BERT
2019-04-30
tf keras SimpleRNN源码解析
2019-04-30
tf keras Dense源码解析
2019-04-30
tf rnn输入输出的维度和权重的维度
2019-04-30
检验是否服从同一分布
2019-04-30
tf callbacks
2019-04-30
keras、tf、numpy实现logloss对比
2019-04-30
Ubuntu20.04安装微信
2019-04-30
Restful风格的使用
2019-04-30
Swagger基础入门整合SpringBoot
2019-04-30
MyBatisPlus简单入门(SpringBoot)
2019-04-30
攻防世界web进阶区NewsCenter详解
2019-04-30
攻防世界web进阶PHP2详解
2019-04-30
如何解决词达人问题(新)
2019-04-30
攻防世界web进阶区surpersqli详解
2019-04-30
攻防世界web进阶区easytornado详解
2019-04-30
攻防世界web进阶区web2详解
2019-04-30