Linux设备模型之spi子系统(2)

[cpp]

struct spi_master {       struct device   dev;                //内嵌的标准dev结构        /* other than negative (== assign one dynamically), bus_num is fully       * board-specific.  usually that simplifies to being SOC-specific.       * example:  one SOC has three SPI controllers, numbered 0..2,       * and one board's schematics might show it using SPI-2.  software       * would normally use bus_num=2 for that controller.       */       s16         bus_num;                  //标识的总线号        /* chipselects will be integral to many controllers; some others       * might use board-specific GPIOs.       */       u16         num_chipselect;       /* some SPI controllers pose alignment requirements on DMAable       * buffers; let protocol drivers know about these requirements.       */       u16         dma_alignment;           //dma对其要求        /* spi_device.mode flags understood by this controller driver */       u16         mode_bits;               //代表操作的spi_device.mode        /* other constraints relevant to this driver */       u16         flags;                   //另外的一些标志    #define SPI_MASTER_HALF_DUPLEX  BIT(0)      /* can't do full duplex */    #define SPI_MASTER_NO_RX    BIT(1)      /* can't do buffer read */    #define SPI_MASTER_NO_TX    BIT(2)      /* can't do buffer write */        /* lock and mutex for SPI bus locking */       spinlock_t      bus_lock_spinlock;       struct mutex        bus_lock_mutex;       /* flag indicating that the SPI bus is locked for exclusive use */       bool            bus_lock_flag;       /* Setup mode and clock, etc (spi driver may call many times).       *       * IMPORTANT:  this may be called when transfers to another       * device are active.  DO NOT UPDATE SHARED REGISTERS in ways       * which could break those transfers.       */       int         (*setup)(struct spi_device *spi);   //设置模式        /* bidirectional bulk transfers       *       * + The transfer() method may not sleep; its main role is       *   just to add the message to the queue.       * + For now there's no remove-from-queue operation, or       *   any other request management       * + To a given spi_device, message queueing is pure fifo       *       * + The master's main job is to process its message queue,       *   selecting a chip then transferring data       * + If there are multiple spi_device children, the i/o queue       *   arbitration algorithm is unspecified (round robin, fifo,       *   priority, reservations, preemption, etc)       *       * + Chipselect stays active during the entire message       *   (unless modified by spi_transfer.cs_change != 0).       * + The message transfers use clock and SPI mode parameters       *   previously established by setup() for this device       */       int         (*transfer)(struct spi_device *spi,    //传输函数                            struct spi_message *mesg);       /* called on release() to free memory provided by spi_master */       void            (*cleanup)(struct spi_device *spi);   };  

而对于要操控的spi总线上的设备,其表述结构为:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/22710.html