您的位置 首页 新品

ARM-Linux s3c2440 之UART剖析(三)

回顾一下上文,s3c2440串口底层驱动围绕三个数据结构展开:UART特定的驱动程序结构定义:structuart_drivers3c24xx_uart_drv;UART端口…

回忆一下上文,s3c2440串口底层驱动环绕三个数据结构打开:

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

UART端口结构界说: struct uart_port s3c24xx_serial_ops;

UART相关操作函数结构界说: struct uart_ops s3c24xx_serial_ops;

完成了这三个数据结构体,基本完成了驱动操作函数的完成,紧接着需要对串口设备及设备驱动进行初始化,首先是模块初始化module_init(s3c24xx_serial_modinit):

  1. staticint__inits3c24xx_serial_modinit(void)
  2. {
  3. intret;
  4. ret=uart_register_driver(&s3c24xx_uart_drv);//注册uart驱动,在serial_core.c中完成
  5. if(ret<0){
  6. printk(KERN_ERR”failedtoregisterUARTdriver\n”);
  7. return-1;
  8. }
  9. return0;
  10. }

uart_register_driver在串口中心及TTY层间进行相关注册:

  1. intuart_register_driver(structuart_driver*drv)
  2. {
  3. structtty_driver*normal=NULL;
  4. drv->tty_driver=normal;
  5. normal->owner=drv->owner;
  6. normal->driver_name=drv->driver_name;
  7. normal->name=drv->dev_name;
  8. normal->major=drv->major;
  9. normal->minor_start=drv->minor;
  10. normal->type=TTY_DRIVER_TYPE_SERIAL;
  11. normal->subtype=SERIAL_TYPE_NORMAL;
  12. normal->init_termios=tty_std_termios;
  13. normal->init_termios.c_cflag=B9600|CS8|CREAD|HUPCL|CLOCAL;
  14. normal->init_termios.c_ispeed=normal->init_termios.c_ospeed=9600;
  15. normal->flags=TTY_DRIVER_REAL_RAW|TTY_DRIVER_DYNAMIC_DEV;
  16. normal->driver_state=drv;
  17. tty_set_operations(normal,&uart_ops);
  18. ….
  19. retval=tty_register_driver(normal);//tty驱动注册
  20. out:
  21. if(retval<0){
  22. put_tty_driver(normal);
  23. kfree(drv->state);
  24. }
  25. returnretval;
  26. }

接着进行总线驱动platform_driver_register:

  1. ints3c24xx_serial_init(structplatform_driver*drv,
  2. structs3c24xx_uart_info*info)
  3. {
  4. #ifdefCONFIG_PM
  5. drv->suspend=s3c24xx_serial_suspend;
  6. drv->resume=s3c24xx_serial_resume;
  7. #endif
  8. returnplatform_driver_register(drv);//
  9. }

其间s3c24xx_serial_init为__init段,模块加载时初始化:

  1. staticint__inits3c2440_serial_init(void)
  2. {
  3. returns3c24xx_serial_init(&s3c2440_serial_drv,&s3c2440_uart_inf);//
  4. }

platfrom_driver_register()中调用driver_register()

  1. intplatform_driver_register(structplatform_driver*drv)
  2. {
  3. drv->driver.bus=&platform_bus_type;//
  4. if(drv->probe)
  5. drv->driver.probe=platform_drv_probe;
  6. if(drv->remove)
  7. drv->driver.remove=platform_drv_remove;
  8. if(drv->shutdown)
  9. drv->driver.shutdown=platform_drv_shutdown;
  10. if(drv->suspend)
  11. drv->driver.suspend=platform_drv_suspend;
  12. if(drv->resume)
  13. drv->driver.resume=platform_drv_resume;
  14. returndriver_register(&drv->driver);//
  15. }

由于串口设备在体系是一种platform_device所以是一种总线驱动类型,总线设备驱动注册platform_driver_register()之后,串口设备即可和相应的驱动相关起来了,这样就完成了串口设备与串口驱动的注册进程。

下一篇讲进一步结合源码剖析。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部