summaryrefslogtreecommitdiff
path: root/meta-ampere/meta-common/recipes-devtools/mtd/mtd-utils/0001-flashcp-support-offset-option.patch
blob: 0edae05f8888b5bac2bb50d2113cb7e4a11cbe47 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
From 32c17dd886a5b506781b86c6227bb059ce33420b Mon Sep 17 00:00:00 2001
From: Tung Nguyen <tung.nguyen@amperecomputing.com>
Date: Sun, 5 Sep 2021 09:22:08 +0000
Subject: [PATCH] flashcp support offset option

The flashcp command from mtd-utils just support to flash from offset 0.
Add offset option to specify the start offset so that firmware can be
flashed correctly

Signed-off-by: Tung Nguyen <tung.nguyen@amperecomputing.com>
---
 misc-utils/flashcp.c | 50 +++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 47 insertions(+), 3 deletions(-)

diff --git a/misc-utils/flashcp.c b/misc-utils/flashcp.c
index 341c210..0a0e75b 100644
--- a/misc-utils/flashcp.c
+++ b/misc-utils/flashcp.c
@@ -91,7 +91,7 @@ static NORETURN void showusage(bool error)
 			"\n"
 			"Flash Copy - Written by Abraham van der Merwe <abraham@2d3d.co.za>\n"
 			"\n"
-			"usage: %1$s [ -v | --verbose | -A | --erase-all ] <filename> <device>\n"
+			"usage: %1$s [ -v | --verbose | -A | --erase-all ] <filename> <device> <offset>\n"
 			"       %1$s -h | --help\n"
 			"       %1$s -V | --version\n"
 			"\n"
@@ -102,6 +102,7 @@ static NORETURN void showusage(bool error)
 			"   -V | --version   Show version information and exit\n"
 			"   <filename>       File which you want to copy to flash\n"
 			"   <device>         Flash device to write to (e.g. /dev/mtd0, /dev/mtd1, etc.)\n"
+			"   <offset>         The start offset. Optional, default: 0\n"
 			"\n",
 			PROGRAM_NAME);
 
@@ -156,6 +157,16 @@ static void safe_rewind (int fd,const char *filename)
 	}
 }
 
+static int safe_rewind_offset(int fd, const char *filename, off_t offset)
+{
+	if (lseek(fd, offset, SEEK_SET) < 0) {
+		log_printf(LOG_ERROR, "While seeking to start of %s: %m\n", filename);
+		return EXIT_FAILURE;
+	}
+
+	return EXIT_SUCCESS;
+}
+
 /******************************************************************************/
 
 static int dev_fd = -1,fil_fd = -1;
@@ -169,6 +180,8 @@ static void cleanup (void)
 int main (int argc,char *argv[])
 {
 	const char *filename = NULL,*device = NULL;
+	off_t offset;
+
 	int i,flags = FLAG_NONE;
 	ssize_t result;
 	size_t size,written;
@@ -225,6 +238,20 @@ int main (int argc,char *argv[])
 				showusage(true);
 		}
 	}
+
+	if (optind + 3 == argc) {
+		flags |= FLAG_FILENAME;
+		filename = argv[optind];
+		DEBUG("Got filename: %s\n", filename);
+
+		flags |= FLAG_DEVICE;
+		device = argv[optind + 1];
+		DEBUG("Got device: %s\n", device);
+
+		offset = strtoul(argv[optind + 2], NULL, 16);
+		DEBUG("Got offset: 0x%x\n", offset);
+	}
+
 	if (optind+2 == argc) {
 		flags |= FLAG_FILENAME;
 		filename = argv[optind];
@@ -233,6 +260,8 @@ int main (int argc,char *argv[])
 		flags |= FLAG_DEVICE;
 		device = argv[optind+1];
 		DEBUG("Got device: %s\n",device);
+
+		offset = 0;
 	}
 
 	if (flags & FLAG_HELP || device == NULL)
@@ -264,6 +293,12 @@ int main (int argc,char *argv[])
 		exit (EXIT_FAILURE);
 	}
 
+	/* does offset is out of the mtd */
+	if (offset > mtd.size) {
+		log_printf(LOG_ERROR, "%s offset won't fit into %s!\n", offset, device);
+		exit(EXIT_FAILURE);
+	}
+
 	/* diff block flashcp */
 	if (flags & FLAG_PARTITION)
 	{
@@ -284,6 +319,8 @@ int main (int argc,char *argv[])
 	}
 	else
 	{
+		/* Erase from the offset */
+		erase.start = offset;
 		erase.length = (filestat.st_size + mtd.erasesize - 1) / mtd.erasesize;
 		erase.length *= mtd.erasesize;
 	}
@@ -330,6 +367,12 @@ int main (int argc,char *argv[])
 	size = filestat.st_size;
 	i = BUFSIZE;
 	written = 0;
+
+	/* if offset is greater than 0 */
+	if (offset)
+		if (safe_rewind_offset(dev_fd, device, offset) != EXIT_SUCCESS)
+			return EXIT_FAILURE;
+
 	while (size)
 	{
 		if (size < BUFSIZE) i = size;
@@ -374,8 +417,9 @@ int main (int argc,char *argv[])
 	 * verify that flash == file data *
 	 **********************************/
 
-	safe_rewind (fil_fd,filename);
-	safe_rewind (dev_fd,device);
+	safe_rewind(fil_fd, filename);
+	safe_rewind_offset(dev_fd, device, offset);
+
 	size = filestat.st_size;
 	i = BUFSIZE;
 	written = 0;
-- 
2.25.1