rtt-f030/bsp/wh44b0/board.c

205 lines
4.6 KiB
C

/*
* File : board.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006, RT-Thread Develop Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://openlab.rt-thread.com/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2006-09-23 Bernard first version
* 2006-09-24 Bernard add rt_hw_finsh_init implementation
*/
#include <rtthread.h>
#include <rthw.h>
#include <s3c44b0.h>
#include "board.h"
/* #define BOARD_DEBUG */
extern void rt_serial_putc(const char ch);
#define DATA_COUNT 0xfff
/**
* @addtogroup wh44b0
*/
/*@{*/
void rt_timer_handler(int vector)
{
#ifdef BOARD_DEBUG
rt_kprintf("timer handler, increase a tick\n");
#endif
rt_tick_increase();
}
void rt_hw_port_init(void)
{
/* PORT A GROUP */
/* BIT 9 8 7 6 5 4 3 2 1 0 */
/* A24 A23 A22 A21 A20 A19 A18 A17 A16 A0 */
/* 1 1 1 1 1 1 1 1 1 1 */
PCONA = 0x1ff;
PDATA = 0x2db;
/* PORT B GROUP */
/* BIT 10 9 8 7 6 5 4 3 2 1 0 */
/* /CS5 /CS4 /CS3 /CS2 /CS1 nWBE3 nWBE2 /SRAS /SCAS SCLS SCKE */
/* NC NC RTL8019 USBD12 NV_Flash NC NC Sdram Sdram Sdram Sdram*/
/* 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1 */
PDATB = 0x4f;
PCONB = 0x7cf;
/* PORT C GROUP */
/* BUSWIDTH=16 */
/* PC15 14 13 12 11 10 9 8 */
/* o o RXD1 TXD1 o o o o */
/* NC NC Uart1 Uart1 NC NC NC NC */
/* 01 01 11 11 01 01 01 00 */
/* PC7 6 5 4 3 2 1 0 */
/* o o o o o o o o */
/* NC NC NC NC NFALE NFCLE NFCE NFRB*/
/* 01 01 01 01 01 01 01 00 */
PDATC = 0x3001; /* All IO is low */
PCONC = 0x5f555555;
PUPC = 0x3000; /* PULL UP RESISTOR should be enabled to I/O */
/* PORT D GROUP */
/* PORT D GROUP(I/O OR LCD) */
/* BIT7 6 5 4 3 2 1 0 */
/* VF VM VLINE VCLK VD3 VD2 VD1 VD0 */
/* 01 01 01 01 01 01 01 01 */
PDATD= 0x0;
PCOND= 0xaaaa;
PUPD = 0x00; /* These pins must be set only after CPU's internal LCD controller is enable */
/* PORT E GROUP */
/* Bit 8 7 6 5 4 3 2 1 0 */
/* ENDLAN LED3 LED2 LED1 LED0 BEEP RXD0 TXD0 CLKOUT */
/* 00 01 01 01 01 01 10 10 11 */
PCONE = 0x556b; /*0->input, 1 2->TXD0 RXD0, 3 4->input, 5->led, 6->buzzer, 7->led, 8->CODECLK */
PDATE = 0x57;
PUPE = 0x006; /* disable all pull-up */
/* PORT F GROUP */
/* Bit8 7 6 5 4 3 2 1 0 */
/* IISCLK IISDI IISDO IISLRCK Input Input Input IICSDA IICSCL */
/* 100 010 010 001 00 01 01 10 10 */
PDATF = 0x2f;
PCONF = 0x24900a;
PUPF = 0x1d3;
/* PORT G GROUP */
/* BIT7 6 5 4 3 2 1 0 */
/* INT7 INT6 INT5 INT4 INT3 INT2 INT1 INT0 */
/* S3 S4 S5 S6 NIC EXT IDE USB */
/* 11 11 11 11 11 11 11 11 */
PDATG = 0xfc;
PCONG = 0x000f; /* eint1 is eth interrupt in WH44B0 */
PUPG = 0x00; /* should be enabled */
SPUCR=0x7; /* D15-D0 pull-up disable */
/* all external interrupts are triggered by low level */
EXTINT=0x0;
}
/**
* This function will init lumit4510 board
*/
void rt_hw_board_init()
{
/* init port setting */
rt_hw_port_init();
/* set timer0 register */
/* stop timer */
TCON &= ~(0x00000001);
/* dead zone = 0, pre = 150 */
TCFG0 = 0x00000095;
/* all are interrupt mode */
TCFG1 = 0x00000003;
TCNTB0 = DATA_COUNT;
TCMPB0 = 0;
/* manual update */
TCON |= 0x00000002;
/* auto reload on,output inverter off */
TCON &= ~(0x0000000f);
TCON |= (0x00000008);
/* install timer handler */
rt_hw_interrupt_install(INT_TIMER0, rt_timer_handler, RT_NULL);
rt_hw_interrupt_umask(INT_TIMER0);
/* start timer */
TCON |=(0x00000001);
}
void rt_hw_led_set(rt_uint32_t led)
{
if((led & 0x01)==0x01) /* D1 */
PDATC = PDATC | (1<<1) ;
else
PDATC = PDATC & (~(1<<1)) ;
if((led & 0x02)==0x02) /* D2 */
PDATC = PDATC | (1<<2) ;
else
PDATC = PDATC & (~(1<<2)) ;
if((led & 0x04)==0x04) /* D3 */
PDATC = PDATC | (1<<3) ;
else
PDATC = PDATC & (~(1<<3)) ;
}
/* led loop */
void rt_hw_led_flash(void)
{
register int i;
rt_hw_led_set(0x01);
for ( i = 0; i < 2000000; i++);
rt_hw_led_set(0x02);
for ( i = 0; i < 2000000; i++);
rt_hw_led_set(0x04);
for ( i = 0; i < 2000000; i++);
}
#ifdef RT_USING_FINSH
extern void finsh_notify(void);
void rt_serial_isr(int vector)
{
finsh_notify();
}
void rt_hw_finsh_init()
{
/* install UART isr */
rt_hw_interrupt_install(INT_URXD0, rt_serial_isr, RT_NULL);
rt_hw_interrupt_umask(INT_URXD0);
}
#endif
void rt_hw_console_output(const char* string)
{
while (*string)
{
rt_serial_putc(*string++);
}
}
/*@}*/