smdk2410_misc.c
来自「eCos操作系统源码」· C语言 代码 · 共 479 行 · 第 1/2 页
C
479 行
//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]
}voidplf_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 clockvoidhal_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.voidhal_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)voidhal_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-secondsvoid 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 controlvoidhal_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);}voidhal_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);}voidhal_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);}voidhal_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 + =
减小字号Ctrl + -
显示快捷键?