xfortune 发表于 2013-04-17 12:04

spi驱动笔记

      
       用户接口层   
        spidev.c         /*为应用层提供操作接口*/
                  open         write             read      
========================================================================
        .write =        spidev_write,
        .read =                spidev_read,
        .unlocked_ioctl = spidev_ioctl,
        .compat_ioctl = spidev_compat_ioctl,
        .open =                spidev_open,
        .release =        spidev_release,

       
       
        平台依赖层         
                  实现相应平台的spi控制器驱动spi_s3c24XX.c

                                1. SPI core

                                2. platform driver
                       
                                3. platform device
                                        描述了中断号、中断触发电平、寄存器基地址等信息
                                        随后使用可以调用 platform_get_resource 标准获取
                                        实现了驱动和资源的分离




        硬件抽象层         
                  提供核心数据结构定义,SPI控制器驱动和设备驱动的注册、注销管理等

=============================================================================
spidev.c 系统通用型驱动
=============================================================================
spidev_init分析:
        static int __init spidev_init(void)
                        /*1.设备注册*/
                status = register_chrdev(SPIDEV_MAJOR, "spi", &spidev_fops);
                        /*2.创建类*/
                spidev_class = class_create(THIS_MODULE, "spidev");
                        注:设备结点的创建是在探测到设备之后:
                        spidev_probe(){...
                        dev = device_create(spidev_class, &spi->dev, spidev->devt,
                                spidev, "spidev%d.%d",spi->master->bus_num,
                                                        spi->chip_select);
                                ...        }
                        /*注册SPI设备驱动*/
                status = spi_register_driver(&spidev_spi_driver);
spidev_open 分析:
        static int spidev_open(struct inode *inode, struct file *filp)
                /*1.创建结构体*/
        struct spidev_data        *spidev; /*包含设备相关信息*/
       
                /*2.将SPI结构放入file_operations 结构的私有数据中*/
        filp->private_data = spidev;
        nonseekable_open(inode, filp);

spidev_read 分析:
spidev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
        /*1.创建spi数据结构*/
        struct spidev_data        *spidev;
        /*2.获取私有数据中的spidev结构*/
        spidev = filp->private_data;
        /*3.通过底层操作函数读*/
        spidev_sync_read(spidev, count);
                spi_message_init(&m);
                spi_message_add_tail(&t, &m);
                return spidev_sync(spidev, &m);
                        status = spi_async(spidev->spi, message);
        struct spi_message {
        struct list_head        transfers;
        struct spi_device        *spi;
        unsigned                is_dma_mapped:1;
        void                        (*complete)(void *context);
        void                        *context;
        unsigned                actual_length;
        int                        status;
        struct list_head        queue;
        void                        *state;
        };
               

spidev_write 分析:
        和读操作相似




主要数据结构
=======================================================

struct spi_device/*主机端用于描述SPI从设备*/
struct spi_driver   /*客户端协议驱动*/
        struct spi_driver {
        const struct spi_device_id *id_table;
        int                        (*probe)(struct spi_device *spi);
        int                        (*remove)(struct spi_device *spi);
        void                        (*shutdown)(struct spi_device *spi);
        int                        (*suspend)(struct spi_device *spi, pm_message_t mesg);
        int                        (*resume)(struct spi_device *spi);
        struct device_driver        driver;
};
               

xfortune 发表于 2013-04-18 17:02

看贴怎就没人顶。。
{:3_204:}

随便顶,到处顶,不介意

wwxxxxll 发表于 2013-04-19 13:43

求交友:qq:2379374402
   只爱linux

xfortune 发表于 2013-04-22 16:13

回复 3# wwxxxxll


原来你的处女贴发我这来了。。哈哈
页: [1]
查看完整版本: spi驱动笔记