Merge pull request #1 from KryoStoffer/master

cc1110 Bootload using the radio interface
This commit is contained in:
Toby Jaffey committed 2012-11-05 14:50:01 -08:00
commit 9b9bfda1c2
10 files changed
+2793 -7

No files matched your search

+18 -7
View File
@@ -9,8 +9,6 @@
#include <getopt.h>
#include <sys/time.h>
#define SERIAL_TIMEOUT 2
#ifdef __CYGWIN__
#undef WIN32
#endif
@@ -35,6 +33,7 @@ static struct option long_options[] =
{"device", required_argument, 0, 'd'},
{"timeout", required_argument, 0, 't'},
{"passthrough", no_argument, 0, 'p'},
{"wireless", no_argument, 0, 'w'},
{0, 0, 0, 0}
};
@@ -51,6 +50,7 @@ void usage(void)
fprintf(stderr, " --flash=file.hex -f file.hex Reflash device with intel hex file\n");
fprintf(stderr, " --timeout=n -t n Search for bootload string for n seconds\n");
fprintf(stderr, " --passthrough -p Program remote device over passthrough\n");
fprintf(stderr, " --wireless -w Program remote device over wireless ccrl\n");
}
static bool opt_console = false;
@@ -60,6 +60,8 @@ static bool opt_device = false;
static char *flash_filename = NULL;
static char *device_name = NULL;
static bool opt_passthrough = 0;
static bool opt_wireless = 0;
static int serial_timeout = 2;
#ifndef WIN32
static struct termios orig_termios;
@@ -72,7 +74,7 @@ int parse_options(int argc, char **argv)
while(1)
{
c = getopt_long (argc, argv, "hcf:d:t:p", long_options, &option_index);
c = getopt_long (argc, argv, "hcf:d:t:p:w", long_options, &option_index);
if (c == -1)
break;
switch(c)
@@ -80,6 +82,10 @@ int parse_options(int argc, char **argv)
case 'h':
return 1;
break;
case 'w':
opt_wireless = 1;
serial_timeout = 4;
break;
case 'p':
opt_passthrough = 1;
break;
@@ -260,7 +266,7 @@ int serialRead(int fd, void* buf, int len)
return rc;
gettimeofday(&now, NULL);
}
while((now.tv_sec - start.tv_sec) < SERIAL_TIMEOUT);
while((now.tv_sec - start.tv_sec) < serial_timeout);
return 1;
}
@@ -296,7 +302,7 @@ int serialWrite(int fd, void* buf, int len)
return rc;
gettimeofday(&now, NULL);
}
while((now.tv_sec - start.tv_sec) < SERIAL_TIMEOUT);
while((now.tv_sec - start.tv_sec) < serial_timeout);
return 1;
}
@@ -469,8 +475,8 @@ int wait_for_bootloader(int fd, int timeout)
gettimeofday(&start, NULL);
if (!opt_passthrough)
serialWrite(fd, "+++", 3);
if (!opt_passthrough && !opt_wireless)
serialWrite(fd, "+++", 5);
printf("Waiting %ds for bootloader, reset board now\n", timeout);
@@ -497,6 +503,11 @@ int wait_for_bootloader(int fd, int timeout)
if (c == 'P' && prev_c == 'P')
break;
}
else if (opt_wireless)
{
if (c == 'W' && prev_c == 'W')
break;
}
else
{
if (c == 'B' && prev_c == 'B')
+69
View File
@@ -0,0 +1,69 @@
PROG = /cygdrive/c/Program\ Files/Texas\ Instruments/SmartRF\ Tools/Flash\ Programmer/bin/SmartRFProgConsole.exe
TARGET = cctl-rf.hex
CC = sdcc
AS = sdas8051
CFLAGS = --model-small --opt-code-size --acall-ajmp
LDFLAGS_FLASH = \
--out-fmt-ihx \
--code-loc 0x0000 --code-size 0x400 \
--xram-loc 0xf000 --xram-size 0x1000 \
--iram-size 0x100
ASFLAGS = -plosgff
ifdef DEBUG
CFLAGS += --debug
endif
SRC = main.c
ASM_SRC = start.asm
ADB = $(SRC:.c=.c.adb)
ASM = $(SRC:.c=.c.asm)
LNK = $(SRC:.c=.c.lnk)
LST = $(SRC:.c=.c.lst)
REL = $(SRC:.c=.c.rel)
RST = $(SRC:.c=.c.rst)
SYM = $(SRC:.c=.c.sym)
ASM_ADB = $(ASM_SRC:.asm=.adb)
ASM_LNK = $(ASM_SRC:.asm=.lnk)
ASM_LST = $(ASM_SRC:.asm=.lst)
ASM_REL = $(ASM_SRC:.asm=.rel)
ASM_RST = $(ASM_SRC:.asm=.rst)
ASM_SYM = $(ASM_SRC:.asm=.sym)
PROGS = $(TARGET)
PCDB = $(PROGS:.hex=.cdb)
PLNK = $(PROGS:.hex=.lnk)
PMAP = $(PROGS:.hex=.map)
PMEM = $(PROGS:.hex=.mem)
PLK = $(PROGS:.hex=.lk)
PAOM = $(PROGS:.hex=)
%.c.rel : %.c
$(CC) -c $(CFLAGS) -o$*.c.rel $<
%.rel : %.asm
$(AS) -c $(ASFLAGS) $<
all: $(PROGS)
$(TARGET): $(REL) $(ASM_REL) Makefile
$(CC) $(LDFLAGS_FLASH) $(CFLAGS) -o $(TARGET) $(ASM_REL) $(REL)
@echo Binary size `makebin -p < $(TARGET) | wc -c`
clean:
rm -f $(ADB) $(ASM) $(LNK) $(LST) $(REL) $(RST) $(SYM)
rm -f $(ASM_ADB) $(ASM_LNK) $(ASM_LST) $(ASM_REL) $(ASM_RST) $(ASM_SYM)
rm -f $(PROGS) $(PCDB) $(PLNK) $(PMAP) $(PMEM) $(PLK) $(PAOM)
install: $(TARGET)
$(PROG) S EPV F="$(TARGET)"
+80
View File
@@ -0,0 +1,80 @@
ChipCon Tiny Loader Radio Version
=================================
A bootloader that can replace the original cctl in places where you don't want to load software via serial cable. This is achieved by using the wireless radio interface of the CC1110.
The readme has only limited information, experience in using the serial version of the cctl is recommended, see the readme of cctl.
Usage
-----
You need 2 cc1110 boards, a device that can run the cctl-prog, and a way to to load the bootloaders, see readme of cctl.
First board should be loaded with a bootloader and the sensemote app ChipCon Radio Loader (ccrl).
Second board should have the cctl-rf bootloader.
Connect the first board via serial to the device running the cctl-prog.
Use the cctl-prog with the -w option.
Building
--------
The code has been tested with SDCC, version 3.2.0
Radio Protocol
--------------
On reset the bootloader will send 18 packets containing the following:
<- `0x02 0xFD 0x10`
waiting for a reponse like:
-> `0x02 0xFE 0x10`
If a response is received, the bootloader will enter upgrade mode.
If no packet is received, the bootloader will attempt to launch user code from 0x400.
The bootloader enables the watchdog with a 1s timeout while running. It does not engage the hardware watchdog when jumping to user code (as the watchdog cannot be disabled making it incompatible with applications which remain in deep sleep for long periods).
Once in upgrade mode, the bootloader expects to receive at least one packet per second, otherwise it will reset using the hardware watchdog.
In upgrade mode the following commands are available:
### Erase page
Erase a 1KB page of flash.
-> `0x04 0xFE 0x01`, `uint8_t page` (0-31), `0x00`
<- `0x04 0xFD 0x01`, `uint8_t page` (0-31), `0x00`
### Program page
Program a 1KB page of flash from RAM buffer.
-> `0x04 0xFE 0x02`, `uint8_t page` (0-31), `0x00`
<- `0x04 0xFD 0x02`, `uint8_t page` (0-31), `0x00`
### Read segment
Read 64 byte segment from flash.
-> `0x04 0xFE 0x03`, `uint8_t page` (0-31), `uint8_t segment` (0-15)
<- `0x44 0xFD 0x03`, `uint8_t page` (0-31), `uint8_t segment` (0-15), `uint8_t data[64]`
### Load page
Load 64 byte segment to RAM buffer.
-> `0x44 0xFE 0x04`, `uint8_t page` (ignored), `uint8_t segment` (0-15), `uint8_t data[64]`
<- `0x04 0xFD 0x04`, `uint8_t page` (ignored), `uint8_t segment` (0-15)
### Jump to user code
-> 0x02 0xFE 0x05
+1283
View File
File diff suppressed because it is too large. Load diff
+555
View File
@@ -0,0 +1,555 @@
/*
* CCTL-RF - ChipCon Tiny Loader Radio Version
* A 1KB RF bootloader for the CC1110/CC1111
*
* Kristoffer Larsen (c) 2012 <kri@kri.dk>
*
* Based on Serial bootload from
* Joby Taffey (c) 2012 <jrt-cctl@hodgepig.org>
*
* Derived from CC Bootloader
* Fergus Noble (c) 2011
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
// Select crystal frequency
// Remember to change in start.asm also.
#define CRYSTAL_26_MHZ
//#define CONSOLE_DEBUG
#include <stdint.h>
#include <cc1110.h>
#include "cc1110-ext.h"
#define RADIOBUF_MAX 256
// Flash write timer value:
// FWT = 21000 * FCLK / (16 * 10^9)
// For FCLK = 24MHz, FWT = 0x1F
// For FCLK = 26MHz, FWT = 0x11
#ifdef CRYSTAL_26_MHZ
#define FLASH_FWT 0x1F
#endif
#ifdef CRYSTAL_24_MHZ
#define FLASH_FWT 0x11
#endif
// Address of flash controller data register
#define FLASH_FWDATA_ADDR 0xDFAF
static __xdata struct cc_dma_channel dma0_config;
static __xdata uint8_t radiobuf[RADIOBUF_MAX];
static uint8_t radiobuf_index;
#ifdef CONSOLE_DEBUG
static __xdata uint8_t * __at (0x0000) flashp;
#endif
__xdata uint8_t rambuf[1024];
struct cc_dma_channel
{
uint8_t src_high;
uint8_t src_low;
uint8_t dst_high;
uint8_t dst_low;
uint8_t len_high;
uint8_t len_low;
uint8_t cfg0;
uint8_t cfg1;
};
#define DMA_CFG0_TRIGGER_FLASH 18
#define DMA_CFG1_SRCINC_1 (1 << 6)
#define DMA_CFG1_DESTINC_0 (0 << 4)
#define DMA_CFG1_PRIORITY_HIGH (2 << 0)
#define DMAARM_DMAARM0 (1 << 0)
#define DMA_LEN_HIGH_VLEN_MASK (7 << 5)
#define DMA_LEN_HIGH_VLEN_LEN (0 << 5)
#define DMA_LEN_HIGH_VLEN_PLUS_1 (1 << 5)
#define DMA_LEN_HIGH_VLEN (2 << 5)
#define DMA_LEN_HIGH_VLEN_PLUS_2 (3 << 5)
#define DMA_LEN_HIGH_VLEN_PLUS_3 (4 << 5)
#define DMA_LEN_HIGH_MASK (0x1f)
#define DMA_CFG0_WORDSIZE_8 (0 << 7)
#define DMA_CFG0_WORDSIZE_16 (1 << 7)
#define DMA_CFG0_TMODE_MASK (3 << 5)
#define DMA_CFG0_TMODE_SINGLE (0 << 5)
#define DMA_CFG0_TMODE_BLOCK (1 << 5)
#define DMA_CFG0_TMODE_REPEATED_SINGLE (2 << 5)
#define DMA_CFG0_TMODE_REPEATED_BLOCK (3 << 5)
void flash_erase_page(void)
{
while (FCTL & FCTL_BUSY);
FWT = FLASH_FWT;
FADDRH = radiobuf[3] << 1;
FADDRL = 0x00;
// Erase the page that will be written to
FCTL |= FCTL_ERASE;
__asm nop __endasm;
// Wait for the erase operation to complete
while (FCTL & FCTL_BUSY) {}
}
void flash_write_trigger(void)
{
// Enable flash write. Generates a DMA trigger. Must be aligned on a 2-byte
// boundary and is therefore implemented in assembly.
// p.s. if this looks a little crazy its because it is, sdcc doesn't currently
// support explicitly specifying code alignment which would make this easier
__asm
.globl flash_write_trigger_instruction
.globl flash_write_trigger_done
; Put our trigger instruction in the HOME segment (shared with some startup code)
; where it wont move around too much
.area HOME (CODE)
; Comment or uncomment these lines to adjust if you change the start.asm code
nop ; Padding to get onto 16-bit boundary
flash_write_trigger_instruction:
orl _FCTL, #0x02 ; FCTL |= FCTL_ERASE
nop ; Required, see datasheet.
ljmp flash_write_trigger_done ; Jump back into our function
; Meanwhile, back in the main CSEG segment...
.area CSEG (CODE)
; Jump to the trigger instruction
ljmp flash_write_trigger_instruction
flash_write_trigger_done:
__endasm;
}
void flash_write(void)
{
// Setup DMA descriptor
dma0_config.src_high = (((uint16_t)(__xdata uint16_t *)rambuf) >> 8) & 0x00FF;
dma0_config.src_low = ((uint16_t)(__xdata uint16_t *)rambuf) & 0x00FF;
dma0_config.dst_high = (FLASH_FWDATA_ADDR >> 8) & 0x00FF;
dma0_config.dst_low = FLASH_FWDATA_ADDR & 0x00FF;
dma0_config.len_high = DMA_LEN_HIGH_VLEN_LEN;
dma0_config.len_high |= ((1024) >> 8) & DMA_LEN_HIGH_MASK;
dma0_config.len_low = (1024) & 0x00FF;
dma0_config.cfg0 = \
DMA_CFG0_WORDSIZE_8 | \
DMA_CFG0_TMODE_SINGLE | \
DMA_CFG0_TRIGGER_FLASH;
dma0_config.cfg1 = \
DMA_CFG1_SRCINC_1 | \
DMA_CFG1_DESTINC_0 | \
DMA_CFG1_PRIORITY_HIGH;
// Point DMA controller at our DMA descriptor
DMA0CFGH = ((uint16_t)&dma0_config >> 8) & 0x00FF;
DMA0CFGL = (uint16_t)&dma0_config & 0x00FF;
// Waiting for the flash controller to be ready
while (FCTL & FCTL_BUSY);
// Configure the flash controller
FWT = FLASH_FWT;
FADDRH = (radiobuf[3] << 1) & 0x3F;
//FADDRL = 0;//(radiobuf[3] << 9) & 0xFF; // reset value is 0x00
// Arm the DMA channel, so that a DMA trigger will initiate DMA writing
DMAARM |= DMAARM_DMAARM0;
// Enable flash write - triggers the DMA transfer
flash_write_trigger();
// Wait for DMA transfer to complete
while (!(DMAIRQ & DMAIRQ_DMAIF0));
// Wait until flash controller not busy
while (FCTL & (FCTL_BUSY | FCTL_SWBSY));
// By now, the transfer is completed, so the transfer count is reached.
// The DMA channel 0 interrupt flag is then set, so we clear it here.
DMAIRQ &= ~DMAIRQ_DMAIF0;
}
void jump_to_user(void)
{
if (*((__xdata uint8_t*)0x400) != 0xFF)
{
// Disable all interrupts
EA = 0;
IEN0 = IEN1 = IEN2 = 0;
// bootloader not running
F1 = 0;
// Jump to user code
__asm
ljmp #0x400
__endasm;
}
}
#ifdef CONSOLE_DEBUG
void cons_putc(uint8_t ch)
{ U0DBUF = ch;
while(!(U0CSR & U0CSR_TX_BYTE)); // wait for byte to be transmitted
U0CSR &= ~U0CSR_TX_BYTE; // Clear transmit byte status
}
char nibble_to_char(uint8_t nibble)
{
if (nibble < 0xA)
return nibble + '0';
return nibble - 0xA + 'A';
}
void cons_puthex8(uint8_t h)
{
cons_putc(nibble_to_char((h & 0xF0)>>4));
cons_putc(nibble_to_char(h & 0x0F));
}
void cons_puthex16(uint16_t h)
{
cons_putc(nibble_to_char((h & 0xF000)>>12));
cons_putc(nibble_to_char((h & 0x0F00)>>8));
cons_putc(nibble_to_char((h & 0x00F0)>>4));
cons_putc(nibble_to_char(h & 0x000F));
}
void cons_puts(const char *s)
{
while(0 != *s)
cons_putc((uint8_t)(*s++));
}
#endif
void rftxrx_isr(void) __interrupt RFTXRX_VECTOR {
switch (MARCSTATE) {
case MARC_STATE_RX:
radiobuf[radiobuf_index] = RFD;
goto inc; // stupid way but saves space.
break;
case MARC_STATE_TX:
RFD = radiobuf[radiobuf_index];
inc:
radiobuf_index++;
break;
}
}
void tx_pkt(void) {
#ifdef CONSOLE_DEBUG
cons_puts("Start TX\r\n");
#endif
T3CTL=0xDC; // User Timer3 to delay TX, without the delay the programer does not have time to switch from TX to RX.
T3OVFIF=0;
while (!T3OVFIF);
T3CTL=0;
radiobuf[1]=0xFD; // Set dev once to save space
radiobuf_index=0;
RFST = RFST_STX; /* enter TX */
while(MARCSTATE != MARC_STATE_TX);
//while (!(RFIF & RFIF_IRQ_DONE));
while(MARCSTATE != MARC_STATE_IDLE);
RFIF =0;
#ifdef CONSOLE_DEBUG
cons_puts("Done TX\r\n");
#endif
}
uint8_t rx_pkt(void) {
if (RFIF & RFIF_IRQ_DONE) {
#ifdef CONSOLE_DEBUG
cons_puts("\r\nR");
cons_puthex8(LQI);
cons_puthex8(RFIF);
cons_puthex8(radiobuf[0]);
cons_puthex8(radiobuf[1]);
cons_puthex8(radiobuf[2]);
cons_puthex8(radiobuf[3]);
cons_puthex8(radiobuf[4]);
cons_puthex8(radiobuf[5]);
cons_puthex8(radiobuf[6]);
cons_puthex8(radiobuf[7]);
cons_puts("\r\n");
#endif
RFIF =0;
if (LQI & 0x80) { // packet has valid CRC
#ifdef CONSOLE_DEBUG
cons_puts("Valid CRC\r\n");
#endif
while(MARCSTATE != MARC_STATE_IDLE);
return 1;
} else {
radiobuf_index=0;
}
}
if (MARCSTATE != MARC_STATE_RX) {
radiobuf_index=0;
RFST = RFST_SRX; // Set RX mode
while (MARCSTATE != MARC_STATE_RX);
#ifdef CONSOLE_DEBUG
cons_puts("Start RX\r\n");
#endif
}
return 0;
}
void radio_init(void) {
uint8_t a,b;
uint16_t p;
uint8_t conf;
p=0xDF00; // SYNC1 position
b=0;
#ifdef CONSOLE_DEBUG
cons_puts("\r\nRadio Init\r\n");
#endif
for (a=22;a<72;a++) {
#ifdef CONSOLE_DEBUG
//cons_puthex8(a);
//cons_puts(" ");
//cons_puthex16(p);
//cons_puts(" ");
//cons_puthex8(flashp[a]);
#endif
conf=*(__xdata uint8_t*)a;
*(__xdata uint8_t*)p=conf;
#ifdef CONSOLE_DEBUG
//cons_puts(" ");
cons_puthex8(flashp[p]);
cons_puthex8(conf);
cons_puts("\r\n");
#endif
b++;
p++;
if (b>4) {
b=0;
a=a+3;
}
}
/* 250kbaud @ 868MHz from RF Studio 7 */
/*
SYNC1 = 0xD3; // Sync Word, High Byte
SYNC0 = 0x91; // Sync Word, Low Byte
PKTLEN = 0x50; // Packet Length
PKTCTRL1 = 0x05; // Packet Automation Control , Only accept ADDR filter.
PKTCTRL0 = 0x05; // Packet Automation Control
ADDR = 0xFE; // Device Address
CHANNR = 0x00; // Channel Number
FSCTRL1 = 0x0C; // Frequency Synthesizer Control
FSCTRL0 = 0x00; // Frequency Synthesizer Control
#ifdef CRYSTAL_26_MHZ
FREQ2 = 0x21; // Frequency Control Word, High Byte
FREQ1 = 0x65; // Frequency Control Word, Middle Byte
FREQ0 = 0x6A; // Frequency Control Word, Low Byte
#endif
#ifdef CRYSTAL_24_MHZ
FREQ2 = 0x24; // Frequency Control Word, High Byte
FREQ1 = 0x2D; // Frequency Control Word, Middle Byte
FREQ0 = 0xDD; // Frequency Control Word, Low Byte
#endif
#ifdef CRYSTAL_26_MHZ
MDMCFG4 = 0x2D; // Modem configuration
MDMCFG3 = 0x3B; // Modem Configuration
#endif
#ifdef CRYSTAL_24_MHZ
MDMCFG4 = 0x1D; // Modem configuration
MDMCFG3 = 0x55; // Modem Configuration
#endif
MDMCFG2 = 0x13; // Modem Configuration
MDMCFG1 = 0x22; // Modem Configuration
MDMCFG0 = 0xF8; // Modem Configuration
DEVIATN = 0x62; // Modem Deviation Setting
MCSM2 = 0x07; // Main Radio Control State Machine Configuration
MCSM1 = 0x30; // Main Radio Control State Machine Configuration
MCSM0 = 0x18; // Main Radio Control State Machine Configuration
FOCCFG = 0x1D; // Frequency Offset Compensation Configuration
BSCFG = 0x1C; // Bit Synchronization Configuration
AGCCTRL2 = 0xC7; // AGC Control
AGCCTRL1 = 0x00; // AGC Control
AGCCTRL0 = 0xB0; // AGC Control
FREND1 = 0xB6; // Front End RX Configuration
FREND0 = 0x10; // Front End TX Configuration
FSCAL3 = 0xEA; // Frequency Synthesizer Calibration
FSCAL2 = 0x2A; // Frequency Synthesizer Calibration
FSCAL1 = 0x00; // Frequency Synthesizer Calibration
FSCAL0 = 0x1F; // Frequency Synthesizer Calibration
*/
//TEST2 = 0x88; // Various Test Settings
TEST1 = 0x31; // Various Test Settings
TEST0 = 0x09; // Various Test Settings
//PA_TABLE7 = 0x00; // PA Power Setting 7
//PA_TABLE6 = 0x00; // PA Power Setting 6
//PA_TABLE5 = 0x00; // PA Power Setting 5
//PA_TABLE4 = 0x00; // PA Power Setting 4
//PA_TABLE3 = 0x00; // PA Power Setting 3
//PA_TABLE2 = 0x00; // PA Power Setting 2
//PA_TABLE1 = 0x00; // PA Power Setting 1
PA_TABLE0 = 0x50; // PA Power Setting 0
//IOCFG2 = 0x00; // Radio Test Signal Configuration (P1_7)
//IOCFG1 = 0x00; // Radio Test Signal Configuration (P1_6)
//IOCFG0 = 0x00; // Radio Test Signal Configuration (P1_5)
//FREQEST = 0x00; // Frequency Offset Estimate from Demodulator
//LQI = 0x00; // Demodulator Estimate for Link Quality
//RSSI = 0x80; // Received Signal Strength Indication
//MARCSTATE = 0x01; // Main Radio Control State Machine State
//PKTSTATUS = 0x00; // Packet Status
//VCO_VC_DAC = 0x94; // Current Setting from PLL Calibration Module
#ifdef TX_HIGHPOWER_ENABLED
PA_TABLE0 = 0xC2; /* turn power up to 10dBm */
#endif
#if 0
IEN2 |= IEN2_RFIE;
RFIM |= RFIF_IRQ_DONE | RFIF_IRQ_TXUNF | RFIF_IRQ_RXOVF | RFIF_IRQ_SFD | RFIF_IRQ_TIMEOUT;
#endif
radiobuf_index = RFIF = 0;
RFTXRXIF = 0; /* enable interrupts */
RFTXRXIE = 1;
RFST = RFST_SIDLE; /* enter idle */
while(MARCSTATE != MARC_STATE_IDLE);
}
void bootloader_main(void) {
uint8_t n;
uint16_t i;
// Initialise clocks
SLEEP &= ~SLEEP_OSC_PD; // enable RC oscillator
while( !(SLEEP & SLEEP_XOSC_S) ); // let oscillator stabilise
CLKCON = CLKCON_OSC32 | CLKCON_OSC | TICKSPD_DIV_32 | CLKSPD_DIV_2; // select internal HS RC oscillator
while (!(CLKCON & CLKCON_OSC));
CLKCON = CLKCON_OSC32 | TICKSPD_DIV_32 | CLKSPD_DIV_1; // select external crystal
while (CLKCON & CLKCON_OSC);
SLEEP |= SLEEP_OSC_PD; // Disable RC oscillator now that we have an external crystal
#ifdef CONSOLE_DEBUG
PERCFG = (PERCFG & ~PERCFG_U0CFG) | PERCFG_U1CFG;
P0SEL |= (1<<3) | (1<<2);
U0CSR = 0x80 | 0x40; // UART, RX on
U0BAUD = 34; // 115200
U0GCR = 13; // 115k2 baud at 13MHz, useful for coming out of sleep. Assumes clkspd_div2 in clkcon for HSRC osc
#endif
radio_init();
F1 = 1;
EA = 1;
#ifdef CONSOLE_DEBUG
cons_puts("\r\nBOOT\r\n");
#endif
n = 20;
i = 65535;
while(n > 2) {
if (rx_pkt()) n=0;
if (i-- == 0) {
radiobuf[0] = 2;
radiobuf[2] = 0x10;
tx_pkt();
#ifdef CONSOLE_DEBUG
cons_putc('W');
#endif
n--;
}
}
if (n == 0)
goto upgrade_loop;
jump_to_user();
upgrade_loop:
WDCTL = 0x08; //Enable watchdog with 1s timeout
#ifdef CONSOLE_DEBUG
cons_puts("Starting Upgrade loop\r\n");
#endif
while(1) {
if (rx_pkt()) {
WDCTL = 0xA8; WDCTL = 0x58;
switch (radiobuf[2]) {
case 0:
goto ack;
case 1: //erase page
flash_erase_page();
goto ack;
break;
case 2: //program page from rambuffer
flash_write();
goto ack;
break;
case 3: //read page segment from flash
radiobuf[0]=68;
#ifdef CONSOLE_DEBUG
cons_puts("Read\r\n");
#endif
i=(radiobuf[3]<<10)+(radiobuf[4]<<6);
for (n=5;n<69;n++) {
#ifdef CONSOLE_DEBUG
cons_puthex8(flashp[i]);
#endif
radiobuf[n]=*(__xdata uint8_t*)i;
i++;
}
#ifdef CONSOLE_DEBUG
cons_puts("\r\n");
#endif
tx_pkt();
break;
case 4:
#ifdef CONSOLE_DEBUG
cons_puts("Load Segment to ram\r\n");
#endif
i=radiobuf[4]<<6;
for (n=5;n<69;n++) {
rambuf[i]=radiobuf[n];
i++;
}
goto ack;
break;
case 5:
jump_to_user();
ack:
radiobuf[0] = 4;
tx_pkt();
}
}
}
}
+279
View File
@@ -0,0 +1,279 @@
:1004E7007E007F007508007D0AED602DE508702904
:1004F700EE4F700F90F000C005120F8BD0057E886D
:100507007F131D1EBEFF011FC007C006C005120BCB
:10051700D0D005D006D00780D0ED600475820122C7
:100527007582011211A375820022020F5FC009E5CF
:1005370081F5092406F581AF090F7E007D408F8282
:100547008E838DF0121116E58270030207AEA8099B
:1005570008B6000302078AA809088607BF65028054
:100567001ABF6A0302076FBF6C03020689BF7002D6
:10057700804FBF720302060E0207AEE5092403FF90
:100587007E007D408F828E838DF0121116E582608A
:10059700EA90F0007404F090F00174FEF090F0021D
:1005A7007401F0E5092403F8741F5690F003F090E6
:1005B700F004E4F01204E7E58270030207AE0207D5
:1005C700A8E5092403FF7E007D408F828E838DF08E
:1005D700121116E58260EA90F0007404F090F001C1
:1005E70074FEF090F0027402F0E5092403F8741F1A
:1005F7005690F003F090F004E4F01204E7E58270FF
:10060700030207AE0207A8E5092403FF7E007D4029
:100617008F828E838DF0121116E58260EA7F00BF0C
:100627001000503390F0007404F090F00174FEF065
:1006370090F0027403F0E5092403F8741F5690F054
:1006470003F0740F5F90F004F0C0071204E7E5822F
:10065700D00760030F80C87E007F00EF54FC600363
:100667000207A8EE2450F582EF34F0F583E0F58217
:10067700C007C0061211A3D006D0070EBE00DC0FBC
:1006870080D97E007F00EF54FC7035E5092402FD18
:100697007C007B408D828C838BF0C007C0061211D3
:1006A70016E582D006D00760E2EE2450F582EF34DB
:1006B700F0F583A8090808E6F00EBE00C90F80C64A
:1006C700E4FEFFE5092404F87600E5092404F8B6FA
:1006D700100040030207A890F0007444F090F00166
:1006E70074FEF090F0027404F090F003E4F0E50972
:1006F7002404F8740F5690F004F08E038F04E50974
:100707002405F87605087600E5092405F8C3E6947C
:100717004508E694005035E5092405F8E62400FF6E
:1007270008E634F0FE8B028C050BBB00010CEA24B3
:1007370050F582ED34F0F583E0FD8F828E83F0E58E
:10074700092405F806B60002080680BC8B068C074C
:10075700C007C0061204E7E582D006D0076042E56D
:10076700092404F8060206D190F0007402F090F014
:100777000174FEF090F0027405F01204E7E5826060
:1007870026801E90F0007404F090F00174FEF09043
:10079700F002E4F090F003F090F004F01204E78028
:1007A700067582001211A3850981D009222222220F
:1007B700020F5FC009E581F5092404F581AE82AA1D
:1007C70083A3E0FDE4BDFD0104FD60228E828A83E0
:1007D700A3A3E0FC90F002E0FBECB50304740180F6
:1007E70001E4FC6009EC6006EC6003750801ED703C
:1007F7000302087B8E828A83A3A3E0FCBC03757483
:10080700042EFBE43AFCA80908E4F608F6A8090850
:10081700C3E6944008E69400506E8B828C83E0FF19
:10082700C003C004EF75F040A4FFADF0A80908EFBE
:1008370026FFED0836FDE5092403F8EF2450F6ED11
:1008470034F008F6A80908740526FBE40836FFEB20
:100857002EF582EF3AF583E0FFE5092403F8868257
:10086700088683EFF0A8090806B600020806D00438
:10087700D0038099ED60118E828A83A3A3E0FFBF26
:1008870010067582571211A390F9A8E02401F0A36E
:0A089700E03400F0850981D0092249
:0213F1000000FA
:1008A100AFBE74FB5FF5BEE5BE30E6FB75C6E9E59C
:1008B100C630E6FB75C6A8E5C620E6FB43BE0422AA
:1008C100222274FC55C94403F5C9AFC974FB5FF515
:1008D100C943C90880FEC0E0C082C083C0D0759CF6
:1008E100FF90F452E02401F0D0D0D083D082D0E048
:1008F1003290F450E4F0A3F090F452F00209007544
:100901009D0DAF9E74FC5F4404F59E439E10D2BAC8
:100911002290F452E0FE7F00AC9C7D0074FFC39CEA
:10092100FCE49DFDEC4207ED420690F450E0FCA38F
:10093100E0FDEC2FF582ED3EF58322C009858109AA
:10094100C082C083C0F0C0E0E5812404F5817A0053
:10095100E4FBFEFFE50924FAF8A90909E6C397C0FB
:10096100E008E60997C0E008E60997C0E008E60953
:1009710097C0E0E5092408F8D0E0F618D0E0F618B1
:10098100D0E0F618D0E0F6E5092405F87DFA8D04EB
:100991001DEC6016E5092405F8E62AFA08E63BFB9A
:1009A10008E63EFE08E63FFF80E48B828E838509E0
:1009B10081D00922AE82AF837D008D048F058E0721
:1009C1007E0074FAC0E0E4C0E0C0E0C0E08E828F37
:1009D100838DF0EC12126CAC82AD83E58124FCF5C1
:1009E10081C005C004120912AE82AF83D004D005C4
:1009F100C007C006C005C004120912AA82AB83D089
:100A010004D005D006D007EAC39EFAEB9FFBC3ECE6
:060A11009AED9B50DB2270
:0604000002048B020D86D0
:01040B0032BE
:030413000210498B
:01041B0032AE
:0104230032A6
:01042B00329E
:010433003296
:01043B00328E
:010443003286
:01044B00327E
:030453000208D7C5
:01045B00326E
:010463003266
:03046B00020FCCB1
:010473003256
:03047B00020FC9A4
:03048300020E79ED
:0304E40002048689
:05048600120BA980FE2D
:100A1700741855BEFFFEBE0002800ABF0802800E92
:100A2700BF101D80129013D175F0800211DE901354
:100A3700D575F0800211DE9013D975F0800211DEB2
:100A4700221208A11208C11211789013DD75F080E7
:100A57001211DE120A171208F2120BB1D2AF120CE2
:100A67003B120FE4020531C009E581F5092404F5BD
:100A7700811208C2120BD0120BC9E5826003020B68
:100A8700A3120534120912AE82AF838E038F02A818
:100A97000908A60308A60208760008760090F9AAB6
:100AA700E0FEA3E0FF8E048F057E007F00C003C039
:100AB70002A80908E6C0E008E6C0E008E6C0E008CA
:100AC700E6C0E08C828D838EF0EF12093CAE82AFD8
:100AD70083E58124FCF581D002D003C374E89E74BA
:100AE700039F501390F9AAEBF0A3EAF0C003C002EA
:100AF7001207B4D002D00390F9ACE0FEA3E0FF7D6B
:100B0700007C00C003C002A80908E6C0E008E6C0F0
:100B1700E008E6C0E008E6C0E08E828F838DF0EC47
:100B270012093CAE82AF83E58124FCF581D002D067
:100B370003C374649EE49F501690F9ACEBF0A3EAEC
:100B4700F0C003C0021207B5120FBFD002D0039046
:100B5700F9AEE0FEA3E0FF7D007C00C003C002A861
:100B67000908E6C0E008E6C0E008E6C0E008E6C01D
:100B7700E08E828F838DF0EC12093CAE82AF83E565
:100B87008124FCF581D002D003C3740A9EE49F50F0
:100B97000B90F9AEEBF0A3EAF01207B6850981D006
:0A0BA7000922120A48120A6E80FBB0
:1013D100424F440045585400574454000D0A63637A
:0C13E100726C206578706F727465640097
:0613F300000000000000F4
:100BB10022AF8290F9B2E4F090F9B0F090F453EFE3
:100BC100F0EF70030207B72290F9B2E0F5822290AC
:100BD100F453E0FF6055BF01028005BF024D803133
:100BE10090F9B2E0FF601D90DF3AE0F582120FE369
:100BF10090DF39E0FF30E70690F4551207BA7582AD
:100C010000120BB290F9B0E0FF6020758200020B78
:100C1100B290F9B2E0FF6006758200120BB290F952
:100C2100B0E0FF6006758200020BB222AF8290DF56
:100C31003BE0FEB507F87582012290DF0074D3F026
:100C410090DF017491F090DF0274FFF090DF037484
:100C510004F090DF047445F090DF05E4F090DF06C6
:100C6100F090DF07740CF090DF08E4F090DF097476
:100C710024F090DF0A742DF090DF0B74DDF090DF2B
:100C81000C741DF090DF0D7455F090DF0E7413F0AD
:100C910090DF0F7422F090DF1074F8F090DF117480
:100CA10062F090DF127407F090DF137430F090DF80
:100CB100147418F090DF15741DF090DF16741CF099
:100CC10090DF1774C7F090DF18E4F090DF1974B06B
:100CD100F090DF1A74B6F090DF1B7410F090DF1CF7
:100CE10074EAF090DF1D742AF090DF1EE4F090DFCB
:100CF1001F741FF090DF237488F090DF247431F0AB
:100D010090DF257409F090DF27E4F090DF28F09060
:100D1100DF29F090DF2AF090DF2BE4F090DF2CF058
:100D210090DF2DF090DF2E7450F090DF2FE4F090E3
:100D3100DF30F090DF31F090DF38F090DF39E4F010
:100D410090DF3A7480F090DF3B7401F090DF3CE477
:100D5100F090DF3D7494F090DF05E4F075E9004315
:100D61009A01D2A84391F175E104758201120C2D0B
:100D7100758200020BB275E104758201120C2D75AA
:100D81008200020BB2C0E0C0F0C082C083C007C0C5
:100D910006C005C004C003C0D075D000AFD990DF34
:100DA1003BE0FEBE134690F455E0FE7D000EBE0012
:100DB100010D90F9B3E0FC7B00C3EC9EEB64808DE8
:100DC100F063F08095F0501C90F9B3E0FE90F9B318
:100DD100E02401F0EE2455F582E434F4F583E0F5E6
:100DE100D9020E6490F9B07401F0807790DF3BE096
:100DF100FEBE0D6F90F9B3E0FE602290F455E0FE67
:100E01007D000EBE00010D90F9B3E0FC7B00C3EC48
:100E11009EEB64808DF063F08095F0502490F9B3DF
:100E2100E0FEBE5000501A90F9B3E0FE90F9B3E035
:100E31002401F0EE2455F582E434F4F583EFF080DB
:100E41002290F455E0FF7E000FBF00010E90F9B330
:100E5100E0FD7C00B50706ECB50602800690F9B00E
:100E61007401F0D0D0D003D004D005D006D007D083
:100E710083D082D0F0D0E032C0E0C082C083C0070E
:100E8100C006C005C004C0D075D000AF9B74FC5F24
:100E9100F59BE5E930E43090F455E0FF7E000FBFAB
:100EA10000010E90F9B3E0FD7C00B5070CECB5062E
:100EB1000890F9B27401F0800690F9B07401F075F0
:100EC100E10490F9B3E4F0E5E920E70AE5E920E679
:100ED10005E5E930E50E75E10490F9B3E4F090F928
:100EE100B07401F0E5E930E00590F9B3E4F075E99B
:100EF10000D0D0D004D005D006D007D083D082D086
:100F0100E03290F453E0FF6009BF012F7402B5E1B4
:100F1100012275E104758201120C2D758202120BFA
:100F2100B290F9B3E4F090F9B1F090F9B2F090F920
:100F3100B0F075E103758213020C2D2290F453E099
:100F4100FFBF021690F9B2E0FF700A90F9B0E0FF1E
:100F51007003FF80027F018F82227582012290F44B
:100F6100537401F075E104758201120C2D90F9B0F2
:100F7100E4F090F9B3F090F9B17401F090F9B2E4B2
:100F8100F075E10275820D020C2DAE82AF83E0FD9A
:100F91007C000DBD00010C7B00C005C004C006C073
:100FA10007C00390F45575F0001212D9E58124FBB6
:050FB100F581020F03B1
:0413F90000000000F0
:100FB600E58290F9B4F0020FBF90F9B4E090F9B46D
:030FC60023F022F3
:0113FD0000EF
:100FC900C2EB32C2C532E5B4540C600280F885BC6C
:100FD90082743055B44407F5B4222275BC0475BC3B
:100FE90004120FCF120FCF020FCFC009858109ADAF
:100FF90082AE83AFF0E50924FDF886048C031CEB6F
:101009006026C007C006C005C004120FCFAB82D04E
:1010190004D005D006D0078D828E838FF0EB121293
:1010290053A3AD82AE8380D4D00922AF82BF0A0018
:1010390050088F0674302EF5822274372FF58222DC
:10104900C020C0E0C0F0C082C083C007C006C00590
:10105900C004C003C002C001C000C0D075D000C226
:101069008BAFC190F9A6E0FDA3E0FE74FE2DF582D9
:1010790074043EF583C00774FFC0E07404C0E01235
:101089001388AD82AE8315811581D00790F9A4E04C
:10109900FBA3E0FCEBB50506ECB506028038EB24B2
:1010A900A5F582EC34F4F583EFF090F9A4E0FDA303
:1010B900E0FE8D828E83A3C00774FFC0E07404C074
:1010C900E0121388AD82AE8315811581D00790F99E
:1010D900A4EDF0A3EEF0BF2B1190F9B5E01490F94F
:1010E900B5F0FF700B1208C3800690F9B57403F0D0
:1010F900D0D0D000D001D002D003D004D005D00682
:10110900D007D083D082D0F0D0E0D02032AD82AEEB
:1011190083AFF090F9A4E0FBA3E0FC90F9A6E0F915
:10112900A3E0FAEBB50108ECB5020475820022E9E7
:1011390024A5F582EA34F4F583E08D828E838FF05D
:1011490012125390F9A6E0FEA3E0FF8E828F83A3CB
:1011590074FFC0E07404C0E0121388AE82AF831537
:1011690081158190F9A6EEF0A3EFF0758201229026
:10117900F9A6E4F0A3F090F9A4F0A3E4F0758600D1
:1011890075C23B75C50DAFF174FE5F4402F5F143BD
:10119900F30C7586C0C28BD2AA228582C1E586303E
:1011A900E1FBAF8674FD5FF58622AD82AE83AFF0B9
:1011B9008D828E838FF012136CFC60180DBD0001B7
:1011C9000E8C82C007C006C0051211A3D005D00637
:1011D900D00780DC221211B39013ED75F080021153
:1011E900B3AF8274F05FC4540FF582C00712103494
:1011F9001211A3D007740F5FF5821210340211A3E4
:10120900C009858109AD82AE83AFF0E50924FDF8F7
:1012190086048C031CEB60268D828E838FF012135B
:101229006CFBA3AD82AE838B82C007C006C005C02C
:10123900041211EAD004D005D006D00780D4901347
:0A124900F075F0801211DED00922CA
:0413ED000D0A0000E5
:0113FE0003EB
:0604BA00E478FFF6D8FD16
:10049800790EE94400601B7A019013F178A87593EE
:1004A800F9E493F2A308B800020593D9F4DAF275D7
:0204B80093FFB0
:1012530020F71030F6118883A88220F507F6A883BB
:0912630075830022F280F7F022ED
:1004C0007800E84400600A79007593F0E4F309D8F5
:1004D000FC78A8E84409600C790A90F000E4F0A3E5
:0404E000D8FCD9FA71
:10126C00FBE58124FBF8E6F9087A20E4FCFDFEFF9F
:10127C00E5822582F582E58333F583E5F033F5F0DD
:10128C00EB33FB4017DAE98042E5822582F582E5F3
:10129C008333F583E5F033F5F0EB33FBEC33FCED06
:1012AC0033FDEE33FEEF33FFEC99ED96EE0896EF3F
:1012BC00089618184013EC99FCED96FDEE0896FE76
:1012CC00EF0896FF1818438201DABEEB22C009E53D
:1012DC0081F5092408F581AD82AE83AFF0A8090829
:1012EC00A60508A60608A607E50924FBF8E50924C7
:1012FC0004F9E6F70809E6F70809E6F7E50924F921
:10130C00F8E5092407F9E6F70809E6F7E5092407E3
:10131C00F88603088604E5092407F816B6FF0208C8
:10132C0016EB4C602AE5092404F8868208868308AB
:10133C0086F012136CFCA31818A68208A6838D8263
:10134C008E838FF0EC121253A3AD82AE8380BDA8B6
:10135C00090886820886830886F0850981D00922CF
:0D048B007581201213CDE582600302048606
:10136C0020F71430F6148883A88220F507E6A883AA
:10137C0075830022E280F7E49322E022E58124FECB
:10138C00F88601188600E84960367A01E825E0F80D
:10139C00E933400EF9E58298E5839940030A80EC25
:1013AC00C3E913F9E813F8C3E58298F5F0E58399DE
:1013BC004005F58385F082C3E913F9E813F8DAE701
:0513CC002275820022E1
:00000001FF
+279
View File
@@ -0,0 +1,279 @@
:1004E7007E007F007508007D0AED602DE508702904
:1004F700EE4F700F90F000C005120F8BD0057E886D
:100507007F131D1EBEFF011FC007C006C005120BCB
:10051700D0D005D006D00780D0ED600475820122C7
:100527007582011211A375820022020F5FC009E5CF
:1005370081F5092406F581AF090F7E007D408F8282
:100547008E838DF0121116E58270030207AEA8099B
:1005570008B6000302078AA809088607BF65028054
:100567001ABF6A0302076FBF6C03020689BF7002D6
:10057700804FBF720302060E0207AEE5092403FF90
:100587007E007D408F828E838DF0121116E582608A
:10059700EA90F0007404F090F00174FEF090F0021D
:1005A7007401F0E5092403F8741F5690F003F090E6
:1005B700F004E4F01204E7E58270030207AE0207D5
:1005C700A8E5092403FF7E007D408F828E838DF08E
:1005D700121116E58260EA90F0007404F090F001C1
:1005E70074FEF090F0027402F0E5092403F8741F1A
:1005F7005690F003F090F004E4F01204E7E58270FF
:10060700030207AE0207A8E5092403FF7E007D4029
:100617008F828E838DF0121116E58260EA7F00BF0C
:100627001000503390F0007404F090F00174FEF065
:1006370090F0027403F0E5092403F8741F5690F054
:1006470003F0740F5F90F004F0C0071204E7E5822F
:10065700D00760030F80C87E007F00EF54FC600363
:100667000207A8EE2450F582EF34F0F583E0F58217
:10067700C007C0061211A3D006D0070EBE00DC0FBC
:1006870080D97E007F00EF54FC7035E5092402FD18
:100697007C007B408D828C838BF0C007C0061211D3
:1006A70016E582D006D00760E2EE2450F582EF34DB
:1006B700F0F583A8090808E6F00EBE00C90F80C64A
:1006C700E4FEFFE5092404F87600E5092404F8B6FA
:1006D700100040030207A890F0007444F090F00166
:1006E70074FEF090F0027404F090F003E4F0E50972
:1006F7002404F8740F5690F004F08E038F04E50974
:100707002405F87605087600E5092405F8C3E6947C
:100717004508E694005035E5092405F8E62400FF6E
:1007270008E634F0FE8B028C050BBB00010CEA24B3
:1007370050F582ED34F0F583E0FD8F828E83F0E58E
:10074700092405F806B60002080680BC8B068C074C
:10075700C007C0061204E7E582D006D0076042E56D
:10076700092404F8060206D190F0007402F090F014
:100777000174FEF090F0027405F01204E7E5826060
:1007870026801E90F0007404F090F00174FEF09043
:10079700F002E4F090F003F090F004F01204E78028
:1007A700067582001211A3850981D009222222220F
:1007B700020F5FC009E581F5092404F581AE82AA1D
:1007C70083A3E0FDE4BDFD0104FD60228E828A83E0
:1007D700A3A3E0FC90F002E0FBECB50304740180F6
:1007E70001E4FC6009EC6006EC6003750801ED703C
:1007F7000302087B8E828A83A3A3E0FCBC03757483
:10080700042EFBE43AFCA80908E4F608F6A8090850
:10081700C3E6944008E69400506E8B828C83E0FF19
:10082700C003C004EF75F040A4FFADF0A80908EFBE
:1008370026FFED0836FDE5092403F8EF2450F6ED11
:1008470034F008F6A80908740526FBE40836FFEB20
:100857002EF582EF3AF583E0FFE5092403F8868257
:10086700088683EFF0A8090806B600020806D00438
:10087700D0038099ED60118E828A83A3A3E0FFBF26
:1008870010067582571211A390F9A8E02401F0A36E
:0A089700E03400F0850981D0092249
:0213F1000000FA
:1008A100AFBE74FB5FF5BEE5BE30E6FB75C6E9E59C
:1008B100C630E6FB75C6A8E5C620E6FB43BE0422AA
:1008C100222274FC55C94403F5C9AFC974FB5FF515
:1008D100C943C90880FEC0E0C082C083C0D0759CF6
:1008E100FF90F452E02401F0D0D0D083D082D0E048
:1008F1003290F450E4F0A3F090F452F00209007544
:100901009D0DAF9E74FC5F4404F59E439E10D2BAC8
:100911002290F452E0FE7F00AC9C7D0074FFC39CEA
:10092100FCE49DFDEC4207ED420690F450E0FCA38F
:10093100E0FDEC2FF582ED3EF58322C009858109AA
:10094100C082C083C0F0C0E0E5812404F5817A0053
:10095100E4FBFEFFE50924FAF8A90909E6C397C0FB
:10096100E008E60997C0E008E60997C0E008E60953
:1009710097C0E0E5092408F8D0E0F618D0E0F618B1
:10098100D0E0F618D0E0F6E5092405F87DFA8D04EB
:100991001DEC6016E5092405F8E62AFA08E63BFB9A
:1009A10008E63EFE08E63FFF80E48B828E838509E0
:1009B10081D00922AE82AF837D008D048F058E0721
:1009C1007E0074FAC0E0E4C0E0C0E0C0E08E828F37
:1009D100838DF0EC12126CAC82AD83E58124FCF5C1
:1009E10081C005C004120912AE82AF83D004D005C4
:1009F100C007C006C005C004120912AA82AB83D089
:100A010004D005D006D007EAC39EFAEB9FFBC3ECE6
:060A11009AED9B50DB2270
:0604000002048B020D86D0
:01040B0032BE
:030413000210498B
:01041B0032AE
:0104230032A6
:01042B00329E
:010433003296
:01043B00328E
:010443003286
:01044B00327E
:030453000208D7C5
:01045B00326E
:010463003266
:03046B00020FCCB1
:010473003256
:03047B00020FC9A4
:03048300020E79ED
:0304E40002048689
:05048600120BA980FE2D
:100A1700741855BEFFFEBE0002800ABF0802800E92
:100A2700BF101D80129013D175F0800211DE901354
:100A3700D575F0800211DE9013D975F0800211DEB2
:100A4700221208A11208C11211789013DD75F080E7
:100A57001211DE120A171208F2120BB1D2AF120CE2
:100A67003B120FE4020531C009E581F5092404F5BD
:100A7700811208C2120BD0120BC9E5826003020B68
:100A8700A3120534120912AE82AF838E038F02A818
:100A97000908A60308A60208760008760090F9AAB6
:100AA700E0FEA3E0FF8E048F057E007F00C003C039
:100AB70002A80908E6C0E008E6C0E008E6C0E008CA
:100AC700E6C0E08C828D838EF0EF12093CAE82AFD8
:100AD70083E58124FCF581D002D003C374E89E74BA
:100AE700039F501390F9AAEBF0A3EAF0C003C002EA
:100AF7001207B4D002D00390F9ACE0FEA3E0FF7D6B
:100B0700007C00C003C002A80908E6C0E008E6C0F0
:100B1700E008E6C0E008E6C0E08E828F838DF0EC47
:100B270012093CAE82AF83E58124FCF581D002D067
:100B370003C374649EE49F501690F9ACEBF0A3EAEC
:100B4700F0C003C0021207B5120FBFD002D0039046
:100B5700F9AEE0FEA3E0FF7D007C00C003C002A861
:100B67000908E6C0E008E6C0E008E6C0E008E6C01D
:100B7700E08E828F838DF0EC12093CAE82AF83E565
:100B87008124FCF581D002D003C3740A9EE49F50F0
:100B97000B90F9AEEBF0A3EAF01207B6850981D006
:0A0BA7000922120A48120A6E80FBB0
:1013D100424F440045585400574454000D0A63637A
:0C13E100726C206578706F727465640097
:0613F300000000000000F4
:100BB10022AF8290F9B2E4F090F9B0F090F453EFE3
:100BC100F0EF70030207B72290F9B2E0F5822290AC
:100BD100F453E0FF6055BF01028005BF024D803133
:100BE10090F9B2E0FF601D90DF3AE0F582120FE369
:100BF10090DF39E0FF30E70690F4551207BA7582AD
:100C010000120BB290F9B0E0FF6020758200020B78
:100C1100B290F9B2E0FF6006758200120BB290F952
:100C2100B0E0FF6006758200020BB222AF8290DF56
:100C31003BE0FEB507F87582012290DF0074D3F026
:100C410090DF017491F090DF0274FFF090DF037484
:100C510004F090DF047445F090DF05E4F090DF06C6
:100C6100F090DF07740CF090DF08E4F090DF097476
:100C710021F090DF0A7465F090DF0B746AF090DF69
:100C81000C742DF090DF0D743BF090DF0E7413F0B7
:100C910090DF0F7422F090DF1074F8F090DF117480
:100CA10062F090DF127407F090DF137430F090DF80
:100CB100147418F090DF15741DF090DF16741CF099
:100CC10090DF1774C7F090DF18E4F090DF1974B06B
:100CD100F090DF1A74B6F090DF1B7410F090DF1CF7
:100CE10074EAF090DF1D742AF090DF1EE4F090DFCB
:100CF1001F741FF090DF237488F090DF247431F0AB
:100D010090DF257409F090DF27E4F090DF28F09060
:100D1100DF29F090DF2AF090DF2BE4F090DF2CF058
:100D210090DF2DF090DF2E7450F090DF2FE4F090E3
:100D3100DF30F090DF31F090DF38F090DF39E4F010
:100D410090DF3A7480F090DF3B7401F090DF3CE477
:100D5100F090DF3D7494F090DF05E4F075E9004315
:100D61009A01D2A84391F175E104758201120C2D0B
:100D7100758200020BB275E104758201120C2D75AA
:100D81008200020BB2C0E0C0F0C082C083C007C0C5
:100D910006C005C004C003C0D075D000AFD990DF34
:100DA1003BE0FEBE134690F455E0FE7D000EBE0012
:100DB100010D90F9B3E0FC7B00C3EC9EEB64808DE8
:100DC100F063F08095F0501C90F9B3E0FE90F9B318
:100DD100E02401F0EE2455F582E434F4F583E0F5E6
:100DE100D9020E6490F9B07401F0807790DF3BE096
:100DF100FEBE0D6F90F9B3E0FE602290F455E0FE67
:100E01007D000EBE00010D90F9B3E0FC7B00C3EC48
:100E11009EEB64808DF063F08095F0502490F9B3DF
:100E2100E0FEBE5000501A90F9B3E0FE90F9B3E035
:100E31002401F0EE2455F582E434F4F583EFF080DB
:100E41002290F455E0FF7E000FBF00010E90F9B330
:100E5100E0FD7C00B50706ECB50602800690F9B00E
:100E61007401F0D0D0D003D004D005D006D007D083
:100E710083D082D0F0D0E032C0E0C082C083C0070E
:100E8100C006C005C004C0D075D000AF9B74FC5F24
:100E9100F59BE5E930E43090F455E0FF7E000FBFAB
:100EA10000010E90F9B3E0FD7C00B5070CECB5062E
:100EB1000890F9B27401F0800690F9B07401F075F0
:100EC100E10490F9B3E4F0E5E920E70AE5E920E679
:100ED10005E5E930E50E75E10490F9B3E4F090F928
:100EE100B07401F0E5E930E00590F9B3E4F075E99B
:100EF10000D0D0D004D005D006D007D083D082D086
:100F0100E03290F453E0FF6009BF012F7402B5E1B4
:100F1100012275E104758201120C2D758202120BFA
:100F2100B290F9B3E4F090F9B1F090F9B2F090F920
:100F3100B0F075E103758213020C2D2290F453E099
:100F4100FFBF021690F9B2E0FF700A90F9B0E0FF1E
:100F51007003FF80027F018F82227582012290F44B
:100F6100537401F075E104758201120C2D90F9B0F2
:100F7100E4F090F9B3F090F9B17401F090F9B2E4B2
:100F8100F075E10275820D020C2DAE82AF83E0FD9A
:100F91007C000DBD00010C7B00C005C004C006C073
:100FA10007C00390F45575F0001212D9E58124FBB6
:050FB100F581020F03B1
:0413F90000000000F0
:100FB600E58290F9B4F0020FBF90F9B4E090F9B46D
:030FC60023F022F3
:0113FD0000EF
:100FC900C2EB32C2C532E5B4540C600280F885BC6C
:100FD90082743055B44407F5B4222275BC0475BC3B
:100FE90004120FCF120FCF020FCFC009858109ADAF
:100FF90082AE83AFF0E50924FDF886048C031CEB6F
:101009006026C007C006C005C004120FCFAB82D04E
:1010190004D005D006D0078D828E838FF0EB121293
:1010290053A3AD82AE8380D4D00922AF82BF0A0018
:1010390050088F0674302EF5822274372FF58222DC
:10104900C020C0E0C0F0C082C083C007C006C00590
:10105900C004C003C002C001C000C0D075D000C226
:101069008BAFC190F9A6E0FDA3E0FE74FE2DF582D9
:1010790074043EF583C00774FFC0E07404C0E01235
:101089001388AD82AE8315811581D00790F9A4E04C
:10109900FBA3E0FCEBB50506ECB506028038EB24B2
:1010A900A5F582EC34F4F583EFF090F9A4E0FDA303
:1010B900E0FE8D828E83A3C00774FFC0E07404C074
:1010C900E0121388AD82AE8315811581D00790F99E
:1010D900A4EDF0A3EEF0BF2B1190F9B5E01490F94F
:1010E900B5F0FF700B1208C3800690F9B57403F0D0
:1010F900D0D0D000D001D002D003D004D005D00682
:10110900D007D083D082D0F0D0E0D02032AD82AEEB
:1011190083AFF090F9A4E0FBA3E0FC90F9A6E0F915
:10112900A3E0FAEBB50108ECB5020475820022E9E7
:1011390024A5F582EA34F4F583E08D828E838FF05D
:1011490012125390F9A6E0FEA3E0FF8E828F83A3CB
:1011590074FFC0E07404C0E0121388AE82AF831537
:1011690081158190F9A6EEF0A3EFF0758201229026
:10117900F9A6E4F0A3F090F9A4F0A3E4F0758600D1
:1011890075C22275C50DAFF174FE5F4402F5F143D6
:10119900F30C7586C0C28BD2AA228582C1E586303E
:1011A900E1FBAF8674FD5FF58622AD82AE83AFF0B9
:1011B9008D828E838FF012136CFC60180DBD0001B7
:1011C9000E8C82C007C006C0051211A3D005D00637
:1011D900D00780DC221211B39013ED75F080021153
:1011E900B3AF8274F05FC4540FF582C00712103494
:1011F9001211A3D007740F5FF5821210340211A3E4
:10120900C009858109AD82AE83AFF0E50924FDF8F7
:1012190086048C031CEB60268D828E838FF012135B
:101229006CFBA3AD82AE838B82C007C006C005C02C
:10123900041211EAD004D005D006D00780D4901347
:0A124900F075F0801211DED00922CA
:0413ED000D0A0000E5
:0113FE0003EB
:0604BA00E478FFF6D8FD16
:10049800790EE94400601B7A019013F178A87593EE
:1004A800F9E493F2A308B800020593D9F4DAF275D7
:0204B80093FFB0
:1012530020F71030F6118883A88220F507F6A883BB
:0912630075830022F280F7F022ED
:1004C0007800E84400600A79007593F0E4F309D8F5
:1004D000FC78A8E84409600C790A90F000E4F0A3E5
:0404E000D8FCD9FA71
:10126C00FBE58124FBF8E6F9087A20E4FCFDFEFF9F
:10127C00E5822582F582E58333F583E5F033F5F0DD
:10128C00EB33FB4017DAE98042E5822582F582E5F3
:10129C008333F583E5F033F5F0EB33FBEC33FCED06
:1012AC0033FDEE33FEEF33FFEC99ED96EE0896EF3F
:1012BC00089618184013EC99FCED96FDEE0896FE76
:1012CC00EF0896FF1818438201DABEEB22C009E53D
:1012DC0081F5092408F581AD82AE83AFF0A8090829
:1012EC00A60508A60608A607E50924FBF8E50924C7
:1012FC0004F9E6F70809E6F70809E6F7E50924F921
:10130C00F8E5092407F9E6F70809E6F7E5092407E3
:10131C00F88603088604E5092407F816B6FF0208C8
:10132C0016EB4C602AE5092404F8868208868308AB
:10133C0086F012136CFCA31818A68208A6838D8263
:10134C008E838FF0EC121253A3AD82AE8380BDA8B6
:10135C00090886820886830886F0850981D00922CF
:0D048B007581201213CDE582600302048606
:10136C0020F71430F6148883A88220F507E6A883AA
:10137C0075830022E280F7E49322E022E58124FECB
:10138C00F88601188600E84960367A01E825E0F80D
:10139C00E933400EF9E58298E5839940030A80EC25
:1013AC00C3E913F9E813F8C3E58298F5F0E58399DE
:1013BC004005F58385F082C3E913F9E813F8DAE701
:0513CC002275820022E1
:00000001FF
+48
View File
@@ -0,0 +1,48 @@
:0900000002009830D1080201ABA6
:06000B0002040B020403D5
:20001300020413D391FF054502041BFE000C00240204232DDD1D551302042B22F86207301C
:15003300020433181D1CC70002043BB0B610EA2A020443001F34
:03004B0002044B61
:0300530002045351
:03005B0002045B41
:0300630002046331
:03006B0002046B21
:0300730002047311
:03007B0002047B01
:03008300020483F1
:03008B0002048BE1
:0300F10002008E7C
:02008E0051AF70
:1E00F400E5AE20E7FB75AB1190F00BE0FF25E0F5AD75AC0043AE0100E5AE20E7FB224D
:080090000043AE02000201155D
:20011200020091227E087FF18F0690F000EEF07E087FF190F001EEF090F00274DFF090F095
:200132000374AFF090F004E4F090F004E04404F090F005E4F090F0067412F090F007744211
:20015200F07E007FF08F068ED57E007FF07F008ED4E5AE20E7FB75AB1190F00BE025E0FFB5
:20017200743F5FF5AD43D6013112E5D130E0FBE5AE54C0600280F8AFD174FE5FF5D1229051
:200192000400E0FFBFFF0122C2AF759A0075B80075A800C2D102040022C0E0C082C083C01F
:2001B20007C0D075D00090DF3BE0FFBF0D028005BF13228010E5082408F582E434F0F583E1
:2001D200E5D9F0800EE5082408F582E434F0F583E0F5D90508D0D0D007D083D082D0E03208
:2001F20075CBDCC2D830D8FD75CB0090F00974FDF075080075E10390DF3BE0FFBF13F8904F
:20021200DF3BE0FFBF01F875E90022E5E930E41A75E90090DF39E0FF30E70C90DF3BE0FF0E
:20023200BF01F87582012275080090DF3BE0FFBF0D02800E75080075E10290DF3BE0FFBF5B
:200252000DF8758200227F007E167C007DDFBE480050228E027B008A828B83E0FA8C828D71
:2002720083F00F0CBC00010DEF24FB50057F000E0E0E0E80D990DF247431F090DF25740968
:20029200F090DF2E7450F075E900750800C289D2A875E10490DF3BE0FFBF01F822AFBE74CD
:2002B200FB5FF5BEE5BE30E6FB75C6E9E5C630E6FB75C6A8E5C620E6FB43BE045158D2D1AB
:2002D200D2AF7F147DFF7EFFEF24FD503EC007C006C005511DE582D005D006D00760027FD7
:2002F200008D038E041DBDFF011EEB4C70DA90F0087402F090F00A7410F0C007C006C00513
:2003120031F2D005D006D0071F80BDEF6002319175C908511DE58260FA75C9A875C9589036
:20033200F00AE0FF24FA40EBEF2F90034073614C614E6152615661A661E161E311F461E389
:20035200311661E390F0087444F090F00BE025E025E0FE7F0090F00CE0FDE4C3CD13CD130E
:20037200A2E0CD13CD13CDFCED2FFFEC3EFE7D05BD4500501BED2408FBE434F0FC8F828E77
:2003920083E0FA8B828C83F00FBF00010E0D80E031F2612590F00CE0FFE4C3CF13CF13A277
:2003B200E0CF13CF13CFFE7D05BD45005023EF2408FBEE34F1FCED2408F582E434F0F5838E
:1B03D200E0FA8B828C83F00FBF00010E0D80DA319190F0087404F031F261258B
:0600C700E478FFF6D8FD0D
:2000A5007900E94400601B7A009003F17800759300E493F2A308B800020593D9F4DAF27528
:0200C50093FFA7
:2000CD007800E84400600A79007593F0E4F309D8FC7808E84405600C790690F000E4F0A34D
:0400ED00D8FCD9FA68
:0D0098007581081203EDE582600302008E01
:0403ED0075820022F3
:00000001FF
+48
View File
@@ -0,0 +1,48 @@
:0900000002009830D1080201ABA6
:06000B0002040B020403D5
:20001300020413D391FF054502041BFE000C0021020423656A2D3B1302042B22F862073064
:15003300020433181D1CC70002043BB0B610EA2A020443001F34
:03004B0002044B61
:0300530002045351
:03005B0002045B41
:0300630002046331
:03006B0002046B21
:0300730002047311
:03007B0002047B01
:03008300020483F1
:03008B0002048BE1
:0300F10002008E7C
:02008E0051AF70
:1E00F400E5AE20E7FB75AB1F90F00BE0FF25E0F5AD75AC0043AE0100E5AE20E7FB223F
:080090000043AE02000201155D
:20011200020091227E087FF18F0690F000EEF07E087FF190F001EEF090F00274DFF090F095
:200132000374AFF090F004E4F090F004E04404F090F005E4F090F0067412F090F007744211
:20015200F07E007FF08F068ED57E007FF07F008ED4E5AE20E7FB75AB1F90F00BE025E0FFA7
:20017200743F5FF5AD43D6013112E5D130E0FBE5AE54C0600280F8AFD174FE5FF5D1229051
:200192000400E0FFBFFF0122C2AF759A0075B80075A800C2D102040022C0E0C082C083C01F
:2001B20007C0D075D00090DF3BE0FFBF0D028005BF13228010E5082408F582E434F0F583E1
:2001D200E5D9F0800EE5082408F582E434F0F583E0F5D90508D0D0D007D083D082D0E03208
:2001F20075CBDCC2D830D8FD75CB0090F00974FDF075080075E10390DF3BE0FFBF13F8904F
:20021200DF3BE0FFBF01F875E90022E5E930E41A75E90090DF39E0FF30E70C90DF3BE0FF0E
:20023200BF01F87582012275080090DF3BE0FFBF0D02800E75080075E10290DF3BE0FFBF5B
:200252000DF8758200227F007E167C007DDFBE480050228E027B008A828B83E0FA8C828D71
:2002720083F00F0CBC00010DEF24FB50057F000E0E0E0E80D990DF247431F090DF25740968
:20029200F090DF2E7450F075E900750800C289D2A875E10490DF3BE0FFBF01F822AFBE74CD
:2002B200FB5FF5BEE5BE30E6FB75C6E9E5C630E6FB75C6A8E5C620E6FB43BE045158D2D1AB
:2002D200D2AF7F147DFF7EFFEF24FD503EC007C006C005511DE582D005D006D00760027FD7
:2002F200008D038E041DBDFF011EEB4C70DA90F0087402F090F00A7410F0C007C006C00513
:2003120031F2D005D006D0071F80BDEF6002319175C908511DE58260FA75C9A875C9589036
:20033200F00AE0FF24FA40EBEF2F90034073614C614E6152615661A661E161E311F461E389
:20035200311661E390F0087444F090F00BE025E025E0FE7F0090F00CE0FDE4C3CD13CD130E
:20037200A2E0CD13CD13CDFCED2FFFEC3EFE7D05BD4500501BED2408FBE434F0FC8F828E77
:2003920083E0FA8B828C83F00FBF00010E0D80E031F2612590F00CE0FFE4C3CF13CF13A277
:2003B200E0CF13CF13CFFE7D05BD45005023EF2408FBEE34F1FCED2408F582E434F0F5838E
:1B03D200E0FA8B828C83F00FBF00010E0D80DA319190F0087404F031F261258B
:0600C700E478FFF6D8FD0D
:2000A5007900E94400601B7A009003F17800759300E493F2A308B800020593D9F4DAF27528
:0200C50093FFA7
:2000CD007800E84400600A79007593F0E4F309D8FC7808E84405600C790690F000E4F0A34D
:0400ED00D8FCD9FA68
:0D0098007581081203EDE582600302008E01
:0403ED0075820022F3
:00000001FF
+134
View File
@@ -0,0 +1,134 @@
; RF config is interleaved witht the interupt vectors to save space.
; To select crystal frequency set 1 or 0
CRYSTAL_26_MHZ=1
; Remember to change in main.c also.
;
.globl __start__stack
;--------------------------------------------------------
; Stack segment in internal ram
;--------------------------------------------------------
.area SSEG (DATA)
__start__stack:
.ds 1
;--------------------------------------------------------
; interrupt vector
;--------------------------------------------------------
.area VECTOR (CODE)
.globl __interrupt_vect
__interrupt_vect:
ljmp __sdcc_gsinit_startup
jnb psw.1, 00001$ ; RFTXRX if F1=1 call bootload isr
ljmp _rftxrx_isr ;
.ds 2
ljmp #(0x400+0x0B) ; ADC
00001$:
ljmp #(0x400+0x03) ; User code RFTXRX usr
.ds 2
ljmp #(0x400+0x13) ; URX0
.db 0xD3 ; SYNC1
.db 0x91 ; SYNC0
.db 0xFF ; PKTLEN
.db 0x05 ; PKTCTRL1
.db 0x45 ; PKTCTRL0
ljmp #(0x400+0x1B) ; URX1
.db 0xFE ; ADDR
.db 0x00 ; CHANNR
.db 0x0C ; FSCTRL1
.db 0x00 ; FSCTRL0
.if CRYSTAL_26_MHZ
.db 0x21 ; FREQ2
.else
.db 0x24 ; FREQ2
.endif
ljmp #(0x400+0x23) ; ENC
.if CRYSTAL_26_MHZ
.db 0x65 ; FREQ1
.db 0x6A ; FREQ0
.db 0x2D ; MDMCFG4
.db 0x3B ; MDMCFG3
.else
.db 0x2D ; FREQ1
.db 0xDD ; FREQ0
.db 0x1D ; MDMCFG4
.db 0x55 ; MDMCFG3
.endif
.db 0x13 ; MDMCFG2
ljmp #(0x400+0x2B) ; ST
.db 0x22 ; MDMCFG1
.db 0xF8 ; MDMCFG0
.db 0x62 ; DEVIATN
.db 0x07 ; MCSM2
.db 0x30 ; MCSM1
ljmp #(0x400+0x33) ; P2INT
.db 0x18 ; MCSM0
.db 0x1D ; FOCCFG
.db 0x1C ; BSCFG
.db 0xC7 ; AGCCTRL2
.db 0x00 ; AGCCTRL1
ljmp #(0x400+0x3B) ; UTX0
.db 0xB0 ; AGCCTRL0
.db 0xB6 ; FREND1
.db 0x10 ; FREND0
.db 0xEA ; FSCAL3
.db 0x2A ; FSCAL2
ljmp #(0x400+0x43) ; DMA
.db 0x00 ; FSCAL1
.db 0x1F ; FSCAL0
.ds 3
ljmp #(0x400+0x4B) ; T1
.ds 5
ljmp #(0x400+0x53) ; T2
.ds 5
ljmp #(0x400+0x5B) ; T3
.ds 5
ljmp #(0x400+0x63) ; T4
.ds 5
ljmp #(0x400+0x6B) ; P0INT
.ds 5
ljmp #(0x400+0x73) ; UTX1
.ds 5
ljmp #(0x400+0x7B) ; P1INT
.ds 5
ljmp #(0x400+0x83) ; RF
.ds 5
ljmp #(0x400+0x8B) ; WDT
;--------------------------------------------------------
; external initialized ram data
;--------------------------------------------------------
.area XISEG (XDATA)
.area HOME (CODE)
.area GSINIT0 (CODE)
.area GSINIT1 (CODE)
.area GSINIT2 (CODE)
.area GSINIT3 (CODE)
.area GSINIT4 (CODE)
.area GSINIT5 (CODE)
.area GSINIT (CODE)
.area GSFINAL (CODE)
.area CSEG (CODE)
;--------------------------------------------------------
; global & static initialisations
;--------------------------------------------------------
.area GSINIT (CODE)
.globl __sdcc_gsinit_startup
.globl __sdcc_program_startup
.globl __start__stack
.globl __mcs51_genXINIT
.globl __mcs51_genXRAMCLEAR
.globl __mcs51_genRAMCLEAR
.area GSFINAL (CODE)
ljmp __sdcc_program_startup
;--------------------------------------------------------
; Home
;--------------------------------------------------------
.area HOME (CODE)
.area HOME (CODE)
__sdcc_program_startup:
acall _bootloader_main
; return from main will lock up