Add C28x RS boot ports for F2812 and F28335

This commit is contained in:
2026-08-30 15:30:08 +03:00
parent 9ce32b56d4
commit 5f3a9879d5
10 changed files with 368 additions and 1 deletions

View 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.

View File

@@ -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

View 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;}

View 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