📄 hal_misc.c
字号:
for (p = &__CTOR_END__[-1]; p >= __CTOR_LIST__; p--)
(*p) ();
#endif
} // cyg_hal_invoke_constructors()
/*------------------------------------------------------------------------*/
/* Determine the index of the ls bit of the supplied mask. */
cyg_uint32 hal_lsbit_index(cyg_uint32 mask)
{
cyg_uint32 n = mask;
static const signed char tab[64] =
{ -1, 0, 1, 12, 2, 6, 0, 13, 3, 0, 7, 0, 0, 0, 0, 14, 10,
4, 0, 0, 8, 0, 0, 25, 0, 0, 0, 0, 0, 21, 27 , 15, 31, 11,
5, 0, 0, 0, 0, 0, 9, 0, 0, 24, 0, 0 , 20, 26, 30, 0, 0, 0,
0, 23, 0, 19, 29, 0, 22, 18, 28, 17, 16, 0
};
n &= ~(n-1UL);
n = (n<<16)-n;
n = (n<<6)+n;
n = (n<<4)+n;
return tab[n>>26];
}
/*------------------------------------------------------------------------*/
/* Determine the index of the ms bit of the supplied mask. */
cyg_uint32 hal_msbit_index(cyg_uint32 mask)
{
cyg_uint32 x = mask;
cyg_uint32 w;
/* Phase 1: make word with all ones from that one to the right */
x |= x >> 16;
x |= x >> 8;
x |= x >> 4;
x |= x >> 2;
x |= x >> 1;
/* Phase 2: calculate number of "1" bits in the word */
w = (x & 0x55555555) + ((x >> 1) & 0x55555555);
w = (w & 0x33333333) + ((w >> 2) & 0x33333333);
w = w + (w >> 4);
w = (w & 0x000F000F) + ((w >> 8) & 0x000F000F);
return (cyg_uint32)((w + (w >> 16)) & 0xFF) - 1;
}
/*------------------------------------------------------------------------*/
/* Delay for some number of useconds. */
void
hal_delay_us(int us)
{
cyg_uint32 val1, val2;
int diff;
long usticks;
long ticks;
// Calculate the number of counter register ticks per microsecond.
usticks = (CYGNUM_HAL_RTC_PERIOD * CYGNUM_HAL_RTC_DENOMINATOR) / 1000000;
// Make sure that the value is not zero. This will only happen if the
// CPU is running at < 2MHz.
if( usticks == 0 ) usticks = 1;
while( us > 0 )
{
int us1 = us;
// Wait in bursts of less than 10000us to avoid any overflow
// problems in the multiply.
if( us1 > 10000 )
us1 = 10000;
us -= us1;
ticks = us1 * usticks;
HAL_CLOCK_READ(&val1);
while (ticks > 0) {
do {
HAL_CLOCK_READ(&val2);
} while (val1 == val2);
diff = val2 - val1;
if (diff < 0) diff += CYGNUM_HAL_RTC_PERIOD;
ticks -= diff;
val1 = val2;
}
}
}
/*------------------------------------------------------------------------*/
void hal_arch_program_new_stack(void *_func)
{
externC void hal_program_new_stack( void *func, CYG_ADDRESS addr);
hal_program_new_stack( (void *)_func,
(CYGMEM_REGION_ram + CYGMEM_REGION_ram_SIZE - sizeof(CYG_ADDRESS)) & ~15 );
}
/*------------------------------------------------------------------------*/
/* Idle thread action */
#include <cyg/infra/diag.h>
void hal_idle_thread_action( cyg_uint32 count )
{
#if 0 //def CYGPKG_HAL_MIPS_SIM
if( (count % 1000) == 0 )
{
// This code causes a fake interrupt.
asm volatile (
"xor $24,$24,$24;"
"mtc0 $24,$13;"
"lui $25,%%hi(1f);"
"ori $25,$25,%%lo(1f);"
"j other_vector;"
"nop;"
"1:"
:
:
: "t8", "t9"
);
}
#endif
#if 0 //def CYGPKG_HAL_MIPS_TX39_JMR3904
if( (count % 100000 ) == 0 )
{
// cyg_uint32 tval, isr, imr, ilr;
cyg_uint32 sr = 0, cr = 0, ctr = 0, cpr = 0;
// HAL_CLOCK_READ( &tval );
// HAL_READ_UINT32( 0xFFFFC000, isr );
// HAL_READ_UINT32( 0xFFFFC004, imr );
// HAL_READ_UINT32( 0xFFFFC01C, ilr );
// CYG_TRACE2(1, "Timer value, ISR ",tval, isr);
// CYG_TRACE2(1, "IMR ILR0 ", imr, ilr);
// asm volatile (
// "mfc0 %0,$12;"
// "nop; nop; nop;"
// "mfc0 %1,$13;"
// "nop; nop; nop;"
// "mfc0 %2,$9;"
// "nop; nop; nop;"
// "mfc0 %3,$11;"
// "nop; nop; nop;"
// : "=r"(sr), "=r"(cr), "=r"(ctr), "=r"(cpr)
// );
// diag_printf("Status %08x ", sr );
// diag_printf("Cause %08x ", cr );
// diag_printf("Counter %08x ", ctr );
// diag_printf("Compare %08x\n", cpr);
#if 0
asm volatile (
"mfc0 %0,$12;"
"nop; nop; nop;"
: "=r"(sr)
);
diag_write_string("Status "); diag_write_hex( sr );
asm volatile (
"mfc0 %0,$13;"
"nop; nop; nop;"
: "=r"(cr)
);
diag_write_string(" Cause "); diag_write_hex( cr );
asm volatile (
"mfc0 %0,$9;"
"nop; nop; nop;"
: "=r"(ctr)
);
diag_write_string(" Counter "); diag_write_hex( ctr );
asm volatile (
"mfc0 %0,$11;"
"nop; nop; nop;"
: "=r"(cpr)
);
diag_write_string(" Compare "); diag_write_hex( cpr );
diag_write_string( "\n" );
#endif
#if 1
asm volatile (
"mfc0 %0,$12;"
"nop; nop; nop;"
: "=r"(sr)
);
asm volatile (
"mfc0 %0,$13;"
"nop; nop; nop;"
: "=r"(cr)
);
CYG_INSTRUMENT_USER( 1, sr, cr );
asm volatile (
"mfc0 %0,$9;"
"nop; nop; nop;"
: "=r"(ctr)
);
asm volatile (
"mfc0 %0,$11;"
"nop; nop; nop;"
: "=r"(cpr)
);
CYG_INSTRUMENT_USER( 2, ctr, cpr );
#endif
// if( count == 4 )
// {
// HAL_ENABLE_INTERRUPTS();
// }
// if( count >= 10 )
// for(;;);
}
#endif
#if 0
{
static CYG_WORD32 istat[3] = { 0xffffffff,0xffffffff,0xffffffff };
int i;
for( i = 0; i < 3; i++ )
{
CYG_WORD32 reg, sr;
HAL_READ_UINT32( CYGHWR_HAL_MIPS_VRC4373_INTC_STAT0 + i * CYGHWR_HAL_MIPS_VRC4373_INTC_MASK_OFF, reg );
if( reg != istat[i] )
{
hal_diag_ai_write_char('~');
hal_diag_ai_write_char('0'+i);
hal_diag_ai_write_hex8( reg );
istat[i] = reg;
HAL_READ_UINT32( CYGHWR_HAL_MIPS_VRC4373_INTC_MASK0 + i * CYGHWR_HAL_MIPS_VRC4373_INTC_MASK_OFF, reg );
hal_diag_ai_write_char('.');
hal_diag_ai_write_hex8( reg );
#if 0
asm volatile (
"mfc0 %0,$12;"
"nop; nop; nop;"
: "=r"(sr)
);
hal_diag_ai_write_char('.');
hal_diag_ai_write_hex8( sr );
#endif
}
}
}
{
static CYG_WORD32 old_pins = 0;
CYG_WORD32 reg;
HAL_READ_UINT32( CYGHWR_HAL_MIPS_VRC4373_INTC_PINS, reg );
if( reg != old_pins )
{
hal_diag_ai_write_char('%');
hal_diag_ai_write_hex8( reg );
old_pins = reg;
}
}
#endif
#if 0 //def CYGPKG_HAL_MIPS_VR4300_VRC4373
// Wiggle one of the leds to show we are running
if( (count % 50000 ) == 0 )
{
cyg_uint8 lr;
{ int i; for( i = 0; i < 200; i++ ); }
HAL_READ_UINT8( 0xc2000008, lr );
lr ^= 2;
{ int i; for( i = 0; i < 200; i++ ); }
HAL_WRITE_UINT8( 0xc2000008, lr );
}
#endif
}
/*------------------------------------------------------------------------*/
/* End of hal_misc.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -