linux 2.6.x spi驱动,spidev,使用从设备

Links:  blog.csdn.net/lanmanck/archive/2009/08/18/4459699.aspx

基于atmel的spi模型,大家可以先看下这篇文章的分析:

http://blog.chinaunix.net/u3/96265/showart_1925533.html

【转帖注明出处】http://blog.csdn.net/lanmanck

但是有的细节没有提到,我补充一下,不对请指出:

1、驱动中有总线和设备的概念。
spi控制器就是总线(spi总线),对应atmel_spi.c
spi控制器上外接的芯片,比如串行flash、can收发器、时钟芯片等,就是设备。这就涉及到设备驱动的问题.

2、这些spi设备可以对应spidev.c,或者具体的文件.

比如说,我接的是flash芯片,那么可以定义spi_board_info 数组的时候指定:
static struct spi_board_info at_spi_board_info_all_devices[] =
{
{    /* DataFlash chip mc13783*/
.modalias    = "mtd_dataflash",    
.chip_select    = 0,    //表示bus_num spi设备的片选号
.max_speed_hz    = 20000000,
.bus_num    = 0,        //表示用第几个spi
.irq        = INT_NUM_MIX1,
},
}
注意这个modalias,这里定义为"mtd_dataflash",是因为mtd_dataflash.c这个驱动文件中定义的驱动名称为"mtd_dataflash",这两个名称也保持一致。
static struct spi_driver dataflash_driver = {
.driver = {
.name       = "mtd_dataflash",
.bus        = &spi_bus_type,
.owner      = THIS_MODULE,
},

.probe      = dataflash_probe,
.remove     = __devexit_p(dataflash_remove),

/* FIXME:  investigate suspend and resume... */
};
static int __init dataflash_init(void)
{
return spi_register_driver(&dataflash_driver);
}


又比如说我接的的ads7846触摸屏芯片,可以这样定义:
{
.modalias    = "ads7846",
.chip_select    = 2,
.max_speed_hz    = 125000 * 26,    /* (max sample rate @ 3V) * (cmd + data + overhead) */
.bus_num    = 0,
.platform_data    = &ads_info,
.irq        = AT91SAM9261_ID_IRQ0,
},
这里的.modalias    = "ads7846",也因为有了ads7846.c这个文件,否则设备驱动无法probe成功,这样/dev下面就看不到设备了.

3、那如果我不想写具体的芯片驱动,就用自带的spi总线驱动怎么办呢?比如我接了一个can收发器。这就要用到spidev.c了.
打开spidev.c就可以发现标准的ioctl/read/write函数,这就是对应用户层的read write函数了,那么 spi_board_info的modalias需要这样定义:
.modalias    = "spidev",   

//不想写从设备驱动的话,就必须指定为"spidev",因为spidev.c就是这个设备的probe函数,里面有read/write/ioctl函数这样设备启动后就可以在/dev看到spidev0.0字样. 0.0 就是bus_num.chip_select.
posted @ 2012-03-20 14:07  general001  阅读(1162)  评论(0)    收藏  举报