1
0
mirror of git://projects.qi-hardware.com/xburst-tools.git synced 2024-11-22 18:54:39 +02:00

add init serial console in serial.c

This commit is contained in:
xiangfu 2008-07-28 10:47:53 -04:00
parent 07ac5def3b
commit dded3f8cbf
6 changed files with 137 additions and 52 deletions

View File

@ -37,5 +37,6 @@
int orange_on(int times); int orange_on(int times);
int blue_on(int times); int blue_on(int times);
int blink_led(void); int blink_led(void);
int delay(int time);
#endif /* __BLINK_LED_H */ #endif /* __BLINK_LED_H */

View File

@ -20,9 +20,44 @@
* MA 02111-1307 USA * MA 02111-1307 USA
*/ */
#define rUTXH0 (*(volatile unsigned char *)0x50000023) #define UART0 0
#define UTRSTAT (*(volatile unsigned char *)0x50000010) #define UART1 1
#define UART2 2
void serial_putc (const char c); #define rULCON0 (*(volatile unsigned *)0x50000000) /*UART 0 Line control*/
#define rUCON0 (*(volatile unsigned *)0x50000004) /*UART 0 Control*/
#define rUFCON0 (*(volatile unsigned *)0x50000008) /*UART 0 FIFO control*/
#define rUMCON0 (*(volatile unsigned *)0x5000000c) /*UART 0 Modem control*/
#define rUTRSTAT0 (*(volatile unsigned *)0x50000010) /*UART 0 Tx/Rx status*/
#define rUERSTAT0 (*(volatile unsigned *)0x50000014) /*UART 0 Rx error status*/
#define rUFSTAT0 (*(volatile unsigned *)0x50000018) /*UART 0 FIFO status*/
#define rUMSTAT0 (*(volatile unsigned *)0x5000001c) /*UART 0 Modem status*/
#define rUBRDIV0 (*(volatile unsigned *)0x50000028) /*UART 0 Baud rate divisor*/
#define rULCON1 (*(volatile unsigned *)0x50004000) /*UART 1 Line control*/
#define rUCON1 (*(volatile unsigned *)0x50004004) /*UART 1 Control*/
#define rUFCON1 (*(volatile unsigned *)0x50004008) /*UART 1 FIFO control*/
#define rUMCON1 (*(volatile unsigned *)0x5000400c) /*UART 1 Modem control*/
#define rUTRSTAT1 (*(volatile unsigned *)0x50004010) /*UART 1 Tx/Rx status*/
#define rUERSTAT1 (*(volatile unsigned *)0x50004014) /*UART 1 Rx error status*/
#define rUFSTAT1 (*(volatile unsigned *)0x50004018) /*UART 1 FIFO status*/
#define rUMSTAT1 (*(volatile unsigned *)0x5000401c) /*UART 1 Modem status*/
#define rUBRDIV1 (*(volatile unsigned *)0x50004028) /*UART 1 Baud rate divisor*/
#define rULCON2 (*(volatile unsigned *)0x50008000) /*UART 2 Line control*/
#define rUCON2 (*(volatile unsigned *)0x50008004) /*UART 2 Control*/
#define rUFCON2 (*(volatile unsigned *)0x50008008) /*UART 2 FIFO control*/
#define rUTRSTAT2 (*(volatile unsigned *)0x50008010) /*UART 2 Tx/Rx status*/
#define rUERSTAT2 (*(volatile unsigned *)0x50008014) /*UART 2 Rx error status*/
#define rUFSTAT2 (*(volatile unsigned *)0x50008018) /*UART 2 FIFO status*/
#define rUBRDIV2 (*(volatile unsigned *)0x50008028) /*UART 2 Baud rate divisor*/
#define WrUTXH0(ch) (*(volatile unsigned char *)0x50000020)=(unsigned char)(ch)
#define RdURXH0() (*(volatile unsigned char *)0x50000024)
#define WrUTXH1(ch) (*(volatile unsigned char *)0x50004020)=(unsigned char)(ch)
#define RdURXH1() (*(volatile unsigned char *)0x50004024)
#define WrUTXH2(ch) (*(volatile unsigned char *)0x50008020)=(unsigned char)(ch)
#define RdURXH2() (*(volatile unsigned char *)0x50008024)
void serial_init (const int ubrdiv_val,const int uart);
void serial_putc (const int uart,const char c);

View File

@ -15,11 +15,7 @@
* Author: Harald Welte <laforge@openmoko.org> * Author: Harald Welte <laforge@openmoko.org>
*/ */
/*#include <common.h>
#include <linux/mtd/nand.h>
*/
#include "nand_read.h" #include "nand_read.h"
#include "blink_led.h"
#define NAND_CMD_READ0 0 #define NAND_CMD_READ0 0
#define NAND_CMD_READSTART 0x30 #define NAND_CMD_READSTART 0x30
@ -108,6 +104,7 @@ static int nand_read_page_ll(unsigned char *buf, unsigned long addr)
int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size) int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{ {
int i, j; int i, j;
int bad_count = 0;
if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK))
return -1; /* invalid alignment */ return -1; /* invalid alignment */
@ -121,13 +118,15 @@ int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
if (i % NAND_BLOCK_SIZE == 0) { if (i % NAND_BLOCK_SIZE == 0) {
if (is_bad_block(i) || if (is_bad_block(i) ||
is_bad_block(i + NAND_PAGE_SIZE)) { is_bad_block(i + NAND_PAGE_SIZE)) {
orange_on(1);
i += NAND_BLOCK_SIZE; i += NAND_BLOCK_SIZE;
size += NAND_BLOCK_SIZE; size += NAND_BLOCK_SIZE;
if(bad_count++ == 4) {
return -1;
}
continue; continue;
} }
} }
blue_on(1);
j = nand_read_page_ll(buf, i); j = nand_read_page_ll(buf, i);
i += j; i += j;
/* buf += j;*/ /* buf += j;*/

View File

@ -20,14 +20,60 @@
* MA 02111-1307 USA * MA 02111-1307 USA
*/ */
# include <serial.h> #include "serial.h"
#include "blink_led.h"
void serial_init (const int ubrdiv_val,const int uart)
{
switch(uart)
{
case UART0:
rULCON0 = 0x3;
rUCON0 = 0x245;
rUFCON0 = 0x0;
rUMCON0 = 0x0;
rUBRDIV0 = ubrdiv_val;
break;
case UART1:
rULCON1 = 0x3;
rUCON1 = 0x245;
rUFCON1 = 0x0;
rUMCON1 = 0x0;
rUBRDIV1 = ubrdiv_val;
break;
case UART2:
rULCON2 = 0x3;
rUCON2 = 0x245;
rUFCON2 = 0x0;
rUBRDIV2 = ubrdiv_val;
break;
default:
break;
}
}
/* /*
* Output a single byte to the serial port. * Output a single byte to the serial port.
*/ */
void serial_putc (const char c) void serial_putc (const int uart,const char c)
{ {
while (!(UTRSTAT & 0x2)); switch(uart)
{
rUTXH0 = c; case UART0:
while ( !( rUTRSTAT0 & 0x2 ) );
delay(10);
WrUTXH0(c);
break;
case UART1:
while ( !( rUTRSTAT1 & 0x2 ) );
delay(10);
WrUTXH1(c);
break;
case UART2:
while ( !( rUTRSTAT2 & 0x2 ) );
WrUTXH2(c);
break;
default:
break;
}
} }

View File

@ -46,17 +46,19 @@ start_code:
orr r0,r0,#0xd3 orr r0,r0,#0xd3
msr cpsr,r0 msr cpsr,r0
/* turn off the watchdog */
# define pWTCON 0x53000000 # define pWTCON 0x53000000
ldr r0, =pWTCON ldr r0, =pWTCON
mov r1, #0x0 mov r1, #0x0
str r1, [r0] str r1, [r0]
/* /*
* mask all IRQs by setting all bits in the INTMR - default * mask all IRQs by setting all bits in the INTMR - default
*/ */
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */ # define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C # define INTSUBMSK 0x4A00001C
# define INTSUBMSK_val 0xffff # define INTSUBMSK_val 0x0000ffff
mov r1, #0xffffffff mov r1, #0xffffffff
ldr r0, =INTMSK ldr r0, =INTMSK
str r1, [r0] str r1, [r0]
@ -65,8 +67,10 @@ start_code:
ldr r0, =INTSUBMSK ldr r0, =INTSUBMSK
str r1, [r0] str r1, [r0]
/* Make sure we get FCLK:HCLK:PCLK = 1:3:6 */ /* Make sure we get FCLK:HCLK:PCLK = 1:3:6 */
# define CAMDIVN 0x4C000018 # define CAMDIVN 0x4C000018
ldr r0, =CAMDIVN ldr r0, =CAMDIVN
mov r1, #0 mov r1, #0
str r1, [r0] str r1, [r0]
@ -76,21 +80,21 @@ start_code:
orr r1, r1, #0xc0000000 orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0 mcr p15, 0, r1, c1, c0, 0
# define LOCKTIME 0x4c000000 #define LOCKTIME 0x4c000000
# define UPLLCON 0x4c000008
# define UPLLCON_val (( 88 << 12) + (8 << 4) + 2)
# define MPLLCON 0x4c000004
# define MPLLCON_val ((142 << 12) + (7 << 4) + 1)
ldr r0, =LOCKTIME ldr r0, =LOCKTIME
mov r1, #0xffffff mov r1, #0xffffff
str r1, [r0] str r1, [r0]
# define MPLLCON_val ((142 << 12) + (7 << 4) + 1)
# define UPLLCON 0x4c000008
# define UPLLCON_val (( 88 << 12) + (8 << 4) + 2)
ldr r0, =UPLLCON ldr r0, =UPLLCON
ldr r1, =UPLLCON_val ldr r1, =UPLLCON_val
str r1, [r0] str r1, [r0]
/* Page 7-23 in s3c2442B manual, seven nops between UPLL and MPLL */ /* Page 7-19, seven nops between UPLL and MPLL */
nop nop
nop nop
nop nop
@ -99,49 +103,46 @@ start_code:
nop nop
nop nop
ldr r0, =MPLLCON
ldr r1, =MPLLCON_val ldr r1, =MPLLCON_val
str r1, [r0] /* MPLLCON */ str r1, [r0, #-4] /* MPLLCON */
# define CLKDIVN 0x4C000014 /* clock divisor register */ # define CLKDIVN 0x4C000014 /* clock divisor register */
# define CLKDIVN_val 7 /* FCLK:HCLK:PCLK = 1:3:6 */ # define CLKDIVN_val 7 /* FCLK:HCLK:PCLK = 1:3:6 */
/* FCLK:HCLK:PCLK = 1:3:6 */
ldr r0, =CLKDIVN ldr r0, =CLKDIVN
mov r1, #CLKDIVN_val mov r1, #CLKDIVN_val
str r1, [r0] str r1, [r0]
/* enable uart */ /* enable uart */
ldr r0, =0x4c00000c /* clkcon */ ldr r0, =0x4c00000c /* clkcon */
ldr r1, =0x7fff0 /* all clocks on */ ldr r1, =0xffff0 /* all clocks on */
str r1, [r0] str r1, [r0]
/* gpio UART0 init */ /* gpio UART0 init */
ldr r0, =0x56000070 ldr r0, =0x56000070
mov r1, #0xaa ldr r1, =0x2afaaa
str r1, [r0] str r1, [r0]
/* init uart */ /* init uart0 */
ldr r0, =0x50000000 /* ldr r0, =0x50000000
mov r1, #0x03 mov r1, #0x03
str r1, [r0] str r1, [r0]
ldr r1, =0x245 ldr r1, =0x245
str r1, [r0, #0x04] str r1, [r0, #0x04]
mov r1, #0x01 mov r1, #0x00
str r1, [r0, #0x08] str r1, [r0, #0x08]
mov r1, #0x00 mov r1, #0x00
str r1, [r0, #0x0c] str r1, [r0, #0x0c]
mov r1, #0x1a mov r1, #0x11
str r1, [r0, #0x28] str r1, [r0, #0x28] */
bl cpu_init_crit bl cpu_init_crit
/* >> CFG_VIDEO_LOGO_MAX_SIZE */ /* >> CFG_VIDEO_LOGO_MAX_SIZE */
#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */ #define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */
#define CONFIG_STACKSIZE (128*1024) /* regular stack */
#define CONFIG_STACKSIZE_IRQ (8*1024) /* IRQ stack */
#define CONFIG_STACKSIZE_FIQ (4*1024) /* FIQ stack */
stack_setup: stack_setup:
ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */ ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */ sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
sub sp, r0, #12 /* leave 3 words for abort-stack */ sub sp, r0, #12 /* leave 3 words for abort-stack */
clear_bss: clear_bss:

View File

@ -33,26 +33,29 @@ unsigned char buf[]={
0x10,0x00,0x00,0x56,0x18,0x00,0x00,0x56,0xff,0xff,0x00,0x00,0x14,0x00,0x00,0x56, 0x10,0x00,0x00,0x56,0x18,0x00,0x00,0x56,0xff,0xff,0x00,0x00,0x14,0x00,0x00,0x56,
0x01,0x00,0x50,0xe2,0xfd,0xff,0xff,0x1a,0x0e,0xf0,0xa0,0xe1,0x0a}; 0x01,0x00,0x50,0xe2,0xfd,0xff,0xff,0x1a,0x0e,0xf0,0xa0,0xe1,0x0a};
*/ */
unsigned char buf[2048]; unsigned char buf[2*1024];
#define ADDR ((volatile unsigned *)&buf) #define ADDR ((volatile unsigned *)&buf)
int start_kboot(void) int start_kboot(void)
{ {
/*1 say hello to uart */ serial_init(0x11,UART0);
serial_putc ('a'); while(1){
serial_putc (UART0,'0');
blue_on(1); blue_on(1);
/*2. test nand flash */ }
if(nand_read_ll(buf, 0x40000, sizeof(buf))==-1) {
while(1) {
blink_led();
}
}
asm volatile("mov pc, %0\n" /*2. test nand flash */
: /* output */ if(nand_read_ll(buf, 0x000, sizeof(buf))==-1) {
:"r"(ADDR) /* input */ while(1) {
); blink_led();
}
}
asm volatile("mov pc, %0\n"
: /* output */
:"r"(ADDR) /* input */
);
return 0; return 0;
} }