@@ -266,6 +266,10 @@ def parse_int(str_value):
266
266
"--meta" ,
267
267
action = "store_true" ,
268
268
help = "dump out the metadata for all connected boards in JSON" )
269
+ parser .add_argument (
270
+ "--security" ,
271
+ type = str ,
272
+ help = "update the security page in the flash at address addr" )
269
273
parser .add_argument (
270
274
"--update-bootloader" ,
271
275
action = "store_true" ,
@@ -372,6 +376,7 @@ def parse_int(str_value):
372
376
# program the flash memory
373
377
if (args .program is not None ) or (
374
378
args .program_userdata is not None ) or (
379
+ args .security is not None ) or (
375
380
args .program_image is not None ):
376
381
boot_fpga = False
377
382
@@ -381,6 +386,7 @@ def progress(info):
381
386
382
387
with active_port :
383
388
fpga = TinyProg (active_port , progress )
389
+ force = False
384
390
385
391
if args .program is not None :
386
392
print (" Programming %s with %s" % (
@@ -390,6 +396,7 @@ def progress(info):
390
396
391
397
if args .addr is not None :
392
398
addr = parse_int (args .addr )
399
+ force = True
393
400
else :
394
401
addr = fpga .meta .userimage_addr_range ()[0 ]
395
402
@@ -400,7 +407,7 @@ def progress(info):
400
407
print (" Bootloader not active" )
401
408
sys .exit (1 )
402
409
403
- if check_if_overwrite_bootloader (
410
+ if force or check_if_overwrite_bootloader (
404
411
addr , len (bitstream ),
405
412
fpga .meta .userimage_addr_range ()):
406
413
boot_fpga = True
@@ -417,6 +424,7 @@ def progress(info):
417
424
418
425
if args .addr is not None :
419
426
addr = parse_int (args .addr )
427
+ force = True
420
428
else :
421
429
addr = fpga .meta .userdata_addr_range ()[0 ]
422
430
@@ -427,7 +435,7 @@ def progress(info):
427
435
print (" Bootloader not active" )
428
436
sys .exit (1 )
429
437
430
- if check_if_overwrite_bootloader (
438
+ if force or check_if_overwrite_bootloader (
431
439
addr , len (bitstream ),
432
440
fpga .meta .userdata_addr_range ()):
433
441
boot_fpga = True
@@ -444,6 +452,7 @@ def progress(info):
444
452
445
453
if args .addr is not None :
446
454
addr = parse_int (args .addr )
455
+ force = True
447
456
else :
448
457
addr = fpga .meta .userimage_addr_range ()[0 ]
449
458
@@ -454,7 +463,7 @@ def progress(info):
454
463
print (" Bootloader not active" )
455
464
sys .exit (1 )
456
465
457
- if check_if_overwrite_bootloader (
466
+ if force or check_if_overwrite_bootloader (
458
467
addr , len (bitstream ),
459
468
(fpga .meta .userimage_addr_range ()[0 ],
460
469
fpga .meta .userdata_addr_range ()[1 ])):
@@ -463,6 +472,27 @@ def progress(info):
463
472
if not fpga .program_bitstream (addr , bitstream ):
464
473
sys .exit (1 )
465
474
475
+ if args .security is not None :
476
+ print (" Programming %s security page with %s" % (
477
+ active_port , args .security ))
478
+
479
+ data = open (args .security , 'r' ).read ()
480
+
481
+ if args .addr is not None :
482
+ addr = parse_int (args .addr )
483
+ else :
484
+ addr = 1
485
+
486
+ if addr < 0 :
487
+ print (" Negative write addr: {}" .format (addr ))
488
+ sys .exit (1 )
489
+ if not fpga .is_bootloader_active ():
490
+ print (" Bootloader not active" )
491
+ sys .exit (1 )
492
+
493
+ if not fpga .program_security_page (addr , data ):
494
+ sys .exit (1 )
495
+
466
496
if boot_fpga :
467
497
fpga .boot ()
468
498
print ("" )
0 commit comments