项目需求:接收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