上篇博文我们按照210的启动流程,分析到了内存初始化,今天我们继续按照u-boot的启动流程对串口的初始化进行分析。
今天我们会用到的文档:
1. 2440芯片手册:http://download.csdn.net/detail/wrjvszq/8358949
2. 6410芯片手册:http://download.csdn.net/detail/wrjvszq/8358965
3. 210芯片手册:S5PV210_UM_REV1.1(我的不知道为什么传不上去大家去百度搜吧)
串口的初始化比较简单,我们今天会通过以下几点,对串口的初始化进行介绍:
1. 串口通信协议分析
2. 编程分析
相信搞过单片机的对串口并不陌生,我下面仅仅是复习一下串口通信协议。
1. RS232接口
我们常见的串口是九帧的串口如下图
注:上面为公头,下面为母头
其接口定义如下:
1. DCD 载波检测
2. RXD 接收数据
3. TXD 发送数据
4. DTR 数据终端准备
5. GND 信号地
6. DSR 数据设备准备好
7. RTS 请求发送
8. CTS 清除发送
9. RI 振铃指示
注:红色标注的三个管脚最为重要
2. 异步串口通信协议
下图是其工作模式:
其各个位的意义如下:
l 起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
l 数据位:有效数据。
l 奇偶校验位:来校验资料传送的正确性。
l 停止位:它是一帧数据的传输结束。
l 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
l 波特率:表示每秒钟传送的二进制位数。
3. 数据发送接收过程
l 发送过程:
把数据发送到fifo中,fifo把数据发送到移位寄存器,然后在时钟脉冲的作用下,往串口线上发送一位bit数据。
l 接收过程:
接收移位寄存器接收到数据后,将数据放到fifo中,接受fifo事先设置好触发门限,当fifo中数据超过这个门限时,就触发一个中断,然后调用驱动中的中断服务函数,把数据写到flip_buf中。
l 编程分析
1. 初始化流程:
按照以往的经验去手册找其的初始化流程,但是没有找到,可以通过在网上查找资料,或者对照u-boot我们可以总结出通用的串口初始化流程:
1) 设置引脚工作模式
2) 设置数据格式
3) 设置工作模式(DMA,轮询,中断)
4) 设置波特率
2. 代码分析
通过上面的流程我们就不难理解u-boot的代码,大家可以自己分析:
1 /* 2 * uart_asm_init: Initialize UART in asm mode, 115200bps fixed. 3 * void uart_asm_init(void) 4 */ 5 uart_asm_init: 6 7 /* set GPIO(GPA) to enable UART */ 8 @ GPIO setting for UART 9 ldr r0, =ELFIN_GPIO_BASE 10 ldr r1, =0x22222222 11 str r1, [r0, #GPA0CON_OFFSET] 12 13 ldr r1, =0x2222 14 str r1, [r0, #GPA1CON_OFFSET] 15 16 // HP V210 use. SMDK not use. 17 #if defined(CONFIG_VOGUES) 18 ldr r1, =0x100 19 str r1, [r0, #GPC0CON_OFFSET] 20 21 ldr r1, =0x4 22 str r1, [r0, #GPC0DAT_OFFSET] 23 #endif 24 25 ldr r0, =ELFIN_UART_CONSOLE_BASE @0xEC000000 26 mov r1, #0x0 27 str r1, [r0, #UFCON_OFFSET] 28 str r1, [r0, #UMCON_OFFSET] 29 30 mov r1, #0x3 31 str r1, [r0, #ULCON_OFFSET] 32 33 ldr r1, =0x3c5 34 str r1, [r0, #UCON_OFFSET] 35 36 ldr r1, =UART_UBRDIV_VAL 37 str r1, [r0, #UBRDIV_OFFSET] 38 39 ldr r1, =UART_UDIVSLOT_VAL 40 str r1, [r0, #UDIVSLOT_OFFSET] 41 42 ldr r1, =0x4f4f4f4f 43 str r1, [r0, #UTXH_OFFSET] @'O' 44 45 mov pc, lr