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:
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
系统: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
相关文章推荐
- TQ2440串口裸板程序uart0
- micro2440串口裸板程序uart0
- OK6410串口裸板程序uart0
- S5PC100裸板更新程序_update
- C8051F340串口通信程序(UART0)
- S5pc100裸板全攻略之SPI
- CC2640协处理器SensorController移植sc_uart串口程序到simple_peripheral工程,实现串口与手机的通信
- OMAPL138/AM1808 修改调试串口为UART1后通过CCSV4下载程序的全过程(原创)
- 嵌入式软件开发培训笔记——S5PC100接口开发(GPIO输入/输出、定时器、中断、UART、ADC、IIC)
- S5pc100裸板全攻略之SPI
- 八、mini2440裸机程序之UART(2)UART0与PC串口通信【转】
- 第五站,我想对社会说——uart串口程序分析
- OK6410的UART0串口程序简单测试
- S3C2440裸机程序【2】串口uart程序
- AM2320 温湿度传感器 C51程序 uart串口输出温湿度
- TQ2440裸奔程序:串口UART打印printf测试程序
- ARM裸机程序开发21(2440串口:申嵌源码2440lib.c文件中关于UART的操作)
- pcDuino第一个裸板程序uart0
- S3c2410裸板程序入门---串口
- 4412裸机程序之UART串口