Linux下SPI驅動分析(1)

Linux下SPI總線驅動有通用接口,一般的SPI設備驅動使用這個驅動接口實現設備驅動。分析驅動最好是先了解核心代碼,然後從具體設備分析入手,然後從下至上,瞭解整個框架,再從上到下分析,理解透徹。

以下分析內核根目錄均以"src"代替。內核代碼http://lxr.linux.no/,版本2.6.37.2。

SPI的核心代碼即

"src/drivers/spi/spi.c"——SPI 初始化和核心代碼

"src/drivers/spi/spi_gpio.c"——IO模擬SPI接口代碼

頭文件:

"src/include/linux/spi/spi.h"

"src/include/linux/spi/spi_gpio.h"

"src/include/linux/spi/spi_bitbang.h"

 

首先,先看核心代碼。

一步步來,先分析代碼,然後看了具體驅動再回過頭來看這個核心代碼。

spi.c

 


 

/* 這個函數是驅動模塊卸載時使用 */ 32static void spidev_release(struct device *dev) 33{ /* 標準設備結構體轉換成SPI設備結構體 * 調用container_of函數獲取dev設備所在的SPI設備結構體指針 */ 34 struct spi_device *spi = to_spi_device(dev); 35 36 /* spi masters may cleanup for released devices */ /* 清空SPI主機申請的內存 */ 37 if (spi->master->cleanup) 38 spi->master->cleanup(spi); 39 /* 減調用次數 */ 40 spi_master_put(spi->master); /* 釋放SPI設備節點內存 */ 41 kfree(spi); 42}

43

      /* 打印模塊別名 */ 44static ssize_t 45modalias_show(struct device *dev, struct device_attribute *a, char *buf) 46{ 47 const struct spi_device *spi = to_spi_device(dev); 48 49 return sprintf(buf, "%s/n", spi->modalias); 50}

 51

/* 設置SPI總線屬性——名稱/顯示 */

  52static struct device_attribute spi_dev_attrs[] = {

  53        __ATTR_RO(modalias),

  54        __ATTR_NULL,

  55};

56

 

/* 獲取設備ID */ 57/* modalias support makes "modprobe $MODALIAS" new-style hotplug work, 58 * and the sysfs version makes coldplug work too. 59 */ 60 61static const struct spi_device_id *spi_match_id(const struct spi_device_id *id, 62 const struct spi_device *sdev) 63{ /* 判斷設備中名稱與模塊別名相同,則返回該設備ID */ 64 while (id->name[0]) { 65 if (!strcmp(sdev->modalias, id->name)) 66 return id; 67 id++; 68 } 69 return NULL; 70} 71 /* 返回設備ID */ 72const struct spi_device_id *spi_get_device_id(const struct spi_device *sdev) 73{ 74 const struct spi_driver *sdrv = to_spi_driver(sdev->dev.driver); 75 76 return spi_match_id(sdrv->id_table, sdev); 77} 78EXPORT_SYMBOL_GPL(spi_get_device_id);



 

先到這,且見下回分解,累了,睡覺~~

 

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