Ignore:
Timestamp:
Jul 3, 2020, 7:19:17 PM (4 years ago)
Author:
coas-nagasima
Message:

ASP3, TINET, mbed を更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/gic_kernel_impl.h

    r321 r429  
    33 *      Toyohashi Open Platform for Embedded Real-Time Systems
    44 *
    5  *  Copyright (C) 2006-2017 by Embedded and Real-Time Systems Laboratory
     5 *  Copyright (C) 2006-2019 by Embedded and Real-Time Systems Laboratory
    66 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    77 *
     
    6767 *  割込み番号の定義
    6868 */
    69 #define GIC_INTNO_SGI0          0U
    70 #define GIC_INTNO_PPI0          16U
    71 #define GIC_INTNO_SPI0          32U
     69#define GIC_INTNO_SGI0          UINT_C(0)
     70#define GIC_INTNO_PPI0          UINT_C(16)
     71#define GIC_INTNO_SPI0          UINT_C(32)
    7272
    7373/*
     
    126126#define GICC_EOIR               GIC_REG(GICC_BASE, 0x10)
    127127#define GICC_RPR                GIC_REG(GICC_BASE, 0x14)
    128 #define GICC_HPIR               GIC_REG(GICC_BASE, 0x18)
     128#define GICC_HPPIR              GIC_REG(GICC_BASE, 0x18)
    129129
    130130/*
     
    198198gicc_set_priority(uint_t pri)
    199199{
    200         sil_wrw_mem(GICC_PMR, pri);
     200        sil_swrw_mem(GICC_PMR, pri);
    201201}
    202202
     
    230230gicd_disable_int(INTNO intno)
    231231{
    232         sil_wrw_mem(GICD_ICENABLER(intno / 32), (1U << (intno % 32)));
     232        sil_swrw_mem(GICD_ICENABLER(intno / 32), (1U << (intno % 32)));
    233233}
    234234
     
    239239gicd_enable_int(INTNO intno)
    240240{
    241         sil_wrw_mem(GICD_ISENABLER(intno / 32), (1U << (intno % 32)));
     241        sil_swrw_mem(GICD_ISENABLER(intno / 32), (1U << (intno % 32)));
    242242}
    243243
     
    248248gicd_clear_pending(INTNO intno)
    249249{
    250         sil_wrw_mem(GICD_ICPENDR(intno / 32), (1U << (intno % 32)));
     250        sil_swrw_mem(GICD_ICPENDR(intno / 32), (1U << (intno % 32)));
    251251}
    252252
     
    257257gicd_set_pending(INTNO intno)
    258258{
    259         sil_wrw_mem(GICD_ISPENDR(intno / 32), (1U << (intno % 32)));
     259        sil_swrw_mem(GICD_ISPENDR(intno / 32), (1U << (intno % 32)));
    260260}
    261261
     
    271271
    272272/*
     273 *  ソフトウェア生成割込み(SGI)の生成
     274 */
     275Inline void
     276gicd_raise_sgi(INTNO intno)
     277{
     278        sil_swrw_mem(GICD_SGIR, (0x02000000 | intno));
     279}
     280
     281/*
    273282 *  割込みのコンフィグレーション
    274283 */
     
    279288        uint32_t        reg;
    280289
    281         reg = sil_rew_mem(GICD_ICFGR(intno / 16));
    282         reg &= ~(0x03U << shift);
    283         reg |= (config << shift);
    284         sil_wrw_mem(GICD_ICFGR(intno / 16), reg);
     290        if (intno >= GIC_INTNO_PPI0) {
     291                reg = sil_rew_mem(GICD_ICFGR(intno / 16));
     292                reg &= ~(0x03U << shift);
     293                reg |= (config << shift);
     294                sil_wrw_mem(GICD_ICFGR(intno / 16), reg);
     295        }
    285296}
    286297
     
    318329 *  割込みターゲットプロセッサの設定
    319330 *
    320  *  prcsは,ターゲットとするプロセッサを表すビットのビット毎論理和で指
    321  *  定する.
     331 *  affinityは,ターゲットとするプロセッサを表すビットのビット毎論理和
     332 *  で指定する.
    322333 *              プロセッサ0 : 0x01
    323334 *              プロセッサ1 : 0x02
     
    326337 */
    327338Inline void
    328 gicd_set_target(INTNO intno, uint_t prcs)
     339gicd_set_target(INTNO intno, uint_t affinity)
    329340{
    330341        uint_t          shift = (intno % 4) * 8;
     
    333344        reg = sil_rew_mem(GICD_ITARGETSR(intno / 4));
    334345        reg &= ~(0xffU << shift);
    335         reg |= (prcs << shift);
     346        reg |= (affinity << shift);
    336347        sil_wrw_mem(GICD_ITARGETSR(intno / 4), reg);
    337348}
     
    373384 */
    374385#ifndef TOPPERS_MACRO_ONLY
     386
     387/*
     388 *  割込み属性の設定のチェック
     389 */
     390Inline bool_t
     391check_intno_cfg(INTNO intno)
     392{
     393        return(intcfg_table[intno] != 0U);
     394}
    375395
    376396/*
     
    393413
    394414/*
     415 *  割込み要求禁止フラグが操作できる割込み番号の範囲の判定
     416 */
     417#ifdef GIC_SUPPORT_DISABLE_SGI
     418#define VALID_INTNO_DISINT(intno)       VALID_INTNO(intno)
     419#else /* GIC_SUPPORT_DISABLE_SGI */
     420#define VALID_INTNO_DISINT(intno) \
     421                                (GIC_INTNO_PPI0 <= (intno) && (intno) <= TMAX_INTNO)
     422#endif /* GIC_SUPPORT_DISABLE_SGI */
     423
     424/*
    395425 *  割込み要求禁止フラグのセット
    396  *
    397  *  intnoで指定された割込み要求ラインに対する割込み要求禁止フラグのセッ
    398  *  トし,割込みを禁止する.割込み属性が設定されていない割込み要求ライ
    399  *  ンが指定された場合には,falseを返す.
    400  */
    401 Inline bool_t
     426 */
     427Inline void
    402428disable_int(INTNO intno)
    403429{
    404         if (intcfg_table[intno] == 0U) {
    405                 return(false);
    406         }
    407430        gicd_disable_int(intno);
    408         return(true);
    409431}
    410432
    411433/*
    412434 *  割込み要求禁止フラグのクリア
    413  *
    414  *  intnoで指定された割込み要求ラインに対する割込み要求禁止フラグのクリ
    415  *  アし,割込みを許可する.割込み属性が設定されていない割込み要求ライ
    416  *  ンが指定された場合には,falseを返す.
     435 */
     436Inline void
     437enable_int(INTNO intno)
     438{
     439        gicd_enable_int(intno);
     440}
     441
     442/*
     443 *  割込み要求がクリアできる割込み番号の範囲の判定
     444 */
     445#define VALID_INTNO_CLRINT(intno) \
     446                                (GIC_INTNO_PPI0 <= (intno) && (intno) <= TMAX_INTNO)
     447
     448/*
     449 *  割込み要求がクリアできる状態か?
    417450 */
    418451Inline bool_t
    419 enable_int(INTNO intno)
    420 {
    421         if (intcfg_table[intno] == 0U) {
    422                 return(false);
     452check_intno_clear(INTNO intno)
     453{
     454        return(true);
     455}
     456
     457/*
     458 *  割込み要求のクリア
     459 */
     460Inline void
     461clear_int(INTNO intno)
     462{
     463        gicd_clear_pending(intno);
     464}
     465
     466/*
     467 *  割込みが要求できる状態か?
     468 */
     469Inline bool_t
     470check_intno_raise(INTNO intno)
     471{
     472        return(true);
     473}
     474
     475/*
     476 *  割込みの要求
     477 */
     478Inline void
     479raise_int(INTNO intno)
     480{
     481        if (intno < GIC_INTNO_PPI0) {
     482                gicd_raise_sgi(intno);
    423483        }
    424         gicd_enable_int(intno);
    425         return(true);
    426 }
    427 
    428 /*
    429  *  割込み要求のクリア
    430  */
    431 Inline void
    432 clear_int(INTNO intno)
    433 {
    434         gicd_clear_pending(intno);
     484        else {
     485                gicd_set_pending(intno);
     486        }
    435487}
    436488
     
    444496}
    445497
    446 /*
    447  *  割込み要求のセット
    448  */
    449 Inline void
    450 raise_int(INTNO intno)
    451 {
    452         gicd_set_pending(intno);
    453 }
    454 
    455498#endif /* TOPPERS_MACRO_ONLY */
    456499#endif /* TOPPERS_GIC_KERNEL_IMPL_H */
Note: See TracChangeset for help on using the changeset viewer.