关于2.6 的 spi驱动,spidev,使用从设备.

 

原文地址:http://blog.csdn.net/lanmanck/article/details/4459699

 

基于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这个文件,里面的probe函数用的名称就是"mtd_dataflash"


又比如说我接的的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.

 

这下各位有点明白了吧.

阅读更多
文章标签: flash struct cmd
个人分类: ARM linux
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭