From 3244dbd998aaed5ba13db688a5c0b85eb88e75a6 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期五, 26 十二月 2025 11:00:12 +0800
Subject: [PATCH] 可升级200万摄像头,兼容旧摄像头,多个摄像头都可升级
---
app/src/main/java/com/fwupgrade/saymanss/FwUpgradeService.java | 283 ++++++++++++++++++++++++++++---------------------------
1 files changed, 144 insertions(+), 139 deletions(-)
diff --git a/app/src/main/java/com/fwupgrade/saymanss/FwUpgradeService.java b/app/src/main/java/com/fwupgrade/saymanss/FwUpgradeService.java
index e45618b..c2f0e7b 100644
--- a/app/src/main/java/com/fwupgrade/saymanss/FwUpgradeService.java
+++ b/app/src/main/java/com/fwupgrade/saymanss/FwUpgradeService.java
@@ -16,15 +16,18 @@
import android.widget.Toast;
+import com.fwupgrade.saymanss.deviceplug.CameraControlTransfer;
import com.fwupgrade.saymanss.deviceplug.IUsbDevicePlugDelegate;
import com.fwupgrade.saymanss.deviceplug.UstorageDeviceInstance;
import com.fwupgrade.saymanss.utils.AppPathInfo;
import com.fwupgrade.saymanss.utils.UtilTools;
import com.fwupgrade.saymanss.view.GeneralDialog;
+import com.jni.NativeMethods;
import com.jni.UStorageTestModule;
-import com.spca.usb.CUSBListener;
+
import java.io.File;
+import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@@ -83,20 +86,21 @@
public void onCreate() {
super.onCreate();
Log.i(TAG,"onCreate");
- initTarget();
initData();
+ acceptFwList();
initDeviceSDK();
- UStorageTestModule.getInstance().initUStorageDeviceModuleWithVirtualDisk(AppPathInfo.getLogPath());
-
}
private File[] mFileList;
+ private ArrayList<CameraControlTransfer> upgradeList = new ArrayList<>();
+ private volatile boolean upgrading = false;
- private HashMap<String, Integer> tty = new HashMap<>();
-
+ private int mUpgradeSuccessNum = 0;
+ private int mUpgradeFailNum = 0;
+ private int mDevicesNum = 0;
private final Handler mHander = new Handler(Looper.getMainLooper()) {
@Override
@@ -119,18 +123,16 @@
case USB_DEVICE_DETACHED:
- int count = (int) msg.obj;
- Log.i(TAG,"count="+count);
- if (count<2) {
- tty.clear();
- initTarget();
- int ret = UstorageDeviceInstance.getInstance().tryAgain(FwUpgradeService.this);
- if (ret==1){
- Log.i(TAG,"鍙戦�佸け璐ョ粨鏋滃箍鎾粰椹惧煿");
- sendToDriveTrainByBroadCast(0,1);
- sendToNewDriveTrainByBroadCast(0,1);
- }
- }
+// int count = (int) msg.obj;
+// Log.i(TAG,"count="+count);
+// if (count<2) {
+// int ret = UstorageDeviceInstance.getInstance().tryAgain(FwUpgradeService.this);
+// if (ret==1){
+// Log.i(TAG,"鍙戦�佸け璐ョ粨鏋滃箍鎾粰椹惧煿");
+// sendToDriveTrainByBroadCast(0,1);
+// sendToNewDriveTrainByBroadCast(0,1);
+// }
+// }
break;
@@ -152,33 +154,13 @@
case USB_DEVICE_UPGRADE:
- String devName = (String) msg.obj;
- int errCode = msg.arg1;
- int succ_num = 0, fail_num = 0;
+ Log.d(TAG, "devicesNum:" + mDevicesNum + " mUpgradeSuccessNum:" + mUpgradeSuccessNum + " mUpgradeFailNum:" + mUpgradeFailNum);
- Log.d("fwup","Upgrade result:" + devName + ", errCode: " + errCode+".ttySize="+tty.size());
-
- if (tty.containsKey(devName)) {
- tty.put(devName, errCode == 0? UPGRADE_SUCCESS:UPGRADE_FAIL);
- }
-
- for (Map.Entry<String, Integer> entry : tty.entrySet()) {
- if (entry.getValue() == UPGRADE_SUCCESS) {
- succ_num++;
- } else if (entry.getValue() == UPGRADE_FAIL) {
- fail_num++;
- }
- }
-
- if (succ_num + fail_num == tty.size()) {
+ if (mUpgradeFailNum + mUpgradeSuccessNum == mDevicesNum) {
Log.d(TAG, "Upgrade Finish!");
-
- sendToNewDriveTrainByBroadCast(succ_num,tty.size());
- sendToDriveTrainByBroadCast(succ_num,tty.size());
-
-
-
+ sendToNewDriveTrainByBroadCast(mUpgradeSuccessNum,mDevicesNum);
+ sendToDriveTrainByBroadCast(mUpgradeSuccessNum,mDevicesNum);
// System.exit(0);
}
break;
@@ -206,19 +188,7 @@
}
// 姣忔鍗囩骇璺緞鍊兼渶灏忕殑
- private void initTarget() {
- ArrayList<UsbDevice> targets = UstorageDeviceInstance.getInstance().acceptOTGDeviceInfo((UsbManager) getSystemService(USB_SERVICE));
- String min = "Z";
- for (UsbDevice usbDevice: targets) {
- if (usbDevice.getDeviceName().compareTo(min) < 0) {
- min = usbDevice.getDeviceName();
-
- }
- }
- Log.i(TAG,"min="+min);
- tty.put(min, UPGRADE_PRESET);
- }
/**
* 鑾峰彇fw鍒楄〃
@@ -252,19 +222,8 @@
* UstorageDeviceSDK鍒濆鍖�.
*/
private void initDeviceSDK() {
- int count = 0 ;
- int ret = UstorageDeviceInstance.getInstance().tryAttcheDeviceHandle(FwUpgradeService.this, FwUpgradeService.this);
- Log.i(TAG,"initDeviceSDk,ret="+ret);
- if (ret==1){
-
- ++count;
- Log.i(TAG,"鍐嶆鐨勫垵濮嬪寲");
- Message message = Message.obtain();
- message.obj = count;
- message.what = USB_DEVICE_DETACHED;
- mHander.sendMessageDelayed(message,1000);
- }
-
+ Log.i(TAG,"initDeviceSDk");
+ UstorageDeviceInstance.getInstance().tryAttcheDeviceHandle(FwUpgradeService.this, FwUpgradeService.this);
}
@Override
@@ -272,86 +231,132 @@
Log.d(TAG,"usbDeviceInsert");
}
- @Override
- public void permissionFinish(boolean isSuccessful, CUSBListener.UsbControlBlock ctrlBlock) {
- synchronized (this) {
- Message msg = Message.obtain();
- msg.obj = isSuccessful;
- msg.what = USB_DEVICE_PERRMISSION;
- mHander.sendMessage(msg);
- Log.d(TAG,"permissionFinish:" + isSuccessful);
- if (isSuccessful && ctrlBlock != null) {
- initFwUpgrade(ctrlBlock);
- }else{
- sendToDriveTrainByBroadCast(0,1);
- sendToNewDriveTrainByBroadCast(0,1);
- }
+ public void onProgress(float progress) {
+
+ }
+
+ private void upgradeNext() {
+ if (upgradeList.isEmpty()) {
+ Log.d(TAG, "upgrade complete!");
+ mHander.sendEmptyMessage(USB_DEVICE_UPGRADE);
+ }
+
+ if (!upgrading && upgradeList.size() > 0) {
+ upgrading = true;
+ CameraControlTransfer cct = upgradeList.get(0);
+
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ if (!cct.bPermission) {
+ return;
+ }
+ Log.d(TAG,"UpdateCameraInfo->dev" + cct.dev.getDeviceName());
+ boolean bClaim = cct.connection.claimInterface(cct.dev.getInterface(0), true);
+ //devInfo.connection.releaseInterface(devInfo.dev.getInterface(0));
+ Log.d(TAG,"UpdateCameraInfo->bClaim" + String.valueOf(bClaim));
+
+ Log.d(TAG, "Start init");
+ boolean r = NativeMethods.getInstance().Initialize(cct);
+ if (r) {
+ Log.d(TAG, "Initialise success!");
+ byte data[] = new byte[100];
+ java.util.Arrays.fill(data, (byte) 0);
+ if (NativeMethods.getInstance().GetProduct(data, 100)) {
+ if (data[0] != 0xFF) {
+ String devName = new String(data).trim();
+ }
+ }
+
+ java.util.Arrays.fill(data, (byte) 0);
+
+ if (NativeMethods.getInstance().GetFwVersion(data, 100, true)) {
+ if (data[0] != 0xFF) {
+ String fwVersion = new String(data).trim();
+ }
+ }
+
+ final NativeMethods.SERIAL_FLASH_TYPE sft = NativeMethods.SERIAL_FLASH_TYPE.SFT_UNKNOW;
+ if(!NativeMethods.getInstance().GetSerialFlashType(sft, true)){
+ Log.i("test", "GetSerialFlashType failed");
+ }
+ sft.setValue(NativeMethods.SERIAL_FLASH_TYPE.SFT_MXIC.ordinal());
+ Log.i("test", "sft= " + sft.getValue());
+
+ if(sft.getValue() == 0){
+ //return;
+ Log.i("test", "set sft= " + NativeMethods.SERIAL_FLASH_TYPE.SFT_MXIC.toString());
+ sft.setValue(NativeMethods.SERIAL_FLASH_TYPE.SFT_MXIC.ordinal());
+ }
+
+ if (mFileList != null && mFileList.length > 0) {
+ try {
+ String path = mFileList[0].getAbsolutePath();
+
+ NativeMethods.ASIC_ROM_TYPE romType = NativeMethods.ASIC_ROM_TYPE.ART_Unknow;
+ int chipID[] = new int[1];
+ if (!NativeMethods.getInstance().GetAsicRomType(romType, chipID)) {
+ throw new Exception("get chip rom type failed!");
+ }
+ Log.d("RomType", String.valueOf(chipID[0]));
+ FileInputStream fis = new FileInputStream(path);
+ fis.available();
+ byte[] buffer = new byte[7];
+
+ if (fis.read(buffer, 0, 7) != -1) {
+ if (buffer[5] < 48 || buffer[5] >= 65 || buffer[6] < 48 || buffer[6] >= 65) {
+ throw new Exception("The selected firmware and device do not match!");
+ }
+ int id = (buffer[5] - 48) * 16 + (buffer[6] - 48);
+ if (id != chipID[0]) {
+ throw new Exception("The selected firmware and device do not match!");
+ }
+ }
+
+ Log.d(TAG, "BurnFw start...");
+ if (!NativeMethods.getInstance().BurnerFW(FwUpgradeService.this, path, sft, true)) {
+ mUpgradeFailNum++;
+ Log.d(TAG, "BurnFw fail!!!");
+ } else {
+ mUpgradeSuccessNum++;
+ Log.d(TAG, "BurnFw success!!!");
+ }
+
+ fis.close();
+ SystemClock.sleep(500);
+ NativeMethods.getInstance().RestartDevice();
+ } catch (Exception ex) {
+ Log.e(TAG, "upgrade fail: " + ex.getMessage());
+ }
+ }
+ NativeMethods.getInstance().UnInitialize();
+ }
+ upgradeList.remove(cct);
+ upgrading = false;
+
+ SystemClock.sleep(1000);
+
+ upgradeNext();
+ }
+ }).start();
}
}
+
+ @Override
+ public void permissionFinish(boolean isSuccessful, com.fwupgrade.saymanss.deviceplug.CUSBListener.UsbControlBlock ctrlBlock, CameraControlTransfer cct) {
+ synchronized (this) {
+ mDevicesNum++;
+ upgradeList.add(cct);
+ upgradeNext();
+ }
+ }
+
@Override
public void usbDeviceDetached() {
Log.d(TAG,"usbDeviceDetached");
}
- /**
- * 鍒濆鍖栧崌绾х幆澧�
- */
- private void initFwUpgrade(CUSBListener.UsbControlBlock ctrlBlock) {
- final int vendorId = ctrlBlock.getVenderId();
- final int productId = ctrlBlock.getProductId();
- int fileDescriptor = ctrlBlock.getFileDescriptor();
- int busNum = ctrlBlock.getBusNum();
- int devNum = ctrlBlock.getDevNum();
- boolean isTarget = false;
- String usbfsName = getUSBFSName(ctrlBlock);
- String devName = ctrlBlock.getDeviceName();
-
- String serial = ctrlBlock.getSerial();
-
- Log.d(TAG,"sonixCamInit " + String.format("vendorId:%d productId:%d fileDescriptor:%d busNum:%d devNum:%d usbfsName:%s devName:%s serial:%s,tty.size=%d", vendorId, productId, fileDescriptor, busNum, devNum, usbfsName, devName, serial,tty.size()));
-
-
- if (tty.containsKey(devName) && tty.get(devName) == 0) {
- isTarget = true;
- tty.put(devName, 1);
- }
-
-
-
- if (!isTarget) {
-
- Log.d(TAG,"Not sonixCam, close");
- ctrlBlock.close();
-
- return;
- }
-
- Log.d(TAG,"Is sonixCam, upgrade!");
- Message msg = Message.obtain();
- //msg.obj = errCode == 0;
- msg.obj = new CameraInfo(vendorId, productId, fileDescriptor, busNum, devNum, usbfsName, devName);
- msg.what = USB_DEVICE_OPEN;
- mHander.sendMessage(msg);
- }
-
-
- private final String getUSBFSName(final CUSBListener.UsbControlBlock ctrlBlock) {
- String result = null;
- final String name = ctrlBlock.getDeviceName();
- final String[] v = !TextUtils.isEmpty(name) ? name.split("/") : null;
- if ((v != null) && (v.length > 2)) {
- final StringBuilder sb = new StringBuilder(v[0]);
- for (int i = 1; i < v.length - 2; i++)
- sb.append("/").append(v[i]);
- result = sb.toString();
- }
- if (TextUtils.isEmpty(result)) {
-// Log.w(TAG, "failed to get USBFS path, try to use default path:" + name);
- result = "/dev/bus/usb";
- }
- return result;
- }
class Update implements Runnable {
CameraInfo cam;
--
Gitblit v1.8.0