summaryrefslogtreecommitdiff
path: root/bsp/mini2440/drivers/board.c
blob: fc623386b41488a795285bfd3f81ff39abad6c28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
/*
 * File      : board.c
 * This file is part of RT-Thread RTOS
 * COPYRIGHT (C) 2006 - 2009 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://www.rt-thread.org/license/LICENSE
 *
 * Change Logs:
 * Date           Author       Notes
 * 2006-03-24     Bernard      first implementation
 * 2006-05-05     Bernard      add DATA_COUNT definition
 * 2006-10-05     Alsor.Z       for s3c2410x porting
 * 2007-11-20     Yi.Qiu	     add lcd,touch,console
 */

#include <rtthread.h>
#include <rthw.h>

#include "board.h"
#include "led.h"

/**
 * @addtogroup mini2440
 */
/*@{*/

extern rt_uint32_t PCLK, FCLK, HCLK, UCLK;

extern void rt_hw_clock_init(void);
extern void rt_hw_mmu_init(void);

extern void rt_hw_get_clock(void);
extern void rt_hw_set_dividor(rt_uint8_t hdivn, rt_uint8_t pdivn);
extern void rt_hw_set_clock(rt_uint8_t sdiv, rt_uint8_t pdiv, rt_uint8_t mdiv);

#define UART0	((struct uartport *)&U0BASE)
struct serial_int_rx uart0_int_rx;
struct serial_device uart0 =
{
	UART0,
	&uart0_int_rx,
	RT_NULL
};
struct rt_device uart0_device;

#define UART2	((struct uartport *)&U2BASE)
struct serial_int_rx uart2_int_rx;
struct serial_device uart2 =
{
	UART2,
	&uart2_int_rx,
	RT_NULL
};
struct rt_device uart2_device;

/**
 * This function will handle rtos timer
 */
static void rt_timer_handler(int vector, void *param)
{
	rt_tick_increase();
}

/**
 * This function will handle serial
 */
static void rt_serial0_handler(int vector, void *param)
{
	INTSUBMSK |= (BIT_SUB_RXD0);

	rt_hw_serial_isr(&uart0_device);

	SUBSRCPND |= BIT_SUB_RXD0;

	/* Unmask sub interrupt (RXD0) */
	INTSUBMSK  &=~(BIT_SUB_RXD0);
}

/**
 * This function will handle serial
 */
static void rt_serial2_handler(int vector, void *param)
{
	INTSUBMSK |= (BIT_SUB_RXD2);

	rt_hw_serial_isr(&uart2_device);

	SUBSRCPND |= BIT_SUB_RXD2;

	/* Unmask sub interrupt (RXD0) */
	INTSUBMSK  &=~(BIT_SUB_RXD2);
}

/**
 * This function will handle init uart
 */
static void rt_hw_uart_init(void)
{
	int i;
	/* UART0 port configure */
	GPHCON |= 0xAA;
	/* PULLUP is disable */
	GPHUP |= 0xF;

	/* FIFO enable, Tx/Rx FIFO clear */
	uart0.uart_device->ufcon = 0x0;
	/* disable the flow control */
	uart0.uart_device->umcon = 0x0;
	/* Normal,No parity,1 stop,8 bit */
	uart0.uart_device->ulcon = 0x3;
	/*
	 * tx=level,rx=edge,disable timeout int.,enable rx error int.,
	 * normal,interrupt or polling
	 */
	uart0.uart_device->ucon = 0x245;
	/* Set uart0 bps */
	uart0.uart_device->ubrd = (rt_int32_t)(PCLK / (BPS * 16)) - 1;
	/* output PCLK to UART0/1, PWMTIMER */
	CLKCON |= 0x0D00;

	/* FIFO enable, Tx/Rx FIFO clear */
	uart2.uart_device->ufcon = 0x0;
	/* disable the flow control */
	uart2.uart_device->umcon = 0x0;
	/* Normal,No parity,1 stop,8 bit */
	uart2.uart_device->ulcon = 0x3;
	/*
	 * tx=level,rx=edge,disable timeout int.,enable rx error int.,
	 * normal,interrupt or polling
	 */
	uart2.uart_device->ucon = 0x245;
	/* Set uart0 bps */
	uart2.uart_device->ubrd = (rt_int32_t)(PCLK / (BPS * 16)) - 1;

	for (i = 0; i < 100; i++);

	/* install uart0 isr */
	INTSUBMSK &= ~(BIT_SUB_RXD0);

	/* install uart2 isr */
	INTSUBMSK &= ~(BIT_SUB_RXD2);

	rt_hw_interrupt_install(INTUART0, rt_serial0_handler, RT_NULL, "UART0");
	rt_hw_interrupt_umask(INTUART0);

	rt_hw_interrupt_install(INTUART2, rt_serial2_handler, RT_NULL, "UART2");
	rt_hw_interrupt_umask(INTUART2);
}

/**
 * This function will init timer4 for system ticks
 */
static  void rt_hw_timer_init(void)
 {
	/* timer4, pre = 15+1 */
	TCFG0 &= 0xffff00ff;
	TCFG0 |= 15 << 8;
	/* all are interrupt mode,set Timer 4 MUX 1/4 */
	TCFG1  &= 0xfff0ffff;
	TCFG1  |= 0x00010000;

	TCNTB4 = (rt_int32_t)(PCLK / (4 *16* RT_TICK_PER_SECOND)) - 1;
	/* manual update */
	TCON = TCON & (~(0x0f<<20)) | (0x02<<20);
	/* install interrupt handler */
	rt_hw_interrupt_install(INTTIMER4, rt_timer_handler, RT_NULL, "tick");
	rt_hw_interrupt_umask(INTTIMER4);

    /* start timer4, reload */
	TCON = TCON & (~(0x0f<<20)) | (0x05<<20);
 }

/**
 * This function will init s3ceb2410 board
 */
void rt_hw_board_init(void)
{
	/* initialize the system clock */
	rt_hw_clock_init();

	/* Get the clock */
	rt_hw_get_clock();

	/* initialize led port */
	rt_hw_led_init();

	/* initialize uart */
	rt_hw_uart_init();

	/* initialize mmu */
	rt_hw_mmu_init();

	/* initialize timer4 */
	rt_hw_timer_init();
}

/*@}*/