📄 smdk2410_misc.c
字号:
//Ports : GPB10 GPB9 GPB8 GPB7 GPB6 GPB5 GPB4 GPB3 GPB2 GPB1 GPB0
//Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
//Setting: INPUT OUTPUT INPUT OUTPUT INPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT
//Binary : 00 01 00 01 00 01 01 01 01 01 01
HAL_WRITE_UINT32(GPBCON, 0x044555);
HAL_WRITE_UINT32(GPBUP, 0x7ff); // The pull up function is disabled GPB[10:0]
//*** PORT C GROUP
//Ports : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8 GPC7 GPC6 GPC5 GPC4 GPC3 GPC2 GPC1 GPC0
//Signal : VD7 VD6 VD5 VD4 VD3 VD2 VD1 VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND
//Binary : 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
HAL_WRITE_UINT32(GPCCON, 0xaaaaaaaa);
HAL_WRITE_UINT32(GPCUP, 0xffff); // The pull up function is disabled GPC[15:0]
//*** PORT D GROUP
//Ports : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
//Signal : VD23 VD22 VD21 VD20 VD19 VD18 VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9 VD8
//Binary : 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
HAL_WRITE_UINT32(GPDCON, 0xaaaaaaaa);
HAL_WRITE_UINT32(GPDUP, 0xffff); // The pull up function is disabled GPD[15:0]
//*** PORT E GROUP
//Ports : GPE15 GPE14 GPE13 GPE12 GPE11 GPE10 GPE9 GPE8 GPE7 GPE6 GPE5 GPE4
//Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK I2SSDO
//Binary : 10 10 10 10 10 10 10 10 10 10 10 10
//------------------------------------------------------------------------------------------------
//Ports : GPE3 GPE2 GPE1 GPE0
//Signal : I2SSDI CDCLK I2SSCLK I2SLRCK
//Binary : 10 10 10 10
HAL_WRITE_UINT32(GPECON, 0xaaaaaaaa);
HAL_WRITE_UINT32(GPEUP, 0xffff); // The pull up function is disabled GPE[15:0]
//*** PORT F GROUP
//Ports : GPF7 GPF6 GPF5 GPF4 GPF3 GPF2 GPF1 GPF0
//Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
//Setting: Output Output Output Output EINT3 EINT2 EINT1 EINT0
//Binary : 01 01 01 01 10 10 10 10
HAL_WRITE_UINT32(GPFCON, 0x55aa);
HAL_WRITE_UINT32(GPFUP, 0xff); // The pull up function is disabled GPF[7:0]
//*** PORT G GROUP
//Ports : GPG15 GPG14 GPG13 GPG12 GPG11 GPG10 GPG9 GPG8 GPG7 GPG6
//Signal : nYPON YMON nXPON XMON EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
//Setting: nYPON YMON nXPON XMON EINT19 Output Output Output SPICLK1 SPIMOSI1
//Binary : 11 11 11 11 10 01 01 01 11 11
//-----------------------------------------------------------------------------------------
//Ports : GPG5 GPG4 GPG3 GPG2 GPG1 GPG0
//Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
//Setting: SPIMISO1 LCD_PWRDN EINT11 nSS0 EINT9 EINT8
//Binary : 11 11 10 11 10 10
HAL_WRITE_UINT32(GPGCON, 0xff95ffba);
HAL_WRITE_UINT32(GPGUP, 0xffff); // The pull up function is disabled GPG[15:0]
//*** PORT H GROUP
//Ports : GPH10 GPH9 GPH8 GPH7 GPH6 GPH5 GPH4 GPH3 GPH2 GPH1 GPH0
//Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
//Binary : 10 10 10 11 11 10 10 10 10 10 10
HAL_WRITE_UINT32(GPHCON, 0x2afaaa);
HAL_WRITE_UINT32(GPHUP, 0x7ff); // The pull up function is disabled GPH[10:0]
//External interrupts will be falling edge triggered.
HAL_WRITE_UINT32(EXTINT0, 0x22222222); // EINT[7:0]
HAL_WRITE_UINT32(EXTINT1, 0x22222222); // EINT[15:8]
HAL_WRITE_UINT32(EXTINT2, 0x22222222); // EINT[23:16]
}
void
plf_hardware_init(void)
{
HAL_WRITE_UINT32(INTMOD, 0x0); //All=IRQ mode
HAL_WRITE_UINT32(INTMSK, BIT_ALLMSK); //All interrupt is masked.
HAL_WRITE_UINT32(INTSUBMSK, BIT_SUB_ALLMSK); //All sub-interrupt is masked.
port_init();
// Initialize real-time clock (for delays, etc, even if kernel doesn't use it)
hal_clock_initialize(CYGNUM_HAL_RTC_PERIOD);
}
// -------------------------------------------------------------------------
// Use Timer4 for system clock
void
hal_clock_initialize(cyg_uint32 period)
{
cyg_uint32 temp;
// Configure the Prescaler1
HAL_READ_UINT32(TCFG0, temp);
temp &= ~(0xff<<8);
temp |= (CYGNUM_HAL_ARM_SMDK2410_TIMER_PRESCALE<<8);
HAL_WRITE_UINT32(TCFG0, temp);
// Configure the MUX to select the 1/2 divider
HAL_READ_UINT32(TCFG1, temp);
temp &= ~(0xf<<16);
temp |= (0x0<<16);
HAL_WRITE_UINT32(TCFG1, temp);
// Set up the Timer4 for period
HAL_WRITE_UINT32(TCNTB4, period);
// Start Timer4
HAL_READ_UINT32(TCON, temp);
temp &= ~(0xf << 20);
HAL_WRITE_UINT32(TCON, (temp|(6<<20)));
HAL_WRITE_UINT32(TCON, (temp|(5<<20)));
// Unmask Timer4 interrupt, need not be done here
//HAL_INTERRUPT_CONFIGURE( CYGNUM_HAL_INTERRUPT_RTC, 1, 1 );
//HAL_INTERRUPT_UNMASK( CYGNUM_HAL_INTERRUPT_RTC );
}
// This routine is called during a clock interrupt.
void
hal_clock_reset(cyg_uint32 vector, cyg_uint32 period)
{
// Do nothing
}
// Read the current value of the clock, returning the number of hardware
// "ticks" that have occurred (i.e. how far away the current value is from
// the start)
void
hal_clock_read(cyg_uint32 *pvalue)
{
cyg_int32 clock_val;
// Read Timer4's current value
HAL_READ_UINT32(TCNTO4, clock_val);
*pvalue = CYGNUM_HAL_RTC_PERIOD - (clock_val & 0xFFFF); // Note: counter is only 16 bits
// and decreases
}
// Delay for some number of micro-seconds
void
hal_delay_us(cyg_int32 usecs)
{
cyg_uint32 ticks = 0;
// Divide by 1000000 in two steps to preserve precision.
cyg_uint32 wait_ticks = (((PCLK/100000)*usecs)/CYGNUM_HAL_ARM_SMDK2410_TIMER_PRESCALE/2/10);
cyg_int32 val, prev, diff;
// Read Timer4's current value
HAL_READ_UINT32(TCNTO4, prev);
prev &= 0xFFFF;
while (ticks < wait_ticks) {
while (true) {
// Read Timer4's current value
HAL_READ_UINT32(TCNTO4, val);
val &= 0xFFFF;
diff = prev - val;
if (diff != 0) {
if(diff < 0)
diff += (CYGNUM_HAL_RTC_PERIOD+1);
break; // atleast 1 tick has passed
}
}
prev = val;
ticks += diff;
}
}
// -------------------------------------------------------------------------
// This routine is called to respond to a hardware interrupt (IRQ). It
// should interrogate the hardware and return the IRQ vector number.
int
hal_IRQ_handler(void)
{
cyg_uint32 ior;
HAL_READ_UINT32(INTOFFSET, ior);
return (int)ior;
}
//----------------------------------------------------------------------------
// Interrupt control
void
hal_interrupt_mask(int vector)
{
cyg_uint32 imr;
CYG_ASSERT(vector <= CYGNUM_HAL_ISR_MAX &&
vector >= CYGNUM_HAL_ISR_MIN , "Invalid vector");
HAL_READ_UINT32(INTMSK, imr);
imr |= (1<<vector);
HAL_WRITE_UINT32(INTMSK, imr);
}
void
hal_interrupt_unmask(int vector)
{
cyg_uint32 imr;
CYG_ASSERT(vector <= CYGNUM_HAL_ISR_MAX &&
vector >= CYGNUM_HAL_ISR_MIN , "Invalid vector");
HAL_READ_UINT32(INTMSK, imr);
imr &= ~(1<<vector);
HAL_WRITE_UINT32(INTMSK, imr);
}
void
hal_interrupt_acknowledge(int vector)
{
cyg_uint32 ipr;
CYG_ASSERT(vector <= CYGNUM_HAL_ISR_MAX &&
vector >= CYGNUM_HAL_ISR_MIN , "Invalid vector");
HAL_WRITE_UINT32(SRCPND, (1<<vector));
HAL_READ_UINT32(INTPND, ipr);
HAL_WRITE_UINT32(INTPND, ipr);
}
void
hal_interrupt_configure(int vector, int level, int up)
{
CYG_ASSERT(vector <= CYGNUM_HAL_ISR_MAX &&
vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
}
void hal_interrupt_set_level(int vector, int level)
{
CYG_ASSERT(vector <= CYGNUM_HAL_ISR_MAX &&
vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector");
}
//-----------------------------------------------------------------------------
// End of smdk2410_misc.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -