6161
6262/* forward declaration */
6363int hal_flash_init (void );
64-
64+ #if defined( WOLFBOOT_RENESAS_TSIP ) && !defined( WOLFBOOT_RENESAS_APP )
6565static void hal_panic (void )
6666{
6767 while (1 )
6868 ;
6969}
70+ #endif
7071
7172#ifdef ENABLE_LED
7273void hal_led_on (void )
@@ -104,6 +105,21 @@ void hal_delay_us(uint32_t us)
104105 }
105106}
106107
108+ static flash_err_t flash_check_error ()
109+ {
110+ uint32_t st = FLASH_FSTATR ;
111+
112+ if (st & FLASH_FSTATR_ILGLERR ) return FLASH_ERR_ILGL ;
113+ if (st & FLASH_FSTATR_PRGERR ) return FLASH_ERR_PRG ;
114+ if (st & FLASH_FSTATR_ERSERR ) return FLASH_ERR_ERS ;
115+ if (st & FLASH_FSTATR_FLWEERR ) return FLASH_ERR_FLWE ;
116+ if (st & FLASH_FSTATR_FESETERR ) return FLASH_ERR_FESET ;
117+ if (st & FLASH_FSTATR_SECERR ) return FLASH_ERR_SEC ;
118+ if (st & FLASH_FSTATR_OTERR ) return FLASH_ERR_OT ;
119+
120+ return FLASH_OK ;
121+
122+ }
107123#ifdef DEBUG_UART
108124
109125#ifndef DEBUG_UART_SCI
@@ -210,7 +226,6 @@ void uart_write(const char* buf, unsigned int sz)
210226void hal_clk_init (void )
211227{
212228 uint32_t reg , i ;
213- uint16_t stc ;
214229 uint8_t cksel = CFG_CKSEL ;
215230
216231 PROTECT_OFF (); /* write protect off */
@@ -235,15 +250,15 @@ void hal_clk_init(void)
235250 /* Wait for HOCO oscillator stabilization */
236251 while ((SYS_OSCOVFSR & SYS_OSCOVFSR_HCOVF ) == 0 ) { RX_NOP (); }
237252#else
238- if (SYS_HOCOCR & SYS_HOCOCR_HCSTP ) {
239- /* Turn off power to HOCO */
240- SYS_HOCOPCR |= SYS_HOCOPCR_HOCOPCNT ;
241- }
253+ if (SYS_HOCOCR & SYS_HOCOCR_HCSTP ) {
254+ /* Turn off power to HOCO */
255+ SYS_HOCOPCR |= SYS_HOCOPCR_HOCOPCNT ;
256+ }
242257#endif
243258
244259 /* ---- Main-Clock ---- */
245260#if CFG_CKSEL == 2
246- /* MOFXIN=0 (not controlled), MODRV2=0 (24MHz), MOSEL=0 (resonator) */
261+ /* MOFXIN=0 (not controlled), MODRV2=0 (24MHz), MOSEL=0 (resonator) */
247262 SYS_MOFCR = 0 ;
248263
249264 /* OSC stabilization time (9.98 ms * (264 kHZ) + 16)/32 = 82.83) */
@@ -485,8 +500,30 @@ void hal_prepare_boot(void)
485500
486501}
487502
503+ #ifdef __CCRX__
504+ /* copy RAM functions from ROM to RAM */
505+ static void copyfuncs (void )
506+ {
507+ unsigned char * dst , * src ;
508+ size_t n ;
509+
510+ src = __sectop ("PFRAM" );
511+ dst = __sectop ("RPFRAM" );
512+ n = (size_t )((unsigned char * )__secend ("PFRAM" ) -
513+ (unsigned char * )__sectop ("PFRAM" ));
514+ wolfBoot_printf ("RAM Function start = 0x%p\n" , __sectop ("RPFRAM" ));
515+ wolfBoot_printf ("RAM Function end = 0x%p\n" , __secend ("RPFRAM" ));
516+ wolfBoot_printf ("RAM Function size = %d\n" , n );
517+ while (src < __secend ("PFRAM" )) {
518+ * dst ++ = * src ++ ;
519+ }
520+ }
521+ #endif
488522int hal_flash_init (void )
489523{
524+ #ifdef __CCRX__
525+ copyfuncs ();
526+ #endif
490527 /* Flash Write Enable */
491528 FLASH_FWEPROR = FLASH_FWEPROR_FLWE ;
492529
@@ -506,23 +543,33 @@ int hal_flash_init(void)
506543/* write up to 128 bytes at a time */
507544#define FLASH_FACI_CODE_BLOCK_SZ \
508545 (FLASH_FACI_CMD_PROGRAM_CODE_LENGTH * FLASH_FACI_CMD_PROGRAM_DATA_LENGTH)
546+ #ifdef __CCRX__
547+ #pragma section FRAM
548+ #endif
509549int RAMFUNCTION hal_flash_write (uint32_t addr , const uint8_t * data , int len )
510550{
511- int ret , i , chunk ;
551+ int i ;
512552 uint8_t codeblock [FLASH_FACI_CODE_BLOCK_SZ ];
513553 uint16_t * data16 = (uint16_t * )data ;
554+ uint32_t block_base ;
555+ uint32_t offset ;
556+ int write_size ;
557+ int ret ;
514558
515559 while (len > 0 ) {
516- /* handle partial remainder */
517- if ( len < FLASH_FACI_CODE_BLOCK_SZ ) {
518- uint8_t * src = ( uint8_t * ) addr ;
519- int remain = FLASH_FACI_CODE_BLOCK_SZ - len ;
520- memcpy (codeblock , data16 , len );
521- memcpy ( codeblock + len , src + len , remain ) ;
522- data16 = ( uint16_t * ) codeblock ;
523- }
560+ /* Align address to 128-byte boundary */
561+ block_base = addr & ~( FLASH_FACI_CODE_BLOCK_SZ - 1 );
562+ offset = addr - block_base ;
563+
564+ memcpy (codeblock , ( uint8_t * ) block_base , FLASH_FACI_CODE_BLOCK_SZ );
565+ write_size = FLASH_FACI_CODE_BLOCK_SZ - offset ;
566+ if ( write_size > len )
567+ write_size = len ;
524568
525- FLASH_FSADDR = addr ;
569+ memcpy (& codeblock [offset ], data , write_size );
570+ data16 = (uint16_t * )codeblock ;
571+
572+ FLASH_FSADDR = block_base ;
526573 /* flash program command */
527574 FLASH_FACI_CMD8 = FLASH_FACI_CMD_PROGRAM ;
528575 /* number of 16-bit blocks: for code blocks is always 0x40 (64) */
@@ -539,9 +586,12 @@ int RAMFUNCTION hal_flash_write(uint32_t addr, const uint8_t *data, int len)
539586
540587 /* Wait for FCU operation to complete */
541588 while ((FLASH_FSTATR & FLASH_FSTATR_FRDY ) == 0 );
542-
543- len -= FLASH_FACI_CODE_BLOCK_SZ ;
544- addr += FLASH_FACI_CODE_BLOCK_SZ ;
589+ if ((ret = flash_check_error ()) != FLASH_OK ) {
590+ return ret ;
591+ }
592+ len -= write_size ;
593+ addr += write_size ;
594+ data += write_size ;
545595 }
546596 return 0 ;
547597}
@@ -579,7 +629,6 @@ int RAMFUNCTION hal_flash_erase(uint32_t address, int len)
579629
580630static int RAMFUNCTION hal_flash_write_faw (uint32_t faw )
581631{
582- volatile uint8_t * cmdArea = (volatile uint8_t * )FLASH_FACI_CMD_AREA ;
583632
584633#ifndef BIG_ENDIAN_ORDER
585634 #if defined(__CCRX__ )
@@ -639,7 +688,9 @@ void RAMFUNCTION hal_flash_lock(void)
639688 FLASH_FENTRYR_CODE_READ | FLASH_FENTRYR_DATA_READ );
640689 return ;
641690}
642-
691+ #ifdef __CCRX__
692+ #pragma section
693+ #endif
643694#if !defined(WOLFBOOT_NO_PARTITIONS ) && !defined(TARGET_library )
644695void * hal_get_primary_address (void )
645696{
@@ -648,6 +699,6 @@ void* hal_get_primary_address(void)
648699
649700void * hal_get_update_address (void )
650701{
651- return (void * )WOLFBOOT_PARTITION_UPDATE_ADDRESS ;
702+ return (void * )( uintptr_t ) WOLFBOOT_PARTITION_UPDATE_ADDRESS ;
652703}
653704#endif
0 commit comments