http://bbs.chinaunix.net/thread-3691765-1-1.html
內核版本2.6.30。編進內核的SPI驅動,通過看代碼我明白了,大致過程是這樣:
1、先創建一個spi_board_info結構描述spi設備信息,調用spi_register_board_info將這個結構添加到board_list中。
2、然后調用spi_register_master注冊SPI控制器驅動,此時會調用scan_boardinfo掃描board_list,根據 spi_board_info調用spi_new_device生成spi_device結構,用spi_add_device添加設備。
3、調用spi_register_driver注冊spi_driver,通過與device匹配驅動設備。
下面是問題:
1、上述做法需要在注冊spi控制器驅動即spi master前,先要定義好spi_board_info結構並注冊。但是如果我要編寫一個驅動模塊,我應該怎樣注冊spi_device?
2、spi控制器是通過片選信號來區分多個spi設備的,這個片選信號是像I2C地址一樣由設備定義好的嗎?如何知道某個設備該用怎樣的片選信號?
回復 1# frank529
急用先學,最近剛好看了這一部分:
1、上述做法需要在注冊spi控制器驅動即spi master前,先要定義好spi_board_info結構並注冊。但是如果我要編寫一個驅動模塊,我應該怎樣注冊spi_device?
spi_device就是就是通過 spi_register_board_info 來注冊的。
通過spi_board_info結構,給定設備的下面信息:
設備名
波特率
設備掛在哪個spi總線上,如powerpc 5000有SPI A, B, C ,D
片選信號
#define SPI_AK4104 \
659{ \
660 .modalias = "ak4104-codec", \設備名
661 .max_speed_hz = 10000, \波特率
662 .bus_num = 0, \SPI A, B, C ,D
663 .chip_select = 0, \片選(0~7)
664 .controller_data = (void *) GPIO_SPDIF_CS,\平台數據
665}
#define SPI_DAC7512 \
679{ \
680 .modalias = "dac7512", \設備名
681 .max_speed_hz = 1000000, \波特率
682 .bus_num = 0, \ SPI A, B, C ,D
683 .chip_select = 2, \片選(0~7)
684 .controller_data = (void *) GPIO_MCLK_DAC_CS, \
685}
static struct spi_board_info connector_spi_devices[] __initdata = {
SPI_AK4104,
SPI_DAC7512,
};
調用下面函數,就把上面兩個設備登記到/sys/bus/spi下了
spi_register_board_info(ARRAY_AND_SIZE(connector_spi_devices));
2、spi控制器是通過片選信號來區分多個spi設備的,這個片選信號是像I2C地址一樣由設備定義好的嗎?如何知道某個設備該用怎樣的片選信號?
硬件連線決定的。
上面的例子,spi bus A上掛了上面兩個設備:AK4104/DAC7512
SPI接口有下列信號線:
SCK_A: 時鍾,同兩個設備的時鍾信號接在一起
SIN_A: data in; 同兩個設備的data out信號接在一起
SOUT_A data out; 同兩個設備的data in信號接在一起
PCS0_A: bus A chip select 0, 接AK4104的片選
PCS2_A: : bus A chip select 2,接DAC7512的片選
如果先選中chip select 0, 下面的操作就會作用於設備AK4104
如果先選中chip select 2, 下面的操作就會作用於設備DAC7512