430{
431 int rc;
432 int exitrc;
433 int i;
434 int ch;
435 int len;
441
442
443
445 int calibrate;
446 char * port;
447 int terminal;
448 int verify;
449 char * exitspecs;
450 char * programmer;
451 char * partdesc;
452
454 char * e;
455 int baudrate;
456 double bitclock;
457 int ispdelay;
458 int safemode;
459 int silentsafe;
460 int init_ok;
461 int is_open;
462
464 unsigned char safemode_lfuse = 0xff;
465 unsigned char safemode_hfuse = 0xff;
466 unsigned char safemode_efuse = 0xff;
467 unsigned char safemode_fuse = 0xff;
468
469 char * safemode_response;
470 int fuses_specified = 0;
471 int fuses_updated = 0;
472
473
474
475
476
477
478
479
480
481
482
484
486
487#if defined (WIN32NATIVE)
488
490#endif
491
494 else
496
501
503
504
505
510 }
511
516 }
517
522 }
523
524 partdesc = NULL;
525 port = NULL;
527 calibrate = 0;
528 p = NULL;
530 terminal = 0;
531 verify = 1;
533 exitspecs = NULL;
537 baudrate = 0;
538 bitclock = 0.0;
539 ispdelay = 0;
540 safemode = 1;
541 silentsafe = 0;
542 is_open = 0;
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558 usr_config[0] = 0;
559
560
561
562
563
564
565
566
567
568
569
571 for (i=0; i<len; i++)
574
575
576
577
578 if (argc == 1) {
580 return 0;
581 }
582
583
584
585
586
588 while ((ch =
getopt(argc,argv,
"?b:B:c:C:DeE:Fi:l:np:OP:qstU:uvVx:yY:")) != -1) {
589
590 switch (ch) {
591 case 'b':
592 baudrate = strtol(
optarg, &e, 0);
593 if ((e ==
optarg) || (*e != 0)) {
597 }
598 break;
599
600 case 'B':
601 bitclock = strtod(
optarg, &e);
602 if (*e != 0) {
603
604 size_t suffixlen = strlen(e);
605 switch (suffixlen) {
606 case 2:
607 if ((e[0] != 'h' && e[0] != 'H') || e[1] != 'z')
608 bitclock = 0.0;
609 else
610
611 bitclock = 1E6 / bitclock;
612 break;
613
614 case 3:
615 if ((e[1] != 'h' && e[1] != 'H') || e[2] != 'z')
616 bitclock = 0.0;
617 else {
618 switch (e[0]) {
619 case 'M':
620 case 'm':
621 bitclock = 1.0 / bitclock;
622 break;
623
624 case 'k':
625 bitclock = 1E3 / bitclock;
626 break;
627
628 default:
629 bitclock = 0.0;
630 break;
631 }
632 }
633 break;
634
635 default:
636 bitclock = 0.0;
637 break;
638 }
639 if (bitclock == 0.0)
642 }
643 if ((e ==
optarg) || bitclock == 0.0) {
647 }
648 break;
649
650 case 'i':
651 ispdelay = strtol(
optarg, &e,10);
652 if ((e ==
optarg) || (*e != 0) || ispdelay == 0) {
656 }
657 break;
658
659 case 'c':
661 break;
662
663
664
665
666
667
668
669
670
671
672 case 'D':
673 uflags &= ~UF_AUTO_ERASE;
674 break;
675
676 case 'e':
678 uflags &= ~UF_AUTO_ERASE;
679 break;
680
681 case 'E':
683 break;
684
685 case 'F':
687 break;
688
689
690
691
692
693 case 'n':
695 break;
696
697 case 'O':
698 calibrate = 1;
699 break;
700
701 case 'p' :
703 break;
704
705 case 'P':
707 break;
708
709 case 'q' :
711 break;
712
713 case 's' :
714 silentsafe = 1;
715 safemode = 1;
716 break;
717
718 case 't':
719 terminal = 1;
720 break;
721
722 case 'u' :
723 safemode = 0;
724 break;
725
726 case 'U':
728 if (upd == NULL) {
732 }
734
739 }
740 break;
741
742 case 'v':
744 break;
745
746 case 'V':
747 verify = 0;
748 break;
749
750 case 'x':
752 break;
753
754 case 'y':
757 break;
758
759 case 'Y':
762 break;
763
764 case '?':
767 break;
768
769 default:
773 break;
774 }
775
776 }
777
778
779
780
781
782
783
784
785
786
787
789
790
791
792
793
794
795
796
797
798
800 }
801
802
803
804
805
807 "%sCopyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/\n"
808 "%sCopyright (c) 2007-2014 Joerg Wunsch\n\n",
810
811
812
813
815 if (rc) {
816
817
820 }
821
822 if (usr_config[0] != 0) {
825
826 rc =
stat(usr_config, &sb);
827 if ((rc < 0) || ((sb.st_mode & S_IFREG) == 0)) {
829 "regular file, skipping\n",
831 }
832 else {
834 if (rc) {
838 }
839 }
840 }
841
844 const char * p = NULL;
845
850
852 if (rc) {
856 }
857 }
858 }
859
860
863 }
864
866
867 if (partdesc) {
868 if (strcmp(partdesc, "?") == 0) {
874 }
875 }
876
877 if (programmer) {
878 if (strcmp(programmer, "?") == 0) {
884 }
885 if (strcmp(programmer, "?type") == 0) {
891 }
892 }
893
894
895 if (programmer[0] == 0) {
897 "or the config file\n",
902 }
903
913 }
914
917 } else {
921 }
922
925 }
927
928
929
930
934 " -x option(s) ignored\n",
936 } else {
941 }
942 }
943 }
944
945 if (port == NULL) {
947 {
950 break;
951
954 break;
955
958 break;
959 }
960 }
961
962 if (partdesc == NULL) {
969 }
970
971
973 if (p == NULL) {
980 }
981
982
983 if (exitspecs != NULL) {
987 exitspecs = NULL;
988 }
992 }
993 }
994
996
997 if (safemode == 0)
998
999 safemode = 1;
1000 else
1001
1002 safemode = 0;
1003 }
1004
1006 safemode = 0;
1007
1008
1010 safemode = 0;
1011 }
1012
1014 safemode = 0;
1015 }
1016
1017
1019 {
1023 }
1024
1025
1026
1027
1028
1029
1030
1033 if (upd->memtype == NULL) {
1034 const char *mtype = (p->flags &
AVRPART_HAS_PDI)?
"application":
"flash";
1038 upd->filename, mtype);
1039 if ((upd->memtype = strdup(mtype)) == NULL) {
1042 }
1043 }
1044 }
1045
1046
1047
1048
1049 if (port[0] == 0) {
1051 "or the config file\n",
1056 }
1057
1061 if ((strcmp(
pgm->
type,
"avr910") == 0)) {
1065 }
1066 }
1067
1068 if (baudrate != 0) {
1071 }
1072
1073 if (bitclock != 0.0) {
1076 }
1077
1078 if (ispdelay != 0) {
1081 }
1082
1084 if (rc < 0) {
1085 exitrc = 1;
1088 goto main_exit;
1089 }
1090 is_open = 1;
1091
1092 if (calibrate) {
1093
1094
1095
1096
1100 exitrc = 1;
1101 } else {
1104 }
1108 }
1109 goto main_exit;
1110 }
1111
1116 }
1117
1120 }
1121
1122 exitrc = 0;
1123
1124
1125
1126
1128
1129
1130
1131
1136
1137
1138
1139
1141 if (!init_ok) {
1145 "or use -F to override\n"
1146 "%sthis check.\n\n",
1148 exitrc = 1;
1149 goto main_exit;
1150 }
1151 }
1152
1153
1155
1159 }
1160
1161
1162
1163
1164
1165
1166
1168 int attempt = 0;
1169 int waittime = 10000;
1170
1171 sig_again:
1173 if (init_ok) {
1175 if (rc != 0) {
1178 exitrc = 1;
1179 goto main_exit;
1180 }
1181 }
1182
1184 if (sig == NULL) {
1187 }
1188
1189 if (sig != NULL) {
1190 int ff, zz;
1191
1194 }
1195 ff = zz = 1;
1196 for (i=0; i<sig->
size; i++) {
1199 }
1200 if (sig->
buf[i] != 0xff)
1201 ff = 0;
1202 if (sig->
buf[i] != 0x00)
1203 zz = 0;
1204 }
1207
1209 if (part) {
1211 }
1212 }
1213 if (ff || zz) {
1214 if (++attempt < 3) {
1215 waittime *= 5;
1218 }
1219 goto sig_again;
1220 }
1223 }
1227 "or use -F to override\n"
1228 "%sthis check.\n\n",
1230 exitrc = 1;
1231 goto main_exit;
1232 }
1233 } else {
1236 }
1237 }
1238
1239 if (sig->
size != 3 ||
1240 sig->
buf[0] != p->signature[0] ||
1241 sig->
buf[1] != p->signature[1] ||
1242 sig->
buf[2] != p->signature[2]) {
1245 p->signature[0], p->signature[1], p->signature[2]);
1248 "or use -F to override this check.\n",
1250 exitrc = 1;
1251 goto main_exit;
1252 }
1253 }
1254 }
1255 }
1256
1257 if (init_ok && safemode == 1) {
1258
1259
1260
1262 &safemode_efuse, &safemode_fuse,
pgm, p);
1263
1264 if (rc != 0) {
1265
1266
1267 if (rc == -5)
1268 {
1270 " Safemode disabled.\n",
progname);
1271 }
1272 else
1273 {
1274
1276 "will be aborted\n",
1278 exitrc = 1;
1279 goto main_exit;
1280 }
1281 } else {
1282
1283 safemode_memfuses(1, &safemode_lfuse, &safemode_hfuse, &safemode_efuse, &safemode_fuse);
1284 }
1285 }
1286
1292 "%sEach page will be erased before programming it, but no chip erase is performed.\n"
1293 "%sTo disable page erases, specify the -D option; for a chip-erase, use the -e option.\n",
1295 }
1296 } else {
1298 const char *memname = (p->flags &
AVRPART_HAS_PDI)?
"application":
"flash";
1299
1300 uflags &= ~UF_AUTO_ERASE;
1304 if (m == NULL)
1305 continue;
1310 "will be performed\n"
1311 "%sTo disable this feature, specify the -D option.\n",
1313 }
1314 break;
1315 }
1316 }
1317 }
1318 }
1319
1320 if (init_ok && erase) {
1321
1322
1323
1324
1328 } else {
1331 }
1333 if(exitrc) goto main_exit;
1334 }
1335 }
1336
1337 if (terminal) {
1338
1339
1340
1342 }
1343
1344 if (!init_ok) {
1345
1346
1347
1348 exitrc = 1;
1349 goto main_exit;
1350 }
1351
1352
1356 if (rc) {
1357 exitrc = 1;
1358 break;
1359 }
1360 }
1361
1362
1363
1364 if (safemode == 1) {
1365
1366
1367 unsigned char safemodeafter_lfuse = 0xff;
1368 unsigned char safemodeafter_hfuse = 0xff;
1369 unsigned char safemodeafter_efuse = 0xff;
1370 unsigned char safemodeafter_fuse = 0xff;
1371 unsigned char failures = 0;
1372 char yes[1] = {'y'};
1373
1376 }
1377
1378
1379 safemode_memfuses(0, &safemode_lfuse, &safemode_hfuse, &safemode_efuse, &safemode_fuse);
1380
1381
1383 &safemodeafter_efuse, &safemodeafter_fuse,
pgm, p) != 0) {
1384
1386 &safemodeafter_efuse, &safemodeafter_fuse,
pgm, p) != 0) {
1388 "I have given up and exited programming mode\n",
1390 exitrc = 1;
1391 goto main_exit;
1392 }
1393 }
1394
1395
1396 if (safemodeafter_fuse != safemode_fuse) {
1397 fuses_updated = 1;
1399 progname, safemode_fuse, safemodeafter_fuse);
1400
1401
1402
1403
1404 if (silentsafe == 0)
1405 safemode_response =
terminal_get_input(
"Would you like this fuse to be changed back? [y/n] ");
1406 else
1407 safemode_response = yes;
1408
1409 if (tolower((int)(safemode_response[0])) == 'y') {
1410
1411
1413 10) == 0) {
1415 }
1416 else {
1418 failures++;
1419 }
1420 }
1421 }
1422
1423
1424 if (safemodeafter_lfuse != safemode_lfuse) {
1425 fuses_updated = 1;
1427 progname, safemode_lfuse, safemodeafter_lfuse);
1428
1429
1430
1431
1432 if (silentsafe == 0)
1433 safemode_response =
terminal_get_input(
"Would you like this fuse to be changed back? [y/n] ");
1434 else
1435 safemode_response = yes;
1436
1437 if (tolower((int)(safemode_response[0])) == 'y') {
1438
1439
1441 10) == 0) {
1443 }
1444 else {
1446 failures++;
1447 }
1448 }
1449 }
1450
1451
1452 if (safemodeafter_hfuse != safemode_hfuse) {
1453 fuses_updated = 1;
1455 progname, safemode_hfuse, safemodeafter_hfuse);
1456
1457
1458 if (silentsafe == 0)
1459 safemode_response =
terminal_get_input(
"Would you like this fuse to be changed back? [y/n] ");
1460 else
1461 safemode_response = yes;
1462 if (tolower((int)(safemode_response[0])) == 'y') {
1463
1464
1466 10) == 0) {
1468 }
1469 else {
1471 failures++;
1472 }
1473 }
1474 }
1475
1476
1477 if (safemodeafter_efuse != safemode_efuse) {
1478 fuses_updated = 1;
1480 progname, safemode_efuse, safemodeafter_efuse);
1481
1482
1483 if (silentsafe == 0)
1484 safemode_response =
terminal_get_input(
"Would you like this fuse to be changed back? [y/n] ");
1485 else
1486 safemode_response = yes;
1487 if (tolower((int)(safemode_response[0])) == 'y') {
1488
1489
1491 10) == 0) {
1493 }
1494 else {
1496 failures++;
1497 }
1498 }
1499 }
1500
1503 if (failures == 0) {
1505 safemode_efuse, safemode_hfuse, safemode_lfuse);
1506 }
1507 else {
1509 }
1510 }
1511
1512 if (fuses_updated && fuses_specified) {
1513 exitrc = 1;
1514 }
1515
1516 }
1517
1518
1519main_exit:
1520
1521
1522
1523
1524
1525 if (is_open) {
1527
1529
1531
1533 }
1534
1537 }
1538
1540}
FP_UpdateProgress update_progress
Definition avr.c:39
int avr_signature(PROGRAMMER *pgm, AVRPART *p)
Definition avr.c:1055
int avr_chip_erase(PROGRAMMER *pgm, AVRPART *p)
Definition avr.c:1196
#define MSG_INFO
Definition avrdude.h:51
#define MSG_NOTICE
Definition avrdude.h:52
#define MSG_NOTICE2
Definition avrdude.h:53
int avr_initmem(AVRPART *p)
Definition avrpart.c:269
AVRPART * locate_part(LISTID parts, char *partdesc)
Definition avrpart.c:514
AVRPART * locate_part_by_signature(LISTID parts, unsigned char *sig, int sigsize)
Definition avrpart.c:549
AVRMEM * avr_locate_mem(AVRPART *p, char *desc)
Definition avrpart.c:354
void avr_display(FILE *f, AVRPART *p, const char *prefix, int verbose)
Definition avrpart.c:621
int init_config(void)
Definition config.c:69
LISTID part_list
Definition config.c:51
char default_serial[PATH_MAX]
Definition config.c:39
double default_bitclock
Definition config.c:40
LISTID programmers
Definition config.c:52
int read_config(const char *file)
Definition config.c:325
int read_config_builtin()
Definition config.c:357
int default_safemode
Definition config.c:41
char default_programmer[MAX_STR_CONST]
Definition config.c:37
char default_parallel[PATH_MAX]
Definition config.c:38
int optind
Definition getopt.c:131
char * optarg
Definition getopt.c:116
int ladd(LISTID lid, void *p)
Definition lists.c:547
void programmer_display(PROGRAMMER *pgm, const char *p)
Definition pgm.c:225
#define DEFAULT_USB
Definition libavrdude.h:929
int do_op(PROGRAMMER *pgm, struct avrpart *p, UPDATE *upd, enum updateflags flags)
Definition update.c:237
#define OFF
Definition libavrdude.h:585
UPDATE * dup_update(UPDATE *upd)
Definition update.c:179
int safemode_memfuses(int save, unsigned char *lfuse, unsigned char *hfuse, unsigned char *efuse, unsigned char *fuse)
Definition safemode.c:290
LISTID lcreat(void *liststruct, int poolsize)
Definition lists.c:410
char id[AVR_IDLEN]
Definition libavrdude.h:219
void * ldata(LNODEID)
Definition lists.c:720
#define AVRPART_AVR32
Definition libavrdude.h:203
int size
Definition libavrdude.h:286
int lsize(LISTID)
Definition lists.c:729
updateflags
Definition libavrdude.h:861
@ UF_AUTO_ERASE
Definition libavrdude.h:864
@ UF_NOWRITE
Definition libavrdude.h:863
@ CONNTYPE_PARALLEL
Definition libavrdude.h:611
@ CONNTYPE_USB
Definition libavrdude.h:613
@ CONNTYPE_SERIAL
Definition libavrdude.h:612
void * LNODEID
Definition libavrdude.h:64
int safemode_writefuse(unsigned char fuse, char *fusename, PROGRAMMER *pgm, AVRPART *p, int tries)
Definition safemode.c:35
PROGRAMMER * locate_programmer(LISTID programmers, const char *configid)
Definition pgm.c:263
LNODEID lnext(LNODEID)
Definition lists.c:704
unsigned char * buf
Definition libavrdude.h:304
#define AVRPART_HAS_PDI
Definition libavrdude.h:202
LNODEID lfirst(LISTID)
Definition lists.c:688
@ DEVICE_VERIFY
Definition libavrdude.h:858
@ DEVICE_WRITE
Definition libavrdude.h:857
@ DEVICE_READ
Definition libavrdude.h:856
#define AVRPART_HAS_TPI
Definition libavrdude.h:206
#define ON
Definition libavrdude.h:584
int safemode_readfuses(unsigned char *lfuse, unsigned char *hfuse, unsigned char *efuse, unsigned char *fuse, PROGRAMMER *pgm, AVRPART *p)
Definition safemode.c:77
#define PATH_MAX
Definition libavrdude.h:51
char desc[AVR_MEMDESCLEN]
Definition libavrdude.h:284
UPDATE * parse_op(char *s)
Definition update.c:31
Definition libavrdude.h:868
Definition libavrdude.h:283
Definition libavrdude.h:217
int ovsigck
Definition main.c:200
static LISTID updates
Definition main.c:186
static LISTID extended_params
Definition main.c:188
int verbose
Definition main.c:198
static bool pgm_setup
Definition main.c:193
static void list_programmers(FILE *f, const char *prefix, LISTID programmers)
Definition main.c:335
char * version
Definition main.c:59
static PROGRAMMER * pgm
Definition main.c:192
static int cleanup_main(int status)
Definition main.c:402
static LISTID additional_config_files
Definition main.c:190
static void list_programmer_types(FILE *f, const char *prefix)
Definition main.c:355
char progbuf[PATH_MAX]
Definition main.c:62
static void list_parts(FILE *f, const char *prefix, LISTID avrparts)
Definition main.c:384
char * progname
Definition main.c:61
static void usage(void)
Definition main.c:208
int avrdude_message(const int msglvl, const char *format,...)
Definition main.c:93
static void update_progress_no_tty(int percent, double etime, char *hdr)
Definition main.c:282
int quell_progress
Definition main.c:199
void erase(std::vector< VecType > &vec, const std::vector< bool > &flags)
Definition RaycastManager.cpp:301
int(* open)(struct programmer_t *pgm, char *port)
Definition libavrdude.h:657
int(* perform_osccal)(struct programmer_t *pgm)
Definition libavrdude.h:682
int ispdelay
Definition libavrdude.h:636
double bitclock
Definition libavrdude.h:635
int baudrate
Definition libavrdude.h:630
int ppidata
Definition libavrdude.h:628
int(* vfy_led)(struct programmer_t *pgm, int value)
Definition libavrdude.h:642
void(* initpgm)(struct programmer_t *pgm)
Definition libavrdude.h:621
int(* pgm_led)(struct programmer_t *pgm, int value)
Definition libavrdude.h:641
int(* parseextparams)(struct programmer_t *pgm, LISTID xparams)
Definition libavrdude.h:683
conntype_t conntype
Definition libavrdude.h:627
void(* enable)(struct programmer_t *pgm)
Definition libavrdude.h:645
int(* rdy_led)(struct programmer_t *pgm, int value)
Definition libavrdude.h:639
int(* err_led)(struct programmer_t *pgm, int value)
Definition libavrdude.h:640
void(* setup)(struct programmer_t *pgm)
Definition libavrdude.h:684
int(* page_erase)(struct programmer_t *pgm, AVRPART *p, AVRMEM *m, unsigned int baseaddr)
Definition libavrdude.h:665
char type[PGM_TYPELEN]
Definition libavrdude.h:619
int(* initialize)(struct programmer_t *pgm, AVRPART *p)
Definition libavrdude.h:643
void(* close)(struct programmer_t *pgm)
Definition libavrdude.h:658
int(* parseexitspecs)(struct programmer_t *pgm, char *s)
Definition libavrdude.h:681
void(* disable)(struct programmer_t *pgm)
Definition libavrdude.h:646
void(* powerdown)(struct programmer_t *pgm)
Definition libavrdude.h:648
char * terminal_get_input(const char *prompt)
Definition term.c:891
int terminal_mode(PROGRAMMER *pgm, struct avrpart *p)
Definition term.c:914
int usleep(unsigned usec)
Definition unistd.cpp:13
#define stat
Definition unistd.h:53
#define strcasecmp
Definition unistd.h:52
#define isatty
Definition unistd.h:46
#define STDIN_FILENO
Definition unistd.h:62