解决9922概率性打不开、死机、图像分层、第一通道黑边等问题
This commit is contained in:
parent
60b7ffb1ec
commit
2706a648f8
24
kernel/drivers/media/i2c/chipup/xs9922.c
Executable file → Normal file
24
kernel/drivers/media/i2c/chipup/xs9922.c
Executable file → Normal file
|
@ -227,7 +227,7 @@ static const struct xs9922_mode supported_modes[] = {
|
|||
.numerator = 10000,
|
||||
.denominator = 250000,
|
||||
},
|
||||
.global_reg_list = xs9922_init_cfg_bak,
|
||||
.global_reg_list = xs9922_init_cfg,
|
||||
.reg_list = xs9922_720p_4lanes_25fps_1500M,
|
||||
.mipi_freq_idx = 0,
|
||||
.bpp = 8,
|
||||
|
@ -246,7 +246,7 @@ static const struct xs9922_mode supported_modes[] = {
|
|||
.numerator = 10000,
|
||||
.denominator = 250000,
|
||||
},
|
||||
.global_reg_list = xs9922_init_cfg_bak,
|
||||
.global_reg_list = xs9922_init_cfg,
|
||||
.reg_list = xs9922_1080p_4lanes_25fps_1500M,
|
||||
.mipi_freq_idx = 0,
|
||||
.bpp = 8,
|
||||
|
@ -409,10 +409,11 @@ void switch_mode(struct xs9922 *xs9922)
|
|||
#if (!__CLOSE_SENSOR__)
|
||||
static void __maybe_unused __xs9922_init(struct work_struct *work)
|
||||
{
|
||||
struct delayed_work *dwork = to_delayed_work(work);
|
||||
struct xs9922 *xs9922 = container_of(dwork, struct xs9922,
|
||||
delay_init);
|
||||
switch_mode(xs9922);
|
||||
//struct delayed_work *dwork = to_delayed_work(work);
|
||||
//struct xs9922 *xs9922 = container_of(dwork, struct xs9922,
|
||||
// delay_init);
|
||||
//switch_mode(xs9922);
|
||||
printk("ffffff __xs9922_init\n");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -1010,24 +1011,27 @@ static int __xs9922_start_stream(struct xs9922 *xs9922)
|
|||
int ret = 0;
|
||||
u32 feng_val;
|
||||
|
||||
dev_dbg(&client->dev, "%s IN --->>>\n", __func__);
|
||||
dev_err(&client->dev, "%s IN fffffff--->>>\n", __func__);
|
||||
|
||||
if (xs9922_reg_config)
|
||||
{
|
||||
switch_mode(xs9922);
|
||||
|
||||
printk("===========chad start mipi reset\n");
|
||||
msleep(1000);
|
||||
//ret =xs9922_write_array(client, xs9922_mipi_reset_new);
|
||||
//ret =xs9922_write_array(client, xs9922_mipi_reset);
|
||||
// ret = xs9922_write_array(client, xs9922_cfg2);
|
||||
if (ret != 0)
|
||||
dev_dbg(&client->dev, "%s write xs9922 register write error!\n", __func__);
|
||||
|
||||
printk("===========chad end mipi reset\n");
|
||||
printk("6667===========chad end mipi reset\n");
|
||||
}
|
||||
|
||||
xs9922_write_reg(client, 0x0e08, XS9922_REG_VALUE_08BIT, 0x01);
|
||||
xs9922_write_reg(client, 0x1e08, XS9922_REG_VALUE_08BIT, 0x01);
|
||||
xs9922_write_reg(client, 0x2e08, XS9922_REG_VALUE_08BIT, 0x00);
|
||||
xs9922_write_reg(client, 0x3e08, XS9922_REG_VALUE_08BIT, 0x00);
|
||||
xs9922_write_reg(client, 0x2e08, XS9922_REG_VALUE_08BIT, 0x01);
|
||||
xs9922_write_reg(client, 0x3e08, XS9922_REG_VALUE_08BIT, 0x01);
|
||||
usleep_range(200*1000, 400*1000);
|
||||
|
||||
detect_thread_start(xs9922);
|
||||
|
|
4
kernel/drivers/media/i2c/chipup/xs9922_reg_cfg.h
Executable file → Normal file
4
kernel/drivers/media/i2c/chipup/xs9922_reg_cfg.h
Executable file → Normal file
|
@ -2080,8 +2080,8 @@ static const struct regval xs9922_720p_4lanes_25fps_1500M[] = {
|
|||
{0x0616, 0x24},
|
||||
{0x0617, 0x00},
|
||||
{0x0618, 0x04},
|
||||
{0x060a, 0x07},
|
||||
{0x010a, 0x05},
|
||||
{0x060a, 0x07},//解决左边黑边问题
|
||||
{0x010a, 0x3e},
|
||||
{0x0100, 0x30},
|
||||
{0x0104, 0x48},
|
||||
{0x0802, 0x21},
|
||||
|
|
|
@ -211,7 +211,7 @@ static struct v4l2_subdev *get_remote_sensor(struct v4l2_subdev *sd)
|
|||
return media_entity_to_v4l2_subdev(sensor_me);
|
||||
}
|
||||
|
||||
static void get_remote_terminal_sensor(struct v4l2_subdev *sd,
|
||||
/*static void get_remote_terminal_sensor(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev **sensor_sd)
|
||||
{
|
||||
struct media_graph graph;
|
||||
|
@ -219,7 +219,6 @@ static void get_remote_terminal_sensor(struct v4l2_subdev *sd,
|
|||
struct media_device *mdev = entity->graph_obj.mdev;
|
||||
int ret;
|
||||
|
||||
/* Walk the graph to locate sensor nodes. */
|
||||
mutex_lock(&mdev->graph_mutex);
|
||||
ret = media_graph_walk_init(&graph, mdev);
|
||||
if (ret) {
|
||||
|
@ -238,12 +237,12 @@ static void get_remote_terminal_sensor(struct v4l2_subdev *sd,
|
|||
*sensor_sd = media_entity_to_v4l2_subdev(entity);
|
||||
else
|
||||
*sensor_sd = NULL;
|
||||
}
|
||||
}*/
|
||||
|
||||
static void csi2_update_sensor_info(struct csi2_dev *csi2)
|
||||
{
|
||||
struct csi2_sensor *sensor = &csi2->sensors[0];
|
||||
struct v4l2_subdev *terminal_sensor_sd = NULL;
|
||||
//struct v4l2_subdev *terminal_sensor_sd = NULL;
|
||||
struct v4l2_mbus_config mbus;
|
||||
int ret = 0;
|
||||
|
||||
|
@ -253,13 +252,13 @@ static void csi2_update_sensor_info(struct csi2_dev *csi2)
|
|||
return;
|
||||
}
|
||||
|
||||
get_remote_terminal_sensor(&csi2->sd, &terminal_sensor_sd);
|
||||
/*get_remote_terminal_sensor(&csi2->sd, &terminal_sensor_sd);
|
||||
if (terminal_sensor_sd) {
|
||||
ret = v4l2_subdev_call(terminal_sensor_sd, core, ioctl,
|
||||
RKMODULE_GET_CSI_DSI_INFO, &csi2->dsi_input_en);
|
||||
if (ret)
|
||||
csi2->dsi_input_en = 0;
|
||||
}
|
||||
}*/
|
||||
csi2->bus.flags = mbus.flags;
|
||||
switch (csi2->bus.flags & V4L2_MBUS_CSI2_LANES) {
|
||||
case V4L2_MBUS_CSI2_1_LANE:
|
||||
|
@ -356,6 +355,8 @@ static int csi2_start(struct csi2_dev *csi2)
|
|||
return ret;
|
||||
}
|
||||
|
||||
pr_err("csi2_start called update sensor info");
|
||||
v4l2_err(&csi2->sd, "%s: csi2_start called\n", __func__);
|
||||
csi2_update_sensor_info(csi2);
|
||||
|
||||
if (csi2->dsi_input_en == RKMODULE_DSI_INPUT)
|
||||
|
@ -959,6 +960,7 @@ static int csi2_probe(struct platform_device *pdev)
|
|||
struct resource *res;
|
||||
const struct csi2_match_data *data;
|
||||
int ret, irq;
|
||||
v4l2_err(&csi2->sd, "csi2_probe called");
|
||||
|
||||
match = of_match_node(csi2_dt_ids, node);
|
||||
if (IS_ERR(match))
|
||||
|
|
Loading…
Reference in New Issue
Block a user