2021-07-22摄像头禁止

这篇博客探讨了Linux内核中如何通过添加和修改驱动文件来控制GPIO,包括读取和设置GPIO方向及电平。同时,展示了如何在USB核心部分检查设备的VID和PID以决定是否注册,并提供了在应用层通过设置界面控制USB设备启用或禁用的功能。此外,还介绍了Android应用中针对特殊模块设置的更新,包括摄像头启用状态的控制和重启操作。
摘要由CSDN通过智能技术生成
diff --git a/drivers/leds/mynode.c b/drivers/leds/mynode.c
index 3e67260d0c31..2ad3d80db8f5 100755
--- a/drivers/leds/mynode.c
+++ b/drivers/leds/mynode.c
@@ -18,9 +18,13 @@
 #include <linux/delay.h>
 
 #define CLONE_KERNEL    (CLONE_FS | CLONE_FILES | CLONE_SIGHAND)
-
 //add by lzp for gpio control API
+extern void set_gpio_direction(int num, int flag);
 extern int get_gpio_level(int num);
+extern void set_gpio_level(int num, int level);
+extern int rk_vendor_read(u32 id, void *pbuf, u32 size);
+extern int rk_vendor_write(u32 id, void *pbuf, u32 size);
+//
 struct myedid {
        unsigned int clock;
        unsigned int hdisplay;
@@ -192,14 +196,109 @@ static ssize_t show_gpiovalue(struct device *dev, struct device_attribute *attr,
      int a0,a1,a2;
      a0 = get_gpio_level(0);
      a1 = get_gpio_level(1);
-     a2 = get_gpio_level(2);
-     count += snprintf(buf + count, PAGE_SIZE - count, "%d,%d,%d\n",a0,a1,a2);
+        a2 = get_gpio_level(2);
+        count += snprintf(buf + count, PAGE_SIZE - count, "%d,%d,%d\n",a0,a1,a2);
+               
     return count;
 }
+
+static ssize_t store_gpiovalue(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+       char dest[3] = {""};
+        
+        if (count <= 0)
+           return 0;
+        
+        strncpy(dest, buf, 2);
+        printk("===>LZP %s\n",dest);
+        
+        if (strncmp(dest,"00",strlen(dest)) == 0){
+                set_gpio_level(0,0);
+        }
+        if (strncmp(dest,"10",strlen(dest)) == 0){
+                set_gpio_level(1,0);
+        }
+        if (strncmp(dest,"20",strlen(dest)) == 0){
+                set_gpio_level(2,0);
+        }
+               
+        
+       if (strncmp(dest,"01",strlen(dest)) == 0){
+                set_gpio_level(0,1);
+        }
+        if (strncmp(dest,"11",strlen(dest)) == 0){
+                set_gpio_level(1,1);
+        }
+        if (strncmp(dest,"21",strlen(dest)) == 0){
+                set_gpio_level(2,1);
+        }
+               
+
+       return count;
+               
+}
+
+static ssize_t store_gpiodirection(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+       char dest[3] = {""};
+
+        if (count <= 0)
+           return 0;
+
+       strncpy(dest, buf, 2);
+       printk("===>LZP %s\n",dest);
+       
+       if (strncmp(dest,"00",strlen(dest)) == 0){
+               set_gpio_direction(0,0);
+       }
+       if (strncmp(dest,"10",strlen(dest)) == 0){
+                set_gpio_direction(1,0);
+        }
+       if (strncmp(dest,"20",strlen(dest)) == 0){
+                set_gpio_direction(2,0);
+        }
+       if (strncmp(dest,"01",strlen(dest)) == 0){
+                set_gpio_direction(0,1);
+        }
+       if (strncmp(dest,"11",strlen(dest)) == 0){
+                set_gpio_direction(1,1);
+        }
+       if (strncmp(dest,"21",strlen(dest)) == 0){
+                set_gpio_direction(2,1);
+        }
+       
+        return count;
+}
+
+static ssize_t store_camera(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+               unsigned char data[2];
+
+        if (count <= 0)
+           return 0;
+       
+               data[0] = simple_strtoul(buf, NULL, 0);
+               rk_vendor_write(8, data, 1);
+               
+        return count;
+}
+
+static ssize_t show_camera(struct device *dev, struct device_attribute *attr, char *buf)
+{
+     int count = 0;
+        unsigned char data[2];
+     rk_vendor_read(8, data, 1);
+
+     count = sprintf(buf, "%d\n",data[0]);
+    return count;
+}
+
+
+static DEVICE_ATTR(gpiodirection, 0666, NULL, store_gpiodirection);
 static DEVICE_ATTR(mytiming, 0666, show_mytiming, NULL);
 static DEVICE_ATTR(hdmiin_id, 0666, show_hdmiin_id, store_hdmiin_id);
-static DEVICE_ATTR(gpiovalue, 0666, show_gpiovalue, NULL);
-
+static DEVICE_ATTR(gpiovalue, 0666, show_gpiovalue, store_gpiovalue);
+static DEVICE_ATTR(camera, 0666,show_camera,store_camera);
 struct file_operations mynode_ops={
          .owner  = THIS_MODULE,
 };
@@ -221,6 +320,10 @@ static int mynode_init(void)
         return -1;
        if(sysfs_create_file(&(mydev->kobj), &dev_attr_gpiovalue.attr))
         return -1;
+       if(sysfs_create_file(&(mydev->kobj), &dev_attr_gpiodirection.attr))
+        return -1;
+       if(sysfs_create_file(&(mydev->kobj), &dev_attr_camera.attr))
+        return -1;
        for (i=0; i<50; i++){
                mydata[i].clock                 = 0;
                mydata[i].hdisplay              = 0;
(END)


diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
old mode 100644
new mode 100755
index f20524695839..dc1c9b1195fb
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -36,6 +36,9 @@
 #define USB_VENDOR_GENESYS_LOGIC               0x05e3
 #define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND       0x01
 
+unsigned char idata[2];
+extern int rk_vendor_read(u32 id, void *pbuf, u32 size);
+
 /* Protect struct usb_device->state and ->children members
  * Note: Both are also protected by ->dev.sem, except that ->state can
  * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */
@@ -2422,6 +2425,21 @@ int usb_new_device(struct usb_device *udev)
        /* Tell the world! */
        announce_device(udev);
 
+     rk_vendor_read(8, idata, 1);
+       if (idata[0] > 1  || idata[0] < 0 ){
+               idata[0] = 1;
+       }
+       if (!idata[0]){
+           if ((le16_to_cpu(udev->descriptor.idVendor) == 0x1bcf &&
+               le16_to_cpu(udev->descriptor.idProduct) == 0x2cc8) ||(le16_to_cpu(udev->descriptor.idVendor) == 0x15aa &&
+               le16_to_cpu(udev->descriptor.idProduct) == 0x1555) ){
+               dev_err(&udev->dev, "this device will del.\n");
+               goto fail;
+               }
+       }
+       //
+
        if (udev->serial)
                add_device_randomness(udev->serial, strlen(udev->serial));
        if (udev->product)

在kernel判断某个USB设备VID、PID默认是否注册,在应用层通过节点写入value控制是否禁用usb设备

diff --git a/src/com/android/settings/SpecialmoduleSetting.java b/src/com/android/settings/SpecialmoduleSetting.java
index 9e2197c3ec..d097670dad 100755
--- a/src/com/android/settings/SpecialmoduleSetting.java
+++ b/src/com/android/settings/SpecialmoduleSetting.java
@@ -81,6 +81,7 @@ public class SpecialmoduleSetting extends SettingsPreferenceFragment implements
        private static final String KEY_WOL_FUNCTION ="wol_function";
        private static final String KEY_CAMERA_DISPLAY = "camera_display";
        private static final String KEY_SCREEN_BRIGHTNESS = "screen_brightness";
+       private static final String KEY_CAMERA_ENABLE = "camera_enable";^M
        
        private CheckBoxPreference advertisements, navigationbar ,cleansystem ,autoLogCatch;
        private Preference advanceSettings;
@@ -111,6 +112,7 @@ public class SpecialmoduleSetting extends SettingsPreferenceFragment implements
        private SharedPreferences sp;
        private int lastSelect = -1;
        private ListPreference mCameraPreference;
+       private ListPreference mCameraEnablePreference;^M
        
        
     @Override
@@ -217,6 +219,19 @@ public class SpecialmoduleSetting extends SettingsPreferenceFragment implements
                mControlBrightness.setOnPreferenceChangeListener(this);
                mControlBrightness.setChecked(Settings.System.getInt(mContext.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS_BUTTON,0)==1);
                
+               mCameraEnablePreference = (ListPreference)findPreference(KEY_CAMERA_ENABLE);^M
+               mCameraEnablePreference.setOnPreferenceChangeListener(this);^M
+               boolean cameraEnable11 = Settings.System.getInt(mContext.getContentResolver(), Settings.System.CAMERA_ENABLE, 0) == 1;^M
+               if(cameraEnable11 ){^M
+                       mCameraEnablePreference.setSummary(R.string.enablecamera);^M
+                       mCameraEnablePreference.setValue("0");^M
+                       ^M
+               }else{^M
+                       mCameraEnablePreference.setSummary(R.string.removecamera);^M
+                       mCameraEnablePreference.setValue("1");^M
+                       ^M
+               }^M
+               ^M
 
     }
 
@@ -270,6 +285,59 @@ public class SpecialmoduleSetting extends SettingsPreferenceFragment implements
                                },2000);        
                        }
                        
+               }else if(preference == mCameraEnablePreference ){^M
+                       String cameraview1  = newValue.toString();^M
+                       mCameraEnablePreference.setSummary(cameraview1);^M
+                       mCameraEnablePreference.setValue(cameraview1);^M
+                       if(cameraview1 != null  && cameraview1.equals("0") ){^M
+                               Settings.System.putInt(mContext.getContentResolver(), Settings.System.CAMERA_ENABLE, 1);^M
+                               ProgressDialog dialog = new ProgressDialog(mContext);^M
+                               dialog.setTitle(getResources().getString(R.string.camera));^M
+                               dialog.setMessage(getResources().getString(R.string.camera_dialog_content));^M
+                               dialog.setCancelable(false);^M
+                               dialog.setCanceledOnTouchOutside(false);^M
+                               dialog.show();^M
+                               new Handler().postDelayed(new Runnable() {^M
+                                       @Override^M
+                                       public void run() {^M
+                                               write_camera("1");^M
+                                               Intent reboot = new Intent("android.intent.action.REBOOT");^M
+                                               // <C1><A2><BC><B4><D6><D8><C6><F4><A3><BA>1^M
+                                               reboot.putExtra("nowait", 1);^M
+                                               // <D6><D8><C6><F4><B4><CE><CA><FD><A3><BA>1^M
+                                               reboot.putExtra("interval", 1);^M
+                                               // <B2><BB><B3><F6><CF>ֵ<AF><B4><B0><A3><BA>0^M
+                                               reboot.putExtra("window", 0);^M
+                                               startActivity(reboot);^M
+                                       }^M
+                               },2000);                                ^M
+                       }else if(cameraview1 != null && cameraview1.equals("1") ){^M
+                               ^M
+                               Settings.System.putInt(mContext.getContentResolver(), Settings.System.CAMERA_ENABLE, 0);^M
+                               ProgressDialog dialog = new ProgressDialog(mContext);^M
+                               dialog.setTitle(getResources().getString(R.string.camera));^M
+                               dialog.setMessage(getResources().getString(R.string.camera_dialog_content));^M
+                               dialog.setCancelable(false);^M
+                               dialog.setCanceledOnTouchOutside(false);^M
+                               dialog.show();^M
+                               new Handler().postDelayed(new Runnable() {^M
+               ^M
+                                       @Override^M
+                                       public void run() {^M
+                                               ^M
+                                               write_camera("0");^M
+                                               Intent reboot = new Intent("android.intent.action.REBOOT");^M
+                                               // <C1><A2><BC><B4><D6><D8><C6><F4><A3><BA>1^M
+                                               reboot.putExtra("nowait", 1);^M
+                                               // <D6><D8><C6><F4><B4><CE><CA><FD><A3><BA>1^M
+                                               reboot.putExtra("interval", 1);^M
+                                               // <B2><BB><B3><F6><CF>ֵ<AF><B4><B0><A3><BA>0^M
+                                               reboot.putExtra("window", 0);^M
+                                               startActivity(reboot);^M
+                                       }^M
+                               },2000);        ^M
+                       }^M
+                       ^M
                }
         return true;
     }
@@ -568,6 +636,21 @@ public class SpecialmoduleSetting extends SettingsPreferenceFragment implements
                         
            }
     }
+       ^M
+       private void write_camera( String value){^M
+        File file = new File("/sys/class/mynode_class/mynode_device/camera");^M
+               if (file.exists()){^M
+                       try{^M
+                               OutputStreamWriter write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");^M
+                               BufferedWriter out = new BufferedWriter(write);^M
+                               out.write(value);^M
+                               out.flush();^M
+                               out.close();^M
+                       }catch(IOException e){^M
+                       }^M
+                        ^M
+           }^M
+    }^M
 
        @Override
     protected int getMetricsCategory() {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值