コード例 #1
0
ファイル: clockdrv.c プロジェクト: goetzpf/rtems
static void generic_or1k_clock_initialize(void)
{
    uint64_t frequency = (1000000000 / OR1K_CLOCK_CYCLE_TIME_NANOSECONDS);
    uint32_t TTMR;

    /* For TTMR register,
     * The least significant 28 bits are the number of clock cycles
     * before generating a tick timer interrupt. While the most
     * significant 4 bits are used for mode configuration, tick timer
     * interrupt enable and pending interrupts status.
     */

    /* FIXME: Long interval should pass since initializing the tick timer
     * registers fires exceptions dispite interrupts has not been enabled yet.
     */
    TTMR = (CPU_OR1K_SPR_TTMR_MODE_RESTART | CPU_OR1K_SPR_TTMR_IE |
            (0xFFED9 & CPU_OR1K_SPR_TTMR_TP_MASK)
           ) & ~(CPU_OR1K_SPR_TTMR_IP);

    _OR1K_mtspr(CPU_OR1K_SPR_TTMR, TTMR);
    _OR1K_mtspr(CPU_OR1K_SPR_TTCR, 0);

    /* Initialize timecounter */
    or1ksim_tc.tc_get_timecount = or1ksim_get_timecount;
    or1ksim_tc.tc_counter_mask = 0xffffffff;
    or1ksim_tc.tc_frequency = frequency;
    or1ksim_tc.tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER;
    rtems_timecounter_install(&or1ksim_tc);
}
コード例 #2
0
ファイル: clockdrv.c プロジェクト: ragunath3252/rtems
static void generic_or1k_clock_cleanup(void)
{
    uint32_t sr;

    sr = _OR1K_mfspr(CPU_OR1K_SPR_SR);

    /* Disable tick timer exceptions */
    _OR1K_mtspr(CPU_OR1K_SPR_SR, (sr & ~CPU_OR1K_SPR_SR_IEE)
                & ~CPU_OR1K_SPR_SR_TEE);

    /* Invalidate tick timer config registers */
    _OR1K_mtspr(CPU_OR1K_SPR_TTCR, 0);
    _OR1K_mtspr(CPU_OR1K_SPR_TTMR, 0);
}
コード例 #3
0
ファイル: cache.c プロジェクト: Avanznow/rtems
static inline void _CPU_OR1K_Cache_data_block_writeback(const void *d_addr)
{
   ISR_Level level;
  _ISR_Disable (level);

  _OR1K_mtspr(CPU_OR1K_SPR_DCBWR, (uintptr_t) d_addr);

  _ISR_Enable(level);
}
コード例 #4
0
ファイル: clockdrv.c プロジェクト: ragunath3252/rtems
static void generic_or1k_clock_at_tick(void)
{
    uint32_t TTMR;

    /* For TTMR register,
     * The least significant 28 bits are the number of clock cycles
     * before generating a tick timer interrupt. While the most
     * significant 4 bits are used for mode configuration, tick timer
     * interrupt enable and pending interrupts status.
     */
    TTMR = (CPU_OR1K_SPR_TTMR_MODE_RESTART | CPU_OR1K_SPR_TTMR_IE |
            (TTMR_NUM_OF_CLOCK_TICKS_INTERRUPT & CPU_OR1K_SPR_TTMR_TP_MASK)
           ) & ~(CPU_OR1K_SPR_TTMR_IP);

    _OR1K_mtspr(CPU_OR1K_SPR_TTMR, TTMR);
    _OR1K_mtspr(CPU_OR1K_SPR_TTCR, 0);

    cpu_counter_ticks += TTMR_NUM_OF_CLOCK_TICKS_INTERRUPT;
}
コード例 #5
0
ファイル: cache.c プロジェクト: Avanznow/rtems
static inline void _CPU_OR1K_Cache_instruction_block_lock
(const void *d_addr)
{
   ISR_Level level;
  _ISR_Disable (level);

  _OR1K_mtspr(CPU_OR1K_SPR_ICBLR, (uintptr_t) d_addr);

  _ISR_Enable(level);
}
コード例 #6
0
ファイル: cache.c プロジェクト: Avanznow/rtems
static inline void _CPU_OR1K_Cache_enable_data(void)
{
  uint32_t sr;
   ISR_Level level;

  _ISR_Disable (level);
  sr = _OR1K_mfspr(CPU_OR1K_SPR_SR);
  _OR1K_mtspr(CPU_OR1K_SPR_SR, sr | CPU_OR1K_SPR_SR_DCE);

  _ISR_Enable(level);
}
コード例 #7
0
ファイル: cache.c プロジェクト: Avanznow/rtems
static inline void _CPU_OR1K_Cache_disable_instruction(void)
{
  uint32_t sr;
  ISR_Level level;

  _ISR_Disable (level);

  sr = _OR1K_mfspr(CPU_OR1K_SPR_SR);
  _OR1K_mtspr(CPU_OR1K_SPR_SR, (sr & ~CPU_OR1K_SPR_SR_ICE));

  _ISR_Enable(level);
}
コード例 #8
0
ファイル: clockdrv.c プロジェクト: ragunath3252/rtems
static void generic_or1k_clock_initialize(void)
{
    uint32_t TTMR;

    /* For TTMR register,
     * The least significant 28 bits are the number of clock cycles
     * before generating a tick timer interrupt. While the most
     * significant 4 bits are used for mode configuration, tick timer
     * interrupt enable and pending interrupts status.
     */

    /* FIXME: Long interval should pass since initializing the tick timer
     * registers fires exceptions dispite interrupts has not been enabled yet.
     */
    TTMR = (CPU_OR1K_SPR_TTMR_MODE_RESTART | CPU_OR1K_SPR_TTMR_IE |
            (0xFFED9 & CPU_OR1K_SPR_TTMR_TP_MASK)
           ) & ~(CPU_OR1K_SPR_TTMR_IP);

    _OR1K_mtspr(CPU_OR1K_SPR_TTMR, TTMR);
    _OR1K_mtspr(CPU_OR1K_SPR_TTCR, 0);

    /* Initialize CPU Counter */
    cpu_counter_ticks = 0;
}
コード例 #9
0
ファイル: cpu.c プロジェクト: Avanznow/rtems
/**
 * @brief Sets the hardware interrupt level by the level value.
 *
 * @param[in] level for or1k can only range over two values:
 * 0 (enable interrupts) and 1 (disable interrupts). In future
 * implementations if fast context switch is implemented, the level
 * can range from 0 to 15. @see OpenRISC architecture manual.
 *
 */
void _CPU_ISR_Set_level(uint32_t level)
{
  uint32_t sr = 0;
  level = (level > 0)? 1 : 0;

  /* map level bit to or1k interrupt enable/disable bit in sr register */
  level <<= CPU_OR1K_SPR_SR_SHAMT_IEE;

  sr = _OR1K_mfspr(CPU_OR1K_SPR_SR);

  if (level == 0){ /* Enable all interrupts */
    sr |= CPU_OR1K_SPR_SR_IEE | CPU_OR1K_SPR_SR_TEE;

  } else{
    sr &= ~CPU_OR1K_SPR_SR_IEE;
  }

  _OR1K_mtspr(CPU_OR1K_SPR_SR, sr);
 }