linux SPI驱动——spidev之deive

Posted 夕相待

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:       */
   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:  }
   1:  spi_register_board_info(jz_spi0_board_info, jz_spi0_devs_size);

 

总结:

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

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

以上是关于linux SPI驱动——spidev之deive的主要内容,如果未能解决你的问题,请参考以下文章

linux uart驱动——相关数据结构以及API

第九章:硬件抽象层

硬件抽象层——HAL

Linux系统启动顺序

第七章

Arduino 串行外设接口(SPI)