📄 bootloader.h
字号:
#ifndef _BOOTLOADER_H
#define _BOOTLOADER_H
#include <ina90.h>
#include "common.h"
/*******************************************************************************
BOOTSZ1 BOOTSZ0 Boot Pages Application BootLoader End Appli- BootResetAddress
Size Flash Section Flash Section cation section (start BootLoaderSection)
1 1 512words 4 $0000 -$FDFF $FE00 -$FFFF $FDFF $FE00
1 0 1024words 8 $0000 -$FBFF $FC00 -$FFFF $FBFF $FC00
0 1 2048words 16 $0000 -$F7FF $F800 -$FFFF $F7FF $F800
0 0 4096words 32 $0000 -$EFFF $F000 -$FFFF $EFFF $F000
Section Pages Address
Read-While-Write section (RWW) 480 $0000 - $EFFF
No Read-While-Write section (NRWW) 32 $F000 - $FFFF
********************************************************************************/
/*******************************************************************************
SLIP_W_FLASH(ACK), SLIP_W_EEPROM(ACK), SLIP_R_FLASH , SLIP_R_EEPROM
| FCS | CMD | address | length |checksum |
| 1 | 1 | 2/3 | 1/2 | 1 |
SLIP_R_FLASH(ACK), SLIP_R_EEPROM(ACK), SLIP_W_FLASH, SLIP_W_EEPROM
| FCS | CMD | address | length | data |checksum |
| 1 | 1 | 2/3 | 1/2 | length | 1 |
SLIP_W_FUSE / SLIP_R_FUSE
| FCS | CMD | data |checksum |
| 1 | 1 | 4 | 1 |
SLIP_START
| FCS | CMD | data |checksum |
| 1 | 1 | 2 | 1 |
SLIP_FINISH / SLIP_BAUD / SLIP_ERROR
| FCS | CMD | checksum |
| 1 | 1 | 1 |
*******************************************************************************/
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// USER defination
#include <iom88.h>
//#define VERIFY_FLASH
//#define VERIFY_EEPROM
//#define ALWAYS_CHECK_LINK // if in BOOT_WAIT get no package , goto app.
//#define EN_ERROR
//#define EN_DEBUG
#define Wait OCR0B // set to any register not used
#define BOOT_CTRL0 (CTRL0_FLASH_8K + CTRL0_BAUD_9600 + CTRL0_NO_ENCRYPT + CTRL0_NO_EXPAND)
// flash size, buad rate, encrypt
#define BOOT_CTRL1 (CTRL1_BOTT_1024 + CTRL1_PAGE_64 + CTRL1_EEPROM_512 + CTRL1_RESEEP_8)
// boot sector size, page zise
#define WAIT_EEPROM {while(EECR &(1<<EEPE));}
#define TIMER_INIT() {TCCR0A = B0000_0010; TCCR0B = B0000_0101; OCR0A = TIMER_OCR;}
#define TIMER_OVERFLOW TIFR0 & (1<<OCF0A)
#define TIMER_CLEAR TIFR0 |= (1<<OCF0A)
#define SYS_CLOCK 8000000 // system clock
#define BOOT_WAIT_TIME 4 // seconds
#define Disp_on() {DDRC = 0x1e; PORTC = 0x1e;}
#define Disp_off() (PORTC = 0)
#define Disp_link()
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
#define HIGH(X) (X>>8)
#define LOW(X) (X&0xff)
#define CTRL0_M_BAUD 0x07
#define CTRL0_M_ENCRYPT 0x08 // bit3
#define CTRL0_M_FLASH 0x70
#define CTRL0_M_EXPAND 0x80 // bit7
#define CTRL1_M_BOOT 0x03
#define CTRL1_M_PAGE 0x0c
#define CTRL1_M_EEPROM 0x30
#define CTRL1_M_RESEEP 0xc0
#define CTRL0_FLASH_8K 0x00
#define CTRL0_FLASH_16K 0x10
#define CTRL0_FLASH_32K 0x20
#define CTRL0_FLASH_64K 0x30
#define CTRL0_FLASH_128K 0x40
#define CTRL0_FLASH_256K 0x50
#define CTRL0_FLASH_512K 0x60
#define CTRL0_FLASH_1024K 0x70
#define CTRL0_ENCRYPT 0x08
#define CTRL0_BAUD_9600 0x00
#define CTRL0_BAUD_19200 0x01
#define CTRL0_BAUD_38400 0x02
#define CTRL0_BAUD_57600 0x03
#define CTRL0_BAUD_115200 0x04
#define CTRL0_BAUD_230400 0x05
#define CTRL0_BAUD_460800 0x06
#define CTRL0_BAUD_921600 0x07
#define CTRL0_EXPAND 0x80 // expand control bytes, reserved now
#define CTRL0_NO_ENCRYPT 0
#define CTRL0_NO_EXPAND 0
#define CTRL1_BOTT_1024 0x00
#define CTRL1_BOTT_2048 0x01
#define CTRL1_BOTT_4096 0x02
#define CTRL1_BOTT_8192 0x03
#define CTRL1_PAGE_32 0x00
#define CTRL1_PAGE_64 0x04
#define CTRL1_PAGE_128 0x08
#define CTRL1_PAGE_256 0x0c
#define CTRL1_EEPROM_512 0x00
#define CTRL1_EEPROM_1024 0x10
#define CTRL1_EEPROM_2048 0x20
#define CTRL1_EEPROM_4096 0x30
#define CTRL1_RESEEP_8 0x00
#define CTRL1_RESEEP_16 0x40
#define CTRL1_RESEEP_32 0x80
#define CTRL1_RESEEP_64 0xc0
/* timer definaiton */
#define TIMER_DUR 20
#define BOOT_WAIT (unsigned char)((unsigned long)BOOT_WAIT_TIME *1000 /TIMER_DUR)
#define TIMER_OCR (unsigned char)(((unsigned long)SYS_CLOCK * (unsigned long)TIMER_DUR/1024/1000) - 1)
#define SECOND_CNT (unsigned char)(1000/TIMER_DUR)
#define Jmp_boot() asm("jmp (..X_FLASH_SIZE-_..X_BOOT_SIZE)")
/* flash size defination */
#if ((BOOT_CTRL0 & CTRL0_M_FLASH) > CTRL0_FLASH_64K)
#define FLASH_ADDRESS_WIDTH 3
#define EN_PAMPZ
#define Rst_boot() {RAMPZ = 0x01; Jmp_boot();}
#define Goto_app() {RAMPZ = 0x00; asm("jmp 0x0000");} //MCUCR = 0x01; MCUCR = 0x00;
#else
#define FLASH_ADDRESS_WIDTH 2
#define Rst_boot() {Jmp_boot();}
#define Goto_app() asm("jmp 0x0000")
#endif
/* baud rate defination */
#if (SYS_CLOCK > 19660800)
#define USE_UBRR0H
#endif
#define BAUD_SET9600 (unsigned int)((unsigned long)SYS_CLOCK / (8*(unsigned long)9600) -1) //U2Xn = 1
#define BAUD_SET19200 (unsigned int)((unsigned long)SYS_CLOCK / (8*(unsigned long)19200) -1)
#define BAUD_SET38400 (unsigned int)((unsigned long)SYS_CLOCK / (8*(unsigned long)38400) -1)
#define BAUD_SET57600 (unsigned int)((unsigned long)SYS_CLOCK / (8*(unsigned long)57600) -1)
#define BAUD_SET115200 (unsigned int)((unsigned long)SYS_CLOCK / (8*(unsigned long)115200) -1)
#define BAUD_SET230400 (unsigned int)((unsigned long)SYS_CLOCK / (8*(unsigned long)230400) -1)
#define BAUD_SET460800 (unsigned int)((unsigned long)SYS_CLOCK / (8*(unsigned long)460800) -1)
#define BAUD_SET921600 (unsigned int)((unsigned long)SYS_CLOCK / (8*(unsigned long)921600) -1)
//#define BAUD_SET (unsigned int)((unsigned long)SYS_CLOCK / (16*(unsigned long)9600)) //U2Xn = 0
#if ((BOOT_CTRL0 & CTRL0_M_BAUD) > CTRL0_BAUD_9600)
#define EN_BAUD_CHANGE
#if ((BOOT_CTRL0 & CTRL0_M_BAUD) == CTRL0_BAUD_19200 )
#define BAUD_HIGH BAUD_SET19200
#elif ((BOOT_CTRL0 & CTRL0_M_BAUD) == CTRL0_BAUD_38400 )
#define BAUD_HIGH BAUD_SET38400
#elif ((BOOT_CTRL0 & CTRL0_M_BAUD) == CTRL0_BAUD_57600 )
#define BAUD_HIGH BAUD_SET57600
#elif ((BOOT_CTRL0 & CTRL0_M_BAUD) == CTRL0_BAUD_115200)
#define BAUD_HIGH BAUD_SET115200
#endif
#else
#define BAUD_HIGH BAUD_SET9600
#endif
/* encypt defination */
#if ((BOOT_CTRL0 & CTRL0_M_ENCRYPT) > 0)
#define EN_ENCRYPT
#endif
/* page size defination */
#if ((BOOT_CTRL1 & CTRL1_M_PAGE) == CTRL1_PAGE_32)
#define SPM_PAGESIZE 32
#elif ((BOOT_CTRL1 & CTRL1_M_PAGE) == CTRL1_PAGE_64)
#define SPM_PAGESIZE 64
#elif ((BOOT_CTRL1 & CTRL1_M_PAGE) == CTRL1_PAGE_128)
#define SPM_PAGESIZE 128
#else
#define SPM_PAGESIZE 256
#endif
#if (SPM_PAGESIZE == 256)
#define FLASH_PAGE_WIDTH 2
#define LENGTH_TYPE unsigned int
#else
#define FLASH_PAGE_WIDTH 1
#define LENGTH_TYPE unsigned char
#endif
/* slip defination*/
#define SLIP_END 0xc0
#define SLIP_ESC 0xdb
#define SLIP_ESC_END 0xdc
#define SLIP_ESC_ESC 0xdd
#define SLIP_ACK 0x80
#define SLIP_START 0x11 // start download with control bytes 2 bytes
#define SLIP_FINISH 0x12 // end bootloader goto app. 0
#define SLIP_BAUD 0x13 // reset bootloader 0
#define SLIP_ERROR 0x14 // package error 2 bytes
#define SLIP_W_FLASH 0x01 //..
#define SLIP_W_EEPROM 0x02 //..
#define SLIP_W_FUSE 0x03 // write fuse and lock bytes 4 bytes
#define SLIP_R_FLASH 0x04 //addr[1..0] length
#define SLIP_R_EEPROM 0x05 //..
#define SLIP_R_FUSE 0x06 // read fuse and lock bytes 4 bytes
#define SLIP_BUFFER_SIZE (SPM_PAGESIZE+8)
#define SLIP_PKG_FCS 0
#define SLIP_PKG_CMD 1
#define SLIP_PKG_ADDR 2
#define SLIP_PKG_LENGTH_S 4
#define SLIP_PKG_DATA_S (SLIP_PKG_LENGTH_S+1)
#define SLIP_PKG_LENGTH_L 5
#define SLIP_PKG_DATA_L (SLIP_PKG_LENGTH_L+1)
#define SLIP_PKG_CTRL0 2
#define SLIP_PKG_CTRL1 3
#define SLIP_ER_SUMCHECK 0x01
#define SLIP_ER_UNKNOWPKG 0x02
#define SLIP_ER_VERIFY 0x03
//------------------------------------------------------------------------------
void Led(BYTE cmd);
void UART_putc(BYTE c);
char UART_getc(void);
LENGTH_TYPE Slip_receive(void);
char Slip_unpackage(void);
void Slip_package(char cmd, LENGTH_TYPE length);
void Slip_send(LENGTH_TYPE len);
void Spm_fuse_write(unsigned int address,int data);
char Read_flash_fuse (unsigned int addr ,char cmd);
void Spm_wait(void);
void Enable_rww(void);
void Spm_page_cmd(unsigned int p_address,char code);
void Spm_page_fill(unsigned int address,int data);
char Read_flash_fuse (unsigned int addr ,char cmd);
char EEPGET(unsigned int ADR);
void EEPPUT(unsigned int ADR,char val);
#define Spm_page_erase(X) Spm_page_cmd(X,0x03)
#define Spm_page_write(X) Spm_page_cmd(X,0x05)
#define Read_flash(X) Read_flash_fuse(X,0)
#define Read_fuse(X) Read_flash_fuse(X,0x09)
//------------------------------------------------------------------------------
extern char Slip_buf[SLIP_BUFFER_SIZE];
//------------------------------------------------------------------------------
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -