Skip to content

Commit 171ff11

Browse files
committed
feat: 支持flash的lock/unlock功能
1 parent b373099 commit 171ff11

File tree

7 files changed

+671
-572
lines changed

7 files changed

+671
-572
lines changed

cskburn/src/main.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,15 @@ static struct option long_options[] = {
7878
{"nand-dat1", required_argument, NULL, 0},
7979
{"nand-dat2", required_argument, NULL, 0},
8080
{"nand-dat3", required_argument, NULL, 0},
81+
{"emmc", no_argument, NULL, 0},
8182
{"ram", no_argument, NULL, 'r'},
8283
{"jump", required_argument, NULL, 0},
8384
{"chip-id", no_argument, NULL, 0},
8485
{"read", required_argument, NULL, 0},
8586
{"erase", required_argument, NULL, 0},
8687
{"erase-all", no_argument, NULL, 0},
88+
{"lock", no_argument, NULL, 0},
89+
{"unlock", no_argument, NULL, 0},
8790
{"verify", required_argument, NULL, 0},
8891
{"verify-all", no_argument, NULL, 0},
8992
{"probe-timeout", required_argument, NULL, 0},
@@ -163,6 +166,8 @@ static struct {
163166
uint32_t size;
164167
} erase_parts[MAX_ERASE_PARTS];
165168
bool erase_all;
169+
bool lock;
170+
bool unlock;
166171
uint16_t verify_count;
167172
struct {
168173
uint32_t addr;
@@ -198,6 +203,8 @@ static struct {
198203
.read_count = 0,
199204
.erase_count = 0,
200205
.erase_all = false,
206+
.lock = false,
207+
.unlock = false,
201208
.verify_count = 0,
202209
.verify_all = false,
203210
.probe_timeout = DEFAULT_PROBE_TIMEOUT,
@@ -298,6 +305,10 @@ print_help(const char *progname)
298305
LOGI(" erase specified flash region");
299306
LOGI(" --erase-all");
300307
LOGI(" erase the entire flash");
308+
LOGI(" --lock");
309+
LOGI(" lock the flash");
310+
LOGI(" --unlock");
311+
LOGI(" unlock the flash");
301312
LOGI(" --verify <addr:size>");
302313
LOGI(" verify specified flash region");
303314
LOGI("");
@@ -526,6 +537,12 @@ main(int argc, char **argv)
526537
} else if (strcmp(name, "emmc") == 0) {
527538
options.target = TARGET_EMMC;
528539
break;
540+
} else if (strcmp(name, "lock") == 0) {
541+
options.lock = true;
542+
break;
543+
} else if (strcmp(name, "unlock") == 0) {
544+
options.unlock = true;
545+
break;
529546
} else {
530547
print_help(argv[0]);
531548
return 0;
@@ -923,6 +940,13 @@ serial_burn(cskburn_partition_t *parts, int parts_cnt)
923940
LOGI("Detected eMMC size: %" PRIu64 " MB", flash_size >> 20);
924941
}
925942

943+
if (options.unlock) {
944+
if ((ret = cskburn_serial_unlock(dev, options.target)) != 0) {
945+
LOGE_RET(ret, "ERROR: Failed locking device");
946+
goto err_enter;
947+
}
948+
}
949+
926950
for (int i = 0; i < options.read_count; i++) {
927951
if (options.read_parts[i].addr >= flash_size) {
928952
LOGE("ERROR: The starting boundary of read address (0x%08X) exceeds the capacity of "
@@ -1107,6 +1131,13 @@ serial_burn(cskburn_partition_t *parts, int parts_cnt)
11071131
}
11081132
}
11091133

1134+
if (options.lock) {
1135+
if ((ret = cskburn_serial_lock(dev, options.target)) != 0) {
1136+
LOGE_RET(ret, "ERROR: Failed unlocking device");
1137+
goto err_enter;
1138+
}
1139+
}
1140+
11101141
if (jump_addr) {
11111142
LOGI("Jumping to 0x%08X...", jump_addr);
11121143
} else if (!options.no_reset) {

libcskburn_serial/include/cskburn_serial.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ int cskburn_serial_erase_all(cskburn_serial_device_t *dev, cskburn_serial_target
122122
int cskburn_serial_erase(
123123
cskburn_serial_device_t *dev, cskburn_serial_target_t target, uint32_t addr, uint32_t size);
124124

125+
int cskburn_serial_lock(cskburn_serial_device_t *dev, cskburn_serial_target_t target);
126+
127+
int cskburn_serial_unlock(cskburn_serial_device_t *dev, cskburn_serial_target_t target);
128+
125129
int cskburn_serial_verify(cskburn_serial_device_t *dev, cskburn_serial_target_t target,
126130
uint32_t addr, uint32_t size, uint8_t *md5);
127131

libcskburn_serial/src/burner_arcs_img.c

Lines changed: 576 additions & 572 deletions
Large diffs are not rendered by default.

libcskburn_serial/src/cmd.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@
4646

4747
#define CMD_FLASH_ERASE_CHIP 0xD0
4848
#define CMD_FLASH_ERASE_REGION 0xD1
49+
#define CMD_FLASH_LOCK 0xD4
50+
#define CMD_FLASH_UNLOCK 0xD5
51+
4952
#define CMD_READ_FLASH_ID 0xF3
5053
#define CMD_READ_CHIP_ID 0xF4
5154

@@ -567,6 +570,18 @@ cmd_flash_erase_region(cskburn_serial_device_t *dev, uint32_t address, uint32_t
567570
NULL, calc_timeout(size, TIMEOUT_FLASH_ERASE_PER_MB));
568571
}
569572

573+
int
574+
cmd_flash_lock(cskburn_serial_device_t *dev)
575+
{
576+
return check_command(dev, CMD_FLASH_LOCK, 0, CHECKSUM_NONE, NULL, TIMEOUT_FLASH_DATA);
577+
}
578+
579+
int
580+
cmd_flash_unlock(cskburn_serial_device_t *dev)
581+
{
582+
return check_command(dev, CMD_FLASH_UNLOCK, 0, CHECKSUM_NONE, NULL, TIMEOUT_FLASH_DATA);
583+
}
584+
570585
int
571586
cmd_flash_md5sum(cskburn_serial_device_t *dev, uint32_t address, uint32_t size, uint8_t *md5)
572587
{

libcskburn_serial/src/cmd.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ int cmd_flash_finish(cskburn_serial_device_t *dev);
7272
int cmd_flash_erase_chip(cskburn_serial_device_t *dev);
7373
int cmd_flash_erase_region(cskburn_serial_device_t *dev, uint32_t address, uint32_t size);
7474

75+
int cmd_flash_lock(cskburn_serial_device_t *dev);
76+
int cmd_flash_unlock(cskburn_serial_device_t *dev);
77+
7578
int cmd_flash_md5sum(cskburn_serial_device_t *dev, uint32_t address, uint32_t size, uint8_t *md5);
7679

7780
int cmd_read_flash(cskburn_serial_device_t *dev, uint32_t address, uint32_t size, uint8_t *data,

libcskburn_serial/src/core.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,40 @@ cskburn_serial_erase(
543543
return -EINVAL;
544544
}
545545

546+
int
547+
cskburn_serial_lock(cskburn_serial_device_t *dev, cskburn_serial_target_t target)
548+
{
549+
int ret;
550+
551+
if (target == TARGET_FLASH) {
552+
if ((ret = cmd_flash_lock(dev)) != 0) {
553+
return ret;
554+
}
555+
556+
return 0;
557+
}
558+
559+
LOGE("ERROR: LOCK is not supported, target: %d", target);
560+
return -EINVAL;
561+
}
562+
563+
int
564+
cskburn_serial_unlock(cskburn_serial_device_t *dev, cskburn_serial_target_t target)
565+
{
566+
int ret;
567+
568+
if (target == TARGET_FLASH) {
569+
if ((ret = cmd_flash_unlock(dev)) != 0) {
570+
return ret;
571+
}
572+
573+
return 0;
574+
}
575+
576+
LOGE("ERROR: UNLOCK is not supported, target: %d", target);
577+
return -EINVAL;
578+
}
579+
546580
int
547581
cskburn_serial_verify(cskburn_serial_device_t *dev, cskburn_serial_target_t target, uint32_t addr,
548582
uint32_t size, uint8_t *md5)

libserial/src/serial_win32.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ struct _serial_dev_t {
1111
bool dtr;
1212
};
1313

14+
#ifndef min
15+
#define min(a, b) ((a) < (b) ? (a) : (b))
16+
#endif
17+
18+
#ifndef max
19+
#define max(a, b) ((a) > (b) ? (a) : (b))
20+
#endif
21+
1422
static int
1523
configure_port(HANDLE handle, DWORD baud_rate)
1624
{

0 commit comments

Comments
 (0)