Wednesday, November 29, 2006

SPI on Blackfin - 1

Data Structures
==================

arch/blackfin/mach-bf537/boards/stamp.c
---------------------------------------

/* SPI ADC chip */
static struct bfin5xx_spi_chip spi_adc_chip_info = {
.ctl_reg = 0x1000,
.enable_dma = 1, /* use dma transfer with this chip*/
.bits_per_word = 16,
};

include/asm-blackfin/bfin5xx_spi.h:
-----------------------------------
/* spi_board_info.controller_data for SPI slave devices,
* copied to spi_device.platform_data ... mostly for dma tuning
*/
struct bfin5xx_spi_chip {
u16 ctl_reg;
u8 enable_dma;
u8 bits_per_word;
u8 cs_change_per_word;
u8 cs_chg_udelay;
};

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

drivers/char/bfin_spi_adc.c:
----------------------------
static struct spi_driver bfin_spi_adc_driver = {
.driver = {
.name = "bfin_spi_adc",
.bus = &spi_bus_type,
.owner = THIS_MODULE,
},
.probe = bfin_spi_adc_probe,
.remove = __devexit_p(bfin_spi_adc_remove),
};

include/linux/spi/spi.h:
------------------------

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;
};

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

drivers/char/bfin_spi_adc.c:
----------------------------
struct bfin_spi_adc {
int opened;
int timeout;
unsigned char sense;
unsigned char edge;
unsigned int triggerpos;
unsigned int actcount;
unsigned short *buffer;
unsigned short level;
unsigned char mode;
unsigned char cont;
unsigned short skfs;
int baud;

struct spi_device *spidev;
};

struct bfin_spi_adc spi_adc;

static int __devinit bfin_spi_adc_probe(struct spi_device *spi)
{
spi_adc.spidev = spi;

return 0;
}

++++++++++++++++++++++++++++++++++++++++++++++++++++++++

drivers/spi/spi_bfin5xx.c

struct chip_data {
u16 ctl_reg;
u16 baud;
u16 flag;

u8 chip_select_num;
u8 n_bytes;
u32 width; /* 0 or 1 */
u8 enable_dma;
u8 bits_per_word; /* 8 or 16 */
u8 cs_change_per_word;
u8 cs_chg_udelay;
void (*write) (struct driver_data *);
void (*read) (struct driver_data *);
void (*duplex) (struct driver_data *);
};

static inline void setup()
{
<snip>
spi_set_ctldata(spi, chip);
<snip>
}

include/linux/spi/spi.h:
------------------------

static inline void spi_set_ctldata(struct spi_device *spi, void *state)
{
spi->controller_state = state;
}
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
*/
u8 bits_per_word;
int irq;
void *controller_state;
void *controller_data;
const char *modalias;
}

No comments:

Blog Archive