Do you tried to measure timeout between id? Do you tried to check if there is data loss ?
I writed v4l2 module over spi. Module code see in attachment. This code works in kernel mode - so it maybe is faster then your code.
All interesting is in the file:
For init this need add this in apropriate arch init file(for example):
static struct platform_device runway_lepton = {
.name = "LEPTON3",
.id = 0,
};
static struct fsl_mxc_spi_capture_platform_data spi_v4l_ptalform_data = {
.cs_gpio = IMX_GPIO_NR(3, 20),
.max_speed_hz = 20e6, /* max spi clock (SCK) speed in HZ */
.bus_num = 3,
.chip_select = 0,
.mode = SPI_MODE_0,
.clock_name = "imx6q-ecspi.3", // Имя генертора . троечка в конце говорит о том, что это для SPI #3. Можно было бы это название генерировать, но мне проще сгененрировать
};
static const __initdata iomux_v3_cfg_t runway_spi_itt_pads[] = {
// MX6DL_PAD_EIM_D20__ECSPI4_SS0,
MX6DL_PAD_SD3_RST__GPIO_7_8,
#define ECSPI_SS0_GPIO IMX_GPIO_NR(3, 20)
MX6DL_PAD_EIM_D20__GPIO_3_20,
MX6DL_PAD_EIM_D21__ECSPI4_SCLK,
MX6DL_PAD_EIM_D22__ECSPI4_MISO,
MX6DL_PAD_EIM_D28__ECSPI4_MOSI,
};
#define imx6q_add_ecspi_v4l(id_caprure,id, pdata) \
imx_add_spi_imx_v4l(id_caprure, &imx6q_ecspi_data_v4l[id], pdata)
mxc_iomux_v3_setup_multiple_pads((runway_spi_itt_pads), ARRAY_SIZE(runway_spi_itt_pads))
imx6q_add_ecspi_v4l(1, spi_v4l_ptalform_data.bus_num, (void*)&spi_v4l_ptalform_data);
mxc_register_device(&runway_lepton,&spi_v4l_ptalform_data);