Skip to content

Commit c57f9f9

Browse files
committed
feat: 支持flash的lock/unlock功能
1 parent c154945 commit c57f9f9

File tree

5 files changed

+86
-0
lines changed

5 files changed

+86
-0
lines changed

cskburn/src/main.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ static struct option long_options[] = {
8585
{"read", required_argument, NULL, 0},
8686
{"erase", required_argument, NULL, 0},
8787
{"erase-all", no_argument, NULL, 0},
88+
{"lock", no_argument, NULL, 0},
89+
{"unlock", no_argument, NULL, 0},
8890
{"verify", required_argument, NULL, 0},
8991
{"verify-all", no_argument, NULL, 0},
9092
{"probe-timeout", required_argument, NULL, 0},
@@ -164,6 +166,8 @@ static struct {
164166
uint32_t size;
165167
} erase_parts[MAX_ERASE_PARTS];
166168
bool erase_all;
169+
bool lock;
170+
bool unlock;
167171
uint16_t verify_count;
168172
struct {
169173
uint32_t addr;
@@ -199,6 +203,8 @@ static struct {
199203
.read_count = 0,
200204
.erase_count = 0,
201205
.erase_all = false,
206+
.lock = false,
207+
.unlock = false,
202208
.verify_count = 0,
203209
.verify_all = false,
204210
.probe_timeout = DEFAULT_PROBE_TIMEOUT,
@@ -299,6 +305,10 @@ print_help(const char *progname)
299305
LOGI(" erase specified flash region");
300306
LOGI(" --erase-all");
301307
LOGI(" erase the entire flash");
308+
LOGI(" --lock");
309+
LOGI(" lock the flash");
310+
LOGI(" --unlock");
311+
LOGI(" unlock the flash");
302312
LOGI(" --verify <addr:size>");
303313
LOGI(" verify specified flash region");
304314
LOGI("");
@@ -527,6 +537,12 @@ main(int argc, char **argv)
527537
} else if (strcmp(name, "emmc") == 0) {
528538
options.target = TARGET_EMMC;
529539
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;
530546
} else {
531547
print_help(argv[0]);
532548
return 0;
@@ -924,6 +940,13 @@ serial_burn(cskburn_partition_t *parts, int parts_cnt)
924940
LOGI("Detected eMMC size: %" PRIu64 " MB", flash_size >> 20);
925941
}
926942

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+
927950
for (int i = 0; i < options.read_count; i++) {
928951
if (options.read_parts[i].addr >= flash_size) {
929952
LOGE("ERROR: The starting boundary of read address (0x%08X) exceeds the capacity of "
@@ -1108,6 +1131,13 @@ serial_burn(cskburn_partition_t *parts, int parts_cnt)
11081131
}
11091132
}
11101133

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+
11111141
if (jump_addr) {
11121142
LOGI("Jumping to 0x%08X...", jump_addr);
11131143
} 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/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)

0 commit comments

Comments
 (0)