I'm developping a driver for iMX28 to communicate with an external peripheral.
- bus SPI between the 2 devices.
the xr20m1280 have an internal fifo of 128bytes and I try to read this fifo. I write a driver with a read function :
int xr20m1280_read (struct char_interface_data *data, size_t len)
{
struct xr20m1280_data_t *private = container_of(data,
struct xr20m1280_data_t, char_interface_data);
struct spi_device *spi = data->spi;
unsigned char *p_buffer = data->buffer;
unsigned char config_tab[] = {
XR20M1280_REG_LINE_CTRL, 0xBF,
XR20M1280_REG_FCTR, 0x70,
//XR20M1280_REG_TRIG,0x40,
XR20M1280_REG_TRIG,0x10,
XR20M1280_REG_LINE_CTRL, 0x03,
//XR20M1280_REG_EMSR, 0x05,
XR20M1280_REG_EMSR, 0x00,
XR20M1280_REG_IRQ_ENABLE, 0x01,
XR20M1280_REG_SPECIAL_FUNCT, 0x10,
// XR20M1280_REG_FIFO_CTRL, 0x07, //pour le test, on fait un reset des fifo avant le debut des transfert
};
size_t remain_len;
unsigned long irq_flags;
int ret, i, len_buf;
unsigned int read_time_out = 0;
unsigned char data_spi[128 + 1];
/***************/
unsigned char reg_rhr = XR20M1280_SPI_WR_BYTE_2_RD(XR20M1280_REG_RHR);
struct spi_transfer command_spi = {
.tx_buf = ®_rhr,
.len = 1,
};
struct spi_transfer data_xfer_spi_1 = {
.rx_buf = data_spi,
.len = 128,
};
struct spi_message xfer_message;
/***************/
gpio_direction_output(PINID_XR20M1280_FLOW_CTRL,1);
gpio_set_value(PINID_XR20M1280_TEST,1);
for (i=0; i<sizeof(config_tab); i+=2)
spi_write(spi, config_tab + i, 2);
gpio_set_value(PINID_XR20M1280_TEST,0);
private->xfer_mode = XR20M1280_RX_MODE;
gpio_set_value(PINID_XR20M1280_TEST,1);
read_time_out = 15000000;
do {
ret = gpio_get_value(PINID_XR20M1280_IRQ);
read_time_out--;
udelay(1);
}
while (!((0 == ret)||(read_time_out == 0)));
if (read_time_out == 0) {
printk("time out (15s) !!!\n");
return 0;
}
spi_message_init(&xfer_message);
spi_message_add_tail(&command_spi, &xfer_message);
spi_message_add_tail(&data_xfer_spi_1, &xfer_message);
spi_async(spi, &xfer_message);
gpio_set_value(PINID_XR20M1280_TEST,0);
return 0;
}