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

📄 spi.h

📁 omap3 linux 2.6 用nocc去除了冗余代码
💻 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. */#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 *	(by specifying SPI_CS_HIGH) as can the "MSB first" default for *	each word in a transfer (by specifying SPI_LSB_FIRST). * @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 * @modalias: Name of the driver to use with this device, or an alias *	for that name.  This appears in the sysfs "modalias" attribute *	for driver coldplugging, and in uevents used for hotplugging * * A @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; another might be * information about how this particular board wires the chip's pins. */struct spi_device {	struct device		dev;	struct spi		*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 */	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;}/* device driver data */static inline void spi_set_drvdata(struct spi_device *spi, void *data){	dev_set_drvdata(&spi->dev, data);}static inline void *spi_get_drvdata(struct spi_device *spi){	return dev_get_drvdata(&spi->dev);}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);/** * spi_unregister_driver - reverse effect of spi_register_driver * @sdrv: the driver to unregister * Context: can sleep */static inline void spi_unregister_driver(struct spi_driver *sdrv){	if (sdrv)		driver_unregister(&sdrv->driver);}/** * struct spi - 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.  This *	must fail if an unrecognized or unsupported mode is requested. *	It's always safe to call this unless transfers are pending on *	the device whose settings are being modified. * @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, copying 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 {	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 */	void			(*cleanup)(struct spi_device *spi);};static inline void *spi_master_get_devdata(struct spi *master){	return class_get_devdata(&master->cdev);}static inline void spi_master_set_devdata(struct spi *master, void *data){	class_set_devdata(&master->cdev, data);}static inline struct spi *spi_master_get(struct spi *master){	if (!master || !class_device_get(&master->cdev))		return NULL;	return master;}static inline void spi_master_put(struct spi *master){	if (master)		class_device_put(&master->cdev);}/* the spi driver core manages memory for the spi classdev */extern struct spi *spi_alloc_master(struct device *host, unsigned size);extern int spi_register_master(struct spi *master);extern int spi_register_slave(struct spi *slave);extern void spi_unregister_master(struct spi *master);extern void spi_unregister_slave(struct spi *slave);extern struct spi *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.  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.) * * In-memory data values are always in native CPU byte order, translated * from the wire byte order (big-endian except with SPI_LSB_FIRST).  So * for example when bits_per_word is sixteen, buffers are 2N bytes long * (@len = 2N) and hold N sixteen bit words in CPU byte order. * * When the word size of the SPI transfer is not a power-of-two multiple * of eight bits, those in-memory words include extra bits.  In-memory * words are always seen by protocol drivers as right-justified, so the * undefined (rx) or unused (tx) bits are always the most significant bits. * * 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.  On multi-device SPI busses * with nothing blocking messages going to other devices, this is just * a performance hint; starting a message to another device deselects * this one.  But in other cases, this can be used to ensure correctness. * Some devices need protocol transactions to be built from a series of * spi_message submissions, where the content of one message is determined * by the results of previous messages and where the whole transaction * ends when the chipselect goes intactive. * * 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	 */

⌨️ 快捷键说明

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