一、概览linux spi驱动子系统

本文介绍了Linux SPI驱动子系统,包括概览、SPI控制器、SPI设备、SPI设备驱动、数据传输相关数据结构和其他数据结构。SPI驱动主要由SPI子系统管理,结构包括struct spi_master和struct spi_device。SPI设备驱动通过struct spi_driver描述,数据传输涉及struct spi_transfer和struct spi_message。文章还提及了设备树在SPI驱动中的应用。
摘要由CSDN通过智能技术生成

#1、概要

Linux 中的spi驱动主要是由spi子系统来管理的,其核心代码位于kernel/drivers/spi/spi.c中。具体的spi控制器驱动也在kernel/drivers/spi/目录中。目前spi子系统只支持spi主机模式,还不支持spi从机模式。
spi通常是由spi控制器、spi总线和连接在spi总线上的设备构成:这里的总线只是指物理的spi连线,并不是指Linux设备模型中逻辑上的总线概念。可以把spi控制器和spi总线看成是一体的,spi总线就是spi控制器加上和spi设备的连接线。spi设备包含很多种,它可以是一个spi接口的nor flash,例如ST的M25P80。它也可以是一个spi网卡,例如ENC28J60。

#2、spi控制器

Linux的spi子系统对spi控制器的描述使用的是struct spi_master这个数据结构,所以在内核中,一个spi_master结构就代表了一个spi控制器,或者说代表一个spi主机。
它的主要定义如下:

struct spi_master {
     struct device   dev;
     struct list_head list;
     s16         bus_num;        //总线(或控制器)编号,总线和设备匹配时用到
     u16         num_chipselect; //片选数量,决定该控制器下面挂接多少个SPI设备
     u16         dma_alignment;
     u16         mode_bits;
     u16         flags;
     spinlock_t      bus_lock_spinlock;
     struct mutex        bus_lock_mutex;
     bool            bus_lock_flag;
     int   (*setup)(struct spi_device *spi);   //这个需要我们自己具体实现,
                                               //主要设置SPI控制器和工作方式
     int   (*transfer)(struct spi_device *spi,
            struct spi_message *mesg);         //这个不同的控制器要具体实现,
                                               //传输数据最后都要调用这个函数
     void   (*cleanup)(struct spi_device *spi); //注销时使用
};

在Linux-2.6以后引入设备模型概念,所有的设备和驱动都需要依附于总线。附于Spi总线的设备驱动对应的总线类型为spi_bus_type,在内核的drivers/spi/spi.c中定义。

struct bus_type spi_bus_type = {
      .name       = "spi",
      .dev_attrs  = spi_dev_attrs,
      .match      = spi_match_device,
      .uevent     = spi_ueven
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值