📄 串口isp下载器avr910的 c 原代码.txt
字号:
char cmd1, cmd2, cmd3;
c = getc();
switch (c) {
case 0x1b: /* ESC received */
break;
case 'T': /* Select device type */
device = getc();
dev_flags = GetDeviceFlag(device);
switch (dev_flags & 0x0F) {
case 1:
twd_flash = TWD_FLASH_MEGA;
twd_eeprom = TWD_EEPROM_MEGA;
break;
case 2:
twd_flash = TWD_FLASH_M103;
twd_eeprom = TWD_EEPROM_M103;
break;
case 3:
twd_flash = TWD_FLASH_NEW;
twd_eeprom = TWD_EEPROM_NEW;
break;
default:
twd_flash = TWD_FLASH;
twd_eeprom = TWD_EEPROM;
}
putc(0x0D);
break;
case 'S': /* Return software identifier */
send_pstr(PSTR("AVR ISP"));
break;
case 'V': /* Return software version */
putc(SW_MAJOR);
putc(SW_MINOR);
break;
case 'v': /* Return hardware version */
putc(HW_MAJOR);
putc(HW_MINOR);
break;
case 't': /* Return supported device codes */
send_device_codes();
break;
case 'p': /* Return programmer type */
putc('S'); /* 僔儕傾儖僾儘僌儔儅 */
break;
case 'a': /* Report autoincrement address */
putc('Y'); /* supports auto increment */
break;
case 'x': /* Set LED */
getc();
// LED_On();
putc(0x0D);
break;
case 'y': /* Clear LED */
getc();
// LED_Off();
putc(0x0D);
break;
default:
/* 忋婰埲奜偺僐儅儞僪偼丄偙偺儔僀僞偑彂偒崬傒傪僒億乕僩偟偰偄傞 */
/* 僨僶僀僗偵懳偟偰偺傒幚峴壜擻偲偡傞丅 */
if (!SupportedDevice(device)) {
/* Command Error */
putc('?');
}
else {
/* 僒億乕僩偟偰偄傞僨僶僀僗偺傒彂偒崬傒壜擻 */
switch (c) {
case 'P': /* Enter programming mode */
SPI_Init(device);
putc(0x0D);
break;
case 'C': /* Write program memory, high byte */
w = getc();
SPI_write(0x48);
SPI_write(addr.byte[1]);
SPI_write(addr.byte[0]);
SPI_write(w);
addr.word++;
if (!(dev_flags & DEV_PAGE)) {
/* 儁乕僕儌乕僪懳墳偱側偗傟偽師偺彂偒崬傒傪抶墑偡傞 */
wait_1ms(twd_flash); /* 彂偒崬傒姰椆懸偪 */
}
putc(0x0D);
break;
case 'c': /* Write program memory, low byte */
w = getc();
SPI_write(0x40);
SPI_write(addr.byte[1]);
SPI_write(addr.byte[0]);
SPI_write(w);
if (!(dev_flags & DEV_PAGE)) {
/* 儁乕僕儌乕僪懳墳偱側偗傟偽師偺彂偒崬傒傪抶墑偡傞 */
wait_1ms(twd_flash); /* 彂偒崬傒姰椆懸偪 */
}
putc(0x0D);
break;
case 'R': /* Read program memory */
SPI_write(0x28);
SPI_write(addr.byte[1]);
SPI_write(addr.byte[0]);
putc(SPI_read());
SPI_write(0x20);
SPI_write(addr.byte[1]);
SPI_write(addr.byte[0]);
putc(SPI_read());
addr.word++;
break;
case 'A': /* Set address */
addr.byte[1] = getc();
addr.byte[0] = getc();
putc(0x0D);
break;
case 'D': /* Write data memory */
w = getc();
SPI_write(0xC0);
SPI_write(addr.byte[1]);
SPI_write(addr.byte[0]);
SPI_write(w);
wait_1ms(twd_eeprom); /* 彂偒崬傒姰椆懸偪 */
addr.word++;
putc(0x0D);
break;
case 'd': /* Read data memory */
SPI_write(0xA0);
SPI_write(addr.byte[1]);
SPI_write(addr.byte[0]);
putc(SPI_read());
addr.word++;
break;
case 'L': /* Leave programming mode */
ReleaseDDRB();
rst2840pin_det();
SetReset();
putc(0x0D);
break;
case 'e': /* Chip erase */
SPI_write(0xAC);
SPI_write(0x80);
SPI_write(0x04);
SPI_write(0x00);
wait_1ms(120); /* 徚嫀姰椆懸偪 */
putc(0x0D);
break;
case 'l': /* Write lock bits */
w = getc();
SPI_write(0xAC);
SPI_write(0xE0|(w & 0x06));
SPI_write(0x00);
SPI_write(0x00);
wait_1ms(120); /* 彂偒崬傒姰椆懸偪 */
putc(0x0D);
break;
case 's': /* Read signature bytes */
for (i = 2; i >= 0; i--) {
SPI_write(0x30);
SPI_write(0x00);
SPI_write(i);
putc(SPI_read());
}
break;
case 'm': /* Issue Page Write */
SPI_write(0x4C);
SPI_write(addr.byte[1]);
SPI_write(addr.byte[0]);
SPI_write(0x00);
wait_1ms(twd_flash); /* 彂偒崬傒姰椆懸偪 */
putc(0x0D);
break;
case ':': /* Universal command */
cmd1 = getc();
cmd2 = getc();
cmd3 = getc();
SPI_write(cmd1);
SPI_write(cmd2);
SPI_write(cmd3);
w = SPI_write(0x00);
wait_1ms(120); /* 彂偒崬傒姰椆懸偪 */
putc(w);
putc(0x0D);
break;
case '.': /* New universal command */
cmd1 = getc();
cmd2 = getc();
cmd3 = getc();
w = getc();
SPI_write(cmd1);
SPI_write(cmd2);
SPI_write(cmd3);
w = SPI_write(w);
wait_1ms(120); /* 彂偒崬傒姰椆懸偪 */
putc(w);
putc(0x0D);
break;
#if 0
/* 'f' 偲 'F' 偼僷儔儗儖僾儘僌儔儅愱梡丠 */
case 'f': /* Write fuse bits */
w = getc();
SPI_write(0xAC);
SPI_write(0xA0|(w & 0x1F));
SPI_write(0x00);
SPI_write(0x00);
wait_1ms(120); /* 彂偒崬傒姰椆懸偪 */
putc(0x0D);
break;
case 'F': /* Read fuse and lock bits */
SPI_write(0x58);
SPI_write(0x00);
SPI_write(0x00);
putc(SPI_read());
break;
#endif
default: /* Command Error */
putc('?');
}
}
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -