您的位置 首页 观点

ARM-Linux s3c2440 之UART剖析(二)

本文系itspy原创,复制/转载请尽量标明原出处http://blog.csdn.net/yyplc/article/details/7196290,谢谢!软件篇(linux-2.6.30.4):Li

本文系itspy原创,仿制/转载请尽量标明原出处http://blog.csdn.net/yyplc/article/details/7196290,谢谢!

软件篇(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结构

  1. staticstructuart_opss3c24xx_serial_ops={
  2. .pm=s3c24xx_serial_pm,//电源办理函数
  3. .tx_empty=s3c24xx_serial_tx_empty,//检车发送FIFO缓冲区是否空
  4. .get_mctrl=s3c24xx_serial_get_mctrl,//是否串口流控
  5. .set_mctrl=s3c24xx_serial_set_mctrl,//是否设置串口流控cts
  6. .stop_tx=s3c24xx_serial_stop_tx,//中止发送
  7. .start_tx=s3c24xx_serial_start_tx,//发动发送
  8. .stop_rx=s3c24xx_serial_stop_rx,//中止接纳
  9. .enable_ms=s3c24xx_serial_enable_ms,//空函数
  10. .break_ctl=s3c24xx_serial_break_ctl,//发送break信号
  11. .startup=s3c24xx_serial_startup,//串口发送/接纳,以及中止请求初始装备函数
  12. .shutdown=s3c24xx_serial_shutdown,//封闭串口
  13. .set_termios=s3c24xx_serial_set_termios,//串口clk,波特率,数据位等参数设置
  14. .type=s3c24xx_serial_type,//CPU类型关于串口
  15. .release_port=s3c24xx_serial_release_port,//开释串口
  16. .request_port=s3c24xx_serial_request_port,//请求串口
  17. .config_port=s3c24xx_serial_config_port,//串口的一些装备信息info
  18. .verify_port=s3c24xx_serial_verify_port,//串口检测
  19. };

驱动程序结构界说:

  1. staticstructuart_drivers3c24xx_uart_drv={
  2. .owner=THIS_MODULE,
  3. .dev_name=”s3c2440_serial”,//详细设备称号
  4. .nr=CONFIG_SERIAL_SAMSUNG_UARTS,//界说有几个端口
  5. .cons=S3C24XX_SERIAL_CONSOLE,//console接口
  6. .driver_name=S3C24XX_SERIAL_NAME,//串口名:ttySAC
  7. .major=S3C24XX_SERIAL_MAJOR,//主设备号
  8. .minor=S3C24XX_SERIAL_MINOR,//次设备号
  9. };

端口装备结构界说,其间包含了一个structuart_ports结构:

  1. structs3c24xx_uart_port{
  2. unsignedcharrx_claimed;
  3. unsignedchartx_claimed;
  4. unsignedintpm_level;
  5. unsignedlongbaudclk_rate;
  6. unsignedintrx_irq;
  7. unsignedinttx_irq;
  8. structs3c24xx_uart_info*info;
  9. structs3c24xx_uart_clksrc*clksrc;
  10. structclk*clk;
  11. structclk*baudclk;
  12. structuart_portport;
  13. #ifdefCONFIG_CPU_FREQ
  14. structnotifier_blockfreq_transition;
  15. #endif
  16. };
  17. staticstructs3c24xx_uart_ports3c24xx_serial_ports[CONFIG_SERIAL_SAMSUNG_UARTS]={
  18. [0]={//串口0
  19. .port={
  20. .lock=__SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[0].port.lock),
  21. .iotype=UPIO_MEM,//
  22. .irq=IRQ_S3CUART_RX0,//中止号
  23. .uartclk=0,//时钟值
  24. .fifosize=16,//界说FIFO缓存区巨细
  25. .ops=&s3c24xx_serial_ops,//串口相关操作函数
  26. .flags=UPF_BOOT_AUTOCONF,
  27. .line=0,//线路1
  28. }
  29. },
  30. [1]={//串口1
  31. .port={
  32. .lock=__SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[1].port.lock),
  33. .iotype=UPIO_MEM,
  34. .irq=IRQ_S3CUART_RX1,
  35. .uartclk=0,
  36. .fifosize=16,
  37. .ops=&s3c24xx_serial_ops,
  38. .flags=UPF_BOOT_AUTOCONF,
  39. .line=1,
  40. }
  41. },
  42. #ifCONFIG_SERIAL_SAMSUNG_UARTS>2
  43. [2]={//串口2
  44. .port={
  45. .lock=__SPIN_LOCK_UNLOCKED(s3c24xx_serial_ports[2].port.lock),
  46. .iotype=UPIO_MEM,
  47. .irq=IRQ_S3CUART_RX2,
  48. .uartclk=0,
  49. .fifosize=16,
  50. .ops=&s3c24xx_serial_ops,
  51. .flags=UPF_BOOT_AUTOCONF,
  52. .line=2,
  53. }
  54. },
  55. #endif
  56. };

综上所述,s3c2440首要是完成这三个数据结构:

s3c24xx_serial_ops, s3c24xx_uart_drv, s3c24xx_uart_ports3c24xx_serial_ports

下篇将进一步结合源码讨论ARM-Linuxs3c2440 的完成。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部