linux SPI驱动——spidev之deive(五)

1.定义board设备
   1:  struct spi_board_info {
   2:      /* the device name and module name are coupled, like platform_bus;
   3:       * "modalias" is normally the driver name.
   4:       *
   5:       * platform_data goes to spi_device.dev.platform_data,
   6:       * controller_data goes to spi_device.controller_data,
   7:       * irq is copied too
   8:       */
   9:      char        modalias[SPI_NAME_SIZE];
  10:      const void    *platform_data;
  11:      void        *controller_data;
  12:      int        irq;
  13:   
  14:      /* slower signaling on noisy or low voltage boards */
  15:      u32        max_speed_hz;
  16:   
  17:   
  18:      /* bus_num is board specific and matches the bus_num of some
  19:       * spi_master that will probably be registered later.
  20:       *
  21:       * chip_select reflects how this chip is wired to that master;
  22:       * it‘s less than num_chipselect.
  23:       */
  24:      u16        bus_num;
  25:      u16        chip_select;
  26:   
  27:      /* mode becomes spi_device.mode, and is essential for chips
  28:       * where the default of SPI_CS_HIGH = 0 is wrong.
  29:       */
  30:      u8        mode;
  31:   
  32:      /* ... may need additional spi_device chip config data here.
  33:       * avoid stuff protocol drivers can set; but include stuff
  34:       * needed to behave without being bound to a driver:
  35:       *  - quirks like clock rate mattering when not selected
  36:       */

.csharpcode,.csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff }
.csharpcode pre { margin: 0em }
.csharpcode .rem { color: #008000 }
.csharpcode .kwrd { color: #0000ff }
.csharpcode .str { color: #006080 }
.csharpcode .op { color: #0000c0 }
.csharpcode .preproc { color: #cc6633 }
.csharpcode .asp { background-color: #ffff00 }
.csharpcode .html { color: #800000 }
.csharpcode .attr { color: #ff0000 }
.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em }
.csharpcode .lnum { color: #606060 }

   1:  /* add by xuyonghong for test */
   2:  struct spi_board_info jz_spi0_board_info[]  = {
   3:      {
   4:          .modalias               =  "spidev",
   5:          .mode                     =  SPI_MODE_3,
   6:          .max_speed_hz           =  1000000,
   7:          .controller_data        =  (void *)GPIO_PB(2),
   8:          .bus_num                =  0,
   9:          .chip_select            =  0,
  10:      },
  11:  };
  12:  int jz_spi0_devs_size = ARRAY_SIZE(jz_spi0_board_info);
 
 
   1:  int __init
   2:  spi_register_board_info(struct spi_board_info const *info, unsigned n)
   3:  {
   4:      struct boardinfo *bi;
   5:      int i;
   6:   
   7:      bi = kzalloc(n * sizeof(*bi), GFP_KERNEL);
   8:      if (!bi)
   9:          return -ENOMEM;
  10:   
  11:      for (i = 0; i < n; i++, bi++, info++) {
  12:          struct spi_master *master;
  13:   
  14:          memcpy(&bi->board_info, info, sizeof(*info));
  15:          mutex_lock(&board_lock);
  16:          list_add_tail(&bi->list, &board_list);
  17:          /* 
  18:              如果master先注册,则执行spi_match_master_to_boardinfo匹配,
  19:              否则在master注册的时候匹配device 
  20:          */
  21:          list_for_each_entry(master, &spi_master_list, list)
  22:              spi_match_master_to_boardinfo(master, &bi->board_info);
  23:          mutex_unlock(&board_lock);
  24:      }
  25:   
  26:      return 0;
  27:  }

.csharpcode,.csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff }
.csharpcode pre { margin: 0em }
.csharpcode .rem { color: #008000 }
.csharpcode .kwrd { color: #0000ff }
.csharpcode .str { color: #006080 }
.csharpcode .op { color: #0000c0 }
.csharpcode .preproc { color: #cc6633 }
.csharpcode .asp { background-color: #ffff00 }
.csharpcode .html { color: #800000 }
.csharpcode .attr { color: #ff0000 }
.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em }
.csharpcode .lnum { color: #606060 }

   1:  spi_register_board_info(jz_spi0_board_info, jz_spi0_devs_size);

.csharpcode,.csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff }
.csharpcode pre { margin: 0em }
.csharpcode .rem { color: #008000 }
.csharpcode .kwrd { color: #0000ff }
.csharpcode .str { color: #006080 }
.csharpcode .op { color: #0000c0 }
.csharpcode .preproc { color: #cc6633 }
.csharpcode .asp { background-color: #ffff00 }
.csharpcode .html { color: #800000 }
.csharpcode .attr { color: #ff0000 }
.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em }
.csharpcode .lnum { color: #606060 }

总结:

1. list_add_tail(&bi->list, &board_list); 讲board添加在board_list

2.当master已经注册,则通过spi_match_master_to_boardinfo和spi_new_device创建spi device。

时间: 2024-08-05 21:45:40

linux SPI驱动——spidev之deive(五)的相关文章

Linux Spi驱动移植小结

2012-01-07 22:21:29 效果图: 理论学习后,主要是linux中spi子系统设备框架的了解后,主控制器与设备分离的思想,那么我要开始动手了. 1,  make menuconfig添加spi配置 2,platform_driver及platform_device数据结构都有了.于是在mach-tq2440.c中tq2440_devices[]结构添加里         &s3c_device_spi1,//by apple 3,接着开始make zImage. 出错,发现串口信息

Linux SPI驱动设计

1. SPI总线结构 SPI串行外设接口,是一种高速的,全双工,同步的通信总线.采用主从模式架构,支持多个slave,一般仅支持单Master SPI接口共有4根信号线,分别是: 设备选择线(SS).时钟线(SCK).串行输出数据线(MOSI).串行输入数据线(MISO). 2. 数据传输过程 主节点通过MOSI线输出数据,从节点在SIMO处从主节点读取数据.同时,也通过SMOI输出MSB(最高位), 主节点会在MISO处读取从节点的数据,整个过程将一直持续,直至交换完所有的数据. 3. 总线时

SPI驱动编写要点

题外话:面对成功和失败,一个人有没有“冠军之心”,直接影响他的表现. 几周前剖析了Linux SPI 驱动框架,算是明白个所以然,对于这么一个庞大的框架,并不是每一行代码都要自己去敲,因为前人已经把这个框架搭建好了,作为驱动开发者的我们只需要搞清楚哪一部分是需要自己修改或重新编写就OK了. 结合Linux内核面向对象的设计思想,SPI总的设计思路大概是这样的: 第①处:内核中抽象了SPI控制器,让spi_master成为他的象征,他的实例化对象就是与硬生生的SPI控制器对应的,在Linux内核中

linux设备驱动归纳总结

前言: (总结已经基本写完,这段时间我会从新排版和修正.错误总会有的,望能指正!) 前段时间学习了嵌入式驱动,趁着没开始找工作,这段时间我会每天抽出时间来复习. 我的总结是根据学习时的笔记(李杨老师授课).<linux内核设计与实现>第三版.<linux设备驱动程序>第三版和<linux设备驱动开发详解>第一版来归纳的.文章中涉及一些自己的想法,并不能保证所说的一定正确. 我也是一位linux初学者,在这里发博也是想跟大家分享技术,同时也希望别人能够指正错误. 我把一些

Linux USB驱动框架分析 【转】

转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结当然不可缺,更何况我决定为嵌入式卖命了.好,言归正传,我说一说这段时间的收获,跟大家分享一下Linux的驱动开发.但这次只先针对Linux的USB子系统作分析,因为周五研讨老板催货.当然,还会顺带提一下其他的驱动程序写法. 事实上,Linux的设备驱动都遵循一个惯例——表征驱动程序(用driver更

Linux设备驱动之USB

Linux驱动框架分析(一) 事实上,Linux的设备驱动都遵循一个惯例--表征驱动程序(用driver更贴切一些,应该称为驱动器比较好吧)的结构体,结构体里面应该包含了驱动程序所需要的所有资源.用术语来说,就是这个驱动器对象所拥有的属性及成员.由于Linux的内核用c来编写,所以我们也按照这种结构化的思想来分析代码,但我还是希望从OO的角度来阐述这些细节.这个结构体的名字有驱动开发人员决定,比如说,鼠标可能有一个叫做mouse_dev的struct,键盘可能由一个keyboard_dev的st

Linux设备驱动探究第1天----spi驱动(1)

本文允许转载,请注明出处:http://blog.csdn.net/fulinus Linux内核代码实在太大了,一个小小的模块也会让你手足无措,今天下午决心要把spi驱动好好看看. 首先分析spidev.c文件,这个文件中定义struct file_operations结构中的成员.成员有spidev_write.spidev_read和spidev_ioctl,前两者实现半双工通信,后者实现全双工通信.当然还有open和release等相关的成员,先忽略吧. spidev_write ---

Linux驱动修炼之道-SPI驱动框架源码分析(上)【转】

转自:http://blog.csdn.net/lanmanck/article/details/6895318 SPI驱动架构,以前用过,不过没这个详细,跟各位一起分享: 来自:http://blog.csdn.net/woshixingaaa/article/details/6574215 SPI协议是一种同步的串行数据连接标准,由摩托罗拉公司命名,可工作于全双工模式.相关通讯设备可工作于m/s模式.主设备发起数据帧,允许多个从设备的存在.每个从设备 有独立的片选信号,SPI一般来说是四线串

Linux下spi驱动开发

转载至:http://www.embedu.org/Column/Column367.htm 作者:刘洪涛,华清远见嵌入式学院讲师. 一.概述 基于子系统去开发驱动程序已经是linux内核中普遍的做法了.前面写过基于I2C子系 统的驱动开发.本文介绍另外一种常用总线SPI的开发方法.SPI子系统的开发和I2C有很多的相似性,大家可以对比学习.本主题分为两个部分叙述,第一 部分介绍基于SPI子系统开发的理论框架:第二部分以华清远见教学平台FS_S5PC100上的M25P10芯片为例(内核版本2.6