当前位置: 首页 > news >正文

linux SPI驱动代码追踪

一、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设备

从内核启动开始

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() 函数去执行。


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、注册SP控制器

module_init(s3c64xx_spi_init);

http://www.lryc.cn/news/33071.html

相关文章:

  • Ls-dyna材料的相关学习笔记
  • Arrays方法(copyOfRange,fill)
  • AcWing - 蓝桥杯集训每日一题(DAY 1——DAY 5)
  • RHCSA-文件的其他命令(3.7)
  • 多线程update导致的mysql死锁问题处理方法
  • SpringBoot 如何保证接口安全?
  • 英伟达驱动爆雷?CPU占用率过高怎么办?
  • 链表经典面试题【典中典】
  • Java泛型深入
  • 体验Linux USB 驱动
  • servlet 中的ServletConfig与servletContext
  • Hadoop3.1.3单机(伪分布式配置)
  • HBase---浅谈HBase原理
  • 学习笔记四:dockerfile
  • 微服务里的小问题
  • 数据库之基本功:Where 中常用运算符
  • 浅谈 Nodejs原型链污染
  • Linux系统安装Docker
  • MCP2515国产替代DP2515带有SPI 接口的独立CAN 控制器
  • 【Kubernetes】第二十篇 - k8s 污点和容忍度
  • 60% 程序员大呼:我要远程办公!
  • jmeter+ant+jenkins接口自动化测试框架
  • 【protoc自定义插件】「go语言」实现rpc的服务映射成http的服务,protoc生成gin的插件,(详解实现原理及过程)
  • 【C语言】3天速刷C语言(语句、函数)
  • Linux系统中指针的详细分析与操作
  • 工程(十一)——NUC11+D435i+VINS-FUSION+ESDF建图(github代码)
  • 第十四届蓝桥杯三月真题刷题训练——第 4 天
  • Hadoop 运行环境搭建(开发重点)
  • 在社交媒体上行之有效的个人IP趋势
  • Java网络编程