基于2.6.28.6内核的SPI驱动总结

原创 2011年01月12日 10:10:00

参考: PowerPC+Linux2.6.25 平台下的SPI驱动构架分析

 

 1、SPI总体构架

      SPI的驱动分为三个层次:硬件抽象层、平台依赖层和用户接口层。

 1.1、硬件抽象层(核心层)

      drivers/spi/spi.c、spi.h为主体框架代码,spi.h提供核心数据结构的定义,如spi_driver、spi_device、spi_board_info、 

      spi_master和一些基本的函数定义;spi.c主要是注册spi_bus_type,定义一些函数,如spi_add_device、

      spi_register_master、spi_register_board_info;

      核心层为硬件平台无关层,向下屏蔽了物理总线控制器的差异,定义了统一的访问策略和接口;向上提供统一的接口,以便spi设备驱动 

      通过总线控制器收发数据。

      struct spi_master{

            struct device dev;

            u16    bus_num;    对应spi0或spi1

            u16    num_chipselect;  对应挂接的spi_slaves

            int (*setup) (struct spi_device *spi)  供spi driver调用来进行设置

            int (*transfer) (struct spi_device *spi, struct spi_message *mesg);

            void (*cleanup) (struct spi_device *spi);

1.2、平台依赖层(platform总线设备和驱动)

      drivers/spi/spi_sam.c,注册名为sam_spi的platform驱动。arch/arm/mach-s3c6410/plat-s3c64xx定义名为sam_spi的

      platform设备,并在 arch/arm/mach-s3c6410/mach-smdk6410中添加设备。

      mach-smdk6410中还注册了spi_board_info结构体(modalias为用户接口层的驱动名),它用来选择哪个主spi以及挂接在其上的哪 

      个从spi;(arm/mach-s3c6410文件夹下的makefile中mach-support项添加的是mach-smdk6410项,用于平台相关的)

      spi总线的master是一条spi总线的控制器,在物理上连接若干spi从设备。每种处理器平台都有自已的控制器驱动,属于平台移植相 

      关层。本处是spi_sam.c,其按照核心层定义的接口实现了spi_master结构(probe函数最后调用spi_register_master)。

1.3、 用户接口层

      drivers/spi/spidev.c向spi_bus_type总线上添加名为spidev的驱动,它的probe函数创建设备结点供用户调用,它的ioctrl提供给

       用户读写寄存器或收发数据;

       spidev驱动和sam_spi驱动都需要维护一个共同master结构体,spidev最终通过sam_spi实现底层的传输。

       spi_device和spi_add_device在spi.c中定义,它通过master定位一个具体的硬件设备,通过modalias找到它对应的驱动;这样在

       sys/bus/spi/devices下看到的设备名为spi0.0可能不和驱动名spidev相同,但是设备结构体中有master和modalias,它会根据

       modalias找到驱动。

 

测试程序在Documentation/spi/spidev_test.c

 

调试记录:

      在arch/arm/mach-s3c6410/mach-smdk6410中的spi_board_info结构体里面把两个spi都加上(主要是bus_num和num_chipslect来确定),然后bus/spi/devices下边就会有两个设备了(spi0.0和spi1.0),/dev下也创建了两个结点。

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android入门之窗口类型

从WmS的角度看,一个窗口并不是Window类,而是一个View类。WmS收到用户消息后,需要把消息派发到窗口,View类本身并不能直接接收WmS传递过来的消息,真正接收用户消息的必须是IWindow...
  • geloin
  • geloin
  • 2015-01-16 17:19
  • 7523

Android窗口管理

一、 概述 在Android系统中,从设计的角度来看,窗口管理系统是基于C/S模式的。整个窗口系统分为服务端和客户端两大部分,客户端负责请求创建窗口和使用窗口,服务端完成窗口的维护,窗口显示等。...

Android中窗口的创建过程

在阅读本文之前建议先阅读我的另外一篇Java层Binder机制详解,因为里面有些地方涉及到通过进程间通过Binder机制通信。 在Android将窗口分为三类:应用窗口,子窗口,系统窗口 应用窗口一...

Android窗口管理剖析

Android窗口管理   一、 概述 在Android系统中,从设计的角度来看,窗口管理系统是基于C/S模式的。整个窗口系统分为服务端和客户端两大部分,客户端负责请求创建窗口和使用窗口,服务端...

Android系统窗口管理机制简介

一、概述 Android系统窗口管理是由WindowManagerService负责实现的.WindowManagerService(后面简称WMS)的代码位于 frameworks/base/ser...

腾讯公司十周年庆典活动是真的吗√腾讯活动网√

★抽奖腾讯备案电话【0755↗3303↘↘7551】抽 奖 二 线【0755↗3303↘↘7551】活 动 热 线【0755↗3303↘↘7551】 幸 运 用 户 必 须 遵 守 领 奖 程 序 办...

Android OpenGL ES学习笔记之材质概念和添加光照

一、光照概念 观察一个真实的3D物体,在不同的部位必然有不同的光照效果,有的地方暗一点,有的地方亮一点。而这种视觉差异是由光源和材质(物体的材料)共同决定的。光源强度由红、绿、蓝三色光强度共同决定,...

Android OpenGL ES学习笔记之概要

前言 因为对OpenGL比较感兴趣,所以这段时间一直在研究这个,于是把自己的学习笔记分享给大家,希望能帮到初学者 。 一、OpenGL ES是什么 百度百科是这样介绍的:OpenGL ES (O...

Android中使用OpenGL ES实现纹理贴图以及实现多重纹理混合

OpenGL ES中最常用的纹理是2D纹理,也就是一个图像的二维数组,当我们使用纹理时,需要使用纹理坐标作为纹理图像中的索引。纹理坐标用(s, t)指定,或者(U, V)。纹理坐标如下图所示,纹理原点...

Android实现画板功能的多种实现方式

Android实现画板主要有2种方式,一种是用自定义View实现,另一种是通过Canvas类实现。当然自定义View内部也是用的Canvas。第一种方式的思路是,创建一个自定义View(推荐Surfa...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)