u-boot分析(八)----串口初始化

u-boot分析(八)

  上篇博文我们按照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.       异步串口通信协议

下图是其工作模式:

其各个位的意义如下:

起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。

数据位:有效数据。

奇偶校验位:来校验资料传送的正确性。

停止位:它是一帧数据的传输结束。

空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

波特率:表示每秒钟传送的二进制位数。

3.       数据发送接收过程

发送过程:

把数据发送到fifo中,fifo把数据发送到移位寄存器,然后在时钟脉冲的作用下,往串口线上发送一位bit数据。

接收过程:

接收移位寄存器接收到数据后,将数据放到fifo中,接受fifo事先设置好触发门限,当fifo中数据超过这个门限时,就触发一个中断,然后调用驱动中的中断服务函数,把数据写到flip_buf中。

编程分析

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
时间: 2024-10-14 16:43:53

u-boot分析(八)----串口初始化的相关文章

第3阶段——内核启动分析之start_kernel初始化函数(5)

内核启动分析之start_kernel初始化函数(init/main.c) stext函数启动内核后,就开始进入start_kernel初始化各个函数, 下面只是浅尝辄止的描述一下函数的功能,很多函数真正理解需要对linux相关体系有很深的了解后才能明白 代码如下: asmlinkage void __init start_kernel(void) { char * command_line; extern struct kernel_param __start___param[], __sto

串口驱动程序设计详解---串口初始化(上)

TTY驱动程序架构: 1. TTY概念解析 1.1 /dev/ttySCA0 1.2 /dev/tty1-n 1.3 /dev/console 在linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备. . 串口终端(/dev/ttyS*) 串口终端是使用计算机串口连接的终端设备.Linux把每个串行端口都看做是一个字符设备.这些串行端口所对应的设备名称是/dev/ttySAC*; .控制台终端(/dev/console) 在Linux系统中,计算机的输出

Spring Boot(十八):使用Spring Boot集成FastDFS

Spring Boot(十八):使用Spring Boot集成FastDFS 环境:Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0 功能:使用Spring Boot将文件上传到分布式文件系统FastDFS中. 一.pom包配置 <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</artifactId> <ve

ThinkPHP6源码分析之应用初始化

ThinkPHP6 源码分析之应用初始化 官方群点击此处. App Construct 先来看看在 __construct 中做了什么,基本任何框架都会在这里做一些基本的操作,也就是从这里开始延伸出去. public function __construct(string $rootPath = '') { $this->thinkPath = dirname(__DIR__) . DIRECTORY_SEPARATOR; $this->rootPath = $rootPath ? rtrim

SDL2源代码分析1:初始化

打算花一段时间研究一下SDL的内部代码.前面几篇文章<最简单的视音频播放示例1:总述>中记录了视频.音频播放的技术,文中提及了SDL实际上封装了Direct3D,DirectSound这类的底层API.但是SDL究竟是如何封装的呢?这次打算深入其源代码一探究竟,看看它是如何封装这些API的. SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中已经叙述过了,不再重复.这两篇文章中也提

nginx源码分析之模块初始化

在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要通过结合源码来分析模块的初始化过程. 稍微了解nginx的人都知道nginx是高度模块化的,各个功能都封装在模块中,而各个模块的初始化则是根据配置文件来进行的,下面我们会看到nginx边解析配置文件中的指令,边初始化指令所属的模块,指令其实就是指示怎样初始化模块的. 模块初始化框架 模块的初始化主要

nginx源码分析之网络初始化

nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网络有关的配置命令主要有两个:listen和sever_name.首先先了解这两个命令的用法. listen listen命令设置nginx监听地址,nginx从这里接受请求.对于IP协议,这个地址就是address和port:对于UNIX域套接字协议,这个地址就是path. 一条listen指令只能

C# 串口初始化

C# 串口初始化方法之一.完整例程中定义了多个串口,程序运行初始会从配置文件加载串口设置并批量初始化串口. ... using System.Text.RegularExpressions; ... //Example, InitPort(gdmPort, 2, "115200,N,8,1") private void InitPort( System.IO.Ports.SerialPort _seriPort, int _com, string _setting) {     str

tiny4412 串口驱动分析八 --- log打印的几个阶段之内核启动阶段(printk tiny4412串口驱动的注册)

作者:彭东林 邮箱:[email protected] 开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 u-boot:U-Boot 2010.12 Linux内核版本:linux-3.0.31 Android版本:android-4.1.2 在arch/arm/mach-exynos/mach-tiny4412.c中: MACHINE_START(TINY4412, "TINY4412") .boot