高通平台:处理diag端口发出的命令

项目需求:接收diag端口发出的命令,恢复出厂设置,做个记录以作备忘



第一次修改:

From 34f7e340d2acc6ae46d23aae36eb9417ed314b12 Mon Sep 17 00:00:00 2001
From: xxx <xxx@localhost>
Date: Fri, 9 Dec 2016 10:03:31 +0800
Subject: [PATCH] qrct send 4bc9aaff13 to recovery factory mode


Change-Id: Ibeb9f22a09f1df80314468da5ecab0336742ba0e
---
 device/qcom/sepolicy/common/kernel.te |    4 ++++
 kernel/drivers/char/diag/diagfwd.c    |   30 ++++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+)


diff --git a/device/qcom/sepolicy/common/kernel.te b/device/qcom/sepolicy/common/kernel.te
index 159ad1a..7274e26 100755
--- a/device/qcom/sepolicy/common/kernel.te
+++ b/device/qcom/sepolicy/common/kernel.te
@@ -7,3 +7,7 @@ allow kernel block_device:blk_file rw_file_perms;
 

 # Access firmware_file
 r_dir_file(kernel, firmware_file)
+
+allow kernel cache_file:file { create write read open };
+allow kernel cache_file:dir { create write read add_name open };
+
diff --git a/kernel/drivers/char/diag/diagfwd.c b/kernel/drivers/char/diag/diagfwd.c
index 39088fc..8bd7ed7 100644
--- a/kernel/drivers/char/diag/diagfwd.c
+++ b/kernel/drivers/char/diag/diagfwd.c
@@ -39,6 +39,8 @@
 #include "diag_usb.h"
 #include "diag_mux.h"
 
+#include <linux/fs.h>
+
 #define STM_CMD_VERSION_OFFSET 4
 #define STM_CMD_MASK_OFFSET 5
 #define STM_CMD_DATA_OFFSET 6
@@ -981,6 +983,34 @@ int diag_process_apps_pkt(unsigned char *buf, int len,
  /* Not required, represents that command isnt sent to modem */
  return 0;
  }

+ else if ((*buf == 0x4b) && (*(buf+1) == 0xc9) &&
+ (*(buf+2) == 0xaa) && (*(buf+3) == 0xff) && (*(buf+4) == 0x13)) {
+ /* send response back */
+
+ for (i = 0; i < 5; i++)
+ *(driver->apps_rsp_buf+i) = *(buf+i);
+ driver->apps_rsp_buf[5] = 'O';
+ driver->apps_rsp_buf[6] = 'K';
+ diag_send_rsp(driver->apps_rsp_buf, 7);
+ {
+ struct file * fd1 = NULL;
+ fd1 = filp_open("/cache/recovery/command", O_CREAT | O_RDWR | O_LARGEFILE | O_SYNC, 0666);
+ if (IS_ERR(fd1)) {
+ fd1 = NULL;
+ printk(KERN_ERR "reset phone errer\n");
+ return 0;
+ }
+
+ kernel_write(fd1, "--shutdown_after\n--wipe_data\n--reason=MasterClearConfirm\n--local=zh-CN\n", 71, 0);
+ filp_close(fd1, NULL);
+ }
+

+ msleep(200);
+ msm_set_restart_mode(RESTART_NORMAL);
+ printk(KERN_CRIT "diag: recovery factory mode set, Rebooting SoC..\n");
+ kernel_restart("recovery");
+ return 0;
+ }
  /* Check for polling for Apps only DIAG */
  else if ((*buf == 0x4b) && (*(buf+1) == 0x32) &&
  (*(buf+2) == 0x03)) {
-- 
1.7.9.5



第二次修改:

From 4246063ba49269de9324034cbe2f57012a4a91b6 Mon Sep 17 00:00:00 2001
From: xxx <xxx@localhost>
Date: Fri, 9 Dec 2016 14:39:32 +0800
Subject: [PATCH 3/3] 发送命令4B C9 AA FF 13 返回值1:成功 0:失败
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit


Change-Id: Ibdbb6fd5bfbb122a4d57928aba8f3bd3e9ce893c
---
 kernel/drivers/char/diag/diagfwd.c |   14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/kernel/drivers/char/diag/diagfwd.c b/kernel/drivers/char/diag/diagfwd.c
index 8bd7ed7..0f5b456 100644
--- a/kernel/drivers/char/diag/diagfwd.c
+++ b/kernel/drivers/char/diag/diagfwd.c
@@ -989,21 +989,29 @@ int diag_process_apps_pkt(unsigned char *buf, int len,
 
  for (i = 0; i < 5; i++)
  *(driver->apps_rsp_buf+i) = *(buf+i);
- driver->apps_rsp_buf[5] = 'O';
- driver->apps_rsp_buf[6] = 'K';
- diag_send_rsp(driver->apps_rsp_buf, 7);
+ //driver->apps_rsp_buf[5] = 'O';
+ //driver->apps_rsp_buf[6] = 'K';
+ //diag_send_rsp(driver->apps_rsp_buf, 7);
  {
  struct file * fd1 = NULL;
  fd1 = filp_open("/cache/recovery/command", O_CREAT | O_RDWR | O_LARGEFILE | O_SYNC, 0666);
  if (IS_ERR(fd1)) {
  fd1 = NULL;
  printk(KERN_ERR "reset phone errer\n");

+
+                // rsp fail to diag
+ driver->apps_rsp_buf[5] = 0;
+ //rsp to diag
+                diag_send_rsp(driver->apps_rsp_buf, 6);
  return 0;
  }
 
  kernel_write(fd1, "--shutdown_after\n--wipe_data\n--reason=MasterClearConfirm\n--local=zh-CN\n", 71, 0);
  filp_close(fd1, NULL);
  }
+ //rsp success to diag
+ driver->apps_rsp_buf[5] = 1;
+ diag_send_rsp(driver->apps_rsp_buf, 6);
 
  msleep(200);
  msm_set_restart_mode(RESTART_NORMAL);
-- 
1.7.9.5

猜你喜欢

转载自blog.csdn.net/jimbo_lee/article/details/53636299