1. 程式人生 > >Linux驅動修煉之道-SPI驅動框架原始碼分析(中-續)

Linux驅動修煉之道-SPI驅動框架原始碼分析(中-續)

然後看這裡是怎樣註冊spi主機控制器驅動的:

  1. int spi_register_master(struct spi_master *master)  
  2. {  
  3.     。。。。。。。。。。。。。。。。  
  4.     /*將spi新增到核心,這也是sys/class/Spi_master下產生Spi0,Spi1的原因*/
  5.     dev_set_name(&master->dev, "spi%u", master->bus_num);  
  6.     status = device_add(&master->dev);  
  7.     scan_boardinfo(master);  
  8. }  

這裡跟蹤scan_boardinfo函式:

  1. staticvoid scan_boardinfo(struct spi_master *master)  
  2. {  
  3.     struct boardinfo    *bi;  
  4. mutex_lock(&board_lock);  
  5.     /*遍歷所有掛在board_list上的struct boardinfo*/
  6.     list_for_each_entry(bi, &board_list, list) {  
  7.         struct spi_board_info   *chip = bi->board_info;  
  8.         unsigned    n;  
  9.         /*遍歷每個boardinfo管理的spi_board_info,如果裝置的匯流排號與控制器的匯流排好相等,則建立新裝置*/
  10.         for (n = bi->n_board_info; n > 0; n--, chip++) {  
  11.             if (chip->bus_num != master->bus_num)  
  12.                 continue;  
  13.             (void) spi_new_device(master, chip);  
  14.         }  
  15.     }  
  16.     mutex_unlock(&board_lock);  
  17. }  
在移植的時候我們會在mach-smdk2440.c中的smdk2440_machine_init中新增spi_register_board_info

這個函式完成了將spi_board_info交由boardinfo管理,並把boardinfo掛載到board_list連結串列上。也就是說在系統初始化的時候將spi_device交由到掛在board_list上的boardinfo管理,在spi controller的driver註冊的時候不但註冊這個主機控制器的驅動,還要遍歷這個主機控制器的總線上的spi_device,將總線上的spi_device全部註冊進核心。當註冊進核心並且spi_driver已經註冊的時候,如果匯流排match成功,則會呼叫spi_driver的probe函式,這個將在後邊進行分析。

  1. <span style="font-size:18px;">int __init  
  2. spi_register_board_info(struct spi_board_info const *info, unsigned n)  
  3. {  
  4.     struct boardinfo    *bi;  
  5.     bi = kmalloc(sizeof(*bi) + n * sizeof *info, GFP_KERNEL);  
  6.     if (!bi)  
  7.         return -ENOMEM;  
  8.     bi->n_board_info = n;  
  9.     memcpy(bi->board_info, info, n * sizeof *info);  
  10.     mutex_lock(&board_lock);  
  11.     list_add_tail(&bi->list, &board_list);  
  12.     mutex_unlock(&board_lock);  
  13.     return 0;  
  14. }</span>  
看一下建立新裝置的函式:
  1. <span style="font-size:18px;">struct spi_device *spi_new_device(struct spi_master *master,  
  2.                   struct spi_board_info *chip)  
  3. {  
  4.     struct spi_device   *proxy;  
  5.     int         status;  
  6.     proxy = spi_alloc_device(master);  
  7.     if (!proxy)  
  8.         return NULL;  
  9.     WARN_ON(strlen(chip->modalias) >= sizeof(proxy->modalias));  
  10.     /*初始化spi_device的各個欄位*/
  11.     proxy->chip_select = chip->chip_select;  
  12.     proxy->max_speed_hz = chip->max_speed_hz;  
  13.     proxy->mode = chip->mode;  
  14.     proxy->irq = chip->irq;  
  15.     /*這裡獲得了spi_device的名字,這個modalias也是在我們移植時在mach-smdk2440.c中的s3c2410_spi0_board中設定的*/
  16.     strlcpy(proxy->modalias, chip->modalias, sizeof(proxy->modalias));  
  17.     proxy->dev.platform_data = (void *) chip->platform_data;  
  18.     proxy->controller_data = chip->controller_data;  
  19.     proxy->controller_state = NULL;  
  20.     /*主要完成將spi_device新增到核心*/
  21.     status = spi_add_device(proxy);  
  22.     if (status < 0) {  
  23.         spi_dev_put(proxy);  
  24.         return NULL;  
  25.     }  
  26. 相關推薦

    Linux驅動修煉-SPI驅動框架原始碼分析(-)

    然後看這裡是怎樣註冊spi主機控制器驅動的: int spi_register_master(struct spi_master *master)   {       。。。。。。。。。。。。。。。。       /*將spi新增到核心,這

    Linux驅動修煉-SPI驅動框架原始碼分析()

    來自:http://blog.csdn.net/woshixingaaa/article/details/6574220 這篇來分析spi子系統的建立過程。 嵌入式微處理器訪問SPI裝置有兩種方式:使用GPIO模擬SPI介面的工作時序或者使用SPI控制

    Linux驅動修煉-SPI驅動框架原始碼分析(上)

    SPI驅動架構,以前用過,不過沒這個詳細,跟各位一起分享: 來自:http://blog.csdn.net/woshixingaaa/article/details/6574215 SPI協議是一種同步的序列資料連線標準,由摩托羅拉公司命名,可工作於全雙工模式。相

    Linux驅動修煉-SPI驅動框架原始碼分析(下-)

    spi_async在spi.h中定義的: <span style="font-size:18px;">staticinlineint spi_async(struct spi_device *spi, struct spi_mess

    Linux驅動修煉-DM9000A網絡卡驅動框架原始碼分析

    網路裝置的初始化: 通過模組的載入函式看出DM9000A的驅動是以平臺驅動的形式註冊進核心的,下邊是模組的載入函式: 1.static int __init   2.dm9000_init(void)   2.{   3.    printk(KERN_INFO "%

    Linux驅動修煉-DMA框架原始碼分析(下)

    static irqreturn_t s3c2410_dma_irq(int irq, void *devpw) { struct s3c2410_dma_chan *chan = (struct s3c2410_dma_chan *)devpw; struct s3c2410_dma_buf *buf

    Linux驅動修煉-DMA框架原始碼分析

    DMA使用3個狀態的有限狀態機: 1.初始狀態,DMA等待DMA請求,一旦請求到達DMA進入狀態2,DMA ACK與INT REQ為0。 2.在這個狀態,DMA ACK置為1並且計數器CURR_TC的值被從DCON[19:0]載入,注意DMA ACK保持為1直到它被清除。 3.在這個狀態,處理DMA原子

    Linux驅動修煉

    一些學習Linux驅動的筆記整理在這裡與大家分享,如果那裡有錯誤也請高手指出。若干年後能進入INTEL開源中心或IBM搞linux kernel是我目前的目標。君子藏器於身,待時而動。文章連載,不斷更新中。

    linux驅動修煉-混雜裝置

    Linux驅動中把無法歸類的五花八門的裝置定義為混雜裝置(用miscdevice結構體表述)。miscdevice共享一個主裝置號MISC_MAJOR(即10),但次裝置號不同。 所有的miscdevice裝置形成了一個連結串列,對裝置訪問時核心根據次裝置號查詢對應的mi

    Java修煉--集合框架

    前言 Java集合框架 (Java Collections Framework, JCF) 也稱容器,這裡可以類比 C++ 中的 STL,在市面上似乎還沒能找到一本詳細介紹的書籍。在這裡主要對如下部分進行原始碼分析,及在面試中常見的問題。 例如,在阿里面試常

    ⑳tiny4412 Linux驅動開發MMC子系統驅動程式

    本次我們來說一下SDIO子系統的控制器的開發部分,這部分也是和硬體平臺相關的,在說這個之前,我們先來了解一下相關硬體的基礎知識和概念. MMC MMC全稱MultiMedia Card,由西門子公司和SanDisk公司1997年推出的多媒體記憶卡標準。MMC卡尺寸為32mm

    Linux 裝置驅動-------I2c裝置驅動(待續)

    Linux 裝置驅動篇之-------I2c裝置驅動 雖然I2C硬體體系結構和協議都很容易理解,但是Linux I2C驅動體系結構卻有相當的複雜度,它主要由3部分組成,即I2C裝置驅動、I2C匯流

    SQL優化三板斧:精簡驅動為王、集合為本

    作者介紹 黃浩,現任職於中國惠普,從業十年,始終專注於SQL。在華為做專案的兩年多,做過大大小小的SQL多達1500個。閒暇之餘,喜歡將部分案例寫成部落格發表在華為內部資料庫官方社群,反響強烈,已連續四個月蟬聯該社群最佳博主。目前已開設專欄“優哉悠齋”,成為首個受邀社群“專家訪談”的外協人員。 公元

    Linux裝置模型tty&&uart驅動架構分析

    五: uart_add_one_port()操作 在前面提到.在對uart裝置檔案過程中.會將操作轉換到對應的port上,這個port跟uart_driver是怎麼關聯起來的呢?這就是uart_add_ont_port()的主要工作了. 顧名思義,這個函式是在uart_driver增加一個port.程式碼如

    Linux 裝置驅動I2c裝置驅動

    Linux 裝置驅動篇之I2c裝置驅動fulinux一、I2C驅動體系雖然I2C硬體體系結構和協議都很容易理解,但是Linux I2C驅動體系結構卻有相當的複雜度,它主要由3部分組成,即I2C裝置驅動、

    linux spi驅動開發學習(四)-----spi驅動程式完整流程分析

    所有的應用程式使用dev/目錄下建立的裝置,這些字元裝置的操作函式集在檔案spidev.c中實現。 點選(此處)摺疊或開啟 static const struct file_operations spidev_fops = {     .owner =    THIS

    第16章 驅動開發字元裝置驅動程式框架

    16.1 字元裝置驅動程式框架簡介 我們在學習 C 語言的時候,知道每個應用程式的入口函式,即第一個被執行的函式是 main函式,那麼,我們自己的驅動程式,哪個函式是入口函式呢? 在寫驅動程式的時候,如果函式的名字可以任意取,常常為 xxxx_init(),

    Spark修煉(基礎篇)——Linux大資料開發基礎:第十三節:Shell程式設計入門(五)

    本節主要內容 while expression do command command done (1)計數器格式 適用於迴圈次數已知或固定時 root@sparkslave02:~/ShellLearning/Chapter13# vim w

    嵌入式Linux裝置驅動開發:按鍵驅動程式例項

    11.6  按鍵驅動程式例項 11.6.1  按鍵工作原理 高電平和低電平相接怎麼會變成低電平呢 就像你把電源正極的負極相連一樣會把電壓拉低。大電流會從高電平引腳流向低電平引腳,把高電平引腳拉低。 LED和蜂鳴器是最簡單的GPIO的應用,都不需要任何外部

    Linux運維網絡基礎學習筆記1.1

    達內 linux雲計算運維 網絡基礎1.1TCP/IP詳細解讀:TCP/IP協議簡介:TCP/IP是最廣泛支持的通信協議集合---包括大量internet應用中的標準協議;---支持跨網絡架構,跨操作系統平臺的通信;主機與主機之間通信的三個要素:---IP地址;---子網掩碼;---IP路由;IP地址