📄 bootloader.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 + -