static int dsi_panel_set_backlight_external(int value) { int ret = 0; ret = kthread_run(lcd_bl_set_led_brightness, (void *)value, "lcd_bl_set_led_brightness");
时间: 2024-04-26 17:22:28 浏览: 12
这段代码看起来将创建一个名为lcd_bl_set_led_brightness的线程,并将value的值直接传递给该线程作为参数。这种情况下,你需要确保lcd_bl_set_led_brightness线程的实现能够正确处理value参数的值。此外,你还需要检查kthread_run函数的返回值,确保线程创建成功。如果kthread_run函数返回值小于0,则说明线程创建失败,你需要在代码中处理这种情况,以防止程序出现问题。
相关问题
static int dsi_panel_set_backlight_external(int value){ int ret = 0; ret = kthread_run(lcd_bl_set_led_brightness, (void *)value, "lcd_bl_set_led_brightness"); if (ret < 0) { pr_err("Failed to create lcd_bl_set_led_brightness thread\n"); } ret = kthread_run(lcd_bias_set_led_brightness, (void *)value, "lcd_bias_set_led_brightness"); if (ret < 0) { pr_err("Failed to create lcd_bias_set_led_brightness thread\n"); } return ret;}这个代码会有kernel/msm-4.19/techpack/display/msm/dsi/dsi_panel.c:761:47: warning: cast to 'void *' from smaller integer type 'int' [-Wint-to-void-pointer-cast] error, forbidden warning: dsi_panel.c:761这个报错,该怎么解决
这个编译警告的原因是函数 `kthread_run()` 的第二个参数需要传入 `void*` 类型的指针,而在这个代码中,value 是一个整型变量,需要转换成 `void*` 类型的指针。你可以使用 `intptr_t` 类型来完成这个转换,它可以安全地将一个整型变量转换成指针类型。修改后的代码如下:
```
static int dsi_panel_set_backlight_external(int value)
{
int ret = 0;
ret = kthread_run(lcd_bl_set_led_brightness, (void *)(intptr_t)value, "lcd_bl_set_led_brightness");
if (ret < 0) {
pr_err("Failed to create lcd_bl_set_led_brightness thread\n");
}
ret = kthread_run(lcd_bias_set_led_brightness, (void *)(intptr_t)value, "lcd_bias_set_led_brightness");
if (ret < 0) {
pr_err("Failed to create lcd_bias_set_led_brightness thread\n");
}
return ret;
}
```
这个修改会把整型变量 value 转换成一个 intptr_t 类型的指针,然后再传给 `kthread_run()` 函数。这样就可以消除这个编译警告了。
int dsi_panel_set_backlight(struct dsi_panel *panel, u32 bl_lvl) { int rc = 0; struct dsi_backlight_config *bl = &panel->bl_config; if (panel->host_config.ext_bridge_mode) return 0; DSI_DEBUG("backlight type:%d lvl:%d\n", bl->type, bl_lvl); switch (bl->type) { case DSI_BACKLIGHT_WLED: rc = backlight_device_set_brightness(bl->raw_bd, bl_lvl); break; case DSI_BACKLIGHT_DCS: rc = dsi_panel_update_backlight(panel, bl_lvl); break; case DSI_BACKLIGHT_EXTERNAL: rc = lcd_bl_set_led_brightness(bl_lvl); //pr_err("dsi set bias brightness: %d\n", bl_lvl); rc = lcd_bias_set_led_brightness(bl_lvl); //pr_err("dsi set brightness: %d\n", bl_lvl); break; case DSI_BACKLIGHT_PWM: rc = dsi_panel_update_pwm_backlight(panel, bl_lvl); break; default: DSI_ERR("Backlight type(%d) not supported\n", bl->type); rc = -ENOTSUPP; } return rc; } int lcd_bl_set_led_brightness(int value)//for set bringhtness { dev_warn(&lcd_bl_i2c_client->dev, "lcm 8866 bl = %d\n", value); if (value < 0) { dev_warn(&lcd_bl_i2c_client->dev, "value=%d\n", value); return 0; } if (value > 0) { lcd_bl_write_byte(KTZ8866_DISP_BB_LSB, value & 0x07);// lsb lcd_bl_write_byte(KTZ8866_DISP_BB_MSB, (value >> 3) & 0xFF);// msb lcd_bl_write_byte(KTZ8866_DISP_BL_ENABLE, 0x4F); /* BL enabled and Current sink 1/2/3/4 enabled;*/ } else { lcd_bl_write_byte(KTZ8866_DISP_BB_LSB, 0x00);// lsb lcd_bl_write_byte(KTZ8866_DISP_BB_MSB, 0x00);// msb lcd_bl_write_byte(KTZ8866_DISP_BL_ENABLE, 0x00); /* BL enabled and Current sink 1/2/3/4 disabled;*/ } return 0; } int lcd_bias_set_led_brightness(int value)//for set bringhtness { dev_warn(&lcd_bl_bias_i2c_client->dev, "lcm 8866 bl = %d\n", value); if (value < 0) { dev_warn(&lcd_bl_bias_i2c_client->dev, "invalid value=%d\n", value); return 0; } if (value > 0) { lcd_bl_bias_write_byte(KTZ8866_DISP_BB_LSB, value & 0x07);// lsb lcd_bl_bias_write_byte(KTZ8866_DISP_BB_MSB, (value >> 3) & 0xFF);// msb lcd_bl_bias_write_byte(KTZ8866_DISP_BL_ENABLE, 0x4F); /* BL enabled and Current sink 1/2/3/4 enabled;*/ } else { lcd_bl_bias_write_byte(KTZ8866_DISP_BB_LSB, 0x00);// lsb lcd_bl_bias_write_byte(KTZ8866_DISP_BB_MSB, 0x00);// msb lcd_bl_bias_write_byte(KTZ8866_DISP_BL_ENABLE, 0x00); /* BL enabled and Current sink 1/2/3/4 disabled;*/ } return 0; } dsi_panel_set_backlight、lcd_bl_set_led_brightness和lcd_bias_set_led_brightness源码如上,帮忙用内核线程的方式,同时实现在case DSI_BACKLIGHT_EXTERNAL:下并发执行lcd_bl_set_led_brightness和lcd_bias_set_led_brightness两个函数
可以使用内核线程的方式实现在case DSI_BACKLIGHT_EXTERNAL下并发执行lcd_bl_set_led_brightness和lcd_bias_set_led_brightness两个函数。具体实现方法如下:
1. 新建一个内核线程函数,用于并发执行lcd_bl_set_led_brightness和lcd_bias_set_led_brightness两个函数。
```
static int dsi_panel_set_backlight_external(int value)
{
int ret = 0;
ret = kthread_run(lcd_bl_set_led_brightness, (void *)value, "lcd_bl_set_led_brightness");
if (ret < 0) {
pr_err("Failed to create lcd_bl_set_led_brightness thread\n");
}
ret = kthread_run(lcd_bias_set_led_brightness, (void *)value, "lcd_bias_set_led_brightness");
if (ret < 0) {
pr_err("Failed to create lcd_bias_set_led_brightness thread\n");
}
return ret;
}
```
2. 在case DSI_BACKLIGHT_EXTERNAL下调用新建的内核线程函数。
```
case DSI_BACKLIGHT_EXTERNAL:
rc = dsi_panel_set_backlight_external(bl_lvl);
break;
```
3. 注意修改lcd_bl_set_led_brightness和lcd_bias_set_led_brightness两个函数的参数类型,改为void *类型,以便在内核线程函数中传递bl_lvl参数。
```
int lcd_bl_set_led_brightness(void *data)
{
int value = (int)data;
...
}
int lcd_bias_set_led_brightness(void *data)
{
int value = (int)data;
...
}
```
以上是一种实现方式,可以在case DSI_BACKLIGHT_EXTERNAL下并发执行lcd_bl_set_led_brightness和lcd_bias_set_led_brightness两个函数。