Sensor Porting Guide
1. Overview¶
This document describes how to porting SigmaStar sensor driver including basic hardware knowledge, software control sensor API(sensor handle), sensor interface API(Sensor-IF) of SigmaStar and software porting flow. In this document, we take the sensor driver of imx415/imx307/os550xs as examples. You can follow the instructions in this document to complete the sensor porting step by step.
First we introduce the relevant knowledge of hardware and corresponding source code to make it easier to understand for you.
2. Sensor Hardware (Take imx415 sensor as an example)¶
2.1. Power On Sequence in Datasheet¶
-
Turn On the power supplies so that the power supplies rise in order of 1.1V power supply (DVdd) → 1.8V Power supply(OVdd) → 2.9V power supply(AVdd). In addition, all power supplies should finish within 200ms.
-
The register values undefined immediately after power-on, so the system must be cleared. Hold XCLR at low level for 500ns or more after all the power supplies have finished rising. (The register values after a system clear are the default values.)
-
The sys clear is applied by setting XCLR to High level. The maser clock input after setting the XCLR pin to High level
-
Make the sensor setting by register communication after the system clear
2.2. Schematic of Power Circuit¶
Below is SigmaStar Sensor board schematic of power circuit. 1.1V, 1.8V, 2.9V power will pull high after power-on enable. First 1.1V, then 1.8V and 2.9V, you can use an oscilloscope to measure it on your sensor board.
2.2.1. IMX415 Power ON Measurement(1)¶
2.2.2. IMX415 Power ON Measurement(1)¶
3. Sensor Code Setting¶
3.1. pCus_poweron API¶
You can control sensor power-on and reset pins through "handle->pCus_sensor_poweron" in the sensor driver handle initial function. If you need to modify sensor power sequence timing, please check the characteristics of sensor and hardware design.
static int pCus_poweron(ms_cus_sensor *handle, u32 idx) { ISensorIfAPI *sensor_if = &handle->sensor_if_api; //SENSOR_DMSG("[%s] ", __FUNCTION__); printk("[%s] ", __FUNCTION__); //Sensor power on sequence sensor_if->PowerOff(idx, handle->pwdn_POLARITY); // Powerdn Pull Low sensor_if->Reset(idx, handle->reset_POLARITY); // Rst Pull Low sensor_if->SetIOPad(idx, handle->sif_bus, handle->interface_attr.attr_mipi.mipi_lane_num); sensor_if->SetCSI_Clk(idx, CUS_CSI_CLK_216M); sensor_if->SetCSI_Lane(idx, handle->interface_attr.attr_mipi.mipi_lane_num, ENABLE); sensor_if->SetCSI_LongPacketType(idx, 0, 0x1C00, 0); if (handle->interface_attr.attr_mipi.mipi_hdr_mode == CUS_HDR_MODE_SONY_DOL) { sensor_if->SetCSI_hdr_mode(idx, handle->interface_attr.attr_mipi.mipi_hdr_mode, 1); } sensor_if->PowerOff(idx, !handle->pwdn_POLARITY); //Sensor board PWDN Enable, 1.8V & 2.9V need 30ms then Pull High SENSOR_MSLEEP(31); sensor_if->Reset(idx, !handle->reset_POLARITY); SENSOR_UDELAY(1); sensor_if->MCLK(idx, 1, handle->mclk); printk("Sensor Power On finished\n"); return SUCCESS; }
3.1.1. Handle of signal polarity API¶
Set Soc hardware signal polarity
Parameter | Description | Note |
---|---|---|
handle->pwdn_POLARITY | Register set output sensor power-down pin (GPIO) polarity | SENSOR_PWDN_POLCUS_CLK_POL_POS = 0,/** High active */CUS_CLK_POL_NEG/** Low active */ |
handle->reset_POLARITY | Register set output sensor reset pin (GPIO) polarity | SENSOR_RST_POLCUS_CLK_POL_POS = 0,/** active */CUS_CLK_POL_NEG /**Low active */ |
For parallel Interface
Parameter | Description | Note |
---|---|---|
handle->VSYNC_POLARITY | Register set receive sensor Vsync pin signal polarity | SENSOR_VSYNC_POL CUS_CLK_POL_POS = 0, /** High active */ CUS_CLK_POL_NEG /** Low active */ |
handle->HSYNC_POLARITY | Register set receive sensor Hsync pin signal polarity | SENSOR_HSYNC_POL CUS_CLK_POL_POS = 0, /** High active */ CUS_CLK_POL_NEG /** Low active */ |
handle->PCLK_POLARITY | Register set receive sensor pixel clk pin signal polarity | SENSOR_PCLK_POL CUS_CLK_POL_POS = 0,/** High active */CUS_CLK_POL_NEG /** Low active */ |
3.2. I2C Info and Setting¶
SigmaStar SoC needs to communicate with a sensor through I2C, please check the sensor I2C slave address first.
3.2.1. Corresponding source code¶
The sensor driver I2C Setting in Marco define
//////////////////////////////////// // I2C Info // //////////////////////////////////// #define SENSOR_I2C_ADDR 0x34 //I2C slave address #define SENSOR_I2C_SPEED 300000 //I2C speed, 60000~320000 //#define SENSOR_I2C_CHANNEL 1 //I2C Channel //#define SENSOR_I2C_PAD_MODE 2 //Pad/Mode Number //usally set CUS_I2C_NORMAL_MODE, if use old OVT I2C protocol=> set CUS_I2C_LEGACY_MODE #define SENSOR_I2C_LEGACY I2C_NORMAL_MODE //CUS_I2C_FMT_A8D8, CUS_I2C_FMT_A8D16, CUS_I2C_FMT_A16D8, CUS_I2C_FMT_A16D16 #define SENSOR_I2C_FMT I2C_FMT_A16D8 int cus_camsensor_init_handle_linear(ms_cus_sensor* drv_handle) ///////////////////////////////////////////////////// // i2c config ///////////////////////////////////////////////////// handle->i2c_cfg.mode = SENSOR_I2C_LEGACY; //(CUS_ISP_I2C_MODE) FALSE; handle->i2c_cfg.fmt = SENSOR_I2C_FMT; //CUS_I2C_FMT_A16D8; handle->i2c_cfg.address = SENSOR_I2C_ADDR; //0x5a; handle->i2c_cfg.speed = SENSOR_I2C_SPEED; //320000;
NOTE: Check the sensor board schematic of I2C slave mode Option
3.2.2. Sensor MCLK suppot¶
Each sensor can support in different MCLK. The MCLK list table that we can provide is as follows. You can find the MCLK corresponding to the sensor from the initialization settings provided by the sensor vendor. The sensor MCLK Setting in Marco define
//////////////////////////////////// // MCLK Info // //////////////////////////////////// /*******I5/I6 Support MCLK List******* * CUS_CMU_CLK_27MHZ / CUS_CMU_CLK_21P6MHZ / CUS_CMU_CLK_12MHZ, * CUS_CMU_CLK_5P4MHZ / CUS_CMU_CLK_36MHZ / CUS_CMU_CLK_54MHZ, * CUS_CMU_CLK_43P2MHZ / CUS_CMU_CLK_61P7MHZ / CUS_CMU_CLK_72MHZ, * CUS_CMU_CLK_48MHZ / CUS_CMU_CLK_24MHZ / CUS_CMU_CLK_37P125MHZ, ******End of Support MCLK List*******/ #define Preview_MCLK_SPEED CUS_CMU_CLK_27MHZ #define Preview_MCLK_SPEED_HDR_DOL CUS_CMU_CLK_37P125MHZ
The sensor MCLK control Interface in handle initial function
//////////////////////////////////// // mclk // //////////////////////////////////// handle->mclk = UseParaMclk(SENSOR_DRV_PARAM_MCLK());
3.3. Fill Up Initial Setting Flow¶
As follow, the init exel supplyed by sony vendors; and we need fill the init setting to Sensor driver's init table.
const static I2C_ARRAY Sensor_init_table_4lane_linear[] = { {0x3000, 0x01}, //Standby //{0xffff, 0x24}, //delay (ms) {0x3002, 0x01}, //Master mode stop //{0xffff, 0x10}, //delay (ms) {0x3008, 0x7F}, //BCwait time {0x3009, 0x00}, {0x300A, 0x5B}, {0x300B, 0xA0}, … … … {0x4074, 0x01}, {0xffff, 0x24}, {0x3002, 0x00}, //Master mode start {0xffff, 0x10}, {0x3000, 0x00}, //Operating };
3.4. Sensor Register Initial Setting Flow¶
4. Software Sensor Driver¶
This chapter introduces the process of software porting sensor driver. First, it will explain how to initialize the sensor. Then describe the information required by the sensor driver 3A and control the functions that 3A will call.
4.1. Sensor Driver Entry and support mode¶
Register the sensor support behavior mode. For example, the IMX415 sensor supports linear and HDR mode, you can refer to the IMX415 sensor driver and fill it in define of “SENSOR_DRV_ENTRY_IMPL_END_EX”.
Parameter | Description |
---|---|
Name | Sensor Name and support mode |
LinearEntry | Sensor Linear mode handle initial function |
HdrSefEntry | Sensor HDR Short Exposure handle initial function |
HdrLefEntry | Sensor HDR Long Exposure handle initial function |
PrivateDataType | Sensor Private Data Type |
4.2. Sensor-IF Information¶
These settings are the hardware infomation of the sensor, we have listed the necessary hardware information, you can refer to the IMX415/IMX307 sensor driver
//////////////////////////////////// // Sensor-If Info // //////////////////////////////////// //MIPI config begin. #define SENSOR_MIPI_LANE_NUM (4) #define SENSOR_MIPI_LANE_NUM_DOL (4) //#define SENSOR_MIPI_HDR_MODE (0) //0: Non-HDR mode. 1:Sony DOL mode #define SENSOR_ISP_TYPE ISP_EXT //ISP_EXT, ISP_SOC (Non-used) //#define SENSOR_DATAFMT CUS_DATAFMT_BAYER //CUS_DATAFMT_YUV, CUS_DATAFMT_BAYER #define SENSOR_IFBUS_TYPE CUS_SENIF_BUS_MIPI //CFG //CUS_SENIF_BUS_PARL, CUS_SENIF_BUS_MIPI #define SENSOR_MIPI_HSYNC_MODE PACKET_HEADER_EDGE #define SENSOR_MIPI_HSYNC_MODE_HDR_DOL PACKET_FOOTER_EDGE #define SENSOR_DATAPREC CUS_DATAPRECISION_10 #define SENSOR_DATAPREC_DOL CUS_DATAPRECISION_12 #define SENSOR_DATAMODE CUS_SEN_10TO12_9098 //CFG #define SENSOR_BAYERID CUS_BAYER_GB //0h: CUS_BAYER_RG, 1h: CUS_BAYER_GR, 2h: CUS_BAYER_BG, 3h: CUS_BAYER_GB #define SENSOR_BAYERID_HDR_DOL CUS_BAYER_RG #define SENSOR_RGBIRID CUS_RGBIR_NONE #define SENSOR_ORIT CUS_ORIT_M0F0 //CUS_ORIT_M0F0, CUS_ORIT_M1F0, CUS_ORIT_M0F1, CUS_ORIT_M1F1, //#define SENSOR_YCORDER CUS_SEN_YCODR_YC //CUS_SEN_YCODR_YC, CUS_SEN_YCODR_CY //////////////////////////////////// // MCLK Info // //////////////////////////////////// #define Preview_MCLK_SPEED CUS_CMU_CLK_27MHZ //CUS_CMU_CLK_24MHZ //CUS_CMU_CLK_37P125MHZ #define Preview_MCLK_SPEED_HDR_DOL CUS_CMU_CLK_27MHZ int cus_camsensor_init_handle_linear(ms_cus_sensor* drv_handle)
4.3. Sensor-IF Information in handle¶
4.3.1. Macro Parameter¶
int cus_camsensor_init_handle_linear(ms_cus_sensor* drv_handle) //////////////////////////////////// // sensor interface info // //////////////////////////////////// handle->isp_type = SENSOR_ISP_TYPE; //handle->data_fmt = SENSOR_DATAFMT; handle->sif_bus = SENSOR_IFBUS_TYPE; handle->data_prec = SENSOR_DATAPREC; handle->data_mode = SENSOR_DATAMODE; handle->bayer_id = SENSOR_BAYERID; handle->RGBIR_id = SENSOR_RGBIRID; handle->orient = SENSOR_ORIT; //handle->YC_ODER = SENSOR_YCORDER; //CUS_SEN_YCODR_CY; handle->interface_attr.attr_mipi.mipi_lane_num = SENSOR_MIPI_LANE_NUM; handle->interface_attr.attr_mipi.mipi_data_format = CUS_SEN_INPUT_FORMAT_RGB; // RGB pattern. handle->interface_attr.attr_mipi.mipi_yuv_order = 0; //don't care in RGB pattern. handle->interface_attr.attr_mipi.mipi_hsync_mode = SENSOR_MIPI_HSYNC_MODE; handle->interface_attr.attr_mipi.mipi_hdr_mode = CUS_HDR_MODE_NONE; handle->interface_attr.attr_mipi.mipi_hdr_virtual_channel_num = 0; //Short frame ///////////////////////////////////////////////////// // mclk ///////////////////////////////////////////////////// handle->mclk = UseParaMclk(SENSOR_DRV_PARAM_MCLK());
4.3.2. Handle of set/get sensor control API¶
We can load sensor initial setting, switch sensor output resolution, sensor mirror or flip and fps set or get through these functions.
//////////////////////////////////////// // Sensor Status Control and Get Info // //////////////////////////////////////// handle->pCus_sensor_release = cus_camsensor_release_handle; handle->pCus_sensor_init = pCus_init_mipi4lane_linear; //handle->pCus_sensor_powerupseq = pCus_powerupseq; handle->pCus_sensor_poweron = pCus_poweron; handle->pCus_sensor_poweroff = pCus_poweroff; handle->pCus_sensor_GetSensorID = pCus_GetSensorID; handle->pCus_sensor_GetVideoResNum = pCus_GetVideoResNum; handle->pCus_sensor_GetVideoRes = pCus_GetVideoRes; handle->pCus_sensor_GetCurVideoRes = pCus_GetCurVideoRes; handle->pCus_sensor_SetVideoRes = pCus_SetVideoRes; handle->pCus_sensor_GetOrien = pCus_GetOrien; handle->pCus_sensor_SetOrien = pCus_SetOrien; handle->pCus_sensor_GetFPS = pCus_GetFPS; handle->pCus_sensor_SetFPS = pCus_SetFPS; //handle->pCus_sensor_GetSensorCap = pCus_GetSensorCap; handle->pCus_sensor_SetPatternMode = imx415_SetPatternMode; //NONE
Parameter | Description | Note |
---|---|---|
handle->pCus_sensor_release | Register sensor release function. | Function ref :cus_camsensor_release_handle |
handle->pCus_sensor_init | Register load sensor initial setting function. | Function ref: pCus_init_mipi4lane_linear |
handle->pCus_sensor_poweron | Register set sensor power-on sequence function. | Function ref: pCus_poweron |
handle->pCus_sensor_poweroff | Register set sensor power-off sequence function. | Function ref pCus_poweroff |
handle->pCus_sensor_GetSensorID | Register get and check sensor ID | Function ref pCus_GetSensorID |
handle->pCus_sensor_GetVideoResNum | Register get sensor support resolution number function, that’s video output index. | Function ref:pCus_GetVideoResNum |
handle->pCus_sensor_GetVideoRes | Register get sensor support preview info function (width, height, and frame rate). | Function ref :pCus_GetVideoRes |
handle->pCus_sensor_GetCurVideoRes | Register get sensor current preview info function (width, height, and frame rate). | Function ref: pCus_GetCurVideoRes |
handle->pCus_sensor_SetVideoRes | Register switch sensor and load initial setting function. | Function ref: pCus_SetVideoRes |
handle->pCus_sensor_GetOrien | Register get sensor mirror-flip status function. | Function ref pCus_GetOrien |
handle->pCus_sensor_SetOrien | Register set Sensor mirror-flip status function. | Function ref pCus_SetOrien |
handle->pCus_sensor_GetFPS | Register set sensor FPS status function. | Function ref:pCus_sensor_GetFPS |
handle->pCus_sensor_SetFPS | Register get sensor FPS status function. | Function ref:pCus_SetFPS |
handle->pCus_sensor_SetPatternMode | Register set sensor test pattern (Color Bar Pattern). | |
handle->pCus_sensor_SwitchSensorId | Register set sensor switch sensor pad info |
4.4. Image Information¶
You need to fill in the sensor image information provided by the sensor provider FAE. This information includes preview size, image crop size and site etc. We define this information as a global variable.
4.4.1. Corresponding source code¶
static struct { // LINEAR // Modify it based on number of support resolution enum {LINEAR_RES_1 = 0, LINEAR_RES_2, LINEAR_RES_3, LINEAR_RES_4, LINEAR_RES_5, LINEAR_RES_6, LINEAR_RES_7, LINEAR_RES_8, LINEAR_RES_END}mode; // Sensor Output Image info struct _senout{ s32 width, height, min_fps, max_fps; }senout; // VIF Get Image Info struct _sensif{ s32 crop_start_X, crop_start_y, preview_w, preview_h; }senif; // Show resolution string struct _senstr{ const char* strResDesc; }senstr; }imx415_mipi_linear[] = { {LINEAR_RES_1, {3860, 2250, 3, 20}, {0, 0, 3840, 2160}, {"3840x2160@20fps"}}, {LINEAR_RES_2, {3096, 2190, 3, 30}, {0, 0, 3072, 2048}, {"3072x2048@30fps"}}, // Modify it {LINEAR_RES_3, {3096, 1758, 3, 30}, {0, 0, 3072, 1728}, {"3072x1728@30fps"}}, // Modify it {LINEAR_RES_4, {2616, 1974, 3, 30}, {0, 0, 2592, 1944}, {"2592x1944@30fps"}}, // Modify it {LINEAR_RES_5, {2976, 1686, 3, 30}, {0, 0, 2944, 1656}, {"2944x1656@30fps"}}, // Modify it {LINEAR_RES_6, {2592, 1470, 3, 30}, {0, 0, 2560, 1440}, {"2560x1440@30fps"}}, // Modify it {LINEAR_RES_7, {1920, 1080, 3, 60}, {0, 0, 1920, 1080}, {"1920x1080@60fps"}}, // Modify it {LINEAR_RES_8, {3864, 2192, 3, 30}, {0, 0, 3840, 2160}, {"3840x2160@30fps"}}, // Modify it //{LINEAR_RES_9, {2616, 1974, 3, 25}, {0, 0, 2592, 1944}, {"2592x1944@25fps"}}, // Modify it }; int cus_camsensor_init_handle_linear(ms_cus_sensor* drv_handle) //////////////////////////////////// // resolution capability // //////////////////////////////////// handle->video_res_supported.ulcur_res = 0; //default resolution index is 0. //handle->video_res_supported.num_res = LINEAR_RES_END; for (res = 0; res < LINEAR_RES_END; res++) { handle->video_res_supported.num_res = res+1; handle->video_res_supported.res[res].width = imx415_mipi_linear[res].senif.preview_w; handle->video_res_supported.res[res].height = imx415_mipi_linear[res].senif.preview_h; handle->video_res_supported.res[res].max_fps = imx415_mipi_linear[res].senout.max_fps; handle->video_res_supported.res[res].min_fps = imx415_mipi_linear[res].senout.min_fps; handle->video_res_supported.res[res].crop_start_x = imx415_mipi_linear[res].senif.crop_start_X; handle->video_res_supported.res[res].crop_start_y = imx415_mipi_linear[res].senif.crop_start_y; handle->video_res_supported.res[res].nOutputWidth = imx415_mipi_linear[res].senout.width; handle->video_res_supported.res[res].nOutputHeight = imx415_mipi_linear[res].senout.height; sprintf(handle->video_res_supported.res[res].strResDesc,imx415_mipi_linear[res].senstr.strResDesc); }
4.4.2. Get the Sensor Driver Support Resolution Info¶
static int pCus_GetVideoResNum( ms_cus_sensor *handle, u32 *ulres_num) { *ulres_num = handle->video_res_supported.num_res; return SUCCESS; } static int pCus_GetCurVideoRes(ms_cus_sensor *handle, u32 *cur_idx, cus_camsensor_res **res) { u32 num_res = handle->video_res_supported.num_res; *cur_idx = handle->video_res_supported.ulcur_res; if (*cur_idx >= num_res) { SENSOR_EMSG("[%s] Please check the number of resolutions supported by the sensor!\n", __FUNCTION__); return FAIL; } *res = &handle->video_res_supported.res[*cur_idx]; return SUCCESS; }
4.4.3. Get the Sensor Driver Support Resolution Info Idx¶
static int pCus_GetVideoRes(ms_cus_sensor *handle, u32 res_idx, cus_camsensor_res **res) { u32 num_res = handle->video_res_supported.num_res; if (res_idx >= num_res) { SENSOR_EMSG("[%s] Please check the number of resolutions supported by the sensor!\n", __FUNCTION__); return FAIL; } *res = &handle->video_res_supported.res[res_idx]; return SUCCESS; }
4.5. The Sensor Driver Initial Flow¶
The functions that the sensor driver needs to support include fps adjustment, AE shutter adjustment, AE gain adjustment, and mirror flip function settings, which we will not describe more detail, because this needs to be implemented according to the characteristics of each sensor.
The following is our control the sensor implement function flow. Relatively, we also need to get the sensor information, please refer to the figure below:
This document introduces the initial process of transplanting the sensor according to the process in the figure above.
4.6. Select the Sensor Driver Resolution¶
static int pCus_SetVideoRes(ms_cus_sensor *handle, u32 res_idx) { imx415_params *params = (imx415_params *)handle->private_data; u32 num_res = handle->video_res_supported.num_res; if (res_idx >= num_res) { SENSOR_EMSG("[%s] Please check the number of resolutions supported by the sensor!\n", __FUNCTION__); return FAIL; } handle->video_res_supported.ulcur_res = res_idx; switch (res_idx) { case 0: handle->video_res_supported.ulcur_res = 0; handle->pCus_sensor_init = pCus_init_8m_20fps_mipi4lane_linear; vts_30fps = 2813; params->expo.vts = vts_30fps; params->expo.fps = 20; Preview_line_period = 17778; // 49.86ms/2813 = 17725ns handle->data_prec = CUS_DATAPRECISION_10; break; case 1: handle->video_res_supported.ulcur_res = 1; handle->pCus_sensor_init = pCus_init_6m_30fps_mipi4lane_linear; vts_30fps = 2250; params->expo.vts = vts_30fps; params->expo.fps = 30; Preview_line_period = 14815; handle->data_prec = CUS_DATAPRE ... ... }
4.7. Control the Sensor implement function flow¶
{ handle->pCus_sensor_AEStatusNotify = pCus_AEStatusNotify; handle->pCus_sensor_GetAEUSecs = pCus_GetAEUSecs; handle->pCus_sensor_SetAEUSecs = pCus_SetAEUSecs; handle->pCus_sensor_GetAEGain = pCus_GetAEGain; handle->pCus_sensor_SetAEGain = pCus_SetAEGain; }
4.7.1. Notify API for sensor setting action to HW¶
5. Supplement¶
5.1. Install the sensor driver parameter¶
SigmaStar sensor driver provides several installation parameters that can be used when installing the sensor driver. Here are the parameters and instructions as below:
Parameter | Description |
---|---|
chmap | Specify SoC Channel pad for sensor |
lane_num | Specify Sensor linear mode MIPI lane number |
hdr_lane_num | Specify Sensor hdr mode MIPI lane number |
i2c_slave_id | Specify Sensor i2c slave id |
For example:
insmod imx335_MIPI.ko chmap=1 lane_num=4 hdr_lane_num=4 i2c_slave_id=0x20
If the above parameters are not used when installing the sensor driver, the default values in the sensor driver are used.
5.2. Verify and Debug¶
5.2.1. cat /sys/class/mstar/vif0/vif_ints¶
At the same time you can open telnet and enter the following cmd to confirm the VIF and ISP status. Usually 30fps means that a frame period is 33.3ms.
/ # cat /sys/class/mstar/vif0/vif_ints == VIF CH-0 == Interval(ns) : 33309000 VREF_RISING : 6147 VREF_FALLING : 6149 LINE_CNT_0 : 2 LINE_CNT_1 : 2
5.2.2. cat /sys/class/mstar/vif0/vif_info¶
Confirm the information of the sensor signal received by VIF device
/ # cat /sys/class/mstar/vif0/vif_info == VIF CH-0 == INTF_MODE = 4 CH_EN: 1 SRC: MIPI0 INPUT_FMT: RGB PIX_FMT: 12 bits HDR_EN: 0 HDR_CH: VC0 CROP_EN: 1 CROP_START_X: 0 - 1919 CROP_START_Y: 0 - 1079 PIXEL_CNT: 1920 LINE_CNT: 1080
5.2.3. cat /sys/class/mstar/isp0/isp_ints¶
If the transmission speed of one line or pixel per frame is too fast, even if the VIF can receive the image data normally, there is no guarantee that the ISP can process it immediately, it causes isp fifo full.
/ # cat /sys/class/mstar/isp0/isp_ints frame_count : 1089 u32FrameIntervalNanoSec : 33332 us ISP_FIFO_FULL : 0 INT_PIPE1_FIFO_FULL : 0 ISP_BUSY : 1089, 06.952374 ISP_IDLE : 1090, 06.950575 RDMA0_DONE : 0 RDMA1_DONE : 0 WDMA0_DONE : 0 WDMA1_DONE : 0 WDMA6_LINE_HIT : 0 WDMA6_DONE : 0 ISPIF_VSYNC : 1089, 06.952046, 0 AE_DONE : 1088, 06.950279, 1934 AE_DONE period : 31565 use