学习笔记 --- LINUX UART串口驱动框架分析

本文详细解析了S3C2440芯片中串口驱动的结构与工作流程,包括虚拟总线机制下的设备与驱动匹配过程、tty设备注册方式以及串口操作函数的调用细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里以S3C2440为例说明内核里面的串口驱动结构,这里也是用的虚拟总线,一边设备,一边驱动,两个名字匹配上就调用probe 函数。另外一个uart是tty设备的一种,注册一个uart就是注册一个tty,而一个平台往往对uart有统一抽象的操作,所以uart的驱动都统一了,这里的是uart_ops结构体;所以重点关心tty设备,注册uart设备通过uart_add_one_port 函数。下面看下代码调用分析,我把一个完整的驱动分成了三个部分:

1 虚拟总线驱动端:

  s3c2440_serial_probe  //与设备端匹配"s3c2440-uart"时调用这个函数
       uart_add_one_port     //s3c24xx_serial_ports : 设备对应的底层信息与操作函数
             tty_register_device   //注册这个tty设备

2 虚拟总线设备端:

  s3c24xx_init_uarts

       (cpu->init_uarts)(cfg, no);   -> cpu_ids 的 s3c244x_init_uarts
        s3c24xx_init_uartdevs  //填充platform_device -> s3c24xx_uart_src 传递给驱动端

3 uart的tty驱动:
s3c24xx_serial_modinit
      uart_register_driver
           alloc_tty_driver
           tty_set_operations   //uart_ops :uart操作的抽象,会调用s3c24xx_serial_ports 里面的操作函数
           tty_register_driver  //注册这个tty设备的驱动


上面这三个部分的数据传递关系:虚拟总线设备端  -> 虚拟总线驱动端 -> uart的tty驱动

解释:

1虚拟总线设备端传递硬件配置信息给驱动端:名称,资源(寄存器地址),平台数据(寄存器配置)

2虚拟总线驱动端传递具体硬件操作函数给uart的tty驱动(UART操作抽象)

——————————————————————————————

打开串口的函数调用过程为:
uart_open
     uart_startup
         uart_port_startup

             uport->ops->startup  ->s3c24xx_serial_startup

关闭串口的函数调用过程为:
uart_close
    uart_shutdown
        uart_port_shutdown
             uport->ops->shutdown ->s3c24xx_serial_shutdown
发送串口数据的函数调用过程为:
uart_write
     uart_start
        __uart_start

             port->ops->start_tx  ->s3c24xx_serial_start_tx

其他函数的调用原理是一样的,这里不详解了。

Linux系统中的串口编程涉及到对串口的调用方式和参数设置。Linux系统中的UART串口驱动框架可以通过网络ftpget、ftpput命令上传和下载文件,同时也可以通过串口进行文件的上传和下载。可以使用lrzsz工具来实现。可以使用stty命令来查看和设置串口参数,例如使用stty -F /dev/ttyS0 -a来查看串口1(/dev/ttyS0)当前的参数,使用stty -F /dev/ttyS0 ispeed 115200 ospeed 115200 cs8来设置串口1(/dev/ttyS0)的波特率为115200,数据位为8位等。使用cat命令可以打印串口数据,例如使用cat /dev/ttyS0可以在终端上显示串口数据。而使用echo命令可以发送数据,例如使用echo "HelloWorld" >/dev/ttyS0可以发送数据到串口1。在ZYNQ平台下,同样可以使用这些方法进行串口编程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [zynq操作系统: Linux驱动开发串口篇](https://blog.youkuaiyun.com/qq_42330920/article/details/115616293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Zynq-Linux移植学习笔记之51-ZYNQ通过串口上传下载文件](https://blog.youkuaiyun.com/jj12345jj198999/article/details/122203484)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值