📄 bsp.c
字号:
/*
*********************************************************************************************************
*
* MICRIUM BOARD SUPPORT PACKAGE
*
* (c) Copyright 2003-2006; Micrium, Inc.; Weston, FL
*
* All rights reserved. Protected by international copyright laws.
*
* Knowledge of the source code may NOT be used to develop a similar product.
*
* Please help us continue to provide the Embedded community with the finest
* software available. Your honesty is greatly appreciated.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*
* BOARD SUPPORT PACKAGE (BSP) FUNCTIONS
*
* CSB ARM MAIN FILE
*
* Filename : bsp.c
* Version : V1.88
* Programmer(s) : Jean-Denis Hatier
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#include <includes.h>
#include <reg_AT91RM9200.h>
/*
*********************************************************************************************************
* DEFINES
*********************************************************************************************************
*/
/* C-Spy patch to unlock flash bus. */
#define BSP_FLASH_UNLOCK_ADDR (*(CPU_INT32U *)0x107FFFF0)
/* Micromonitor services entry point. */
#define BSP_uMON_ENTRY_POINT (*(CPU_INT32U *)0x10000020)
#define BSP_REMAP_ADDR 0x00000000
#define BSP_SRAM_ADDR 0x00200000
#define BSP_FLASH_ADDR 0x10000000
#define BSP_SDRAM_ADDR 0x20000000
#define BSP_DBGU_RATE 38400
/*
*********************************************************************************************************
TYPE DEFINITIONS
*********************************************************************************************************
*/
typedef void (*BSP_FNCT_PTR)(void);
/*
*********************************************************************************************************
* GLOBAL VARIABLES
*********************************************************************************************************
*/
static CPU_INT08U BSP_CSB_ARM_LED_RegImage;
/*
*********************************************************************************************************
* BSP INITIALIZATION
*
* Description : This function should be called by your application code before you make use of any of the
* functions found in this module.
*
* Arguments : None.
*********************************************************************************************************
*/
void BSP_Init (void)
{
CPU_INT32U i;
BSP_CSB_ARM_LED_RegImage = 0;
*AT91C_AIC_IDCR = ~0; /* Disable ALL interrupts. */
BSP_FLASH_UNLOCK_ADDR = ~0; /* C-Spy patch to unlock Flash bus. */
i = 0; /* Determine if remappable address range 0x00000000 */
while (*(CPU_INT32U*)(BSP_FLASH_ADDR + i) == /* to 0x0fffffff is mapped to FLASH or SRAM. */
*(CPU_INT32U*)(BSP_SRAM_ADDR + i)) {
i++;
}
if (*(CPU_INT32U*)(BSP_REMAP_ADDR + i) != /* If mapped to FLASH, remap it to SRAM. */
*(CPU_INT32U*)(BSP_SRAM_ADDR + i)) {
*AT91C_MC_RCR = AT91C_MC_RCB;
}
/* Activate i-cache. */
asm("MRC p15, 0, r0, c1, c0, 0");
asm("ORR r0, r0, #0x00001000");
asm("MCR p15, 0, r0, c1, c0, 0");
asm("nop");
asm("nop");
asm("nop");
/* Change BUS mode to synchronous. */
asm("MRC p15, 0, r0, c1, c0, 0");
asm("ORR r0, r0, #0x40000000");
asm("MCR p15, 0, r0, c1, c0, 0");
asm("nop");
asm("nop");
asm("nop");
/* Switch to the slow clock unless we already are. */
if (PMC_REG(PMC_MCKR)) {
PMC_REG(PMC_MCKR) = PMC_REG(PMC_MCKR) & ~PMC_MCKR_PRES_MASK;
PMC_REG(PMC_MCKR) = PMC_REG(PMC_MCKR) & ~PMC_MCKR_CSS_MASK;
}
/* Delay for slow clock synchronization. */
for (i = 0; i < 100; i++) {
;
}
/* Set new CPU clock speed (core clock). */
/* (3.6864 * 87 / 2 = 160.3584MHz). */
PMC_REG(PMC_PLLAR) = PMC_PLLAR_MUST_SET | /* This bit must be set according to the documentation. */
PMC_PLLAR_MUL(87-1) | /* Multiplier. */
PMC_PLLAR_OUT_150_240 | /* Select when PLL frequency is 150-240 MHz. */
PMC_PLLAR_DIV(2); /* Divider, */
/* Wait for PLLA lock bit. */
for (i = 0; i < 1000; i++) {
if (PMC_REG(PMC_SR) & PMC_INT_LCKA) {
break;
}
}
/* MCK = PLLA clock / 2 = 80.1792MHz. */
PMC_REG(PMC_MCKR) = PMC_MCKR_CSS_PLLA | /* Core Source = PLL A. */
PMC_MCKR_MDIV_2; /* MCK = Core / 2. */
/* Set Debug (serial) port to 38400bps. */
*AT91C_DBGU_BRGR = BSP_CLK_AT91RM9200_MASTER_HZ / (16 * BSP_DBGU_RATE);
/* Initialize monitor services. */
monConnect((int (*)())BSP_uMON_ENTRY_POINT, NULL, NULL);
LED_Init(); /* Initialize LEDs. */
OS_CPU_InitExceptVect(); /* Initialize exception vectors. */
}
/*
*********************************************************************************************************
* EXCEPTION HANDLER
*
* Arguments : None.
*********************************************************************************************************
*/
void OS_CPU_ExceptHndlr (CPU_DATA except_id)
{
BSP_FNCT_PTR pfnct;
CPU_INT32U *sp;
if ((except_id == OS_CPU_ARM_EXCEPT_FIQ) ||
(except_id == OS_CPU_ARM_EXCEPT_IRQ)) {
pfnct = (BSP_FNCT_PTR)*AT91C_AIC_IVR; /* Read the interrupt vector from the AIC. */
if (pfnct != (BSP_FNCT_PTR)0) { /* Make sure we don't have a NULL pointer. */
(*pfnct)(); /* Execute the ISR for the interrupting device. */
}
} else {
sp = (CPU_INT32U *)OSTCBCur->OSTCBStkPtr;
APP_TRACE_INFO(("\nCPU_ARM_EXCEPTION #%d trapped.\n", except_id));
APP_TRACE_INFO(("R0 : 0x%08x\n", *(sp + 0x01)));
APP_TRACE_INFO(("R1 : 0x%08x\n", *(sp + 0x02)));
APP_TRACE_INFO(("R2 : 0x%08x\n", *(sp + 0x03)));
APP_TRACE_INFO(("R3 : 0x%08x\n", *(sp + 0x04)));
APP_TRACE_INFO(("R4 : 0x%08x\n", *(sp + 0x05)));
APP_TRACE_INFO(("R5 : 0x%08x\n", *(sp + 0x06)));
APP_TRACE_INFO(("R6 : 0x%08x\n", *(sp + 0x07)));
APP_TRACE_INFO(("R7 : 0x%08x\n", *(sp + 0x08)));
APP_TRACE_INFO(("R8 : 0x%08x\n", *(sp + 0x09)));
APP_TRACE_INFO(("R9 : 0x%08x\n", *(sp + 0x0A)));
APP_TRACE_INFO(("R10 : 0x%08x\n", *(sp + 0x0B)));
APP_TRACE_INFO(("R11 : 0x%08x\n", *(sp + 0x0C)));
APP_TRACE_INFO(("R12 : 0x%08x\n", *(sp + 0x0D)));
APP_TRACE_INFO(("SP : 0x%08x\n", sp));
APP_TRACE_INFO(("LR : 0x%08x\n", *(sp + 0x0E)));
APP_TRACE_INFO(("PC : 0x%08x\n", *(sp + 0x0F)));
APP_TRACE_INFO(("CPSR: 0x%08x\n", *(sp + 0x00)));
/* Infinite loop on other exceptions. */
/* Should be replaced by other behavior (reboot, etc.) */
while (DEF_TRUE) {
;
}
}
}
/*
*********************************************************************************************************
* TICKER INITIALIZATION
*
* Description : This function is called to initialize uC/OS-II's tick source (typically a timer generating
* interrupts every 1 to 100 mS).
*
* We decided to use Timer #0 as the tick interrupt source.
*
* Arguments : None.
*********************************************************************************************************
*/
void Tmr_Init (void)
{
/* OS Timer is on interrupt #1. */
AIC_SVR_REG(1 * 4) = (CPU_INT32U)Tmr_TickHandler; /* Setup the interrupt vector for the tick ISR. */
AIC_SMR_REG(1 * 4) = AT91C_AIC_PRIOR_LOWEST | /* Level sensitive, low priority. */
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE;
*AT91C_AIC_IECR = DEF_BIT_01; /* Enable timer interrupt at AIC level. */
/* Initialize the timer to generate 100 Hz. */
*AT91C_ST_PIMR = BSP_CLK_AT91RM9200_SLOW_HZ / OS_TICKS_PER_SEC;
*AT91C_ST_IER = AT91C_ST_PITS; /* Enable timer interrupt at ST level. */
}
/*
*********************************************************************************************************
* TIMER #0 IRQ HANDLER
*
* Description : This function handles the timer interrupt that is used to generate TICKs for uC/OS-II.
*
* Arguments : None.
*********************************************************************************************************
*/
void Tmr_TickHandler (void)
{
CPU_INT32U reg_val;
reg_val = *AT91C_ST_SR;
if (reg_val & AT91C_ST_PITS) { /* If the interrupt is from the tick source, call */
OSTimeTick(); /* OSTimeTick(). */
}
/* OS Timer is on interrupt #1. */
*AT91C_AIC_EOICR = DEF_BIT_01; /* End of interrupt handler. */
}
/*
*********************************************************************************************************
* LED INITIALIZATION
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -