IIC && SPI架構淺析



一. IIC 架構淺析

1. 註冊板級包中的i2c設備(例如:eeprom1,eeprom2,eeprom3), 將i2c設備添加到__i2c_board_list鏈表中。
  i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
 
2. SPI控制器驅動(spi-s3c64xx.c)

 採用平臺總線的形式,通過probe函數,初始化相關數據,
 
 當調用i2c_register_adapter(struct i2c_adapter *adap)後, 
 
 接着執行--
 if (adap->nr < __i2c_first_dynamic_bus_num)
  i2c_scan_static_board_info(adap);
    
  //將板級包中的i2c 設備信息取出來,新建i2c設備-client並和和i2c控制器相關聯
      
   static void i2c_scan_static_board_info(struct i2c_adapter *adapter)
   {
    struct i2c_devinfo *devinfo;
   
    down_read(&__i2c_board_lock);
    list_for_each_entry(devinfo, &__i2c_board_list, list) { ////
     if (devinfo->busnum == adapter->nr     ////
       && !i2c_new_device(adapter,     ///   ---->1
         &devinfo->board_info))    ////
      dev_err(&adapter->dev,
       "Can't create device at 0x%02x\n",
       devinfo->board_info.addr);
    }
    up_read(&__i2c_board_lock);
   }
   
   ----->1
   struct i2c_client *i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
   {
     
    dev_set_name(&client->dev, "%d-%04x", i2c_adapter_id(adap),   ////設備名字
         client->addr);
    status = device_register(&client->dev);
   }
  
 
 接着執行 
  bus_for_each_drv(&i2c_bus_type, NULL, adap, __process_new_adapter); 
  
  __process_new_adapter-->i2c_do_add_adapter
  
  --->if (driver->attach_adapter) {      
    driver->attach_adapter(adap); //attach_adapter = i2cdev_attach_adapter
   }
  
  註冊相應的設備控制器 i2c-%d
  
  static int i2cdev_attach_adapter(struct i2c_adapter *adap)
  {
   
  
   /* register this i2c device with the driver core *///註冊設備控制器
   i2c_dev->dev = device_create(i2c_dev_class, &adap->dev,
           MKDEV(I2C_MAJOR, adap->nr), NULL,
           "i2c-%d", adap->nr);
   
   res = device_create_file(i2c_dev->dev, &dev_attr_name);//創建設備文件
  }
  
  
3. 設備驅動層(i2c-dev.c)
 /*註冊設備驅動*/
 int i2c_register_driver(struct module *owner, struct i2c_driver *driver)

 有一個通用驅動i2cdev_driver--->提供統一的控制器設備節點/設備接口-->供應用層寫相應的控制驅動

 也可以自己寫相應的設備驅動--->at24.c
    
*************************************************************************************************

二. SPI架構淺析

1.註冊spi設備信息
/*
  註冊spi設備信息, 將信息掛載在board_list鏈表上
*/
int spi_register_board_info(struct spi_board_info const *info, unsigned n)
 -->list_add_tail(&bi->list, &board_list);

2.SPI控制器驅動(spi-s3c64xx.c)

 採用平臺總線的形式,通過probe函數,初始化相關數據,建立工作隊列--主要用來傳輸數據, 

/*
  當在probe中調用spi_register_master()函數後,執行spi_match_master_to_boardinfo()
 
  遍歷所開發板上的spi設備,接着執行dev = spi_new_device(master, bi);
 
  建立spi控制器和spi設備之間的關係, 並且綁定在spi總線上.
 
  spi%d.%d --->第一個代表總線上的第幾個設備,第二個代表第幾個總線。
   
*/
int spi_register_master(struct spi_master *master)
{
 list_for_each_entry(bi, &board_list, list)
  spi_match_master_to_boardinfo(master, &bi->board_info);
  
 of_register_spi_devices(master);  //註冊SPI設備
}

3.設備驅動層(spidev.c)

 //註冊設備驅動
 int spi_register_driver(struct spi_driver *sdrv)

 有一個通用驅動spidev_spi_driver--->提供統一的設備節點/設備接口

 也可以自己寫相應的設備驅動
 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章