SPI通用接口層用spi_device結構來表示一個spi設備,它的各個字段的意義如下:
| struct device dev | 代表該spi設備的device結構 | 
| struct spi_master *master | 指向該spi設備所使用的控制器 | 
| u32 max_speed_hz | 該設備的最大工作時鐘頻率 | 
| u8 chip_select | 在控制器中的片選引腳編號索引 | 
| u16 mode | 設備的工作模式,包括時鐘格式,片選信號的有效電平等等 | 
| u8 bits_per_Word | 設備每個單位數據所需要的比特數 | 
| int irq | 設備使用的irq編號 | 
| char modalias[SPI_NAME_SIZE] | 該設備的名字,用于spi總線和驅動進行配對 | 
| int cs_gpio | 片選信號的gpio編號,通常不用我們自己設置,接口層會根據上面的chip_select字段在spi_master結構中進行查找并賦值 | 
要完成向系統增加并注冊一個SPI設備,我們還需要另一個數據結構:
/* include/linux/spi/spi.h */struct spi board_info {char modalias[32] ;/*用于初始化spi_device.modalias */const void *platform_data ;/*用于初始化spi_device.dev.platform_data */void *controller data;/ * 用于初始化spi_device.controller_data */int irq;/*用于初始化spi_device.irq */u32 max speed h z ;/*用于初始化spi_device.max_speed_hz */ul6 b us num;/*用于初始化spi_device.bus_num */ul6 chip_select ;/*用于初始化spi_device.chip select */u8 mode ;/*用于初始化spi_device.mode */};
spi_board_info對象用于描述 SPI設備信息,其大部分字段和spi_device結構相對應,bus_num字段則用來指定所屬的控制器編號,通過spi_board_info結構,我們可以有兩種方式向系統增加spi設備。第一種方式是在SPI控制器驅動已經被加載后,我們使用通用接口層提供的如下API來完成:
struct spi_device *spi_new_device(struct spi_master *master, struct spi_board_info *chip);
第二種方式是在板子的初始化代碼中,定義一個spi_board_info數組,然后通過以下API注冊spi_board_info:int spi_register_board_info(struct spi_board_info const *info, unsigned n);
上面這個API會把每個spi_board_info掛在全局鏈表變量board_list上,并且遍歷已經在系統中注冊了的控制器,匹配上相應的控制器并取得它們的spi_master結構指針,最終也會通過spi_new_device函數添加SPI設備。因為spi_register_board_info可以在板子的初始化代碼中調用,可能這時控制器驅動尚未加載,此刻無法取得相應的spi_master指針,不過不要擔心,控制器驅動被加載時,一定會調用spi_register_master函數來注冊spi_master結構,而spi_register_master函數會反過來遍歷全局鏈表board_list上的spi_board_info,然后通過spi_new_device函數添加SPI設備。新聞熱點
疑難解答