免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1957 | 回复: 3
打印 上一主题 下一主题

spi驱动笔记 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-17 12:04 |只看该作者 |倒序浏览
      
       用户接口层   
        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;
};
               

论坛徽章:
0
2 [报告]
发表于 2013-04-18 17:02 |只看该作者
看贴怎就没人顶。。

{:3_204:}

随便顶,到处顶,不介意

论坛徽章:
0
3 [报告]
发表于 2013-04-19 13:43 |只看该作者
求交友:qq:2379374402
     只爱linux

论坛徽章:
0
4 [报告]
发表于 2013-04-22 16:13 |只看该作者
回复 3# wwxxxxll


   原来你的处女贴发我这来了。。哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP