ARMLinux s3c2440 之UART分析二

发布者:科技狂人最新更新时间:2016-06-12 来源: eefocus关键字:ARM  Linux  s3c2440  UART 手机看文章 扫描二维码
随时随地手机看文章
软件篇(linux-2.6.30.4):

Linux系统的串口驱动与一般字符设备并一样,它采用层次化的架构,从而看做是一个串行系统来实现。

(1)      关注UART或其他底层串行硬件特征的底层驱动程序。

(2)      和底层驱动程序接口的TTY驱动程序。

(3)      加工用于和TTY驱动程序交换数据的线路规程。

下图描述了串行系统间的层次结构关系(s3c2440串口实现例),可以概括为:用户应用层 --> 线路规划层 --> TTY层 --> 底层驱动层 --> 物理硬件层

 ARMLinux s3c2440 之UART分析二

线路规程和TTY驱动程序是与硬件平台无关的,Linux源码中已经提供了实现,所以对于具体的平台,我们只需实现底层驱动程序即可,这也是我们最关心的。在s3c2440a中,主要由dirivers/serial/下的s3c2440.c和samsung.c实现。

Uart驱动程序主要围绕三个关键的数据结构展开(include/linux/serial_core.h中定义):

 

UART特定的驱动程序结构定义:struct uart_driver s3c24xx_uart_drv;

UART端口结构定义: struct uart_port s3c24xx_serial_ops;

UART相关操作函数结构定义: struct uart_ops s3c24xx_serial_ops;

 

基于以上三个结构体,来看看s3c2440是如何挂接到Linux中串口构架的:

S3c2440串口相关操作函数定义在s3c24xx_serial_ops中,这个是一个structuart_ops结构

 

static struct uart_ops s3c24xx_serial_ops ={
      .pm         =s3c24xx_serial_pm,   //电源管理函数
      .tx_empty       = s3c24xx_serial_tx_empty, //检车发送FIFO缓冲区是否空
      .get_mctrl       = s3c24xx_serial_get_mctrl, //是否串口流控
      .set_mctrl       = s3c24xx_serial_set_mctrl, //是否设置串口流控cts
       .stop_tx   =s3c24xx_serial_stop_tx,  //停止发送
       .start_tx   =s3c24xx_serial_start_tx,  //启动发送
       .stop_rx   =s3c24xx_serial_stop_rx,   //停止接收
      .enable_ms     = s3c24xx_serial_enable_ms, //空函数
      .break_ctl       = s3c24xx_serial_break_ctl,   //发送break信号
       .startup    =s3c24xx_serial_startup,   //串口发送/接收,以及中断申请初始配置函数
      .shutdown       = s3c24xx_serial_shutdown,  //关闭串口
      .set_termios    = s3c24xx_serial_set_termios,//串口clk,波特率,数据位等参数设置
      .type             = s3c24xx_serial_type,  // CPU类型关于串口
       .release_port   =s3c24xx_serial_release_port,  //释放串口
       .request_port   =s3c24xx_serial_request_port, //申请串口
      .config_port    = s3c24xx_serial_config_port,  //串口的一些配置信息info
      .verify_port    = s3c24xx_serial_verify_port,  //串口检测
};

 

 

驱动程序结构定义:

 

static struct uart_driver s3c24xx_uart_drv= {
      .owner           =THIS_MODULE,
      .dev_name      = "s3c2440_serial",  //具体设备名称
      .nr          =CONFIG_SERIAL_SAMSUNG_UARTS,  //定义有几个端口
      .cons             = S3C24XX_SERIAL_CONSOLE,  //console接口
       .driver_name  =S3C24XX_SERIAL_NAME,  //串口名:ttySAC
      .major            =S3C24XX_SERIAL_MAJOR,  //主设备号
      .minor            =S3C24XX_SERIAL_MINOR,   //次设备号
};

 

 

端口配置结构定义,其中包括了一个structuart_ports结构:

 

struct s3c24xx_uart_port {
      unsignedchar               rx_claimed;
      unsignedchar               tx_claimed;
      unsignedint                 pm_level;
      unsignedlong              baudclk_rate;
 
      unsignedint                 rx_irq;
      unsignedint                 tx_irq;
 
      structs3c24xx_uart_info       *info;
      structs3c24xx_uart_clksrc     *clksrc;
      structclk              *clk;
      structclk              *baudclk;
      structuart_port            port;
 
#ifdef CONFIG_CPU_FREQ
      structnotifier_block            freq_transition;
#endif
};
static structs3c24xx_uart_ports3c24xx_serial_ports[CONFIG_SERIAL_SAMSUNG_UARTS] = {
       [0]= {  //串口0
             .port= {
                    .lock             =__SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[0].port.lock),
                    .iotype           =UPIO_MEM,  //
                    .irq         =IRQ_S3CUART_RX0,   //中断号
                    .uartclk   = 0,   //时钟值
                    .fifosize   = 16,   //定义FIFO缓存区大小
                    .ops        = &s3c24xx_serial_ops, //串口相关操作函数
                    .flags            = UPF_BOOT_AUTOCONF,
                    .line        = 0, //线路1
             }
       },
       [1]= {//串口1
             .port= {
                    .lock             =__SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[1].port.lock),
                    .iotype           = UPIO_MEM,
                    .irq         = IRQ_S3CUART_RX1,
                    .uartclk   = 0,
                    .fifosize   = 16,
                    .ops        = &s3c24xx_serial_ops,
                    .flags            = UPF_BOOT_AUTOCONF,
                    .line        = 1,
             }
       },
#if CONFIG_SERIAL_SAMSUNG_UARTS > 2
 
       [2]= {//串口2
             .port= {
                    .lock             =__SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[2].port.lock),
                    .iotype           = UPIO_MEM,
                    .irq         = IRQ_S3CUART_RX2,
                    .uartclk   = 0,
                    .fifosize   = 16,
                    .ops        =&s3c24xx_serial_ops,
                    .flags            = UPF_BOOT_AUTOCONF,
                    .line        = 2,
             }
       },
#endif
};

 

 

综上所述,s3c2440主要是实现这三个数据结构: 

s3c24xx_serial_ops,  s3c24xx_uart_drv,  s3c24xx_uart_ports3c24xx_serial_ports

下篇将进一步结合源码探讨ARM-Linuxs3c2440 的实现。

关键字:ARM  Linux  s3c2440  UART 引用地址:ARMLinux s3c2440 之UART分析二

上一篇:ARMLinux s3c2440 之UART分析一
下一篇:ARM-Linux s3c2440 之I2C分析

推荐阅读最新更新时间:2024-03-16 14:56

51单片机入门 - UART串口
对于单片机来说,通信则与传感器、存储芯片、外围控制芯片等技术紧密结合,成为整个单片机系统的“神经中枢”。 1、初步认识 一位一位的发送出去的,要发送 8 次才能发送完一个字节。 STC89C52有两个引脚是专门用来做 UART串行通信的,一个是 P3.0一个是 P3.1,它们还分别有另外的名字叫做 RXD和TXD,由它们组成的通信接口就叫做串行接口,简称串口。 波特率:发送二进制数据位的速率,习惯上用 baud 表示;即我们发送一位二进制数据的持续时间=1/baud。 通信过程:在UART 通信的时候,一个字节是 8 位,规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位 0
[单片机]
51单片机入门 - <font color='red'>UART</font>串口
软银拟收购ARM 英特尔面临更大竞争压力
与英国公司ARM Holdings PLC (ARMH)之间的竞争总会给英特尔公司(Intel Co. ,INTC)带来特殊麻烦,英特尔已多次尝试突破ARM对智能手机芯片技术的封锁,但均以失败告终。这项任务可能很快会变得更加艰巨。 日本软银集团股份有限公司(SoftBank Group Corp. ,9984.TO)周一宣布,计划以320亿美元收购ARM,并承诺对ARM进行更多投资,帮助其在五年内将员工数量增加一倍。ARM获得的额外资金也将被用于收购和内部技术发展,以增强该芯片设计公司在新市场的影响力,比如数据中心设备这个英特尔占据优势的市场。 Linley Group分析师Linley Gwenn称,对于英特尔
[半导体设计/制造]
ARM芯片选择的一般原则
1.1 ARM芯核 如果希望使用WinCE或Linux等操作系统以减少软件开发时间,就需要选择ARM720T以上带有MMU(memory management unit)功能的ARM芯片,ARM720T、StrongARM、ARM920T、ARM922T、ARM946T都带有MMU功能。而 ARM7TDMI没有MMU,不支持Windows CE和大部分的Linux, 但目前有uCLinux等少数几种Linux不需要MMU的支持。 1.2 系统时钟控制器 系统时钟决定了ARM芯片的处理速度。ARM7的处理速度为0.9MIPS/MHz,常见的ARM7芯片系统主时钟为20MHz- 133MHz,ARM9的处理速度为1.1MI
[单片机]
新建的UART0通讯波特率不一致的问题(波特率降低4倍)
如果用Keil ARM的话自动生成的Startup.s中默认VPBDIV=0X00000000,这就导致 Fpclk 为4分频。导致波特率下降四倍。以下为keil中的Startup.s中默认设定的值。;// e VPBDIV Setup ;// i Peripheral Bus Clock Rate ;// o1.0..1 VPBDIV: VPB Clock ;// 0= VPB Clock = CPU Clock / 4 ;// 1= VPB Clock = CPU Clock ;// 2= VPB Clock = CPU Clock / 2 ;// o1.4..5 XCLKDI
[单片机]
详解bootloader的执行流程与ARM Linux启动过程分析
ARM Linux启动过程分析是本文要介绍的内容,嵌入式 Linux 的可移植性使得我们可以在各种电子产品上看到它的身影。对于不同体系结构的处理器来说Linux的启动过程也有所不同。 本文以S3C2410 ARM处理器为例,详细分析了系统上电后 bootloader的执行流程及 ARM Linux的启动过程。 1、引 言 Linux 最初是由瑞典赫尔辛基大学的学生 Linus Torvalds在1991 年开发出来的,之后在 GNU的支持下,Linux 获得了巨大的发展。虽然 Linux 在桌面 PC 机上的普及程度远不及微软的 Windows 操作系统,但它的发展速度之快、用户数量的日益增多,也是微软所不能轻视的。而近些
[单片机]
详解bootloader的执行流程与<font color='red'>ARM</font> <font color='red'>Linux</font>启动过程分析
基于ARM S3C44B0X 的LED显示屏设计
为了简化L ED 显示屏 的 驱动 电路,节约单片机的端口资源,对常见的L ED 显示屏驱动电路进行了改进,全部采用通用的串入并出移位寄存器作为选通驱动,系统全部采用串行数据控制,形成了一种只需4 根信号线的L ED 显示屏驱动电路解决方案,仅需占用单片机的4个I/ O 端口发送串行数据就可以实现正常的 显示 功能,文中给出相应的程序代码。    1 、引言   L ED 显示屏应用十分广泛,是信息传播的有效工具。在某井下矿采设备监测系统中选用了 ARM S3C44B0X 32 位单片机作为CPU ,根据应用要求,监测系统的显示部分使用16 行的单色L ED 显示屏实时显示监测数据。由于系统 外设 较多,端口资源十分
[电源管理]
基于<font color='red'>ARM</font> S3C44B0X 的LED显示屏设计
基于ARM的PWM模块的超声波检测系统的设计
  近年来以微电子学和计算机技术为基础的信息技术飞速发展,超声无损检测仪器也得到了前所未有的发展动力,为了提高检测的可靠性和提高检测效率,研制数字化、智能化、自动化、图像化的超声仪是当今无损检测领域发展的一个重要趋势。而传统的超声波检测仪存在准确性差、精度低、体积大、功耗大、人机界面不友好等问题。而超声波发射与控制电路正是在一种基于ARM的超声波检测系统的基础上,以ARM微控制器为核心,使用C语言编程,方便地实现了发射频率与激励电压脉冲幅度的调节。    1 超声波检测系统的总体设计结构   基于ARM超声波检测系统的总体结构框图,如图1所示。该系统主要由3部分组成:超声波前端发射接收电路、DSP和ARM处理器。   
[单片机]
基于<font color='red'>ARM</font>的PWM模块的超声波检测系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved