请教linux的SPI驱动问题

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

posted @ 2014-06-10 16:49  Merlin-magic  阅读(2880)  评论(0编辑  收藏  举报