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);
//將message與spi_device關聯,發送meg