您的位置:首页 > 其它

s5pc100串口裸板程序uart0

2013-04-23 23:29 246 查看
开发环境

系统:ubuntu 10.04.4

单板:s5pc100

编译器:arm-linux-gcc-4.3.2

搭建开发环境详见ubuntu 10.04.4开发环境配置。

目标:实现s5pc100 uart0 显示任意输入字符

一、编写源代码

根据s5pc100手册编写代码,包括源文件start.S clock.s main.c uart.c uart.h Makefile

文件start.s:

.global _start

_start:

ldr sp, =0xD0030000
bl clock_init
b main
文件clock.s:

.globl clock_init

clock_init:

/* 1.设置LOCK_TIME */
ldr r0, =0xe0100000  	//CLOCK_POWER_BASE
mov r1, #0xe00
orr r1, r1, #0x10
str r1, [r0, #0x0]		/* APLL_LOCK */
str r1, [r0, #0x4]	 /* MPLL_LOCK */
str r1, [r0, #0x8]	 /* EPLL_LOCK */
str r1, [r0, #0x0c]	//HPLL_LOCK

//#define OTHERS		0x7e00f900
//	@ set async mode  /* 当CPU时钟 != HCLK时,要设为异步模式 */
//	ldr r0, =OTHERS
//	ldr r1, [r0]
//	bic r1, r1, #0xc0	/* 1100,0000 */
//	str r1, [r0]

//loop1:				/* 等待,直到CPU进入异步模式 */
//	ldr r0, =OTHERS
//	ldr r1, [r0]
//	and r1, r1, #0xf00
//	cmp r1, #0
//	bne loop1

/* SYNC667 */
/* MISC_CON[19] = 0 */

//#define ARM_RATIO    0   /* ARMCLK = DOUTAPLL / (ARM_RATIO + 1)    */
//#define HCLKX2_RATIO 1   /* HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) */
//#define HCLK_RATIO   1   /* HCLK = HCLKX2 / (HCLK_RATIO + 1)       */
//#define PCLK_RATIO   3   /* PCLK   = HCLKX2 / (PCLK_RATIO + 1)     */
//#define MPLL_RATIO   0   /* DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1)     */
//	ldr r0, =0x7E00F020  /* CLK_DIV0 */
//	ldr r1, =(ARM_RATIO) | (MPLL_RATIO << 4) | (HCLK_RATIO << 8) | (HCLKX2_RATIO << 9) | (PCLK_//RATIO << 12)
//	str r1, [r0]
/* CLK_DIV0 */
#define APLL_RATIO	0
#define ARM_RATIO	4
#define D0_BUS_RATIO	8
#define PCLKD0_RATIO	12
#define SECSS_RATIO	16

ldr r1, [r0, #0x300]	//CLK_DIV0 Clock divider
ldr r2, =0x3fff
bic r1, r1, r2

ldr r2, =(1<<APLL_RATIO) | (0<<ARM_RATIO) | (4<<D0_BUS_RATIO) | (1<<PCLKD0_RATIO) | (1<<SECSS_RATIO)
orr r1, r1, r2
str r1, [r0, #0x300]	//CLK_DIV0

ldr r2, =((1<<16) | (1<<12) | (1<<8) | (1<<4))
orr r1 ,r1, r2
str r1, [r0, #0x304]	//CLD_DIV1
/* 2.配置时钟 */
/* 2.1 配置APLL */
/* 2.1.1 设置APLL
* 2.1.2 MUXAPLL
* 2.1.3 SYNC667
* 2.1.4 DIVAPLL
*/
//#define APLL_CON_VAL  ((1<<31) | (266 << 16) | (3 << 8) | (1))
//	ldr r0, =0x7E00F00C
//	ldr r1, =APLL_CON_VAL
//	str r1, [r0]		/* APLL_CON, FOUTAPL = MDIV * Fin / (PDIV*2^SDIV) = 266*12/(3*2^1) = 532MHz  */
#define APLL_VAL  ((1<<31) | (417 << 16) | (3 << 8) | (0))
//ldr r0, =0xe0100100	//APLL_CON
ldr r1, =APLL_VAL
str r1, [r0, #0x100]		/* MPLL_CON, FOUTMPL = MDIV * Fin / (PDIV*2^SDIV) = 266*12/(3*2^1) = 532MHz  */
/* 2.2 配置MPLL */
/* 2.2.1 设置MPLL
* 2.2.2 MUXMPLL
* 2.2.3 SYNCMUX
* 2.2.4 SYNC667
* 2.2.5 HCLKX2_RATIO
* 2.2.6 PCLK_RATIO
*/
//#define MPLL_CON_VAL  ((1<<31) | (266 << 16) | (3 << 8) | (1))
//CONFIG_CLK_833_166_66
#define MPLL_VAL  ((1<<31) | (89 << 16) | (2 << 8) | (1))
#define EPLL_VAL  ((1<<31) | (135 << 16) | (3 << 8) | (3))
#define HPLL_VAL  ((1<<31) | (96 << 16) | (6 << 8) | (3))

ldr r1, =MPLL_VAL
str r1, [r0, #0x104]

ldr r1, =EPLL_VAL
str r1, [r0, #0x108]

ldr r1, =HPLL_VAL
str r1, [r0, #0x10c]

/* 3.选择PLL的输出作为时钟源 */
ldr r1, [r0, #0x200]	//CLK_SRC0 0xe0100200
ldr r2, =0x1111
orr r1, r1, r2
str r1, [r0, #0x200]	//FOUT: APLL MPLL EPLL HPLL

mov 	r1, #0x10000
1:	subs	r1, r1, #1
bne	1b

mov pc, lr
文件main.c:

#include "uart.h"

int main(void)
{
char c;
/* 帮内核设置串口: 内核启动的开始部分会从串口打印一些信息,但是内核一开始没有初始化串口*/
uart_init();

while (1)
{

do {
c = getc();
if (c == '\n' || c == '\r')
{
putc('\n');
putc('\r');
}
else
{
putc(c);
}
} while (c == '\n' || c == '\r');

}

return 0;
}
文件uart.c:

#define ULCON0     (*((volatile unsigned long *)0xEC000000))
#define UCON0      (*((volatile unsigned long *)0xEC000004))
#define UFCON0     (*((volatile unsigned long *)0xEC000008))
#define UMCON0     (*((volatile unsigned long *)0xEC00000C))
#define UTRSTAT0   (*((volatile unsigned long *)0xEC000010))
#define UFSTAT0    (*((volatile unsigned long *)0xEC000018))
#define UTXH0      (*((volatile unsigned char *)0xEC000020))
#define URXH0      (*((volatile unsigned char *)0xEC000024))
#define UBRDIV0    (*((volatile unsigned long *)0xEC000028))
#define UDIVSLOT0  (*((volatile unsigned long *)0xEC00002C))

#define GPACON     (*((volatile unsigned long *)0xE0300000))

#define ENABLE_FIFO

static void delay1(void)
{
volatile int i = 10;
while (i--);
}
void uart_init(void)
{
GPACON &= ~0xffff;
GPACON |= 0x2222;

/* ULCON0 */
ULCON0 = 0x3;  /* 鏁版嵁浣?8, 鏃犺緝楠? 鍋滄浣? 1, 8n1 */
UCON0  = 0x5;  /* 浣胯兘UART鍙戦€併€佹帴鏀?*/
#ifdef ENABLE_FIFO
UFCON0 = 0x07; /* FIFO enable */
#else
UFCON0 = 0x00; /* FIFO disable */
#endif
UMCON0 = 0;

/* 娉㈢壒鐜?*/
/* DIV_VAL = (PCLK / (bps x 16 ) ) - 1
* bps = 115200
* DIV_VAL = (66500000 / (115200 x 16 ) ) - 1
*         = 35.08
*/
UBRDIV0   = 35;

/* x/16 = 0.08
* x = 1
*/
UDIVSLOT0 = 3;

//UTXH0 = 0x4f4f4f4f;
}

unsigned char getc(void)
{
#ifdef ENABLE_FIFO
while ((UFSTAT0 & (1<<6)) == 0 && (UFSTAT0 & 0x3f) == 0)delay1();
#else
while ((UTRSTAT0 & (1<<0)) == 0);
#endif

return URXH0;
}

int getc_nowait(unsigned char *pChar)
{
#ifdef ENABLE_FIFO
if ((UFSTAT0 & (1<<6)) == 0 && (UFSTAT0 & 0x3f) == 0)
#else
if ((UTRSTAT0 & (1<<0)) == 0)
#endif
{
return -1;
}
else
{
*pChar = URXH0;
return 0;
}
}

void putc(char c)
{
#ifdef ENABLE_FIFO
while (UFSTAT0 & (1<<14))delay1();
#else
while ((UTRSTAT0 & (1<<2)) == 0);
#endif
UTXH0 = c;
}
文件uart.h:

void uart_init(void);
void putc(char c);
int getc_nowait(unsigned char *pChar);
unsigned char getc(void);
文件Makefile:

2_uart.bin:start.s clock.s main.c uart.c
arm-linux-gcc -nostdlib -c -o start.o start.s
arm-linux-gcc -nostdlib -c -o clock.o clock.s
arm-linux-gcc -nostdlib -c -o main.o main.c
arm-linux-gcc -nostdlib -c -o uart.o uart.c
arm-linux-ld -Ttext 0xd0020010 start.o clock.o main.o uart.o -o uart_elf
arm-linux-objcopy -O binary -S uart_elf 2_uart.bin

clean:
rm -rf uart_elf *.bin *.o
二、编译

change@change:~$ cd Si/s5pc100/2_uart0/

change@change:~/Si/s5pc100/2_uart0$ make clean

rm -rf uart_elf *.bin *.o

change@change:~/Si/s5pc100/2_uart0$ make

arm-linux-gcc -nostdlib -c -o start.o start.s

arm-linux-gcc -nostdlib -c -o clock.o clock.s

arm-linux-gcc -nostdlib -c -o main.o main.c

In file included from main.c:1:

uart.h:2: warning: conflicting types for built-in function 'putc'

arm-linux-gcc -nostdlib -c -o uart.o uart.c

uart.c:81: warning: conflicting types for built-in function 'putc'

arm-linux-ld -Ttext 0xd0020010 start.o clock.o main.o uart.o -o uart_elf

arm-linux-objcopy -O binary -S uart_elf 2_uart.bin

change@change:~/Si/s5pc100/2_uart0$ ./mktiny210spl.exe 2_uart.bin 2_uarts.bin

change@change:~/Si/s5pc100/2_uart0$ cp 2_uarts.bin /home/change/work/tftpboot/

三、烧写、测试

单板从NAND启动,用u-boot烧写程序到内存运行。当然直接烧写到NAND也能运行。上电:

OK

U-Boot 1.3.4-dirty (Nov 19 2012 - 10:50:02) for CES-C100

************************************************************

** CES-C100 Nand boot **

** Shenzhen Haitianxiong Electronic Co.,Ltd.(China) **

** http://www.ces-tech.com **

************************************************************

CPU: S5PC100@834MHz

Fclk = 1668MHz, Hclk = 166MHz, Pclk = 66MHz, Serial = PCLK

Board: CES-C100

I2C: ready

VGA: OK

DRAM: 256 MB

Net: DM9000cep

NAND: s3c_nand_oob_slc_64 is selected1024 MB

*** Warning - using default environment

In: serial

Out: serial

Err: serial

Hit any key to stop autoboot: 0

##### s5pc100 Bootloader for OpenJTAG #####

Download u-boot to Nand Flash

[o] Download u-boot to Nor Flash

[k] Download Linux kernel uImage

[j] Download root_jffs2 image

[y] Download root_yaffs image

[d] Download to SDRAM & Run

[z] Download zImage into RAM

[g] get file, and write to nand flash 0 block

[f] Read the Nand Flash

[w] Write the nand flash

[e] Erase one nand block

[s] Set the boot parameters

[b] Boot the system

[r] Reboot u-boot

[q] Quit from menu

Enter your selection: q

CES-C100 # set ipaddr 172.16.1.133

CES-C100 # set gatewayip 172.16.1.1

CES-C100 # set serverip 172.16.1.135

CES-C100 # tftp 0x22000000 2_uarts.bin

ERROR: resetting DM9000 -> not responding

dm9000 i/o: 0x88000000, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 00:40:5c:26:0a:5b

operating at 100M full duplex mode

TFTP from server 172.16.1.135; our IP address is 172.16.1.133

Filename '2_uarts.bin'.

Load address: 0x22000000

Loading: ##

done

Bytes transferred = 24576 (0x6000)

串口程序已写到内存,在u-boot执行如下命令,开始运行串口程序

CES-C100 # go 0x22000000

## Starting application at 0x22000000 ...

此时任意输入字符测试OK

qwerrSDF

s5pc100 test

it' ok
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: