2.6内核以后,多数驱动都是以平台总线的方式编写,因此对于这种类型的驱动,实际就是要分成两个流程来分析

平台总线设备的构造,平台总线驱动的构造。

下面先分析平台总线设备的构造,平台总线设备里是硬件相关的信息,比如中断资源,寄存件地址定义。

1. arch/arm/mach-s5pv210/mach-x210.c

smdkc110_map_io()

s3c24xx_init_uarts(smdkc110_uartcfgs, ARRAY_SIZE(smdkc110_uartcfgs))

2. arch/arm/mach-s5pv210/init.c

s5pv210_common_init_uarts(struct s3c2410_uartcfg *cfg, int no)

s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no)

3. arch\arm\plat-samsung\init.c

s3c24xx_init_uartdevs(char *name, struct s3c24xx_uart_resources *res, struct s3c2410_uartcfg *cfg, int no)

上面3部完成了  platform_device  的构造

其中:name = "s5pv210-uart"

resource = arch\arm\plat-s5p\dev-uart.c 文件中定义s3c24xx_uart_resources结构体

dev.platform_data = arch\arm\mach-s5pv210\mach-x210.c  文件中定义 s3c2410_uartcfg 结构体

下面分析平台总线驱动

1. drivers/serial/s5pv210.c

s5p_serial_init(void)

s3c24xx_serial_init(&s5p_serial_driver, *s5p_uart_inf)

2. drivers\serial\samsung.c

s3c24xx_serial_init(struct platform_driver *drv, struct s3c24xx_uart_info *info)

platform_driver_register(drv);

上面2部构造并注册了platform_driver

因为uart驱动是字符设备驱动,因此,下面分析uart的字符设备驱动的初始化

1.  drivers\serial\samsung.c

s3c24xx_serial_modinit()

uart_register_driver(&s3c24xx_uart_drv)

2.   drivers\serial\serial_core.c

uart_register_driver(struct uart_driver *drv)

tty_register_driver(normal)

3. drivers\char\tty_io.c

tty_register_driver(struct tty_driver *driver)

register_chrdev_region(dev, driver->num, driver->name)

cdev_init(&driver->cdev, &tty_fops)

cdev_add(&driver->cdev, dev, driver->num)

从上面的关键步骤可以看出一个标准的字符设备驱动的初始化流程,但是没有创建出设备文件。显然,设备文件的

创建,应该是平台总线驱动的probe函数创建的。

下面分析设备文件的创建

1.drivers/serial/s5pv210.c

s3c24xx_serial_probe(pdev, s5p_uart_inf[pdev->id])

2. drivers\serial\samsung.c

int s3c24xx_serial_probe(struct platform_device *dev, struct s3c24xx_uart_info *info)

device_create_file(&dev->dev, &dev_attr_clock_source)

可以看到设备文件的创建是在平台总线的驱动的probe函数中创建

V210 UART 整体流程相关推荐

  1. V210 UART TX 流程

    1. 虽然V210的uart驱动是平台总线设备驱动模型,但实际上他还是以字符设备驱动存在,那么分析他的发送流程, 首先找到他的file_operations的write函数 drivers/char/ ...

  2. 机器学习入门(14)— 神经网络学习整体流程、误差反向传播代码实现、误差反向传播梯度确认、误差反向传播使用示例

    1. 神经网络学习整体流程 神经网络学习的步骤如下所示. 前提 神经网络中有合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为学习.神经网络的学习分为下面 4 个步骤. 步骤1(mini-ba ...

  3. 二、Netty服务端/客户端启动整体流程

    一.综述 Netty 的整体流程相对来说还是比较复杂的,初学者往往会被绕晕.所以这里总结了一下整体的流程,从而对 Netty 的整体服务流程有一个大致的了解.从功能上,流程可以分为服务启动.建立连接. ...

  4. X265整体流程-Create

    X265整体流程-Create

  5. 【Swin Transformer Block】的整体流程如下:

    根据上述代码的前向,我们可以了解到Swin Transformer Block的整体流程如下: 先对特征图做norm; 通过shift_size参数决定是否需要对特征图进行shift操作: 然后将特征 ...

  6. HDFS源码分析DataXceiver之整体流程

    在<HDFS源码分析之DataXceiverServer>一文中,我们了解到在DataNode中,有一个后台工作的线程DataXceiverServer.它被用于接收来自客户端或其他数据节 ...

  7. 带你梳理Roach全量恢复的整体流程

    摘要:本文将梳理Roach全量恢复的整体流程,描述Roach集群全量备份场景的运转机制. 数据备份恢复是保护数据安全的重要手段之一.Roach工具支持多种备份恢复类型,例如集群级的物理备份,表级备份的 ...

  8. linux input输入子系统分析《四》:input子系统整体流程全面分析

    1      input输入子系统整体流程 本节分析input子系统在内核中的实现,包括输入子系统(Input Core),事件处理层(Event Handler)和设备驱动层.由于上节代码讲解了设备 ...

  9. MMKV_微信MMKV源码分析(一) | 整体流程

    在使用MMKV框架前,需调用以下方法进行初始化 MMKV.initialize(context); 复制代码 这里的 Java 层主要是获取到保存文件的路径,传入Native层,这里默认的路径是APP ...

最新文章

  1. 系列文章|OKR与敏捷(二):实现全栈敏捷
  2. java BlockingQueue 用法
  3. 洛谷4366——最短路(dijkstra,思维,异或)
  4. 外卖(food) 洛谷4040宅男计划 三分套二分贪心
  5. Spring - Java/J2EE Application Framework 应用框架 第 9 章 DAO支持
  6. OpenGL GPU粒子
  7. malloc分配内存的原理?
  8. HDU3208(区间指数和)
  9. leetcode235. 二叉搜索树的最近公共祖先
  10. Г函数(伽马函数)、分布
  11. 一道『easy』等级的力扣题,我写了两个小时的笔记...
  12. NBOOT分析-NBOOT.c(2)
  13. 小镇青年程序员的逆袭人生:从差点回老家到荔枝技术骨干
  14. nrf51822+rfx2401c系统板(开源原理图、PCB)
  15. 如何修改命令提示符(cmd)的颜色?
  16. android 地球坐标 火星坐标系,IOS开发入门之iOS开发火星坐标系与地球坐标系解析...
  17. JS中的for循环解数学题
  18. Golang 本地缓存选型对比及原理总结
  19. CCC3.0学习笔记_SCP03安全通道
  20. scip指令集_一、设备名称:轮式机器人

热门文章

  1. js react根据几个颜色点计算区间任意数值对应颜色
  2. 记事本和textarea中的换行
  3. html4废弃了哪些元素,HTML中的一些废弃元素_html
  4. IO流的体系及FileReader、FileWriter
  5. java面向对象封装之有参无返与有参有返
  6. C++学习第二天(打卡)
  7. 循序渐进PYTHON3(十三) --4-- DJANGO之CSRF使用
  8. EBS业务学习之应付INVOICE类型
  9. 随机交换检验数据挖掘结果-assessing data mining result via swap randomization
  10. ASP.NET使用Memcached高缓存实例(初级教程)