linux內核SPI總線驅動分析(二)


SPI驅動編寫

 

簡而言之,SPI驅動的編寫分為:

1.spi_device就構建並注冊 

 在板文件中添加spi_board_info,並在板文件的init函數中調用spi_register_board_info(s3c_spi_devs,ARRAY_SIZE(s3c_spi_devs));

spi_register_board_info(s3c_spi_devs,ARRAY_SIZE(s3c_spi_devs));//注冊spi_board_info。這個代碼會把spi_board_info注冊到鏈表board_list上。spi_device封裝了一個spi_master結構體,事實上spi_master的注冊會在spi_register_board_info之后,spi_master注冊的過程中會調用scan_boardinfo掃描board_list,找到掛接在它上面的spi設備,然后創建並注冊spi_device。

 

2. spi_driver的構建與注冊

(1)

static struct spi_driver   m25p80_driver = { 

 

.driver = {

        .name   ="m25p80",

        .bus    =&spi_bus_type,

        .owner  = THIS_MODULE,

    },

    .probe  = m25p_probe,

    .remove =__devexit_p(m25p_remove),

};

(2)//spi_driver的注冊

 

spi_register_driver(&m25p80_driver);當匹配了spi_device以后調用probe

 

3實現probe操作:

 

 

 

 

 

spi_transfer(里面集成了數據buf空間地址等信息)

 

spi_message(是spi_transfer的集合的構建;

 

spi_message_init(初始spi_message

 

spi_message_add_tail(將新的spi_transfer添加到spi_message隊列尾部

 

 

spi_sync函數的調用(調用spi_master發送spi_message

 

例如:

 

struct spi_transfer st={

 

 

 

。。。。。。。。。

 

 

};

 

//填充spi_transfer  

 

 

struct spi_message meg

 

 

//定義message

 

 

spi_init_message(&meg)

 

//初始化meg

 

 

spi_message_add_tail(&st,&meg);

 

 

//st放在message隊列尾部

 

 

Spi_sync(spi_device,&meg);

 

 

//messagespi_device關聯,發送meg

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM