[Bootloader]

- ML402: do baudrate init in board_init()
- use faster memcpy
- print CPU info
- provide extra diagnostic during SREC load

git-svn-id: http://moon:8086/svn/mips@176 a8ebac50-d88d-4704-bea3-6648445a41b3
This commit is contained in:
2021-11-22 07:32:53 +00:00
parent 5c1eb1946a
commit 7ced3f1db1
4 changed files with 28 additions and 14 deletions
+3 -1
View File
@@ -52,5 +52,7 @@ uint32_t getBootOffset(uint32_t sel)
void board_init(void) void board_init(void)
{ {
volatile uint32_t *pBaud = (uint32_t)SYS_UART_BAUD;
*pBaud = UART_CALC_BAUD(460800);
} }
+21 -9
View File
@@ -1,4 +1,5 @@
#include <board.h> #include <board.h>
#include <string.h>
#include "libsys.h" #include "libsys.h"
#include "srec.h" #include "srec.h"
#include "../cfiflash.h" #include "../cfiflash.h"
@@ -52,9 +53,11 @@ void Exec_at(void *pEntry)
__asm __asm
( (
// Enable User Mode and Interrupts on RFE // On RFE:
// Exception Vector = 0xBFC00080 // (KUp = 1): Enable User Mode
"li $26, 0x1000000C\n" // (IEp = 0): Disable Interrupts
// (BEV = 1): Exception Vector = 0xBFC00080
"li $26, 0x10000008\n"
"mtc0 $26, $12\n" "mtc0 $26, $12\n"
); );
@@ -108,7 +111,6 @@ void Exec_RE_at(void *pEntry)
} }
#define MAX_IMG_SIZE (1024*1024) // bytes #define MAX_IMG_SIZE (1024*1024) // bytes
#define FLASH_USE_BLOCK 1
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
@@ -133,7 +135,9 @@ int main(int argc, char *argv[])
*pGPIO_DATA = GPIO_0_DFLT_DATA; *pGPIO_DATA = GPIO_0_DFLT_DATA;
block_sel = 0x7F & (uint32_t)((*pGPIO_DATA >> GPIO_0_ALIGN_DIP) & GPIO_0_MASK_DIP); block_sel = 0x7F & (uint32_t)((*pGPIO_DATA >> GPIO_0_ALIGN_DIP) & GPIO_0_MASK_DIP);
sputs("\nMIPS bootloader\n"); sputs("\nMIPS bootloader 2.0\n");
PrintCPUinfo();
// ---------------------------------------------------------- // ----------------------------------------------------------
if (IS_ERROR(flash_find(&flash, SYS_FLASH_IO))) if (IS_ERROR(flash_find(&flash, SYS_FLASH_IO)))
{ {
@@ -193,12 +197,19 @@ int main(int argc, char *argv[])
switch (srec_state) switch (srec_state)
{ {
case srec_data: case srec_data:
result = -1;
if ((srec.addr + srec.size) > MAX_IMG_SIZE)
{
sputs("O");
break;
}
memcpy((uint32_t*)srec.addr, srec.data, srec.size);
if ((srec.addr + srec.size) > haddr) if ((srec.addr + srec.size) > haddr)
{
haddr = srec.addr + srec.size; haddr = srec.addr + srec.size;
}
pMem = (uint8_t*)srec.addr; result = 0;
for (i=0; i < srec.size; i++)
*pMem++ = srec.data[i];
break; break;
@@ -252,6 +263,7 @@ int main(int argc, char *argv[])
break; break;
default: default:
sputs("E");
result = -1; result = -1;
break; break;
} }
+1 -4
View File
@@ -19,14 +19,11 @@ const uart_if_t uart_if[2] =
// ------------------------------------ // ------------------------------------
// Low-level I/O // Low-level I/O
// ------------------------------------ // ------------------------------------
#define CALC_BAUD(b) \
(((10*CPU_FREQ_HZ)/((16*b) + 5))/10 - 1)
void UART_setbaud(void const *pInst, uint32_t baudrate) void UART_setbaud(void const *pInst, uint32_t baudrate)
{ {
uart_if_t *pReg = (uart_if_t*)pInst; uart_if_t *pReg = (uart_if_t*)pInst;
*pReg->pBAUD = CALC_BAUD(baudrate); *pReg->pBAUD = UART_CALC_BAUD(baudrate);
} }
int UART_readchar(void const *pInst) int UART_readchar(void const *pInst)
+3
View File
@@ -16,6 +16,9 @@
#ifndef UART_H #ifndef UART_H
#define UART_H #define UART_H
#define UART_CALC_BAUD(b) \
(((10*CPU_FREQ_HZ)/((16*b) + 5))/10 - 1)
typedef struct _suart_if_t typedef struct _suart_if_t
{ {
volatile uint32_t *pCTRL; volatile uint32_t *pCTRL;