0
点赞
收藏
分享

微信扫一扫

linux驱动开发架构


  最近开始开发驱动,现总结通用驱动开发模型如下

  驱动整体模型:

  

linux驱动开发架构_服务器

  添加一个设备,多数需要用户空间下发指令等操作。那么有两个问题:

  kernel如何控制设备用户空间如何和kernel中的驱动交互

  问题1:

  kernel中有各种总线,设备挂载在总线上,驱动通过kernel总线提供的接口初始化控制设备。

  问题2:

  kernel中提供文件设备驱动,在驱动中增加一个文件设备,如字符设备、proc、sys等文件设备。

  基于以上两个问题,驱动包含两部分

  

linux驱动开发架构_服务器_02

  系统端驱动开发步骤

  1、阅读设备相关的规格书、demo

  2、确定设备挂载总线、文件交互设备

  3、参照demo,编写驱动代码,代码包含两部分:设备树添加结点、逻辑代码

  注意: 设备树结点中的字段可以是标准的(内核已有代码解析),也可以包含自定义的(设备驱动逻辑代码解析)。

  设备端基于单片机驱动开发

  设备端硬件形态有两种:

  1、设备端有一个独立的小系统,通过一个单片机运行

  2、设备端仅由电子原件和电路图实现

  形态1:

  一般情况下,该部分代码,设备厂商已提供,无需系统端负责开发。系统端通过总线和设备进行交互。

  形态2:

  设备端上电后,驱动实现初始化,控制设备端寄存器,配置设备以满足对设备功能、数据的需求

  应用场景

  以上描述的驱动开发架构模式,常用于应用级驱动开发。一些控制器类型,如i2c控制器、spi总线控制器等kernel中框架层的,一般不需要文件系统设备的存在,只需要开发设备驱动即可;为debug方便,一般也会搭配文件系统设备,方便命令行查看设备状态。

  在开发中,可以根据实际需求决定。

  需求描述

  给一个i2c编写驱动,i2c提供一些接口给userspace使用

  添加设备树结点

  驱动实现

  在代码实现中把文件系统设备实现和设备驱动实现混合在一起,个人加以分开实现,利于代码重用和设备驱动替换和多方案切换。

  验证

  通过上面的驱动, 我们可以在应用层操作设备文件从mpu6050寄存器中读取原始数据, 应用层如下

  最终可以获取传感器的原始数据如下

  

linux驱动开发架构_linux_03

  说明: 在实际开发中个人也有实现,代码不在写该篇博客的电脑中,就借用了大神代码。


举报

相关推荐

0 条评论