您的位置 首页 厂商

ARMLinux s3c2440 之UART剖析二

软件篇(linux-2.6.30.4):Linux系统的串口驱动与一般字符设备并一样,它采用层次化的架构,从而看做是一个串行系统来实现。(1)关注UART或…

软件篇(linux-2.6.30.4):

Linux体系的串口驱动与一般字符设备并相同,它选用层次化的架构,然后看做是一个串行体系来完成。

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

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

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

下图描绘了串行体系间的层次结构联系(s3c2440串口完成例),能够归纳为:用户应用层 –> 线路规划层 –>TTY层 –>底层驱动层 –>物理硬件层

线路规程和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_FREQstructnotifier_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 的完成。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/264937.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部