Add C28x RS boot ports for F2812 and F28335
This commit is contained in:
5
c/rs485-boot/ports/tms320f28335/README.md
Normal file
5
c/rs485-boot/ports/tms320f28335/README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# TMS320F28335
|
||||
Uses `../c28x` to preserve 8-bit wire bytes on the 16-bit-byte C28x ABI.
|
||||
Copy the config template, provide the board external-Flash functions and RS485
|
||||
direction macros. BEGIN byte 8 bit 0 enables Flash + RAM mirroring; Flash is
|
||||
always retained and used for final CRC/recovery after reset.
|
||||
@@ -0,0 +1,17 @@
|
||||
#ifndef RS_BOOT_PORT_CONFIG_H
|
||||
#define RS_BOOT_PORT_CONFIG_H
|
||||
#include "DSP2833x_Device.h"
|
||||
/* C28x addresses and sizes are in 16-bit words. */
|
||||
#define F28335_BOOT_FLASH_BASE 0x00100000UL
|
||||
#define F28335_BOOT_FLASH_WORDS 0x00078000UL
|
||||
#define F28335_BOOT_RAM_BASE 0x00080000UL
|
||||
#define F28335_BOOT_RAM_WORDS 0x00078000UL
|
||||
#define F28335_BOOT_USE_SCIB 0
|
||||
#define F28335_BOOT_RS485_TX() do { } while (0)
|
||||
#define F28335_BOOT_RS485_RX() do { } while (0)
|
||||
#define F28335_BOOT_REBOOT() do { } while (0)
|
||||
/* Supply board Flash driver. word_offset is relative to FLASH_BASE. */
|
||||
int F28335_BOOT_FLASH_ERASE(unsigned long first_word,unsigned long word_count);
|
||||
int F28335_BOOT_FLASH_PROGRAM(unsigned long word_offset,unsigned int value);
|
||||
unsigned int F28335_BOOT_FLASH_READ(unsigned long word_offset);
|
||||
#endif
|
||||
24
c/rs485-boot/ports/tms320f28335/rs_boot_port_f28335.c
Normal file
24
c/rs485-boot/ports/tms320f28335/rs_boot_port_f28335.c
Normal file
@@ -0,0 +1,24 @@
|
||||
#include "rs_boot_port_config.h"
|
||||
#include "rs_boot_port_f28335.h"
|
||||
static rsbt_t boot;
|
||||
static int tx(void*u,const rsbt_byte_t*d,rsbt_u16_t n){rsbt_u16_t i;(void)u;F28335_BOOT_RS485_TX();for(i=0U;i<n;++i){
|
||||
#if F28335_BOOT_USE_SCIB
|
||||
while(!ScibRegs.SCICTL2.bit.TXRDY){}ScibRegs.SCITXBUF=d[i]&0xFFU;
|
||||
#else
|
||||
while(!SciaRegs.SCICTL2.bit.TXRDY){}SciaRegs.SCITXBUF=d[i]&0xFFU;
|
||||
#endif
|
||||
}
|
||||
#if F28335_BOOT_USE_SCIB
|
||||
while(!ScibRegs.SCICTL2.bit.TXEMPTY){}
|
||||
#else
|
||||
while(!SciaRegs.SCICTL2.bit.TXEMPTY){}
|
||||
#endif
|
||||
F28335_BOOT_RS485_RX();return 1;}
|
||||
static int erase(void*u,rsbt_u32_t n){(void)u;if(!n||n>F28335_BOOT_FLASH_WORDS*2UL)return 0;return F28335_BOOT_FLASH_ERASE(0UL,(n+1UL)/2UL);}
|
||||
static int wr(void*u,rsbt_u32_t o,const rsbt_byte_t*d,rsbt_u16_t n){rsbt_u16_t i=0U,w;unsigned long a=o/2UL;(void)u;if(o+n>F28335_BOOT_FLASH_WORDS*2UL)return 0;if(o&1UL){w=F28335_BOOT_FLASH_READ(a);w=(w&0xFF00U)|(d[0]&0xFFU);if(!F28335_BOOT_FLASH_PROGRAM(a++,w))return 0;i=1U;}while(i<n){w=(d[i]&0xFFU)<<8;w|=(i+1U<n)?(d[i+1U]&0xFFU):0xFFU;if(!F28335_BOOT_FLASH_PROGRAM(a++,w))return 0;i+=2U;}return 1;}
|
||||
static int rd(void*u,rsbt_u32_t o,rsbt_byte_t*d,rsbt_u16_t n){rsbt_u16_t i,w;(void)u;if(o+n>F28335_BOOT_FLASH_WORDS*2UL)return 0;for(i=0U;i<n;++i){w=F28335_BOOT_FLASH_READ((o+i)/2UL);d[i]=((o+i)&1UL)?(w&0xFFU):(w>>8);}return 1;}
|
||||
static int ram(void*u,rsbt_u32_t o,const rsbt_byte_t*d,rsbt_u16_t n){rsbt_u16_t i=0U,w;volatile unsigned int*p;(void)u;if(o+n>F28335_BOOT_RAM_WORDS*2UL)return 0;p=(volatile unsigned int*)(F28335_BOOT_RAM_BASE+o/2UL);if(o&1UL){w=*p;*p++=(w&0xFF00U)|(d[0]&0xFFU);i=1U;}while(i<n){w=(d[i]&0xFFU)<<8;w|=(i+1U<n)?(d[i+1U]&0xFFU):0xFFU;*p++=w;i+=2U;}return 1;}
|
||||
static int valid(void*u,rsbt_u32_t size,rsbt_u32_t expected){rsbt_byte_t b[32];rsbt_u32_t crc=0xFFFFFFFFUL,o;rsbt_u16_t i,n,bit;(void)u;for(o=0UL;o<size;o+=32UL){n=(rsbt_u16_t)(size-o);if(n>32U)n=32U;if(!rd(0,o,b,n))return 0;for(i=0U;i<n;++i){crc^=b[i]&0xFFU;for(bit=0U;bit<8U;++bit)crc=(crc>>1)^((crc&1U)?0xEDB88320UL:0U);}}return(crc^0xFFFFFFFFUL)==expected;}
|
||||
static void reboot(void*u){(void)u;F28335_BOOT_REBOOT();}
|
||||
void F28335Boot_Init(void){rsbt_config_t c;rsbt_port_t p;c.app_address=F28335_BOOT_FLASH_BASE;c.app_size=F28335_BOOT_FLASH_WORDS*2UL;c.max_block=RSBT_MAX_BLOCK;p.transmit=tx;p.erase=erase;p.write=wr;p.read=rd;p.write_ram=ram;p.image_valid=valid;p.reboot=reboot;(void)rsbt_init(&boot,&c,&p,0);}
|
||||
void F28335Boot_FeedByte(unsigned int b){rsbt_feed(&boot,b&0xFFU);}rsbt_state_t F28335Boot_State(void){return boot.state;}
|
||||
7
c/rs485-boot/ports/tms320f28335/rs_boot_port_f28335.h
Normal file
7
c/rs485-boot/ports/tms320f28335/rs_boot_port_f28335.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef RS_BOOT_PORT_F28335_H
|
||||
#define RS_BOOT_PORT_F28335_H
|
||||
#include "rs_boot_transport.h"
|
||||
void F28335Boot_Init(void);
|
||||
void F28335Boot_FeedByte(unsigned int wire_byte);
|
||||
rsbt_state_t F28335Boot_State(void);
|
||||
#endif
|
||||
Reference in New Issue
Block a user