一、Linux SPI 框架概述

linux系统下的spi驱动程序从逻辑上可以分为3个部分:

SPI Core:SPI Core 是 Linux 内核用来维护和管理 spi 的核心部分,SPI Core 提供操作接口,允许一个 spi master,spi driver 和 spi device 在 SPI Core 中进行注册、注销。

SPI Master Driver:SPI Master针对不同类型的spi控制器硬件,实现spi总线的硬件访问操作。SPI Master通过接口函数向SPI Core注册一个控制器。

SPI Device Driver:SPI Driver是对应于spi设备端的驱动程序,通过接口函数向SPI Core进行注册,SPI Driver的作用是将spi设备挂接到spi总线上;

二、代码追踪

1、注册SPI board_info

从内核启动开始
Linux从上电起执行完汇编代码阶段之后,就跳入main.c文件中,开始执行 start_kernel,一些系统外设的初始化设定、注册总线等等众多的初始化工作都在这里完成的。
在这里重点提及下面的几个函数的执行顺序以及它们完成的主要工作。

setup_arch() 函数
这里的函数流程主要是取出在 arch.info.init 段中MACHINE_START所定义的函数指针。这里其中有 .init_machine = smdkc110_machine_init 被赋予 void (*init_machine)(void) __initdata 这个函数指针,做好这些赋值工作之后,以便于后面的函数进行扫描arch.info.init 段中对应的函数以及进行执行它们。

reset_init() 函数
reset_init() 函数是 start_kernel() 函数中最后执行的一个函数,它的功能是创建一个内核线程,然后逐条取出 arch.info.init 段中的函数指针,执行对应的初始化函数。
在这里注意初始化顺序,setup.c中,宏定义 arch_initcall(customize_machine);规定了它的执行顺序是3,即:(arch_initcall(fn) __define_initcall(“3”,fn,3))

spi_register_board_info() 函数
spi_register_board_info() 函数为给定的板子注册SPI设备(片上spi资源)。
它在 smdkc110_machine_init() 函数中执行,而smdkc110_machine_init() 在宏定义 MACCHINA_START中赋值给 .init_machine成员,在上面的 setup_arch() 函数中 又赋值给void (*init_machine)(void) __initdata 这个函数指针,最后通过 reset_init() 函数去执行。

上面所有的过程,都为了一个结果,就是把 spi_board_info 注册到链表 board_list上。spi_device 封装了一个 spi_master 结构体,spi_master 的注册会在spi_register_board_info 之后,spi_master 注册的过程中会调用 scan_boardinfo 扫描board_list,找到挂接在它上面的spi设备,然后创建并注册spi_device。

2、注册 SPI 总线

SPI 总线注册流程如下图。触发这个流程的关键是宏定义 :postcore_initcall(spi_init)。

#define postcore_initcall(fn) __define_initcall(“2”,fn,2)

这个宏在 reset_init() 函数中扫描 arch.info.init 段中被执行 可见它的执行顺序比较早,早于上面的 spi_register_board_info()的注册。流程如下:

3、注册SPI控制器

spi_master 是控制器驱动层,主要提供 transfer 函数,进行 spi 协议的收发。spi_master 基于 Platform 总线模型,注册 spi_master 时扫描一个链表进行注册设备。注册函数用module_init(s3c64xx_spi_init)。

spi_register_master() 函数
由于spi设备不能被spi总线动态扫描,所以spi子系统使用了另一种方法,就是通过spi_register_board_info 函数将spi设备静态得登记到系统中。最后在 scan_boardinfo 函数中根据这些保存的结构体创建 spi 设备,(spi_new_device)。

spi_register_master
  -->device_add
   -->scan_boardinfo
    -->list_for_each_entry
     -->spi_new_device

==============================================================

platform_driver_register
->driver_register
->bus_add_driver
->driver_attach
->__driver_attach
->
(1、match----driver_match_device总线回调函数match匹配dev&drv
2、probe---driver_probe_device->really_probe->drv->probe(dev);)

linux SPI驱动代码追踪相关推荐

  1. linux i2c adapter 增加设备_「正点原子Linux连载」第六十二章Linux SPI驱动实验(一)...

    1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南>关注官方微信号公众号,获取更多资料:正点原子 第六十二章Linux SPI驱动实验 上一 ...

  2. Linux SPI驱动框架(2)——控制器驱动层

    SPI控制器驱动层   上节中,讲了SPI核心层的东西,这一部分,以全志平台SPI控制器驱动为例,对SPI控制器驱动进行说明. SPI控制器驱动,即SPI硬件控制器对应的驱动,核心部分需要实现硬件SP ...

  3. linux SPI驱动开发

    一,linux内核设备驱动分三类 1,字符设备驱动:按字节来访问设备,字符驱动负责驱动字符设备,这样的驱动通常实现open,close,read,write系统调用. 特点:操作的硬件,按照字节流形式 ...

  4. Linux SPI驱动框架(3)——设备驱动层

    SPI设备驱动层   Linux SPI驱动框架(1)和(2)中分别介绍了SPI框架中核心层,和控制器驱动层.其实实际开发过程中,不是IC原厂工程师比较少会接触控制器驱动层,设备驱动层才是接触比较多的 ...

  5. 【正点原子Linux连载】第六十二章 Linux SPI驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  6. Linux SPI驱动框架(1)——核心层

    概述   linux SPI驱动框架主要分为核心层,控制器驱动层以及设备驱动层.具体结构可参考下图   图中,最下层是硬件空间,SPI总线控制器,总线控制器负责硬件上的数据交互.内核空间中,需要有对应 ...

  7. linux spi不使用框架,Linux spi驱动框架之执行流程

    Linux spi驱动架构由三部分构成:SPI核心层.SPI控制器驱动层.和SPI设备驱动程序. 1.SPI核心层: SPI核心层是Linux的SPI核心部分,提供了核心数据结构的定义.SPI控制器驱 ...

  8. Linux spi驱动分析(四)----SPI设备驱动(W25Q32BV)

    一.W25Q32BV芯片简介 W25X是一系列SPI接口Flash芯片的简称,它采用SPI接口和CPU通信,本文使用的W25Q32BV容量为32M,具体特性如下: 1.1.基本特性 该芯片最大支持10 ...

  9. Linux spi驱动分析----SPI设备驱动(W25Q32BV)

    转载地址:http://blog.chinaunix.net/uid-25445243-id-4026974.html 一.W25Q32BV芯片简介 W25X是一系列SPI接口Flash芯片的简称,它 ...

最新文章

  1. InnoDB: Error: log file .\ib_logfile0 is of different size 0 10485760 bytes
  2. (详细)Hibernate框架的搭建,Hibernate的CRUD操作(一)
  3. 【NLP】TransformerXL:因为XL,所以更牛
  4. Java面试宝典系列之基础面试题String、变量、类与对象、集合类、SSH(三)
  5. spark UDAF
  6. java spr_Java中的42行代码中的URL缩短器服务(Java(?!)Spring Boot + Redis
  7. html查看程序魅族,怎么查看源代码(什么工具能查出一个程序的代码)
  8. dj鲜生-01-新建项目-配置数据库
  9. Java 多条件复杂排序小结
  10. sax 解析 xml
  11. LeetCode 97. 交错字符串(动态规划)
  12. macOS版本大升级,这几项的细节值得你关注
  13. .net 中使用rabbitmq
  14. Linux安装redis(6.0.9)环境
  15. MySQL 管理表记录
  16. PreaparedStatement中execut的使用
  17. c++图的创建_如何在photoshop中创建汉堡菜单模板
  18. linux系统带界面,linux系统界面详情介绍
  19. 企业内部信息安全管理——(一)风险识别和管控
  20. 蓝牙协议栈测试,蓝牙协议栈认证:蓝牙BQB认证中End Product/Subsystem和Component的认证区别

热门文章

  1. JDK/Java 17 马上来袭,看看带来哪些新特性?
  2. Java字节缓冲流/字符流/IO流小结
  3. 形状补间制作摇曳的烛光动画
  4. 开源一款自用听书App---Ting
  5. android:SeekBar控制系统音量(媒体音量键和通话音量键的diallog自动切换调节控制)
  6. IDEA debug模式下修改变量后运行
  7. 获取iframe嵌套页面的数据_爬虫学习十二之案例开发获取搜索页面数据
  8. 再见!IE浏览器,这条路由Edge替IE继续走下去
  9. python写入csv中文乱码
  10. v-for在表格标签的tr标签里不能用