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

📄 bootloader.h

📁 mega88的无线bootload, 无线芯片cc1100,支持flash读写, eeprom读写, 编译环境IAR for AVR 4.20
💻 H
字号:
#ifndef _BOOTLOADER_H
#define _BOOTLOADER_H

#include <ina90.h>
#include "common.h"
#include "ccreg.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
********************************************************************************/

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// USER defination
#include <iom88.h>

#define EN_FUSE_WRITE           0
#define EN_FUSE_READ            0

#define SLAVE_TYPE              RFADDR_SKYFLO                                   

#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   LEDPORT               'C'
#define   LEDPIN                2
#define   LEDPINEX              1
#define   LEDACTIVE             1

#define   KEYPORT               'D'                                             // keyport 'B''C''D'
#define   KEYPIN                5                                               // 0..7
#define   KEYACTIVE             1                                               // 0,1

#define	  READ_GDO2 			(PINB & (1<<PB1))
#define   SET_CSN		        PORTB |= 1 << PB0
#define   CLR_CSN				PORTB &= ~ (1 << PB0)
#define	  READ_MISO 			((PINB>>PB4)& 0x01)
#define   SPI_WAIT()            while (!(SPSR&(1<<SPIF)));

//------------------------------------------------------------------------------
//-----key
#if(KEYPORT == 'B')
  #if(KEYACTIVE == 1)
    #define Key_Init()          {DDRB &= ~(1<<KEYPIN);  PORTB &= ~(1<<KEYPIN);}
    #define Check_key_break()   {if(PORTB &(1<<KEYPIN)) return 0;}
  #else
    #define Key_Init()          {DDRB &= ~(1<<KEYPIN);  PORTB |=  (1<<KEYPIN);}
    #define Check_key_break()   {if((PORTB &(1<<KEYPIN)) == 0) return 0;}
  #endif
#elif(KEYPORT == 'C')
  #if(KEYACTIVE == 1)
    #define Key_Init()          {DDRC &= ~(1<<KEYPIN);  PORTC &=~(1<<KEYPIN);}
    #define Check_key_break()   {if(PORTC &(1<<KEYPIN)) return 0;}
  #else
    #define Key_Init()          {DDRC &= ~(1<<KEYPIN);  PORTC |= (1<<KEYPIN);}
    #define Check_key_break()   {if((PORTC &(1<<KEYPIN))== 0) return 0;}
  #endif
#elif(KEYPORT == 'D')
  #if(KEYACTIVE == 1)
    #define Key_Init()          {DDRD &= ~(1<<KEYPIN);  PORTD &=~(1<<KEYPIN);}
    #define Check_key_break()   {if(PORTD &(1<<KEYPIN)) return 0;}
  #else
    #define Key_Init()          {DDRD &= ~(1<<KEYPIN);  PORTD |= (1<<KEYPIN);}
    #define Check_key_break()   {if((PORTD &(1<<KEYPIN))== 0) return 0;}
  #endif
#else
    #error unknow key port !!!
#endif

//-----led 
#if(LEDPORT == 'B')
  #if(LEDACTIVE == 0)
    #define Led_Init()          {DDRB |=  (1<<LEDPIN)+(1<<LEDPINEX);  PORTB &= ~(1<<LEDPINEX);}
    #define Led_Idle()          (PORTB|=  (1<<LEDPIN))
    #define Led_Active()        (PORTB&= ~(1<<LEDPIN))
  #else
    #define Led_Init()          {DDRB |=  (1<<LEDPIN)+(1<<LEDPINEX);  PORTB |=  (1<<LEDPINEX);}
    #define Led_Idle()          (PORTB&= ~(1<<LEDPIN))
    #define Led_Active()        (PORTB|=  (1<<LEDPIN))
  #endif
#elif(LEDPORT == 'C')
  #if(LEDACTIVE == 0)
    #define Led_Init()          {DDRC |=  (1<<LEDPIN)+(1<<LEDPINEX);  PORTC &= ~(1<<LEDPINEX);}
    #define Led_Idle()          (PORTC|=  (1<<LEDPIN))
    #define Led_Active()        (PORTC&= ~(1<<LEDPIN))
  #else
    #define Led_Init()          {DDRC |=  (1<<LEDPIN)+(1<<LEDPINEX);  PORTC |=  (1<<LEDPINEX);}
    #define Led_Idle()          (PORTC&= ~(1<<LEDPIN))
    #define Led_Active()        (PORTC|=  (1<<LEDPIN))
  #endif
#elif(LEDPORT == 'D')
  #if(LEDACTIVE == 0)
    #define Led_Init()          {DDRD |=  (1<<LEDPIN)+(1<<LEDPINEX);  PORTD &= ~(1<<LEDPINEX);}
    #define Led_Idle()          (PORTD|=  (1<<LEDPIN))
    #define Led_Active()        (PORTD&= ~(1<<LEDPIN))
  #else
    #define Led_Init()          {DDRD |=  (1<<LEDPIN)+(1<<LEDPINEX);  PORTD |=  (1<<LEDPINEX);}
    #define Led_Idle()          (PORTD&= ~(1<<LEDPIN))
    #define Led_Active()        (PORTD|=  (1<<LEDPIN))
  #endif
#else
    #error unknow led port !!!
#endif

//------------------------------------------------------------------------------
#define RFADDR_WIDE			5						// rf address wide, also for differentiate device
#define RFADDR_MASK			B1111_1000

#define RFADDR_BROAD		0<<(8-RFADDR_WIDE)		// broadcast
#define RFADDR_MASTER		1<<(8-RFADDR_WIDE)		// master		bit2..0 can be used for multi-master
#define RFADDR_ALARM		2<<(8-RFADDR_WIDE)		// alarm
#define RFADDR_WAITER		3<<(8-RFADDR_WIDE)		// waiter
#define RFADDR_KITCHEN		4<<(8-RFADDR_WIDE)		// kitchen
#define RFADDR_TABLE		5<<(8-RFADDR_WIDE)		// table
#define RFADDR_DOOR		 	6<<(8-RFADDR_WIDE)		// door
#define RFADDR_RES0			7<<(8-RFADDR_WIDE)		// -

#define RFADDR_SKYFLO		8<<(8-RFADDR_WIDE)		// skyflo
#define RFADDR_FIXFLO		9<<(8-RFADDR_WIDE)		// fixflo
#define RFADDR_BARFLO		10<<(8-RFADDR_WIDE)		// barflo
#define RFADDR_KIPCLO		11<<(8-RFADDR_WIDE)		// kipflo

#define RFADDR_SCALE_S		12<<(8-RFADDR_WIDE)		// scale single
#define RFADDR_SCALE_M		13<<(8-RFADDR_WIDE)		// scale multi
#define RFADDR_SCALE_F		14<<(8-RFADDR_WIDE)		// scale fridge
#define RFADDR_SCALE_K		15<<(8-RFADDR_WIDE)		// ?

#define RFADDR_BEERFLO		16<<(8-RFADDR_WIDE)		// beerflo
#define RFADDR_BEERHANDLE	17<<(8-RFADDR_WIDE)		// beerhandle
#define RFADDR_RAVEN		18<<(8-RFADDR_WIDE)		// reven
#define RFADDR_OPTIC		19<<(8-RFADDR_WIDE)		// optic pearl

#define RFADDR_COFFEE		16<<(8-RFADDR_WIDE)		// coffee machine
#define RFADDR_COCKTAIL	 	17<<(8-RFADDR_WIDE)		// cocktail machine
#define RFADDR_RES3		 	18<<(8-RFADDR_WIDE)		// -
#define RFADDR_RES4		 	19<<(8-RFADDR_WIDE)		// -
//#define RFADDR_COFFEE		 20..31<<3				// master

//------------------------------------------------------------------------------
#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)		

//----- flash size defination 
#define Jmp_boot()              asm("jmp (..X_FLASH_SIZE-_..X_BOOT_SIZE)")

#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

//-----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_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

//-----RF defination
#define RF_DATA_SIZE        32
#define RF_DATA_MAX         32+8

#define CMD_TYPE_R_CONFIG		0x05			// read configration

typedef struct{
	BYTE length;		// +1
	BYTE addr;			// +1		
	BYTE fctcmd;		// +1 		
	BYTE cmd;			// +1	
    WORD maddr;
    BYTE mlength;
    BYTE fill;
	BYTE mdata[32];	    // +n
}package;				// 6+n		

#define ST_length		0
#define ST_addr			1
#define ST_fctcmd		2
#define ST_cmd		    3
#define ST_maddr		4
#define ST_mlength		6
#define ST_fill		    7
#define ST_mdata	    8

//------------------------------------------------------------------------------
#define  SpiReadStatus(X) SpiReadReg(X | READ_BURST )
void SpiPut(BYTE data);
void SpiHead(BYTE data);
void SpiWriteReg(BYTE addr, BYTE val);
void SpiStrobe(BYTE strobe);
BYTE SpiReadReg(BYTE addr);

void Pause_1uS(BYTE delay);
void Cc_Init(void);
char DataPrc(void);

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)

//------------------------------------------------------------------------------
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -