推广 广州网站建设公司,wordpress hacker,25亿企业网站管理系统,html公司网页一、Linux SPI 框架概述
linux系统下的spi驱动程序从逻辑上可以分为3个部分:
SPI Core#xff1a;SPI Core 是 Linux 内核用来维护和管理 spi 的核心部分#xff0c;SPI Core 提供操作接口#xff0c;允许一个 spi master#xff0c;spi driver 和 spi device 在 SPI Cor…一、Linux SPI 框架概述
linux系统下的spi驱动程序从逻辑上可以分为3个部分:
SPI CoreSPI Core 是 Linux 内核用来维护和管理 spi 的核心部分SPI Core 提供操作接口允许一个 spi masterspi driver 和 spi device 在 SPI Core 中进行注册、注销。
SPI Master DriverSPI Master针对不同类型的spi控制器硬件实现spi总线的硬件访问操作。SPI Master通过接口函数向SPI Core注册一个控制器。
SPI Device DriverSPI 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);