Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1710633
  • 博文数量: 143
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1462
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-23 11:14
文章分类

全部博文(143)

文章存档

2022年(3)

2021年(13)

2020年(21)

2019年(8)

2018年(28)

2017年(7)

2016年(63)

我的朋友

分类: 嵌入式

2016-08-27 15:37:55

背景介绍:本文选自:http://blog.163.com/wxiongn@126/blog/static/11788203820111126103811200/。原文写的精简而详细,通读后能对SPI子系统架构、SPI每一层的代码位置和实现等,具备基本的认知。本文是将其中最重要的部分节选出来,方便以后遇到其它版本Linux内核的SPI子系统时,能用如下内容快速分析和开发。我不生产水,我只是大自然的搬运工。

1 SPI是撒子
  SPI(同步外设接口)是由摩托罗拉公司开发的全双工同步串行总线,有4根线分别是SDI(数据输入),SDO(数据输出),SCLK(时钟),CS(片选),一些处理器还支持5线模式。
2 SPI架构
  在2.6的linux内核中,SPI的驱动架构可以分为如下三个层次:SPI 核心层、SPI控制器驱动层和SPI设备驱动层。
2.1 SPI核心层
  SPI核心层主要是,提供核心数据结构的定义、SPI控制器驱动和设备驱动的注册配置等API接口。这一层向下屏蔽了硬件差异性,向上为SPI控制器层提供了统一的接口。
2.2 SPI控制器层
  每种处理器平台都有自己的SPI控制器,每个SPI控制器负责连接若干个SPI从设备,并提供相应的读写方法。这一层属于平台移植相关层。以下分析SPI控制器master驱动。
  SPI控制器的设备和驱动是要挂在总线上的,所以spi控制器驱动用到了platform虚拟总线。
  SPI控制器platform device:是在BSP的init过程中,通过platform_device_register将SPI控制器的platform设备注册进系统。通常是在 arch/arm/mach-***/xxx.c中添加platform device(如arch/arm/mach-davinci/devices-da8xx.c)。若片上有n个spi控制器,可以在此定义n个platform_device。注册成功后即可在sys/bus/platform/devices下看到对应的***_spi.n。
  SPI控制器platform driver:是通过platform_driver_register注册SPI控制器的platform驱动。一般是在driver/spi/xxx.c中(如driver/spi/davinci_spi.c)。注册成功后即可在sys/bus/platform/drivers下看到对应的***_spi。
  当platform_driver和platform_device匹配后(不再研究),会执行platform驱动中的xxx_probe。然后根据传入的platform_device参数,构建一个用于描述SPI控制器的结构体spi_master,并调用spi_register_master()注册spi_master。而且spi_register_master()中注册spi_master完成后,会继续注册spi_device,此时需要选定spi_device自己的spi_master,并利用spi_master提供的传输功能传输spi数据。
2.3 SPI设备层
  不同SPI外设在SPI总线通信上的需求不尽相同,比如模式、时钟速率、片选拐角等,而SPI设备层为用户提供了通过SPI总线访问具体设备的接口,用户自己实现不同的功能。这一层是用户接口层。
  SPI外设:这些跟具体硬件相关的信息都用spi_board_info来描述,当系统初始化时调用spi_register_board_info来将板上所有的外设注册到board_list链表上,后续再遍历board_list链表将SPI外设注册进内核。通常是在arch/arm/mach-***/xxx.c中添加spi device(如arch/arm/mach-davinci/board-da850-evm.c)。注册成功后即可在sys/bus/spi/devices下看到对应的spin.m。
  SPI驱动:以Linux spi通用驱动/driver/spi/spidev.c为例。如果不想写具体的spi设备驱动,使用这个驱动能给我们带来很多便利,非常方便。在内核代码下的Documentation/spi/spidev是对spidev的描述,其中还提供一个spidev_test.c的测试程序。注册成功后即可在sys/bus/spi/drivers下看到对应的spidev。
  当spi driver和spi device匹配后(不再研究),会执行spi driver中的xxx_probe()(即spidev_probe()),xxx_probe()函数会注册spi外设的字符设备。注册成功后即可在dev/下看到对应的spidevn.m字符设备,接着应用程序就可以使用这些字符设备,而这些字符设备的操作函数集在文件spidev.c中实现。

注:下图是驱动加载成功后,sys目录下SPI子系统的目录结构(来源于だへ雄♂√ぷ):

阅读(2909) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~