⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.h

📁 Axis 221 camera embedded programing interface
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) 2005 David Brownell * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#ifndef __LINUX_SPI_H#define __LINUX_SPI_H/* * INTERFACES between SPI master-side drivers and SPI infrastructure. * (There's no SPI slave support for Linux yet...) */extern struct bus_type spi_bus_type;/** * struct spi_device - Master side proxy for an SPI slave device * @dev: Driver model representation of the device. * @master: SPI controller used with the device. * @max_speed_hz: Maximum clock rate to be used with this chip *	(on this board); may be changed by the device's driver. *	The spi_transfer.speed_hz can override this for each transfer. * @chip-select: Chipselect, distinguishing chips handled by "master". * @mode: The spi mode defines how data is clocked out and in. *	This may be changed by the device's driver. *	The "active low" default for chipselect mode can be overridden, *	as can the "MSB first" default for each word in a transfer. * @bits_per_word: Data transfers involve one or more words; word sizes *	like eight or 12 bits are common.  In-memory wordsizes are *	powers of two bytes (e.g. 20 bit samples use 32 bits). *	This may be changed by the device's driver, or left at the *	default (0) indicating protocol words are eight bit bytes. *	The spi_transfer.bits_per_word can override this for each transfer. * @irq: Negative, or the number passed to request_irq() to receive *	interrupts from this device. * @controller_state: Controller's runtime state * @controller_data: Board-specific definitions for controller, such as *	FIFO initialization parameters; from board_info.controller_data * * An spi_device is used to interchange data between an SPI slave * (usually a discrete chip) and CPU memory. * * In "dev", the platform_data is used to hold information about this * device that's meaningful to the device's protocol driver, but not * to its controller.  One example might be an identifier for a chip * variant with slightly different functionality. */struct spi_device {	struct device		dev;	struct spi_master	*master;	u32			max_speed_hz;	u8			chip_select;	u8			mode;#define	SPI_CPHA	0x01			/* clock phase */#define	SPI_CPOL	0x02			/* clock polarity */#define	SPI_MODE_0	(0|0)			/* (original MicroWire) */#define	SPI_MODE_1	(0|SPI_CPHA)#define	SPI_MODE_2	(SPI_CPOL|0)#define	SPI_MODE_3	(SPI_CPOL|SPI_CPHA)#define	SPI_CS_HIGH	0x04			/* chipselect active high? */#define	SPI_LSB_FIRST	0x08			/* per-word bits-on-wire */#define	SPI_TX_1	0x10			/* shift out ones on rx-only */	u8			bits_per_word;	int			irq;	void			*controller_state;	void			*controller_data;	const char		*modalias;	// likely need more hooks for more protocol options affecting how	// the controller talks to each chip, like:	//  - memory packing (12 bit samples into low bits, others zeroed)	//  - priority	//  - drop chipselect after each word	//  - chipselect delays	//  - ...};static inline struct spi_device *to_spi_device(struct device *dev){	return dev ? container_of(dev, struct spi_device, dev) : NULL;}/* most drivers won't need to care about device refcounting */static inline struct spi_device *spi_dev_get(struct spi_device *spi){	return (spi && get_device(&spi->dev)) ? spi : NULL;}static inline void spi_dev_put(struct spi_device *spi){	if (spi)		put_device(&spi->dev);}/* ctldata is for the bus_master driver's runtime state */static inline void *spi_get_ctldata(struct spi_device *spi){	return spi->controller_state;}static inline void spi_set_ctldata(struct spi_device *spi, void *state){	spi->controller_state = state;}struct spi_message;struct spi_driver {	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;};static inline struct spi_driver *to_spi_driver(struct device_driver *drv){	return drv ? container_of(drv, struct spi_driver, driver) : NULL;}extern int spi_register_driver(struct spi_driver *sdrv);static inline void spi_unregister_driver(struct spi_driver *sdrv){	if (!sdrv)		return;	driver_unregister(&sdrv->driver);}/** * struct spi_master - interface to SPI master controller * @cdev: class interface to this driver * @bus_num: board-specific (and often SOC-specific) identifier for a *	given SPI controller. * @num_chipselect: chipselects are used to distinguish individual *	SPI slaves, and are numbered from zero to num_chipselects. *	each slave has a chipselect signal, but it's common that not *	every chipselect is connected to a slave. * @setup: updates the device mode and clocking records used by a *	device's SPI controller; protocol code may call this. * @transfer: adds a message to the controller's transfer queue. * @cleanup: frees controller-specific state * * Each SPI master controller can communicate with one or more spi_device * children.  These make a small bus, sharing MOSI, MISO and SCK signals * but not chip select signals.  Each device may be configured to use a * different clock rate, since those shared signals are ignored unless * the chip is selected. * * The driver for an SPI controller manages access to those devices through * a queue of spi_message transactions, copyin data between CPU memory and * an SPI slave device).  For each such message it queues, it calls the * message's completion function when the transaction completes. */struct spi_master {	struct class_device	cdev;	/* 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;	/* setup mode and clock, etc (spi driver may call many times) */	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);};static inline void *spi_master_get_devdata(struct spi_master *master){	return class_get_devdata(&master->cdev);}static inline void spi_master_set_devdata(struct spi_master *master, void *data){	class_set_devdata(&master->cdev, data);}static inline struct spi_master *spi_master_get(struct spi_master *master){	if (!master || !class_device_get(&master->cdev))		return NULL;	return master;}static inline void spi_master_put(struct spi_master *master){	if (master)		class_device_put(&master->cdev);}/* the spi driver core manages memory for the spi_master classdev */extern struct spi_master *spi_alloc_master(struct device *host, unsigned size);extern int spi_register_master(struct spi_master *master);extern void spi_unregister_master(struct spi_master *master);extern struct spi_master *spi_busnum_to_master(u16 busnum);/*---------------------------------------------------------------------------*//* * I/O INTERFACE between SPI controller and protocol drivers * * Protocol drivers use a queue of spi_messages, each transferring data * between the controller and memory buffers. * * The spi_messages themselves consist of a series of read+write transfer * segments.  Those segments always read the same number of bits as they * write; but one or the other is easily ignored by passing a null buffer * pointer.  (This is unlike most types of I/O API, because SPI hardware * is full duplex.) * * NOTE:  Allocation of spi_transfer and spi_message memory is entirely * up to the protocol driver, which guarantees the integrity of both (as * well as the data buffers) for as long as the message is queued. *//** * struct spi_transfer - a read/write buffer pair * @tx_buf: data to be written (dma-safe memory), or NULL * @rx_buf: data to be read (dma-safe memory), or NULL * @tx_dma: DMA address of tx_buf, if spi_message.is_dma_mapped * @rx_dma: DMA address of rx_buf, if spi_message.is_dma_mapped * @len: size of rx and tx buffers (in bytes) * @speed_hz: Select a speed other then the device default for this *      transfer. If 0 the default (from spi_device) is used. * @bits_per_word: select a bits_per_word other then the device default *      for this transfer. If 0 the default (from spi_device) is used. * @cs_change: affects chipselect after this transfer completes * @delay_usecs: microseconds to delay after this transfer before *	(optionally) changing the chipselect status, then starting *	the next transfer or completing this spi_message. * @transfer_list: transfers are sequenced through spi_message.transfers * * SPI transfers always write the same number of bytes as they read. * Protocol drivers should always provide rx_buf and/or tx_buf. * In some cases, they may also want to provide DMA addresses for * the data being transferred; that may reduce overhead, when the * underlying driver uses dma. * * If the transmit buffer is null, zeroes will be shifted out while * filling rx_buf, unless SPI_TX_1 is set in spi->mode (in which case * ones will be shifted out).  If the receive buffer is null, the data * shifted in will be discarded.  Only "len" bytes shift out (or in). * It's an error to try to shift out a partial word.  (For example, by * shifting out three bytes with word size of sixteen or twenty bits; * the former uses two bytes per word, the latter uses four bytes.) * * All SPI transfers start with the relevant chipselect active.  Normally * it stays selected until after the last transfer in a message.  Drivers * can affect the chipselect signal using cs_change: * * (i) If the transfer isn't the last one in the message, this flag is * used to make the chipselect briefly go inactive in the middle of the * message.  Toggling chipselect in this way may be needed to terminate * a chip command, letting a single spi_message perform all of group of * chip transactions together. * * (ii) When the transfer is the last one in the message, the chip may * stay selected until the next transfer.  This is purely a performance * hint; the controller driver may need to select a different device * for the next message. * * The code that submits an spi_message (and its spi_transfers) * to the lower layers is responsible for managing its memory. * Zero-initialize every field you don't set up explicitly, to * insulate against future API updates.  After you submit a message * and its transfers, ignore them until its completion callback. */struct spi_transfer {	/* it's ok if tx_buf == rx_buf (right?)	 * for MicroWire, one buffer must be null	 * buffers must work with dma_*map_single() calls, unless	 *   spi_message.is_dma_mapped reports a pre-existing mapping	 */	const void	*tx_buf;	void		*rx_buf;	unsigned	len;	dma_addr_t	tx_dma;	dma_addr_t	rx_dma;	unsigned	cs_change:1;	u8		bits_per_word;	u16		delay_usecs;	u32		speed_hz;	struct list_head transfer_list;};/**

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -