⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chip_support.s

📁 μITRON4.0 source code for ARM
💻 S
字号:
/* *  TOPPERS/ASP Kernel *      Toyohashi Open Platform for Embedded Real-Time Systems/ *      Advanced Standard Profile Kernel *  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory *                              Toyohashi Univ. of Technology, JAPAN *  Copyright (C) 2006-2007 by Embedded and Real-Time Systems Laboratory *              Graduate School of Information Science, Nagoya Univ., JAPAN *  *  惧淡螟侯涪荚は·笆布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェ *  ア∈塑ソフトウェアを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖 *  恃ˇ浩芹邵∈笆布·网脱と钙ぶ∷することを痰浸で钓满するˉ *  (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 *      涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 *      スコ〖ド面に崔まれていることˉ *  (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 *      脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 *      荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 *      の痰瘦沮惮年を非很することˉ *  (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 *      脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ *      とˉ *    (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 *        侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *    (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに *        鼠桂することˉ *  (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 *      巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ *      また·塑ソフトウェアのユ〖ザまたはエンドユ〖ザからのいかなる妄 *      统に答づく懒滇からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを *      倘勒することˉ *  *  塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お *  よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·泼年の蝗脱誊弄 *  に滦する努圭拉も崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェ *  アの网脱により木儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·そ *  の勒扦を砷わないˉ *  *  @(#) $Id: chip_support.S 746 2008-02-23 04:46:56Z honda $ *//* *  チップ巴赂モジュ〖ル アセンブリ咐胳婶∈AT91SAM7S脱∷ */#define  TOPPERS_MACRO_ONLY#define UINT_C(val)		(val)		/* uint_t房の年眶を侯るマクロ */#define ULONG_C(val)	(val)		/* ulong_t房の年眶を侯るマクロ */#include "kernel_impl.h"/* *  你レベルのタ〖ゲットシステム巴赂の介袋步 * *  スタ〖トアップモジュ〖ルの面で·メモリ介袋步の涟に钙び叫されるˉ           */        .text        .align 2        .global hardware_init_hookhardware_init_hook:        ldr     r10, =TADR_BASE_RSTC        ldr     r0, =0xA5000c01        /* NRST enable */        str     r0, [r10, #TOFF_RSTC_MR]                                    /* Set up FLASH wait state */        ldr     r10, =TADR_MC_BASE        ldr     r0, =(50<<MC_FMR_FMCN_SHIFT) | MC_FMR_FWS_1FWS        str     r0, [r10, #TOFF_MC_FMR]                                    /* Disable Watchdog */        ldr     r10, =TADR_WDT_BASE        ldr     r0, =WDT_MR_WDDIS        str     r0, [r10, #TOFF_WDT_MR]                                    /* Enable the main oscillator */        ldr     r10, =TADR_PMC_BASE        ldr     r0, =(6<<CKGR_MOR_OSCOUNT_SHIFT)|CKGR_MOR_MOSCEN        str     r0, [r10, #TOFF_CKGR_MOR]                                    /* Wait for main oscillator to stabilize */oscillator_wait:        ldr     r0, [r10, #TOFF_PMC_SR]        tst     r0, #PMC_SR_MOSCS        beq     oscillator_wait                                    /* Set up the PLL */                                    /* MCK=18.432[MHz]/(DIV=14)*((MUL=72)+1)/2=48054857[Hz] */        ldr     r0, =(14<<CKGR_PLLR_DIV_SHIFT) | (28<<CKGR_PLLR_PLLCOUNT_SHIFT) | (72<<CKGR_PLLR_MUL_SHIFT)        str     r0, [r10, #TOFF_CKGR_PLLR]                                    /* Wait for PLL to lock */PLLlock_wait:        ldr     r0, [r10, #TOFF_PMC_SR]        tst     r0, #PMC_SR_LOCK        beq     PLLlock_wait                                    /* Select PLL as clock source */        ldr     r0, =(PMC_MCKR_CSS_PLL_CLOCK|PMC_MCKR_PRES_CLK_2)        str     r0, [r10, #TOFF_PMC_MCKR]                                    /* Setup the stack for each mode */        mov     r0, sp        msr     cpsr_c, #(CPSR_FIQ|CPSR_IRQ_BIT|CPSR_FIQ_BIT)    /* Set up Fast Interrupt Mode and set FIQ Mode Stack */        ldr     r8, =TADR_AIC_BASE                      /* Init the FIQ register */        msr     cpsr_c, #(CPSR_IRQ|CPSR_IRQ_BIT|CPSR_FIQ_BIT)    /* Set up Interrupt Mode and set IRQ Mode Stack */        mov     r13, r0                                 /* Init stack IRQ */        msr     cpsr_c, #(CPSR_SVC|CPSR_IRQ_BIT|CPSR_FIQ_BIT)   /* Return Supervisor Mode and set Supervisor Mode */init_done:        mov     pc, lr        .text        .align 2        .global software_init_hooksoftware_init_hook:        mov     pc, lr        .text        .align 2        .global software_term_hooksoftware_term_hook:        mov     pc, lr/* * 充哈みハンドラ * * IRQ 毋嘲ベクタから钙び叫される */    .text    .align 2    .global irq_handlerirq_handler:    /*      * IRQモ〖ドで悸乖される     */    /*      *  充哈み涟のモ〖ド(ス〖パ〖バイザ〖モ〖ド)へ     *  败乖し·コンテキストを瘦赂する     */    msr   cpsr, #(CPSR_SVC|CPSR_IRQ_BIT)     stmfd sp!, {r0-r3, ip, lr, pc} /* pcはダミ〖 */    /*     * spsrと提り戎孟を艰评するためにIRQモ〖ドへ     */    msr   cpsr, #(CPSR_IRQ|CPSR_IRQ_BIT)    sub   r0, lr, #4    mrs   r1, spsr    /*     *  充哈みハンドラ悸乖箕のモ〖ド∈ス〖パ〖バイザ〖モ〖ド∷に     */    msr   cpsr, #(CPSR_SVC|CPSR_IRQ_BIT)     str   r0, [sp, #0x18] /* 提り戎孟をスタックに */    stmfd sp!, {r1}       /* spsrをスタックに瘦赂 */    mov   lr, sp          /* この箕爬のスタックを牲耽のため艰评 */    /*     *  驴脚充哈みか冉年     */    ldr   r2, =excpt_nest_count /* 毋嘲ˇ充哈みネスト搀眶を艰评 */    ldr   r3, [r2]    add   r0, r3, #1            /* 毋嘲ˇ充哈みネスト搀眶を构糠 */    str   r0, [r2]    cmp   r3, #0        bne   irq_handler_1    /*      * 办檬誊の毋嘲∈充哈み∷ならスタックを恃构する     */    ldr   r0, =_kernel_istkpt    ldr   sp, [r0]irq_handler_1:    stmfd sp!, {lr}     /* 牲耽脱のスタックポインタの瘦赂 */    /*     *  充り哈み妥傍の冉年     */    ldr   r1, =TADR_AIC_BASE    ldr   r3, [r1, #TOFF_AIC_IVR]    /*     *  充哈み妥傍の充哈み庭黎刨を滇め(モデル惧の)充哈み庭黎刨マスクをセット     *  するˉまたその狠·ハンドラ悸乖涟の(モデル惧の)充哈み庭黎刨マスクを     *  瘦赂するˉ     */    ldr   r0, =inh_ipm_tbl      /* 充哈み庭黎刨を艰评 */    ldr   r1, [r0, r3, lsl #2]  /* r1<-充哈み庭黎刨   */    ldr   r0, =ipm              /* 充哈み券栏涟の充哈み庭黎刨マスクをスタックに瘦赂 */    ldr   r2, [r0]                  stmfd sp!,{r2}    str   r1, [r0]              /* (モデル惧の)充哈み庭黎刨マスクをセット */    /*     * ハ〖ドウェア(IRC)は充哈みを减け烧けた稿·充哈みに炳じて庭黎刨マスク     * をセットするˉそのためソフトウェア弄には泼に借妄は乖う涩妥はないˉ     * ソフトウェア弄に(モデル惧の)充哈み庭黎刨マスクを惧げる狠には·     * 充哈み庭黎刨マスクに炳じて充哈み妥滇敦贿フラグにより充哈みを敦贿するˉ     */    /*     *  充哈みハンドラの弹瓢戎孟を艰评     */    ldr   r0, =inh_tbl         /* 充哈みハンドラテ〖ブルの粕み叫し  */    ldr   r0, [r0, r3, lsl #2] /* r0<-充哈みハンドラ            */        stmfd sp!,{r3}             /* inhno を瘦赂  */    /*      * 充り哈み钓材      */             msr   cpsr, #(CPSR_SVC)#ifdef LOG_INH_ENTER    stmfd sp!,{r0}    mov   r0, r3         /* inhno をパラメ〖タに    */    bl    log_inh_enter  /* log_inh_enterを钙び叫す */    ldmfd sp!,{r0}#endif /* LOG_INH_ENTER */    /*      * 充哈みハンドラの钙び叫し     */    mov   lr, pc    mov   pc, r0    ldmfd sp!,{r0}       /* inhno を牲耽  */    #ifdef LOG_INH_LEAVE    bl    log_inh_leave  /* log_inh_leaveを钙び叫す */#endif /* LOG_INH_LEAVE */    /*     * カ〖ネル瓷妄の充哈みを敦贿する     */    msr   cpsr, #(CPSR_SVC|CPSR_IRQ_BIT)    /*     * 充哈みクリア     */    ldr   r3, =TADR_AIC_BASE    mov   r0, #0    str   r0, [r3, #TOFF_AIC_EOICR]        b     target_ret_int/* * タ〖ゲット巴赂の毋嘲掐庚借妄 */    .text    .global target_exc_handlertarget_exc_handler:        /*     *  毋嘲悸乖のモ〖ド∈ス〖パ〖バイザ〖モ〖ド∷に     *  充哈みロック觉轮·CPUロック觉轮はCPU毋嘲券栏箕の     *  觉轮を费镜するˉ     */    msr   cpsr, #(CPSR_SVC|CPSR_FIQ_BIT|CPSR_IRQ_BIT)     str   r0, [sp, #0x18] /* 提り戎孟をスタックに */    stmfd sp!, {r1}       /* spsrをスタックに瘦赂 */        mov   lr, sp          /* この箕爬のスタックを牲耽のため艰评 */    ldr   r0, =ipm        /* 充哈み券栏涟の充哈み庭黎刨マスクをスタックに瘦赂 */    ldr   r1, [r0]                  stmfd sp!, {r1}    /*      * コンテキスト冉年のため·excpt_nest_count をスタックに瘦赂ˉ     * スタックに瘦赂せず·附哼のexcpt_nest_countを-1すると艰评できるが·     * スタックに姥んでおいた数がデバッグ霹が乖いやすいので·スタックに     * 瘦赂するˉ     */    ldr   r0, =excpt_nest_count    ldr   r1, [r0]    stmfd sp!, {r1}    mov   r3,  sp         /* 毋嘲フレ〖ム戎孟を瘦赂 */    /*     *  驴脚充り哈みか冉年     */    ldr   r0, =excpt_nest_count    ldr   r1, [r0]    add   r1, r1, #1    str   r1, [r0]    cmp   r1, #1    bne   target_exc_handler_1        /*      * 办檬誊の悸乖ならスタックを恃构する     */    ldr  r0, =_kernel_istkpt    ldr  sp, [r0]target_exc_handler_1:        stmfd sp!, {lr}     /* 牲耽脱のスタックポインタの瘦赂 */    /*      * 充哈み券栏涟の充哈み庭黎刨マスクをスタックに瘦赂      * 充哈みハンドラと叫庚ル〖チンを鼎铜するために瘦赂     */    ldr   r0, =ipm           ldr   r1, [r0]                  stmfd sp!, {r1}    /*     *  CPU毋嘲ハンドラの弹瓢戎孟を艰评     */    ldr   r0, =exch_tbl        /* 充哈みハンドラテ〖ブルの粕み叫し */    ldr   r1, [r0, r2, lsl #2] /* r1<-毋嘲ハンドラ                 */    stmfd sp!,{r2}      /* excno を瘦赂 */    /*      * 充り哈み钓材      * CPUロック觉轮·充哈みロック觉轮は费镜する     */             ldr   r0, [lr]    and   r0, r0, #(CPSR_IRQ_BIT|CPSR_FIQ_BIT)    orr   r0, r0, #(CPSR_SVC)    msr   cpsr, r0#ifdef LOG_EXC_ENTER    stmfd sp!,{r1,r3}    mov   r0, r2         /* excno をパラメ〖タに    */    bl    log_exc_enter  /* log_exc_enterを钙び叫す */    ldmfd sp!,{r1,r3}#endif /* LOG_EXC_ENTER */    /*      * CPU毋嘲ハンドラの钙び叫し     *     * 毋嘲フレ〖ムの黎片を苞眶として畔す     */            mov   r0, r3    mov   lr, pc    mov   pc, r1    ldmfd sp!,{r0}       /* excno を牲耽  */    #ifdef LOG_EXC_LEAVE    bl    log_exc_leave  /* log_exc_leaveを钙び叫す */#endif /* LOG_EXC_LEAVE *//* * タ〖ゲット巴赂の毋嘲ˇ充哈みの叫庚借妄 * */    .global target_ret_exctarget_ret_exc:    /*     * カ〖ネル瓷妄の充哈みを敦贿する     */    msr   cpsr, #(CPSR_SVC|CPSR_IRQ_BIT)    .global target_ret_int        target_ret_int:            /*     * 充哈み庭黎刨マスクを傅に提す     */    ldmfd sp!, {r1}             /* 傅の充哈み庭黎刨マスクを艰评 */    ldr   r0, =ipm              /* 充哈み庭黎刨マスクを牲耽     */    str   r1, [r0]    rsb   r1, r1, #0            /* インデックスとするため瓤啪   */                  ldr   r0, =ipm_mask_tbl     /* (モデル惧)の充哈み庭黎刨のを悸附するための */    ldr   r2, [r0, r1, lsl #2]  /* 充哈み妥滇敦贿フラグを艰评 */        ldr   r0, =idf              /* 称充哈みの充哈み妥滇敦贿フラグの觉轮を艰评 */    ldr   r1, [r0]    /*     * 称充哈みの充哈み妥滇敦贿フラグの觉轮と(モデル惧)の充哈み庭黎刨のを悸附する     * ための充哈み妥滇敦贿フラグの觉轮のORをとり·それの容年を滇めることにより·     * IRCの充哈み钓材レジスタへの肋年猛を栏喇し肋年するˉ     */    ldr   r0, =TADR_AIC_BASE    /* いったん链充哈みの充哈み妥滇をマスクする */    mvn   lr, #0                    str   lr, [r0, #TOFF_AIC_IDCR]                                    orr   r1, r1, r2            /* マスク回年されていない充哈みの钓材 */    mvn   r1, r1                /* 肋年猛を栏喇 */        str   r1, [r0, #TOFF_AIC_IECR]    /*     * スタックポインタの牲耽     */    ldmfd sp!, {r2}             /* 傅のスタックポインタを艰评 */    mov   sp, r2        /*     * 稿の借妄はARM巴赂婶で悸乖     */                b     ret_int

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -