Lưu ý
Mục đích của file này là để độc giả tiếng Việt có thể đọc và hiểu tài liệu nhân kernel dễ dàng hơn, không phải để tạo ra một nhánh tài liệu riêng. Nếu bạn có bất kỳ nhận xét hoặc cập nhật nào cho file này, vui lòng thử cập nhật file tiếng Anh gốc trước. Nếu bạn thấy có sự khác biệt giữa bản dịch và bản gốc, hoặc có vấn đề về bản dịch, vui lòng gửi góp ý hoặc patch cho người dịch của file này, hoặc nhờ người bảo trì và người review tài liệu tiếng Việt giúp đỡ.
- Bản gốc:
- Người dịch:
Google Translate (machine translation)
- Phiên bản gốc:
8541d8f725c6
Cảnh báo
Tài liệu này được dịch tự động bằng máy và chưa được review bởi người dịch. Nội dung có thể không chính xác hoặc khó hiểu ở một số chỗ. Khi có sự khác biệt với bản gốc, bản gốc luôn là chuẩn. Bản dịch chất lượng cao (được review) được đặt trong thư mục vi_VN/.
1.9. Kiểm soát người dùng¶
Các thiết bị thường có một số điều khiển mà người dùng có thể cài đặt như độ sáng, độ bão hòa, v.v. sẽ được hiển thị cho người dùng trên giao diện người dùng đồ họa. Tuy nhiên, các thiết bị khác nhau sẽ có các biện pháp kiểm soát khác nhau có sẵn, và hơn nữa, phạm vi có thể giá trị và giá trị mặc định sẽ khác nhau tùy theo thiết bị. các ioctls kiểm soát cung cấp thông tin và cơ chế để tạo ra một hệ thống tốt đẹp giao diện người dùng cho các điều khiển này sẽ hoạt động chính xác với bất kỳ thiết bị.
Tất cả các điều khiển được truy cập bằng giá trị ID. V4L2 xác định một số ID cho các mục đích cụ thể. Trình điều khiển cũng có thể thực hiện tùy chỉnh của riêng họ điều khiển bằng ZZ0001ZZ [1] và các giá trị cao hơn. các ID điều khiển được xác định trước có tiền tố ZZ0002ZZ và được liệt kê trong ZZ0000ZZ. ID được sử dụng khi truy vấn các thuộc tính của một điều khiển và khi nhận hoặc thiết lập giá trị hiện tại.
Nói chung các ứng dụng phải đưa ra các điều khiển cho người dùng mà không cần giả định về mục đích của họ. Mỗi điều khiển đi kèm với một chuỗi tên người dùng phải hiểu. Khi mục đích không trực quan người viết trình điều khiển phải cung cấp hướng dẫn sử dụng, trình cắm giao diện người dùng hoặc một ứng dụng bảng điều khiển cụ thể. ID được xác định trước đã được giới thiệu để thay đổi một số điều khiển theo chương trình, ví dụ như tắt tiếng thiết bị trong quá trình chuyển kênh.
Trình điều khiển có thể liệt kê các điều khiển khác nhau sau khi chuyển đổi dòng điện đầu vào hoặc đầu ra video, bộ chỉnh hoặc bộ điều biến hoặc đầu vào hoặc đầu ra âm thanh. Khác nhau về ý nghĩa của các giới hạn khác, một mặc định và hiện tại khác giá trị, kích thước bước hoặc các mục menu khác. Điều khiển với ZZ0000ZZ nhất định ID cũng có thể thay đổi tên và loại.
Nếu một điều khiển không áp dụng được cho cấu hình hiện tại của thiết bị (ví dụ: nó không áp dụng cho đầu vào video hiện tại) trình điều khiển đặt cờ ZZ0000ZZ.
Các giá trị điều khiển được lưu trữ trên toàn cầu, chúng không thay đổi khi chuyển đổi ngoại trừ việc ở trong giới hạn được báo cáo. Họ cũng không thay đổi e. g. khi thiết bị được mở hoặc đóng, khi tần số vô tuyến của bộ dò sóng đã thay đổi hoặc nói chung là không bao giờ nếu không có yêu cầu ứng dụng.
V4L2 chỉ định cơ chế sự kiện để thông báo cho ứng dụng khi điều khiển thay đổi giá trị (xem ZZ0000ZZ, sự kiện ZZ0001ZZ), các ứng dụng bảng điều khiển có thể muốn tận dụng điều đó để luôn phản ánh đúng giá trị kiểm soát.
Tất cả các điều khiển đều sử dụng độ bền của máy.
1.9.1. ID kiểm soát¶
- ZZ0000ZZ
ID được xác định trước đầu tiên, bằng ZZ0001ZZ.
- ZZ0000ZZ
Từ đồng nghĩa của ZZ0001ZZ.
- ZZ0000ZZ ZZ0001ZZ
Độ sáng của hình ảnh, hay chính xác hơn là mức độ màu đen.
- ZZ0000ZZ ZZ0001ZZ
Độ tương phản hình ảnh hoặc tăng độ sáng.
- ZZ0000ZZ ZZ0001ZZ
Độ bão hòa màu của hình ảnh hoặc tăng sắc độ.
- ZZ0000ZZ ZZ0001ZZ
Cân bằng màu sắc hoặc màu sắc.
- ZZ0000ZZ ZZ0001ZZ
Âm lượng tổng thể. Lưu ý một số trình điều khiển cũng cung cấp OSS hoặc ALSA giao diện máy trộn.
- ZZ0000ZZ ZZ0001ZZ
Cân bằng âm thanh nổi. Tối thiểu tương ứng với tất cả các cách còn lại, tối đa sang phải.
- ZZ0000ZZ ZZ0001ZZ
Điều chỉnh âm trầm.
- ZZ0000ZZ ZZ0001ZZ
Điều chỉnh âm thanh treble.
- ZZ0000ZZ ZZ0001ZZ
Tắt tiếng âm thanh, tôi. đ. tuy nhiên, đặt âm lượng về 0 mà không ảnh hưởng ZZ0002ZZ. Giống như trình điều khiển ALSA, trình điều khiển V4L2 phải tắt tiếng tại thời điểm tải để tránh tiếng ồn quá mức. Trên thực tế toàn bộ thiết bị nên được đặt lại về trạng thái tiêu thụ điện năng thấp.
- ZZ0000ZZ ZZ0001ZZ
Chế độ âm lượng (tăng âm trầm).
- ZZ0000ZZ ZZ0001ZZ
Một tên khác cho độ sáng (không phải là từ đồng nghĩa với ZZ0002ZZ). Kiểm soát này không được dùng nữa và không nên được sử dụng trong các trình điều khiển và ứng dụng mới.
- ZZ0000ZZ ZZ0001ZZ
Cân bằng trắng tự động (máy ảnh).
- ZZ0000ZZ ZZ0001ZZ
Đây là một điều khiển hành động. Khi được đặt (giá trị bị bỏ qua), thiết bị sẽ thực hiện cân bằng trắng và sau đó giữ cài đặt hiện tại. Ngược lại điều này với boolean ZZ0002ZZ, mà khi được kích hoạt sẽ tiếp tục điều chỉnh cân bằng trắng.
- ZZ0000ZZ ZZ0001ZZ
Cân bằng sắc độ màu đỏ.
- ZZ0000ZZ ZZ0001ZZ
Cân bằng sắc độ màu xanh.
- ZZ0000ZZ ZZ0001ZZ
Điều chỉnh gamma
- ZZ0000ZZ ZZ0001ZZ
Độ trắng cho các thiết bị có thang màu xám. Đây là từ đồng nghĩa với ZZ0002ZZ. Kiểm soát này không được dùng nữa và không nên được sử dụng trong các trình điều khiển và ứng dụng mới.
- ZZ0000ZZ ZZ0001ZZ
Độ phơi sáng (máy ảnh). [Đơn vị?]
- ZZ0000ZZ ZZ0001ZZ
Điều khiển khuếch đại/phơi sáng tự động.
- ZZ0000ZZ ZZ0001ZZ
Giành quyền kiểm soát.
- Chủ yếu được sử dụng để kiểm soát mức tăng trên ví dụ: bộ điều chỉnh TV nhưng cũng bật
webcam. Hầu hết các thiết bị chỉ kiểm soát mức tăng kỹ thuật số bằng điều khiển này nhưng trên một số điều này cũng có thể bao gồm cả mức tăng tương tự. Các thiết bị đó nhận ra sự khác biệt giữa việc sử dụng khuếch đại kỹ thuật số và tương tự điều khiển ZZ0000ZZ và ZZ0001ZZ.
- ZZ0000ZZ ZZ0001ZZ
Phản chiếu hình ảnh theo chiều ngang.
- ZZ0000ZZ ZZ0001ZZ
Phản chiếu hình ảnh theo chiều dọc.
- ZZ0000ZZ ZZ0001ZZ
Bật bộ lọc tần số đường dây điện để tránh nhấp nháy. Có thể các giá trị cho ZZ0002ZZ là:
struct v4l2_queryctrl queryctrl;
struct v4l2_querymenu querymenu;
static void enumerate_menu(__u32 id)
{
printf(" Menu items:\\n");
memset(&querymenu, 0, sizeof(querymenu));
querymenu.id = id;
for (querymenu.index = queryctrl.minimum;
querymenu.index <= queryctrl.maximum;
querymenu.index++) {
if (0 == ioctl(fd, VIDIOC_QUERYMENU, &querymenu)) {
printf(" %s\\n", querymenu.name);
}
}
}
memset(&queryctrl, 0, sizeof(queryctrl));
queryctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL;
while (0 == ioctl(fd, VIDIOC_QUERYCTRL, &queryctrl)) {
if (!(queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)) {
printf("Control %s\\n", queryctrl.name);
if (queryctrl.type == V4L2_CTRL_TYPE_MENU)
enumerate_menu(queryctrl.id);
}
queryctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
}
if (errno != EINVAL) {
perror("VIDIOC_QUERYCTRL");
exit(EXIT_FAILURE);
}
1.9.2. Ví dụ: Liệt kê tất cả các điều khiển bao gồm các điều khiển kết hợp¶
struct v4l2_query_ext_ctrl query_ext_ctrl;
memset(&query_ext_ctrl, 0, sizeof(query_ext_ctrl));
query_ext_ctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND;
while (0 == ioctl(fd, VIDIOC_QUERY_EXT_CTRL, &query_ext_ctrl)) {
if (!(query_ext_ctrl.flags & V4L2_CTRL_FLAG_DISABLED)) {
printf("Control %s\\n", query_ext_ctrl.name);
if (query_ext_ctrl.type == V4L2_CTRL_TYPE_MENU)
enumerate_menu(query_ext_ctrl.id);
}
query_ext_ctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND;
}
if (errno != EINVAL) {
perror("VIDIOC_QUERY_EXT_CTRL");
exit(EXIT_FAILURE);
}
1.9.3. Ví dụ: Liệt kê tất cả các điều khiển của người dùng (kiểu cũ)¶
memset(&queryctrl, 0, sizeof(queryctrl));
for (queryctrl.id = V4L2_CID_BASE;
queryctrl.id < V4L2_CID_LASTP1;
queryctrl.id++) {
if (0 == ioctl(fd, VIDIOC_QUERYCTRL, &queryctrl)) {
if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
continue;
printf("Control %s\\n", queryctrl.name);
if (queryctrl.type == V4L2_CTRL_TYPE_MENU)
enumerate_menu(queryctrl.id);
} else {
if (errno == EINVAL)
continue;
perror("VIDIOC_QUERYCTRL");
exit(EXIT_FAILURE);
}
}
for (queryctrl.id = V4L2_CID_PRIVATE_BASE;;
queryctrl.id++) {
if (0 == ioctl(fd, VIDIOC_QUERYCTRL, &queryctrl)) {
if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
continue;
printf("Control %s\\n", queryctrl.name);
if (queryctrl.type == V4L2_CTRL_TYPE_MENU)
enumerate_menu(queryctrl.id);
} else {
if (errno == EINVAL)
break;
perror("VIDIOC_QUERYCTRL");
exit(EXIT_FAILURE);
}
}
1.9.4. Ví dụ: Thay đổi điều khiển¶
struct v4l2_queryctrl queryctrl;
struct v4l2_control control;
memset(&queryctrl, 0, sizeof(queryctrl));
queryctrl.id = V4L2_CID_BRIGHTNESS;
if (-1 == ioctl(fd, VIDIOC_QUERYCTRL, &queryctrl)) {
if (errno != EINVAL) {
perror("VIDIOC_QUERYCTRL");
exit(EXIT_FAILURE);
} else {
printf("V4L2_CID_BRIGHTNESS is not supported\n");
}
} else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) {
printf("V4L2_CID_BRIGHTNESS is not supported\n");
} else {
memset(&control, 0, sizeof (control));
control.id = V4L2_CID_BRIGHTNESS;
control.value = queryctrl.default_value;
if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) {
perror("VIDIOC_S_CTRL");
exit(EXIT_FAILURE);
}
}
memset(&control, 0, sizeof(control));
control.id = V4L2_CID_CONTRAST;
if (0 == ioctl(fd, VIDIOC_G_CTRL, &control)) {
control.value += 1;
/* The driver may clamp the value or return ERANGE, ignored here */
if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)
&& errno != ERANGE) {
perror("VIDIOC_S_CTRL");
exit(EXIT_FAILURE);
}
/* Ignore if V4L2_CID_CONTRAST is unsupported */
} else if (errno != EINVAL) {
perror("VIDIOC_G_CTRL");
exit(EXIT_FAILURE);
}
control.id = V4L2_CID_AUDIO_MUTE;
control.value = 1; /* silence */
/* Errors ignored */
ioctl(fd, VIDIOC_S_CTRL, &control);