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):
- static int __inits3c24xx_serial_modinit(void)
- {
- intret;
- ret= uart_register_driver(&s3c24xx_uart_drv); //注册uart驱动,在serial_core.c中实现
- if(ret < 0) {
- printk(KERN_ERR"failed to register UART driver\n");
- return-1;
- }
- return0;
- }
uart_register_driver在串口核心及TTY层间进行相关注册:
- int uart_register_driver(struct uart_driver*drv)
- {
- struct tty_driver *normal = NULL;
- …
- drv->tty_driver= normal;
- normal->owner = drv->owner;
- normal->driver_name = drv->driver_name;
- normal->name = drv->dev_name;
- normal->major = drv->major;
- normal->minor_start = drv->minor;
- normal->type = TTY_DRIVER_TYPE_SERIAL;
- normal->subtype = SERIAL_TYPE_NORMAL;
- normal->init_termios = tty_std_termios;
- normal->init_termios.c_cflag= B9600 | CS8 | CREAD | HUPCL | CLOCAL;
- normal->init_termios.c_ispeed= normal->init_termios.c_ospeed = 9600;
- normal->flags = TTY_DRIVER_REAL_RAW |TTY_DRIVER_DYNAMIC_DEV;
- normal->driver_state = drv;
- tty_set_operations(normal,&uart_ops);
- ….
- retval= tty_register_driver(normal); // tty 驱动注册
- out:
- if(retval < 0) {
- put_tty_driver(normal);
- kfree(drv->state);
- }
- returnretval;
- }
接着进行总线驱动platform_driver_register:
- int s3c24xx_serial_init(structplatform_driver *drv,
- structs3c24xx_uart_info *info)
- {
- #ifdef CONFIG_PM
- drv->suspend= s3c24xx_serial_suspend;
- drv->resume= s3c24xx_serial_resume;
- #endif
- returnplatform_driver_register(drv); //
- }
其中s3c24xx_serial_init为__init段,模块加载时初始化:
- static int __init s3c2440_serial_init(void)
- {
- returns3c24xx_serial_init(&s3c2440_serial_drv, &s3c2440_uart_inf); //
- }
platfrom_driver_register()中调用driver_register()
- int platform_driver_register(structplatform_driver *drv)
- {
- drv->driver.bus= &platform_bus_type; //
- if(drv->probe)
- drv->driver.probe= platform_drv_probe;
- if(drv->remove)
- drv->driver.remove= platform_drv_remove;
- if(drv->shutdown)
- drv->driver.shutdown= platform_drv_shutdown;
- if(drv->suspend)
- drv->driver.suspend= platform_drv_suspend;
- if(drv->resume)
- drv->driver.resume= platform_drv_resume;
- returndriver_register(&drv->driver); //
- }
因为串口设备在系统是一种platform_device所以是一种总线驱动类型,总线设备驱动注册platform_driver_register()之后,串口设备即可和相应的驱动关联起来了,这样就完成了串口设备与串口驱动的注册过程。
下一篇讲进一步结合源码分析。
上一篇:ARM-Linux s3c2440 之UART分析(四)
下一篇:ARM-Linux s3c2440 之UART分析(二)
推荐阅读最新更新时间:2024-03-16 14:56
设计资源 培训 开发板 精华推荐
- 应用指南下载|是德科技《快速查找和识别隐藏的信号误差》
- 找小伙伴们一起去闯 STM32 F7英雄联盟设计大赛
- 下载【ADI 6本精选电子书】,截图抽红包啦~
- 今天上午10:0有奖直播|完美替代传统汽车钥匙?探索英飞凌数字钥匙解决方案
- 红外战高温,下载预测性维护手册,预约热像仪、测温仪有好礼!
- TI C2000TM的信号链实时性评测和使用教程
- 了解 PI 全新 PowiGaN 开关电源 IC ,答题赢好礼!
- 免费样片申请、技术干货|Littelfuse数据中心解决方案专区
- 有奖直播:ADI数字主动降噪耳机方案 8月6日上午10:00-11:30 邀您聆听让技术为我们静下来
- 体积小、功耗低、安全性高,专用加密芯片ATSHA204 精彩专题,答题有好礼!
- 关于MSP430FR5969使用外部有源晶振频率差异太大问题
- 为什么晶体管共基极接法适合宽带放大?
- 晒一个高大上的无线开发板!
-
VS2005 C++基于对话框的智能设备程序,引入头文件
后,增加变量CFtpConnection* m_pFTPConnection;出错 - 例程:如何使用PX2硬解码H.264裸码流 [CODE_PX2]Decode_RAW_H264_FILE
- 有关STM32F407 SPI DMA收发程序问题
- “好奇”号火星车已在火星表面着陆(ZT)
- 路由节点可不可用于采集数据等工作啊。。
- pcf8563和 单片机内部(STM8L)RTC那个更准
- 用ccs 调试出来的tm4c123gh6pz的彩屏