⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bootloader.h

📁 mega88的bootload, 基于串口,支持flash读写,eeprom读写,fuse读写,编译环境IAR for AVR 4.20, 包含xcl配置文件
💻 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 + -