解决9922概率性打不开、死机、图像分层、第一通道黑边等问题

This commit is contained in:
hehaoyang 2024-01-27 15:24:52 +00:00
parent 60b7ffb1ec
commit 2706a648f8
3 changed files with 24 additions and 18 deletions

24
kernel/drivers/media/i2c/chipup/xs9922.c Executable file → Normal file
View 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
View 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},

View File

@ -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))