Tuesday, September 28, 2010

Bare Metal: PuppyBeagle low level initialization code in C [low_init.c]

/******************************************************************************
*            PuppyBeagle low level init code
*
* This part of the code does some basic hardware initialization including
* UART init, SDRAM init, 2nd level IVT setup
*
*       Copyrights (c) 2010 Amarnath B Revanna, amarnath.revanna@gmail.com
******************************************************************************/
#include
#include "low_init.h"
#include "sprint.h"

void und_ex_handler (void)
{
sprint ("*** UNDEF EXCEPTION RAISED ***\n");
}
void swi_ex_handler (void)
{
sprint ("*** SWI EXCEPTION RAISED ***\n");
}
void pabt_ex_handler (void)
{
sprint ("*** PREFETCH ABORT ***\n");
}
void dabt_ex_handler (void)
{
sprint ("*** DATA ABORT ***\n");
}
void irq_ex_handler (void)
{
sprint ("*** RECEIVED IRQ INTERRUPT ***\n");
}
void fiq_ex_handler (void)
{
sprint ("*** RECEIVED FIQ INTERRUPT ***\n");
}

void low_level_init ()
{
uart_reg *puart;
sdrc_reg *psdrc;

uint32_t *pIvt2_und = (uint32_t *)0x4020FFE4;
uint32_t *pIvt2_swi = (uint32_t *)0x4020FFE8;
uint32_t *pIvt2_pabt = (uint32_t *)0x4020FFEC;
uint32_t *pIvt2_dabt = (uint32_t *)0x4020FFF0;
uint32_t *pIvt2_irq = (uint32_t *)0x4020FFF8;
uint32_t *pIvt2_fiq = (uint32_t *)0x4020FFFC;

puart = (uart_reg *) UART3_REG_BASE;
psdrc = (sdrc_reg *) SDRC_REG_BASE;

//Do soft-reset and wait for reset complete
puart->UART_SYSC |= UART_RST_MASK;
while (!puart->UART_SYSS)
;

/* Put UART3 in Config. Mode B to access UART_DLL_REG which is same as
* UART_THR_REG
*/
puart->UART_LCR &= UART3_B_MODE;
puart->UART_THR = BAUD_115200;

//Put UART3 in Operational Mode
puart->UART_LCR = UART3_OP_MODE;

// Put UART3 in 16x mode
puart->UART_MDR1 = UART_16X_MODE;

//Finally, touch UART_RESUME register to start Tx/Rx
puart->UART_RESUME = puart->UART_RESUME;

sprint ("UART CONFIGURED...\n");

//Next, start SDRAM configuration
psdrc->SDRC_MCFG_0 &= RAMSZ_TYP_CLR;
psdrc->SDRC_MCFG_0 |= RAMSZ_TYP;

sprint ("SDRC CONFIGURED...\n");

//Setup secondary IVT
*pIvt2_und = (uint32_t) &und_ex_handler;
*pIvt2_swi = (uint32_t) &swi_ex_handler;
*pIvt2_pabt = (uint32_t) &pabt_ex_handler;
*pIvt2_dabt = (uint32_t) &dabt_ex_handler;
*pIvt2_irq = (uint32_t) &irq_ex_handler;
*pIvt2_fiq = (uint32_t) &fiq_ex_handler;

sprint ("IVT SETUP...\n");

}

No comments:

Post a Comment