📄 main.c
字号:
/*
Main.C
Micro In-System Programmer
Uros Platise (C) 1997-1999
*/
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include "Terminal.h"
#include "MotIntl.h"
#include "AvrAtmel.h"
#include "Stk500.h"
#ifndef NO_DAPA
# include "AvrDummy.h"
#endif
/* Globals
*/
int argc;
const char** argv;
char* argv_ok;
unsigned verbose_level;
PDevice device;
TMotIntl motintl;
TTerminal terminal;
const char* version = "uisp version 20010909\n"
"(c) 1997-1999 Uros Platise, 2000-2001 Marek Michalkiewicz\n";
const char* help_screen =
"Syntax: uisp [-v{=level}] [-h] [--help] [--version] [--hash=perbytes]\n"
" [-dprog=avr910|pavr|stk500]"
#ifndef NO_DAPA
" [-dprog=type]\n"
" [-dlpt=address|/dev/parportX] [-dno-poll] [-dno-retry]\n"
" [-dvoltage=...] [-dt_sck=time] [-dt_wd_{flash|eeprom}=time]"
#endif
"\n"
" [-dserial=device] [-dpart=name|no]\n"
" [-dspeed=1200|2400|4800|9600|19200|38400|57600|115200]"
"\n"
" [--upload] [--verify] [--erase] [--lock] [if=input_file]\n"
" [--download] [of=output_file]\n"
" [--segment=flash|eeprom|fuse] [--terminal]\n\n"
"Programming Methods:\n"
" -dprog=avr910 Standard Atmel Serial Programmer/Atmel Low Cost Programmer\n"
" pavr http://avr.jpk.co.nz/pavr/pavr.html\n"
" stk500 Atmel STK500\n"
#ifndef NO_DAPA
" -dprog=dapa|stk200|abb|avrisp|bsd|fbprg|dt006|dasa|dasa2 programmer type:\n"
" dapa Direct AVR Parallel Access\n"
" stk200 Parallel Starter Kit STK200, STK300\n"
" abb Altera ByteBlasterMV Parallel Port Download Cable\n"
" avrisp Atmel AVR ISP (?)\n"
" bsd http://www.bsdhome.com/avrprog/ (parallel)\n"
" fbprg http://ln.com.ua/~real/avreal/adapters.html (parallel)\n"
" dt006 http://www.dontronics.com/dt006.html (parallel)\n"
" dasa serial (RESET=RTS SCK=DTR MOSI=TXD MISO=CTS)\n"
" dasa2 serial (RESET=TXD SCK=RTS MOSI=DTR MISO=CTS)\n"
"\n"
"Parallel Device Settings:\n"
" -dlpt= specify device name (Linux ppdev, FreeBSD ppi, serial)\n"
#ifndef NO_DIRECT_IO
" or direct I/O parallel port address (0x378, 0x278, 0x3BC)\n"
#endif
" -dno-poll Program without data polling (a little slower)\n"
" -dno-retry Disable retries of program enable command\n"
" -dvoltage Set timing specs according to the power supply voltage in [V]\n"
" (default 3.0)\n"
" -dt_sck Set minimum SCK high/low time in micro-seconds (default 5)\n"
" -dt_wd_flash Set FLASH maximum write delay time in micro-seconds\n"
" -dt_wd_eeprom Set EEPROM maximum write delay time in micro-seconds\n"
" Use -v=3 option to see current settings.\n"
#endif
"\n"
"Atmel Low Cost Programmer Serial Device Settings:\n"
" -dserial Set serial interface as /dev/ttyS* (default /dev/avr)\n"
" -dpart Set target abbreviated name or number\n"
" If -dpart is not given programmer's supported devices\n"
" are listed. Set -dpart=auto for auto-select.\n"
" -dspeed Set speed of the serial interface (default 19200)\n"
"\n"
"Functions:\n"
" --upload Upload \"input_file\" to the AVR memory.\n"
" --verify Verify \"input_file\" (processed after the --upload opt.)\n"
" --download Download AVR memory to \"output_file\" or stdout.\n"
" --erase Erase device.\n"
" --lock Write lock bits.\n"
" --segment Set active segment (auto-select for AVA Motorola output)\n"
"\n"
"Files:\n"
" if Input file for the --upload and --verify functions in\n"
" Motorola S-records (S1 or S2) or 16 bit Intel format\n"
" of Output file for the --download function in\n"
" Motorola S-records format, default is standard output\n"
"\n"
"Other Options:\n"
" -v Set verbose level (-v equals -v=2, min/max: 0/3, default 1)\n"
" --hash Print hash (default is 32 bytes)\n"
" --help -h Help\n"
" --version Print version information\n"
" --terminal Invoke shell-like terminal\n"
"\n"
"Report bugs to: Marek Michalkiewicz <marekm@amelek.gda.pl>\n"
"Updates: http://www.amelek.gda.pl/avr/uisp/\n";
/* Find command line parameter's value.
It searches the command line parameters of the form:
argv_name=value
Returns pointer to the value.
*/
const char* GetCmdParam(const char* argv_name, bool value_required=true){
int argv_name_len = strlen(argv_name);
for (int i=1; i<argc; i++){
if (strncmp(argv_name, argv[i], argv_name_len)==0){
if (argv[i][argv_name_len]==0){
if (value_required){
throw Error_Device("Incomplete parameter", argv[i]);
}
argv_ok[i]=1;
return &argv[i][argv_name_len];
}
if (argv[i][argv_name_len]=='='){
argv_ok[i]=1;
return &argv[i][argv_name_len+1];
}
}
}
return NULL;
}
/* Print Status Information to the Standard Error Output.
*/
bool Info(unsigned _verbose_level, const char* fmt, ...){
if (_verbose_level > verbose_level){return false;}
va_list ap;
va_start(ap,fmt);
vfprintf(stderr,fmt,ap);
va_end(ap);
return true;
}
int main(int _argc, const char* _argv[]){
int return_val=0;
argc = _argc;
argv = _argv;
verbose_level=1;
if (argc==1){
Info(0, "%s: No command specified.\n", argv[0]); exit(1);
}
argv_ok = (char *)malloc(argc);
for (int i=1; i<argc; i++){argv_ok[i]=0;}
/* Help Screen? */
if (GetCmdParam("-h", false) || GetCmdParam("--help", false)){
printf("%s%s\n", version, help_screen);
return 0;
}
if (GetCmdParam("--version", false)){
printf("%s\n", version);
return 0;
}
/* Setup Verbose Level */
const char *p = GetCmdParam("-v",false);
if (p!=NULL){
if (*p==0){verbose_level=2;} else{verbose_level = atoi(p);}
}
/* Invoke Terminal or Command Line Batch Processing */
try{
const char* val;
val = GetCmdParam("-dprog");
/* backwards compatibility, -datmel is now -dprog=avr910 */
if (GetCmdParam("-datmel", false))
val = "avr910";
if (strcmp(val, "avr910") == 0 || strcmp(val, "pavr") == 0) {
/* Drop setuid privileges (if any - not recommended) before
trying to open the serial device, they are only needed for
direct I/O access (not ppdev/ppi) to the parallel port. */
setgid(getgid());
setuid(getuid());
device = new TAvrAtmel();
}
else if (strcmp(val, "stk500") == 0) {
setgid(getgid());
setuid(getuid());
device = new TStk500();
}
#ifndef NO_DAPA
else if (val) {
device = new TAvrDummy();
}
#endif
/* Check Device's bad command line params. */
for (int i=1; i<argc; i++){
if (argv_ok[i]==0 && strncmp(argv[i], "-d", 2)==0){
Info(0,"Invalid parameter: %s\n", argv[i]); exit(1);
}
}
if (device()==NULL){
throw Error_Device("Programming method is not selected.");
}
/* Set Current Active Segment */
if ((val=GetCmdParam("--segment"))!=NULL){
if (!device->SetSegment(val)){
Info(0, "--segment=%s: bad segment name\n", val);
}
}
/* Device Operations: */
if (GetCmdParam("--download", false)) {
motintl.Write(GetCmdParam("of"));
}
if (GetCmdParam("--erase", false)){device->ChipErase();}
/* Input file */
if ((val=GetCmdParam("if"))) {
if (GetCmdParam("--upload", false)){motintl.Read(val, true, false);}
if (GetCmdParam("--verify", false)){motintl.Read(val, false, true);}
}
if (GetCmdParam("--lock", false)){device->WriteLockBits(0xFC);}
/* enter terminal */
if (GetCmdParam("--terminal", false)){terminal.Run();}
/* Check bad command line parameters */
for (int i=1; i<argc; i++){
if (argv_ok[i]==0){Info(0,"Invalid parameter: %s\n", argv[i]);}
}
}
catch(Error_C){perror("Error"); return_val=1;}
catch(Error_Device& errDev){errDev.print(); return_val=2;}
catch(Error_MemoryRange& x){
Info(0, "Address out of memory range.\n"); return_val=3;
}
free(argv_ok);
return return_val;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -