[РЕШЕНО] Отсутствие регулировки экспозиции на вебкамере a4tech pk-910h

safocl, молодцом, но не будете же вы каждый раз пересобирать ядро... Неплохо было бы баг оформить.
Aivar
safocl, молодцом, но не будете же вы каждый раз пересобирать ядро… Неплохо было бы баг оформить.
хочу пожже отписать коммитерам ядра, чо их коммит делает плахие весчи.... вчера по ошибке отписался на другой коммит, тот который думал является трабблой.

если кто не инертный к данному моменту просьба тож отписаться к коммиттерам, а так же хз мож в арч майнтейнеру пакета ядра? чо бы накладывал патч...
надо кстати подумать, там я уверен можно исправить не откатывая патч, просто чот челы не додумали, кто в си шарит могут пакумекать, сам ентим займусь, но я такой себе программист, а еще читатель чужого кода из меня ваще пичальный, но постараюсь, люблю капаться в подобном
`--> v4l2-ctl -l
                     brightness 0x00980900 (int)    : min=-10 max=10 step=1 default=2 value=1
                       contrast 0x00980901 (int)    : min=1 max=32 step=1 default=17 value=14
                     saturation 0x00980902 (int)    : min=0 max=32 step=1 default=17 value=16
                            hue 0x00980903 (int)    : min=-5 max=5 step=1 default=0 value=0
 white_balance_temperature_auto 0x0098090c (bool)   : default=1 value=1
                          gamma 0x00980910 (int)    : min=100 max=200 step=1 default=150 value=157
           power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=2 value=1
      white_balance_temperature 0x0098091a (int)    : min=2800 max=6500 step=1850 default=6500 value=4650 flags=inactive
                      sharpness 0x0098091b (int)    : min=0 max=10 step=1 default=6 value=6
                  exposure_auto 0x009a0901 (menu)   : min=0 max=3 default=3 value=1
              exposure_absolute 0x009a0902 (int)    : min=156 max=5000 step=1 default=512 value=156
.-(~)-------------------------------------------------------------------------------------------------------------------------------------------------------------------------([email protected]_comp)-
`--> uname -r
4.17.2
да, именно ентот коммит, наложил реверс патч и все роббит и на 4.17.2
о кстати, походу я нашел чо мешает нормально работать ентому патчу....
static int uvc_ctrl_fill_xu_info(struct uvc_device *dev,
	const struct uvc_control *ctrl, struct uvc_control_info *info)
{
	u8 *data;
	int ret;

	data = kmalloc(2, GFP_KERNEL);
	if (data == NULL)
		return -ENOMEM;

	memcpy(info->entity, ctrl->entity->extension.guidExtensionCode,
	       sizeof(info->entity));
	info->index = ctrl->index;
	info->selector = ctrl->index + 1;

	/* Query and verify the control length (GET_LEN) */
	ret = uvc_query_ctrl(dev, UVC_GET_LEN, ctrl->entity->id, dev->intfnum,
			     info->selector, data, 2);
	if (ret < 0) {
		uvc_trace(UVC_TRACE_CONTROL,
			  "GET_LEN failed on control %pUl/%u (%d).\n",
			   info->entity, info->selector, ret);
		goto done;
	}

	info->size = le16_to_cpup((__le16 *)data);

	/* Query the control information (GET_INFO) */
	ret = uvc_query_ctrl(dev, UVC_GET_INFO, ctrl->entity->id, dev->intfnum,
			     info->selector, data, 1);
енто до патча... тут в data выделяется 2 байта при втором присвоении ret, а в файле после патча:

static int uvc_ctrl_fill_xu_info(struct uvc_device *dev,
	const struct uvc_control *ctrl, struct uvc_control_info *info)
{
	u8 *data;
	int ret;

	data = kmalloc(2, GFP_KERNEL);
	if (data == NULL)
		return -ENOMEM;

	memcpy(info->entity, ctrl->entity->extension.guidExtensionCode,
	       sizeof(info->entity));
	info->index = ctrl->index;
	info->selector = ctrl->index + 1;

	/* Query and verify the control length (GET_LEN) */
	ret = uvc_query_ctrl(dev, UVC_GET_LEN, ctrl->entity->id, dev->intfnum,
			     info->selector, data, 2);
	if (ret < 0) {
		uvc_trace(UVC_TRACE_CONTROL,
			  "GET_LEN failed on control %pUl/%u (%d).\n",
			   info->entity, info->selector, ret);
		goto done;
	}

	info->size = le16_to_cpup((__le16 *)data);

	ret = uvc_ctrl_get_flags(dev, ctrl, info);
тут ret присваивается значение из той же функции uvc_query_ctrl, но в нее подставляется значение data, которой выделено всего 1 байт:

static int uvc_ctrl_get_flags(struct uvc_device *dev,
			      const struct uvc_control *ctrl,
			      struct uvc_control_info *info)
{
	u8 *data;
	int ret;

	data = kmalloc(1, GFP_KERNEL);
	if (data == NULL)
		return -ENOMEM;

	ret = uvc_query_ctrl(dev, UVC_GET_INFO, ctrl->entity->id, dev->intfnum,
			     info->selector, data, 1);
	if (!ret)
		info->flags = UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX
			    | UVC_CTRL_FLAG_GET_RES | UVC_CTRL_FLAG_GET_DEF
			    | (data[0] & UVC_CONTROL_CAP_GET ?
			       UVC_CTRL_FLAG_GET_CUR : 0)
			    | (data[0] & UVC_CONTROL_CAP_SET ?
			       UVC_CTRL_FLAG_SET_CUR : 0)
			    | (data[0] & UVC_CONTROL_CAP_AUTOUPDATE ?
			       UVC_CTRL_FLAG_AUTO_UPDATE : 0);

	kfree(data);
	return ret;
}
надо просто пересобрать ядро, присвоив значение 2 при выделении области памяти в переменную data в функции uvc_ctrl_get_flags

т.к. инфа о экспозиции находится в конце, то она паходу просто не умещается на 1 байте.
да и получается, чо два раза вызывается выделение памяти, не лучше ли передавать функции uvc_ctrl_get_flags ссылку на u8 *data?, тока есесна надо енто везде поменять в вызовах, и еще хз где ента новая функция используется в каких других файлах. енто надо смареть, а енто долга и занудно)))
да... все роббит, надо всего в функции static int uvc_ctrl_get_flags изменить размеры буффера data с 1 на 2 байта.
патч:
--- a/drivers/media/usb/uvc/uvc_ctrl.c	2018-06-23 15:12:25.948081416 +0400
+++ b/drivers/media/usb/uvc/uvc_ctrl.c	2018-06-23 14:57:52.462048382 +0400
@@ -1600,12 +1600,12 @@
 	u8 *data;
 	int ret;

-	data = kmalloc(1, GFP_KERNEL);
+	data = kmalloc(2, GFP_KERNEL);
 	if (data == NULL)
 		return -ENOMEM;

 	ret = uvc_query_ctrl(dev, UVC_GET_INFO, ctrl->entity->id, dev->intfnum,
-			     info->selector, data, 1);
+			     info->selector, data, 2);
 	if (!ret)
 		info->flags = UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX
 			    | UVC_CTRL_FLAG_GET_RES | UVC_CTRL_FLAG_GET_DEF
В апстрим его.
Aivar
В апстрим его.
как енто сделать? кто делал может сделает?

я отписался коммитерам патча, хотелось бы майнтейнеру арчевого ядра отписаться, наверна сча так и сделаю. чо бы дабавил в сборку пока не пофиксят в ядре.
так надеюсь пойдет?

вот еще и на багзилле kernel.org разместил
safocl
я хароший
хароший ...
Ошибки не исчезают с опытом - они просто умнеют
 
Зарегистрироваться или войдите чтобы оставить сообщение.