* OV5640 autofocus kernel+gstreamer+Qt implementation
@ 2015-09-29 20:10 Nikita Yushchenko
2015-09-29 22:03 ` Dmitriy B.
2015-10-02 8:34 ` Carlos Rafael Giani
0 siblings, 2 replies; 6+ messages in thread
From: Nikita Yushchenko @ 2015-09-29 20:10 UTC (permalink / raw)
To: meta-freescale@yoctoproject.org; +Cc: Gennady Kuznetsov, Andrey Rusalin
[-- Attachment #1: Type: text/plain, Size: 5259 bytes --]
Hi list.
I've recently been working on integrating autofocus functionality of
OV5640 camera into software stack on imx6-based board.
This mail contains patches to kernel, gstreamer-imx and Qt5 that make
things somehow working. In particular, declarative-camera example
focuses ok, custom Qt-based project also does.
Kernel patches are against imx_3.14.28_1.0.0_ga branch.
First patch is generic mxc_v4l2_capture cleanup. Unfortunately driver
was quite racy and did not survive even streaming stop+start from within
Qt. Had to do some cleanup to mitigate that.
Second patch contains actual implementation of focus-related v4l ioctls.
Autofocus firmware embedded into patch was taken from
http://crewrktablets.arctablet.com:8080/opendev/kernel_rockchip.git,
branch rockchip-3.10-rk3288
file drivers/media/video/ov5640_af_firmware.c
and converted to format that existing driver uses. I've tried different
firmwares found over the net, this one shows the best behaviour.
For gstreamer, I had to add GstPhotography implementation stub to
imxv4l2videosrc. Implementation is far incomplete, only focus-related
operations are there.
gstreamer-imx patch is against version 0.11.1
For Qt, need several patches to qtmultimedia. We use meta-qt5 layer,
frodo branch, which is Qt 5.4 based. We had to backport several patches
from 5.5 for better GStreamer 1.0 support. Also we had to create several
new patches. Attaching a tarball with all these.
With all these changes, single autofocus works ok with unmodified Qt's
declarative-camera example.
Easy way to check continuous autofocus is:
- apply this to declarative-camera.qml
--- a/declarative-camera.qml 2015-09-26 11:29:54.000000000 +0300
+++ b/declarative-camera.qml 2015-09-16 13:12:51.000000000 +0300
@@ -56,6 +56,7 @@
StateChangeScript {
script: {
camera.captureMode = Camera.CaptureStillImage
+ camera.focus.focusMode = Camera.FocusAuto
camera.start()
}
}
@@ -68,6 +69,7 @@
StateChangeScript {
script: {
camera.captureMode = Camera.CaptureVideo
+ camera.focus.focusMode = Camera.FocusContinuous
camera.start()
}
}
- start it via /usr/bin/qt5/qmlscene /path/to/declarative-camera.qml
[running declarative-camera binary without recompilation won't get these
changes since binary has qml embedded and does not re-read it from files
at execution time]
- from within demo, switch to "video" mode
- take a sheet of paper with printed text and try moving in near camera
- on playback screen, see camera's attempts to keep focused
Known issues/limitations:
*) Legal status of AF firmware is unclear.
*) AF firmware is loaded using byte operations, loading using group
writes is not implemented.
*) AF firmware is loaded unconditionally on device open; better to do it
on first focus-related operation.
*) Reloading AF firmware on suspend-resume is not implemented. With
current implementation, autofocus will stop working after suspend-resume
cycle. To restore, need to close and reopen camera device (which usually
means - restart camera-using program).
Proper fix for the two above should be: make "firmware not loaded" a
state of firmware-control automata and threat firmware loading as
required step for requested state changes; when suspending, just force
"firmware not loaded" state.
*) Driver does not have protection against AF firmware misfunction (such
as - operation not completes in reasonable time). Such misfuction
sometimes does happen. It is not fatal (newly issued operation succeeds)
but still incorrect.
*) Setting camera parameters is not implemented. Camera always captures
at 640x480 with all default settings.
*) Middleware (QT plugin + gstreamer) is incomplete and quite unfriendly
to debug and use. It basically works for trivial scenarios (streaming
video from camera to viewfinder, starting/stopping, capturing images)
but tends to fail on anything else. On failure, it just displays
"CameraBin error" message and stops working. This happens in different
cases, which includes inaccurate Qt application behavior (such as too
long frame processing, failing to release buffer in time, etc).
Extracting details on what happened is possible via GST_DEBUG but is
quite cumbersome and requires understanding of gstreamer internals.
*) 'imx-ipuv3 2400000.ipu: IPU Warning - IPU_INT_STAT_5 = 0x00000001'
message sometimes appears
*) 'ERROR: unrecognized std! 0 (PAL=ff, NTSC=b000)' message sometimes
appears
*) pressing Capture button in Qt C++ camera example
(qt5/examples/multimediawidgets/camera/camera) causes CameraBin error
(tried to investigate this, immediate reason is that after streaming
restart, QPainterVideoSurface receives first two frames ok but does not
become back ready after that and refuses 3rd frame; why this happens is
not clear yet)
Any comments on all this are welcome.
Nikita Yushchenko,
System Software Engineer at Software Development Center, RTsoft
[-- Attachment #2: 0001-mxc_v4l2_capture-rework.patch --]
[-- Type: text/x-patch, Size: 22911 bytes --]
From cfa4f86cd1e4ff6215e1be5584e6788452a7f5d5 Mon Sep 17 00:00:00 2001
From: Nikita Yushchenko <nyushchenko@dev.rtsoft.ru>
Date: Fri, 28 Aug 2015 09:11:39 +0300
Subject: [PATCH] mxc_v4l2_capture: rework
- clean up locking: use single spinlock to protect all queues
- clean up races from O_NONBLOCK handling
- get rid of unneeded checks of buffer flags when moving buffers between
queues - those are not needed since there is only one possible path,
ready_q -> working_q -> done_q.
- get rid of cam->enc_counter, check list empty state directly
- implement v4l-defined buffer behaviour over REQBUFS and STREAMOFF:
- on REQBUFS, any queued buffers are forgotten thus ownersip is
returned to userspace
- on STREAMOFF, any queued buffers are moved to done, with
V4L2_BUF_FLAG_ERROR set, however queues are not dropped and reader
thread can get them
- use file descriptor for remembering owner, not PID (one PID can have
multiple FDs, and one FDs can end shared between PIDs)
- implement owner checking on streaming-related ioctls
- remember number of buffers allocated by REQBUFS and block attempts to
use buffer index out of allocated range
- use list_first_entry() instead of direct access to head->next
- clean up some code paths and other misc cleanup
Signed-off-by: Nikita Yushchenko <nyushchenko@dev.rtsoft.ru>
---
.../media/platform/mxc/capture/mxc_v4l2_capture.c | 402 ++++++++++++---------
.../media/platform/mxc/capture/mxc_v4l2_capture.h | 9 +-
2 files changed, 235 insertions(+), 176 deletions(-)
diff --git a/drivers/media/platform/mxc/capture/mxc_v4l2_capture.c b/drivers/media/platform/mxc/capture/mxc_v4l2_capture.c
index 3926baa..37ffd02 100644
--- a/drivers/media/platform/mxc/capture/mxc_v4l2_capture.c
+++ b/drivers/media/platform/mxc/capture/mxc_v4l2_capture.c
@@ -249,7 +249,13 @@ static int mxc_free_frame_buf(cam_data *cam)
cam->frame[i].paddress);
cam->frame[i].vaddress = 0;
}
+ INIT_LIST_HEAD(&cam->frame[i].queue);
}
+ cam->alloced_buffers = 0;
+
+ INIT_LIST_HEAD(&cam->ready_q);
+ INIT_LIST_HEAD(&cam->working_q);
+ INIT_LIST_HEAD(&cam->done_q);
return 0;
}
@@ -269,6 +275,11 @@ static int mxc_allocate_frame_buf(cam_data *cam, int count)
pr_debug("In MVC:mxc_allocate_frame_buf - size=%d\n",
cam->v2f.fmt.pix.sizeimage);
+ if (count < 2)
+ count = 2;
+ if (count > FRAME_NUM)
+ count = FRAME_NUM;
+
for (i = 0; i < count; i++) {
cam->frame[i].vaddress =
dma_alloc_coherent(0,
@@ -278,8 +289,11 @@ static int mxc_allocate_frame_buf(cam_data *cam, int count)
if (cam->frame[i].vaddress == 0) {
pr_err("ERROR: v4l2 capture: "
"mxc_allocate_frame_buf failed.\n");
- mxc_free_frame_buf(cam);
- return -ENOBUFS;
+ if (i < 2) {
+ mxc_free_frame_buf(cam);
+ return -ENOBUFS;
+ } else
+ break;
}
cam->frame[i].buffer.index = i;
cam->frame[i].buffer.flags = V4L2_BUF_FLAG_MAPPED;
@@ -291,32 +305,11 @@ static int mxc_allocate_frame_buf(cam_data *cam, int count)
cam->frame[i].index = i;
}
+ cam->alloced_buffers = i;
return 0;
}
/*!
- * Free frame buffers status
- *
- * @param cam Structure cam_data *
- *
- * @return none
- */
-static void mxc_free_frames(cam_data *cam)
-{
- int i;
-
- pr_debug("In MVC:mxc_free_frames\n");
-
- for (i = 0; i < FRAME_NUM; i++)
- cam->frame[i].buffer.flags = V4L2_BUF_FLAG_MAPPED;
-
- cam->enc_counter = 0;
- INIT_LIST_HEAD(&cam->ready_q);
- INIT_LIST_HEAD(&cam->working_q);
- INIT_LIST_HEAD(&cam->done_q);
-}
-
-/*!
* Return the buffer status
*
* @param cam Structure cam_data *
@@ -409,9 +402,9 @@ static int mxc_streamon(cam_data *cam)
pr_debug("In MVC:mxc_streamon\n");
- if (NULL == cam) {
- pr_err("ERROR! cam parameter is NULL\n");
- return -1;
+ if (!cam || !cam->enc_update_eba) {
+ pr_err("ERROR! cam parameter is invalid\n");
+ return -EINVAL;
}
if (cam->capture_on) {
@@ -420,20 +413,12 @@ static int mxc_streamon(cam_data *cam)
return -1;
}
- if (list_empty(&cam->ready_q)) {
- pr_err("ERROR: v4l2 capture: mxc_streamon buffer has not been "
- "queued yet\n");
- return -EINVAL;
- }
- if (cam->enc_update_eba &&
- cam->ready_q.prev == cam->ready_q.next) {
+ if (list_empty(&cam->ready_q) || list_is_singular(&cam->ready_q)) {
pr_err("ERROR: v4l2 capture: mxc_streamon buffer need "
"ping pong at least two buffers\n");
return -EINVAL;
}
- cam->capture_pid = current->pid;
-
if (cam->overlay_on == true)
stop_preview(cam);
@@ -443,30 +428,24 @@ static int mxc_streamon(cam_data *cam)
return err;
}
- spin_lock_irqsave(&cam->queue_int_lock, lock_flags);
+ spin_lock_irqsave(&cam->queue_lock, lock_flags);
cam->ping_pong_csi = 0;
cam->local_buf_num = 0;
- if (cam->enc_update_eba) {
- frame =
- list_entry(cam->ready_q.next, struct mxc_v4l_frame, queue);
- list_del(cam->ready_q.next);
- list_add_tail(&frame->queue, &cam->working_q);
- frame->ipu_buf_num = cam->ping_pong_csi;
- err = cam->enc_update_eba(cam->ipu, frame->buffer.m.offset,
- &cam->ping_pong_csi);
-
- frame =
- list_entry(cam->ready_q.next, struct mxc_v4l_frame, queue);
- list_del(cam->ready_q.next);
- list_add_tail(&frame->queue, &cam->working_q);
- frame->ipu_buf_num = cam->ping_pong_csi;
- err |= cam->enc_update_eba(cam->ipu, frame->buffer.m.offset,
- &cam->ping_pong_csi);
- spin_unlock_irqrestore(&cam->queue_int_lock, lock_flags);
- } else {
- spin_unlock_irqrestore(&cam->queue_int_lock, lock_flags);
- return -EINVAL;
- }
+
+ frame = list_first_entry(&cam->ready_q, struct mxc_v4l_frame, queue);
+ list_del(&frame->queue);
+ list_add_tail(&frame->queue, &cam->working_q);
+ frame->ipu_buf_num = cam->ping_pong_csi;
+ err = cam->enc_update_eba(cam->ipu, frame->buffer.m.offset,
+ &cam->ping_pong_csi);
+
+ frame = list_first_entry(&cam->ready_q, struct mxc_v4l_frame, queue);
+ list_del(&frame->queue);
+ list_add_tail(&frame->queue, &cam->working_q);
+ frame->ipu_buf_num = cam->ping_pong_csi;
+ err |= cam->enc_update_eba(cam->ipu, frame->buffer.m.offset,
+ &cam->ping_pong_csi);
+ spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
if (cam->overlay_on == true)
start_preview(cam);
@@ -491,7 +470,9 @@ static int mxc_streamon(cam_data *cam)
*/
static int mxc_streamoff(cam_data *cam)
{
- int err = 0;
+ int err;
+ unsigned long lock_flags;
+ struct mxc_v4l_frame *frame;
pr_debug("In MVC:mxc_streamoff\n");
@@ -517,10 +498,38 @@ static int mxc_streamoff(cam_data *cam)
}
}
- mxc_free_frames(cam);
+ spin_lock_irqsave(&cam->queue_lock, lock_flags);
+
mxc_capture_inputs[cam->current_input].status |= V4L2_IN_ST_NO_POWER;
cam->capture_on = false;
- return err;
+
+ /* Looks like IPU code does not call callback for frame that is aborted
+ * due to stop.
+ *
+ * Need to move any frames in ready_q or working_q to done_q and
+ * mark those as error. Keep order: first working_q, then ready_q */
+
+ while (!list_empty(&cam->working_q)) {
+ frame = list_first_entry(&cam->working_q, struct mxc_v4l_frame, queue);
+ list_del(&frame->queue);
+ frame->buffer.flags &= ~V4L2_BUF_FLAG_QUEUED;
+ frame->buffer.flags |= (V4L2_BUF_FLAG_DONE | V4L2_BUF_FLAG_ERROR);
+ list_add_tail(&frame->queue, &cam->done_q);
+ }
+
+ while (!list_empty(&cam->ready_q)) {
+ frame = list_first_entry(&cam->ready_q, struct mxc_v4l_frame, queue);
+ list_del(&frame->queue);
+ frame->buffer.flags &= ~V4L2_BUF_FLAG_QUEUED;
+ frame->buffer.flags |= (V4L2_BUF_FLAG_DONE | V4L2_BUF_FLAG_ERROR);
+ list_add_tail(&frame->queue, &cam->done_q);
+ }
+
+ wake_up_interruptible(&cam->enc_queue);
+
+ spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
+
+ return 0;
}
/*!
@@ -1509,7 +1518,7 @@ static int mxc_v4l2_g_std(cam_data *cam, v4l2_std_id *e)
* @return status 0 success, EINVAL invalid frame number,
* ETIME timeout, ERESTARTSYS interrupted by user
*/
-static int mxc_v4l_dqueue(cam_data *cam, struct v4l2_buffer *buf)
+static int mxc_v4l_dqueue(cam_data *cam, struct v4l2_buffer *buf, bool nonblock)
{
int retval = 0;
struct mxc_v4l_frame *frame;
@@ -1517,40 +1526,46 @@ static int mxc_v4l_dqueue(cam_data *cam, struct v4l2_buffer *buf)
pr_debug("In MVC:mxc_v4l_dqueue\n");
- if (!wait_event_interruptible_timeout(cam->enc_queue,
- cam->enc_counter != 0,
- 10 * HZ)) {
- pr_err("ERROR: v4l2 capture: mxc_v4l_dqueue timeout "
- "enc_counter %x\n",
- cam->enc_counter);
- return -ETIME;
- } else if (signal_pending(current)) {
+retry:
+ retval = wait_event_interruptible_timeout(cam->enc_queue,
+ !list_empty(&cam->done_q) || nonblock || !cam->capture_on,
+ 10 * HZ);
+ if (signal_pending(current)) {
pr_err("ERROR: v4l2 capture: mxc_v4l_dqueue() "
"interrupt received\n");
return -ERESTARTSYS;
}
+ if (!retval) {
+ pr_err("ERROR: v4l2 capture: mxc_v4l_dqueue timeout\n");
+ return -ETIME;
+ }
- if (down_interruptible(&cam->busy_lock))
- return -EBUSY;
-
- spin_lock_irqsave(&cam->dqueue_int_lock, lock_flags);
- cam->enc_counter--;
+ retval = down_interruptible(&cam->busy_lock);
+ if (retval)
+ return retval;
- frame = list_entry(cam->done_q.next, struct mxc_v4l_frame, queue);
- list_del(cam->done_q.next);
- if (frame->buffer.flags & V4L2_BUF_FLAG_DONE) {
- frame->buffer.flags &= ~V4L2_BUF_FLAG_DONE;
- } else if (frame->buffer.flags & V4L2_BUF_FLAG_QUEUED) {
- pr_err("ERROR: v4l2 capture: VIDIOC_DQBUF: "
- "Buffer not filled.\n");
- frame->buffer.flags &= ~V4L2_BUF_FLAG_QUEUED;
- retval = -EINVAL;
- } else if ((frame->buffer.flags & 0x7) == V4L2_BUF_FLAG_MAPPED) {
- pr_err("ERROR: v4l2 capture: VIDIOC_DQBUF: "
- "Buffer not queued.\n");
- retval = -EINVAL;
+ spin_lock_irqsave(&cam->queue_lock, lock_flags);
+ if (list_empty(&cam->done_q)) {
+ /* no streaming and no buffers => -EINVAL
+ * nonblock => -EAGAIN,
+ * otherwise => retry */
+ if (!cam->capture_on) {
+ retval = -EINVAL;
+ goto out;
+ } else if (nonblock) {
+ retval = -EAGAIN;
+ goto out;
+ } else {
+ spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
+ up(&cam->busy_lock);
+ goto retry;
+ }
}
+ frame = list_first_entry(&cam->done_q, struct mxc_v4l_frame, queue);
+ list_del(&frame->queue);
+ frame->buffer.flags &= ~V4L2_BUF_FLAG_DONE;
+
cam->frame[frame->index].buffer.field = cam->device_type ?
V4L2_FIELD_INTERLACED : V4L2_FIELD_NONE;
@@ -1560,8 +1575,10 @@ static int mxc_v4l_dqueue(cam_data *cam, struct v4l2_buffer *buf)
buf->m = cam->frame[frame->index].buffer.m;
buf->timestamp = cam->frame[frame->index].buffer.timestamp;
buf->field = cam->frame[frame->index].buffer.field;
- spin_unlock_irqrestore(&cam->dqueue_int_lock, lock_flags);
+ retval = 0;
+out:
+ spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
up(&cam->busy_lock);
return retval;
}
@@ -1626,8 +1643,9 @@ static int mxc_v4l_open(struct file *file)
err = prp_enc_select(cam);
#endif
}
+ if (err)
+ goto oops;
- cam->enc_counter = 0;
INIT_LIST_HEAD(&cam->ready_q);
INIT_LIST_HEAD(&cam->working_q);
INIT_LIST_HEAD(&cam->done_q);
@@ -1758,16 +1776,21 @@ static int mxc_v4l_close(struct file *file)
down(&cam->busy_lock);
/* for the case somebody hit the ctrl C */
- if (cam->overlay_pid == current->pid && cam->overlay_on) {
- err = stop_preview(cam);
- cam->overlay_on = false;
+ if (cam->overlay_filp == file) {
+ if (cam->overlay_on) {
+ err = stop_preview(cam);
+ cam->overlay_on = false;
+ }
+ cam->overlay_filp = NULL;
}
- if (cam->capture_pid == current->pid) {
- err |= mxc_streamoff(cam);
- wake_up_interruptible(&cam->enc_queue);
+ if (cam->capture_filp == file) {
+ mxc_streamoff(cam);
+ mxc_free_frame_buf(cam);
+ cam->capture_filp = NULL;
}
if (--cam->open_count == 0) {
+
vidioc_int_s_power(cam->sensor, 0);
clk_disable_unprepare(sensor->sensor_clk);
wait_event_interruptible(cam->power_queue,
@@ -1786,13 +1809,7 @@ static int mxc_v4l_close(struct file *file)
#endif
}
- mxc_free_frame_buf(cam);
file->private_data = NULL;
-
- /* capture off */
- wake_up_interruptible(&cam->enc_queue);
- mxc_free_frames(cam);
- cam->enc_counter++;
}
up(&cam->busy_lock);
@@ -1962,12 +1979,6 @@ static long mxc_v4l_do_ioctl(struct file *file,
struct v4l2_requestbuffers *req = arg;
pr_debug(" case VIDIOC_REQBUFS\n");
- if (req->count > FRAME_NUM) {
- pr_err("ERROR: v4l2 capture: VIDIOC_REQBUFS: "
- "not enough buffers\n");
- req->count = FRAME_NUM;
- }
-
if ((req->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)) {
pr_err("ERROR: v4l2 capture: VIDIOC_REQBUFS: "
"wrong buffer type\n");
@@ -1975,11 +1986,24 @@ static long mxc_v4l_do_ioctl(struct file *file,
break;
}
+ if (cam->capture_filp && cam->capture_filp != file) {
+ pr_err("ERROR: v4l2 capture: VIDIOC_REQBUFS: "
+ "streaming is active for other FD\n");
+ retval = -EBUSY;
+ break;
+ }
+
mxc_streamoff(cam);
- if (req->memory & V4L2_MEMORY_MMAP) {
+ if (req->memory == V4L2_MEMORY_MMAP) {
mxc_free_frame_buf(cam);
retval = mxc_allocate_frame_buf(cam, req->count);
+ if (!retval) {
+ req->count = cam->alloced_buffers;
+ if (!cam->capture_filp)
+ cam->capture_filp = file;
+ }
}
+
break;
}
@@ -1992,27 +2016,40 @@ static long mxc_v4l_do_ioctl(struct file *file,
pr_debug(" case VIDIOC_QUERYBUF\n");
if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {
- pr_err("ERROR: v4l2 capture: "
- "VIDIOC_QUERYBUFS: "
+ pr_err("ERROR: v4l2 capture: VIDIOC_QUERYBUF: "
"wrong buffer type\n");
retval = -EINVAL;
break;
}
- if (buf->memory & V4L2_MEMORY_MMAP) {
+ if (index < 0 || index >= cam->alloced_buffers) {
+ pr_err("ERROR: v4l2 capture: VIDIOC_QUERYBUF: "
+ "index out of range\n");
+ retval = -EINVAL;
+ }
+
+ if (cam->capture_filp && cam->capture_filp != file) {
+ retval = -EBUSY;
+ break;
+ }
+
+ if (buf->memory == V4L2_MEMORY_MMAP) {
memset(buf, 0, sizeof(buf));
buf->index = index;
}
down(&cam->param_lock);
- if (buf->memory & V4L2_MEMORY_USERPTR) {
+ if (buf->memory == V4L2_MEMORY_USERPTR) {
mxc_v4l2_release_bufs(cam);
retval = mxc_v4l2_prepare_bufs(cam, buf);
}
- if (buf->memory & V4L2_MEMORY_MMAP)
+ if (buf->memory == V4L2_MEMORY_MMAP)
retval = mxc_v4l2_buffer_status(cam, buf);
up(&cam->param_lock);
+
+ if (!retval && !cam->capture_filp)
+ cam->capture_filp = file;
break;
}
@@ -2020,35 +2057,46 @@ static long mxc_v4l_do_ioctl(struct file *file,
* V4l2 VIDIOC_QBUF ioctl
*/
case VIDIOC_QBUF: {
- struct v4l2_buffer *buf = arg;
+ struct v4l2_buffer *buf = arg, *tbuf;
int index = buf->index;
+
pr_debug(" case VIDIOC_QBUF\n");
- spin_lock_irqsave(&cam->queue_int_lock, lock_flags);
- if ((cam->frame[index].buffer.flags & 0x7) ==
- V4L2_BUF_FLAG_MAPPED) {
- cam->frame[index].buffer.flags |=
- V4L2_BUF_FLAG_QUEUED;
- list_add_tail(&cam->frame[index].queue,
- &cam->ready_q);
- } else if (cam->frame[index].buffer.
- flags & V4L2_BUF_FLAG_QUEUED) {
+ if (cam->capture_filp && cam->capture_filp != file) {
+ retval = -EBUSY;
+ break;
+ }
+
+ if (index < 0 || index >= cam->alloced_buffers) {
+ pr_err("ERROR: v4l2 capture: VIDIOC_QBUF: "
+ "index out of range\n");
+ retval = -EINVAL;
+ }
+
+ tbuf = &cam->frame[index].buffer;
+
+ spin_lock_irqsave(&cam->queue_lock, lock_flags);
+
+ if (tbuf->flags & V4L2_BUF_FLAG_QUEUED) {
pr_err("ERROR: v4l2 capture: VIDIOC_QBUF: "
"buffer already queued\n");
retval = -EINVAL;
- } else if (cam->frame[index].buffer.
- flags & V4L2_BUF_FLAG_DONE) {
+ } else if (tbuf->flags & V4L2_BUF_FLAG_DONE) {
pr_err("ERROR: v4l2 capture: VIDIOC_QBUF: "
- "overwrite done buffer.\n");
- cam->frame[index].buffer.flags &=
- ~V4L2_BUF_FLAG_DONE;
- cam->frame[index].buffer.flags |=
- V4L2_BUF_FLAG_QUEUED;
+ "buffer is in done queue %d\n", index);
retval = -EINVAL;
+ } else {
+ list_add_tail(&cam->frame[index].queue,
+ &cam->ready_q);
+ tbuf->flags |= V4L2_BUF_FLAG_QUEUED;
+ tbuf->flags &= ~V4L2_BUF_FLAG_ERROR;
}
- buf->flags = cam->frame[index].buffer.flags;
- spin_unlock_irqrestore(&cam->queue_int_lock, lock_flags);
+ buf->flags = tbuf->flags;
+ spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
+
+ if (!retval && !cam->capture_filp)
+ cam->capture_filp = file;
break;
}
@@ -2059,13 +2107,13 @@ static long mxc_v4l_do_ioctl(struct file *file,
struct v4l2_buffer *buf = arg;
pr_debug(" case VIDIOC_DQBUF\n");
- if ((cam->enc_counter == 0) &&
- (file->f_flags & O_NONBLOCK)) {
- retval = -EAGAIN;
- break;
+ if (cam->capture_filp && cam->capture_filp != file)
+ retval = -EBUSY;
+ else {
+ retval = mxc_v4l_dqueue(cam, buf, file->f_flags & O_NONBLOCK);
+ if (!retval && !cam->capture_filp)
+ cam->capture_filp = file;
}
-
- retval = mxc_v4l_dqueue(cam, buf);
break;
}
@@ -2074,7 +2122,13 @@ static long mxc_v4l_do_ioctl(struct file *file,
*/
case VIDIOC_STREAMON: {
pr_debug(" case VIDIOC_STREAMON\n");
- retval = mxc_streamon(cam);
+ if (cam->capture_filp && cam->capture_filp != file)
+ retval = -EBUSY;
+ else {
+ retval = mxc_streamon(cam);
+ if (!retval && !cam->capture_filp)
+ cam->capture_filp = file;
+ }
break;
}
@@ -2083,7 +2137,13 @@ static long mxc_v4l_do_ioctl(struct file *file,
*/
case VIDIOC_STREAMOFF: {
pr_debug(" case VIDIOC_STREAMOFF\n");
- retval = mxc_streamoff(cam);
+ if (cam->capture_filp && cam->capture_filp != file)
+ retval = -EBUSY;
+ else {
+ retval = mxc_streamoff(cam);
+ if (!retval && !cam->capture_filp)
+ cam->capture_filp = file;
+ }
break;
}
@@ -2190,13 +2250,24 @@ static long mxc_v4l_do_ioctl(struct file *file,
int *on = arg;
pr_debug(" VIDIOC_OVERLAY on=%d\n", *on);
if (*on) {
- cam->overlay_on = true;
- cam->overlay_pid = current->pid;
- retval = start_preview(cam);
+ if (cam->overlay_filp)
+ retval = -EBUSY;
+ else {
+ retval = start_preview(cam);
+ if (!retval) {
+ cam->overlay_on = true;
+ cam->overlay_filp = file;
+ }
+ }
}
if (!*on) {
- retval = stop_preview(cam);
- cam->overlay_on = false;
+ if (cam->overlay_filp != file)
+ retval = cam->overlay_filp ? -EBUSY : -EINVAL;
+ else {
+ retval = stop_preview(cam);
+ cam->overlay_on = false;
+ cam->overlay_filp = NULL;
+ }
}
break;
}
@@ -2550,14 +2621,13 @@ static void camera_callback(u32 mask, void *dev)
pr_debug("In MVC:camera_callback\n");
- spin_lock(&cam->queue_int_lock);
- spin_lock(&cam->dqueue_int_lock);
+ spin_lock(&cam->queue_lock);
+
if (!list_empty(&cam->working_q)) {
do_gettimeofday(&cur_time);
- done_frame = list_entry(cam->working_q.next,
- struct mxc_v4l_frame,
- queue);
+ done_frame = list_first_entry(&cam->working_q,
+ struct mxc_v4l_frame, queue);
if (done_frame->ipu_buf_num != cam->local_buf_num)
goto next;
@@ -2569,32 +2639,24 @@ static void camera_callback(u32 mask, void *dev)
*/
done_frame->buffer.timestamp = cur_time;
- if (done_frame->buffer.flags & V4L2_BUF_FLAG_QUEUED) {
- done_frame->buffer.flags |= V4L2_BUF_FLAG_DONE;
- done_frame->buffer.flags &= ~V4L2_BUF_FLAG_QUEUED;
+ list_del(&done_frame->queue);
+ list_add_tail(&done_frame->queue, &cam->done_q);
- /* Added to the done queue */
- list_del(cam->working_q.next);
- list_add_tail(&done_frame->queue, &cam->done_q);
+ done_frame->buffer.flags &= ~V4L2_BUF_FLAG_QUEUED;
+ done_frame->buffer.flags |= V4L2_BUF_FLAG_DONE;
- /* Wake up the queue */
- cam->enc_counter++;
- wake_up_interruptible(&cam->enc_queue);
- } else
- pr_err("ERROR: v4l2 capture: camera_callback: "
- "buffer not queued\n");
+ wake_up_interruptible(&cam->enc_queue);
}
next:
if (!list_empty(&cam->ready_q)) {
- ready_frame = list_entry(cam->ready_q.next,
- struct mxc_v4l_frame,
- queue);
+ ready_frame = list_first_entry(&cam->ready_q,
+ struct mxc_v4l_frame, queue);
if (cam->enc_update_eba)
if (cam->enc_update_eba(cam->ipu,
ready_frame->buffer.m.offset,
&cam->ping_pong_csi) == 0) {
- list_del(cam->ready_q.next);
+ list_del(&ready_frame->queue);
list_add_tail(&ready_frame->queue,
&cam->working_q);
ready_frame->ipu_buf_num = cam->local_buf_num;
@@ -2607,8 +2669,7 @@ next:
}
cam->local_buf_num = (cam->local_buf_num == 0) ? 1 : 0;
- spin_unlock(&cam->dqueue_int_lock);
- spin_unlock(&cam->queue_int_lock);
+ spin_unlock(&cam->queue_lock);
return;
}
@@ -2742,8 +2803,7 @@ static int init_camera_struct(cam_data *cam, struct platform_device *pdev)
cam->enc_callback = camera_callback;
init_waitqueue_head(&cam->power_queue);
- spin_lock_init(&cam->queue_int_lock);
- spin_lock_init(&cam->dqueue_int_lock);
+ spin_lock_init(&cam->queue_lock);
cam->self = kmalloc(sizeof(struct v4l2_int_device), GFP_KERNEL);
cam->self->module = THIS_MODULE;
diff --git a/drivers/media/platform/mxc/capture/mxc_v4l2_capture.h b/drivers/media/platform/mxc/capture/mxc_v4l2_capture.h
index 9294dc6..5f5d519 100644
--- a/drivers/media/platform/mxc/capture/mxc_v4l2_capture.h
+++ b/drivers/media/platform/mxc/capture/mxc_v4l2_capture.h
@@ -119,16 +119,15 @@ typedef struct _cam_data {
struct semaphore param_lock;
/* Encoder */
+ int alloced_buffers;
struct list_head ready_q;
struct list_head done_q;
struct list_head working_q;
int ping_pong_csi;
- spinlock_t queue_int_lock;
- spinlock_t dqueue_int_lock;
+ spinlock_t queue_lock;
struct mxc_v4l_frame frame[FRAME_NUM];
struct mxc_v4l_frame dummy_frame;
wait_queue_head_t enc_queue;
- int enc_counter;
dma_addr_t rot_enc_bufs[2];
void *rot_enc_bufs_vaddr[2];
int rot_enc_buf_size[2];
@@ -202,8 +201,8 @@ typedef struct _cam_data {
/* misc status flag */
bool overlay_on;
bool capture_on;
- int overlay_pid;
- int capture_pid;
+ struct file *overlay_filp;
+ struct file *capture_filp;
bool low_power;
wait_queue_head_t power_queue;
unsigned int ipu_id;
--
2.1.4
[-- Attachment #3: 0002-mxc-ov5640-autofocus-support.patch --]
[-- Type: text/x-patch, Size: 114670 bytes --]
From 804964d92e6b27c3d3f685a208240dd164d56808 Mon Sep 17 00:00:00 2001
From: Nikita Yushchenko <nyushchenko@dev.rtsoft.ru>
Date: Wed, 16 Sep 2015 19:29:14 +0300
Subject: [PATCH] mxc/ov5640: autofocus support
This includes OV5640 AF firmware and implementation of AF-related
ioctl's.
Signed-off-by: Nikita Yushchenko <nyushchenko@dev.rtsoft.ru>
---
drivers/media/platform/mxc/capture/bin2ov5640fw.c | 30 +
.../media/platform/mxc/capture/mxc_v4l2_capture.c | 24 +
.../platform/mxc/capture/ov5640_af_firmware.c | 1363 ++++++++++++++++++++
drivers/media/platform/mxc/capture/ov5640_mipi.c | 615 +++++++++
4 files changed, 2032 insertions(+)
create mode 100644 drivers/media/platform/mxc/capture/bin2ov5640fw.c
create mode 100644 drivers/media/platform/mxc/capture/ov5640_af_firmware.c
diff --git a/drivers/media/platform/mxc/capture/bin2ov5640fw.c b/drivers/media/platform/mxc/capture/bin2ov5640fw.c
new file mode 100644
index 0000000..1c9c520
--- /dev/null
+++ b/drivers/media/platform/mxc/capture/bin2ov5640fw.c
@@ -0,0 +1,30 @@
+/* Usage: bin2ov5640fw < fw.bin > ov5640_af_firmware.h */
+
+#include <stdio.h>
+#include <unistd.h>
+
+int main()
+{
+ unsigned char buf[0x1000];
+ int i, len;
+
+ len = read(0, buf, sizeof(buf));
+ if (len < 0) {
+ fprintf(stderr, "read stdin: %m\n");
+ return 1;
+ }
+
+ printf("/* Generated by bin2ov5640fw */\n\n");
+
+ printf("static struct reg_value ov5640_af_firmware[] = {");
+ for (i = 0; i < len; i++) {
+ printf("%s{0x%04x, 0x%02x, 0, 0}%s",
+ ((i % 3) == 0) ? "\n\t" : " ",
+ i + 0x8000,
+ buf[i],
+ (i < len - 1) ? "," : "");
+ }
+ printf("\n};\n");
+
+ return 0;
+}
diff --git a/drivers/media/platform/mxc/capture/mxc_v4l2_capture.c b/drivers/media/platform/mxc/capture/mxc_v4l2_capture.c
index 37ffd02..f6d2a44 100644
--- a/drivers/media/platform/mxc/capture/mxc_v4l2_capture.c
+++ b/drivers/media/platform/mxc/capture/mxc_v4l2_capture.c
@@ -1077,6 +1077,17 @@ static int mxc_v4l2_g_ctrl(cam_data *cam, struct v4l2_control *c)
status = -ENODEV;
}
break;
+ case V4L2_CID_AUTO_FOCUS_STATUS:
+ case V4L2_CID_FOCUS_AUTO:
+ case V4L2_CID_AUTO_FOCUS_RANGE:
+ case V4L2_CID_3A_LOCK:
+ if (cam->sensor)
+ status = vidioc_int_g_ctrl(cam->sensor, c);
+ else {
+ pr_err("ERROR: v4l2 capture: slave not found!\n");
+ status = -ENODEV;
+ }
+ break;
default:
pr_err("ERROR: v4l2 capture: unsupported ioctrl!\n");
}
@@ -1241,6 +1252,18 @@ static int mxc_v4l2_s_ctrl(cam_data *cam, struct v4l2_control *c)
ret = -ENODEV;
}
break;
+ case V4L2_CID_AUTO_FOCUS_START:
+ case V4L2_CID_AUTO_FOCUS_STOP:
+ case V4L2_CID_FOCUS_AUTO:
+ case V4L2_CID_AUTO_FOCUS_RANGE:
+ case V4L2_CID_3A_LOCK:
+ if (cam->sensor)
+ ret = vidioc_int_s_ctrl(cam->sensor, c);
+ else {
+ pr_err("ERROR: v4l2 capture: slave not found!\n");
+ ret = -ENODEV;
+ }
+ break;
case V4L2_CID_MXC_FLASH:
#ifdef CONFIG_MXC_IPU_V1
ipu_csi_flash_strobe(true);
@@ -1791,6 +1814,7 @@ static int mxc_v4l_close(struct file *file)
if (--cam->open_count == 0) {
+ vidioc_int_dev_exit(cam->sensor);
vidioc_int_s_power(cam->sensor, 0);
clk_disable_unprepare(sensor->sensor_clk);
wait_event_interruptible(cam->power_queue,
diff --git a/drivers/media/platform/mxc/capture/ov5640_af_firmware.c b/drivers/media/platform/mxc/capture/ov5640_af_firmware.c
new file mode 100644
index 0000000..3700259
--- /dev/null
+++ b/drivers/media/platform/mxc/capture/ov5640_af_firmware.c
@@ -0,0 +1,1363 @@
+/* Generated by bin2ov5640fw */
+
+static struct reg_value ov5640_af_firmware[] = {
+ {0x8000, 0x02, 0, 0}, {0x8001, 0x0f, 0, 0}, {0x8002, 0xd6, 0, 0},
+ {0x8003, 0x02, 0, 0}, {0x8004, 0x0a, 0, 0}, {0x8005, 0x39, 0, 0},
+ {0x8006, 0xc2, 0, 0}, {0x8007, 0x01, 0, 0}, {0x8008, 0x22, 0, 0},
+ {0x8009, 0x22, 0, 0}, {0x800a, 0x00, 0, 0}, {0x800b, 0x02, 0, 0},
+ {0x800c, 0x0f, 0, 0}, {0x800d, 0xb2, 0, 0}, {0x800e, 0xe5, 0, 0},
+ {0x800f, 0x1f, 0, 0}, {0x8010, 0x70, 0, 0}, {0x8011, 0x72, 0, 0},
+ {0x8012, 0xf5, 0, 0}, {0x8013, 0x1e, 0, 0}, {0x8014, 0xd2, 0, 0},
+ {0x8015, 0x35, 0, 0}, {0x8016, 0xff, 0, 0}, {0x8017, 0xef, 0, 0},
+ {0x8018, 0x25, 0, 0}, {0x8019, 0xe0, 0, 0}, {0x801a, 0x24, 0, 0},
+ {0x801b, 0x4e, 0, 0}, {0x801c, 0xf8, 0, 0}, {0x801d, 0xe4, 0, 0},
+ {0x801e, 0xf6, 0, 0}, {0x801f, 0x08, 0, 0}, {0x8020, 0xf6, 0, 0},
+ {0x8021, 0x0f, 0, 0}, {0x8022, 0xbf, 0, 0}, {0x8023, 0x34, 0, 0},
+ {0x8024, 0xf2, 0, 0}, {0x8025, 0x90, 0, 0}, {0x8026, 0x0e, 0, 0},
+ {0x8027, 0x93, 0, 0}, {0x8028, 0xe4, 0, 0}, {0x8029, 0x93, 0, 0},
+ {0x802a, 0xff, 0, 0}, {0x802b, 0xe5, 0, 0}, {0x802c, 0x4b, 0, 0},
+ {0x802d, 0xc3, 0, 0}, {0x802e, 0x9f, 0, 0}, {0x802f, 0x50, 0, 0},
+ {0x8030, 0x04, 0, 0}, {0x8031, 0x7f, 0, 0}, {0x8032, 0x05, 0, 0},
+ {0x8033, 0x80, 0, 0}, {0x8034, 0x02, 0, 0}, {0x8035, 0x7f, 0, 0},
+ {0x8036, 0xfb, 0, 0}, {0x8037, 0x78, 0, 0}, {0x8038, 0xbd, 0, 0},
+ {0x8039, 0xa6, 0, 0}, {0x803a, 0x07, 0, 0}, {0x803b, 0x12, 0, 0},
+ {0x803c, 0x0f, 0, 0}, {0x803d, 0x04, 0, 0}, {0x803e, 0x40, 0, 0},
+ {0x803f, 0x04, 0, 0}, {0x8040, 0x7f, 0, 0}, {0x8041, 0x03, 0, 0},
+ {0x8042, 0x80, 0, 0}, {0x8043, 0x02, 0, 0}, {0x8044, 0x7f, 0, 0},
+ {0x8045, 0x30, 0, 0}, {0x8046, 0x78, 0, 0}, {0x8047, 0xbc, 0, 0},
+ {0x8048, 0xa6, 0, 0}, {0x8049, 0x07, 0, 0}, {0x804a, 0xe6, 0, 0},
+ {0x804b, 0x18, 0, 0}, {0x804c, 0xf6, 0, 0}, {0x804d, 0x08, 0, 0},
+ {0x804e, 0xe6, 0, 0}, {0x804f, 0x78, 0, 0}, {0x8050, 0xb9, 0, 0},
+ {0x8051, 0xf6, 0, 0}, {0x8052, 0x78, 0, 0}, {0x8053, 0xbc, 0, 0},
+ {0x8054, 0xe6, 0, 0}, {0x8055, 0x78, 0, 0}, {0x8056, 0xba, 0, 0},
+ {0x8057, 0xf6, 0, 0}, {0x8058, 0x78, 0, 0}, {0x8059, 0xbf, 0, 0},
+ {0x805a, 0x76, 0, 0}, {0x805b, 0x33, 0, 0}, {0x805c, 0xe4, 0, 0},
+ {0x805d, 0x08, 0, 0}, {0x805e, 0xf6, 0, 0}, {0x805f, 0x78, 0, 0},
+ {0x8060, 0xb8, 0, 0}, {0x8061, 0x76, 0, 0}, {0x8062, 0x01, 0, 0},
+ {0x8063, 0x75, 0, 0}, {0x8064, 0x4a, 0, 0}, {0x8065, 0x02, 0, 0},
+ {0x8066, 0x78, 0, 0}, {0x8067, 0xb6, 0, 0}, {0x8068, 0xf6, 0, 0},
+ {0x8069, 0x08, 0, 0}, {0x806a, 0xf6, 0, 0}, {0x806b, 0x74, 0, 0},
+ {0x806c, 0xff, 0, 0}, {0x806d, 0x78, 0, 0}, {0x806e, 0xc1, 0, 0},
+ {0x806f, 0xf6, 0, 0}, {0x8070, 0x08, 0, 0}, {0x8071, 0xf6, 0, 0},
+ {0x8072, 0x75, 0, 0}, {0x8073, 0x1f, 0, 0}, {0x8074, 0x01, 0, 0},
+ {0x8075, 0x78, 0, 0}, {0x8076, 0xbc, 0, 0}, {0x8077, 0xe6, 0, 0},
+ {0x8078, 0x75, 0, 0}, {0x8079, 0xf0, 0, 0}, {0x807a, 0x05, 0, 0},
+ {0x807b, 0xa4, 0, 0}, {0x807c, 0xf5, 0, 0}, {0x807d, 0x4b, 0, 0},
+ {0x807e, 0x12, 0, 0}, {0x807f, 0x0a, 0, 0}, {0x8080, 0xff, 0, 0},
+ {0x8081, 0xc2, 0, 0}, {0x8082, 0x37, 0, 0}, {0x8083, 0x22, 0, 0},
+ {0x8084, 0x78, 0, 0}, {0x8085, 0xb8, 0, 0}, {0x8086, 0xe6, 0, 0},
+ {0x8087, 0xd3, 0, 0}, {0x8088, 0x94, 0, 0}, {0x8089, 0x00, 0, 0},
+ {0x808a, 0x40, 0, 0}, {0x808b, 0x02, 0, 0}, {0x808c, 0x16, 0, 0},
+ {0x808d, 0x22, 0, 0}, {0x808e, 0xe5, 0, 0}, {0x808f, 0x1f, 0, 0},
+ {0x8090, 0xb4, 0, 0}, {0x8091, 0x05, 0, 0}, {0x8092, 0x23, 0, 0},
+ {0x8093, 0xe4, 0, 0}, {0x8094, 0xf5, 0, 0}, {0x8095, 0x1f, 0, 0},
+ {0x8096, 0xc2, 0, 0}, {0x8097, 0x01, 0, 0}, {0x8098, 0x78, 0, 0},
+ {0x8099, 0xb6, 0, 0}, {0x809a, 0xe6, 0, 0}, {0x809b, 0xfe, 0, 0},
+ {0x809c, 0x08, 0, 0}, {0x809d, 0xe6, 0, 0}, {0x809e, 0xff, 0, 0},
+ {0x809f, 0x78, 0, 0}, {0x80a0, 0x4e, 0, 0}, {0x80a1, 0xa6, 0, 0},
+ {0x80a2, 0x06, 0, 0}, {0x80a3, 0x08, 0, 0}, {0x80a4, 0xa6, 0, 0},
+ {0x80a5, 0x07, 0, 0}, {0x80a6, 0xa2, 0, 0}, {0x80a7, 0x37, 0, 0},
+ {0x80a8, 0xe4, 0, 0}, {0x80a9, 0x33, 0, 0}, {0x80aa, 0xf5, 0, 0},
+ {0x80ab, 0x3c, 0, 0}, {0x80ac, 0x90, 0, 0}, {0x80ad, 0x30, 0, 0},
+ {0x80ae, 0x28, 0, 0}, {0x80af, 0xf0, 0, 0}, {0x80b0, 0x75, 0, 0},
+ {0x80b1, 0x1e, 0, 0}, {0x80b2, 0x10, 0, 0}, {0x80b3, 0xd2, 0, 0},
+ {0x80b4, 0x35, 0, 0}, {0x80b5, 0x22, 0, 0}, {0x80b6, 0xe5, 0, 0},
+ {0x80b7, 0x4b, 0, 0}, {0x80b8, 0x75, 0, 0}, {0x80b9, 0xf0, 0, 0},
+ {0x80ba, 0x05, 0, 0}, {0x80bb, 0x84, 0, 0}, {0x80bc, 0x78, 0, 0},
+ {0x80bd, 0xbc, 0, 0}, {0x80be, 0xf6, 0, 0}, {0x80bf, 0x90, 0, 0},
+ {0x80c0, 0x0e, 0, 0}, {0x80c1, 0x8c, 0, 0}, {0x80c2, 0xe4, 0, 0},
+ {0x80c3, 0x93, 0, 0}, {0x80c4, 0xff, 0, 0}, {0x80c5, 0x25, 0, 0},
+ {0x80c6, 0xe0, 0, 0}, {0x80c7, 0x24, 0, 0}, {0x80c8, 0x0a, 0, 0},
+ {0x80c9, 0xf8, 0, 0}, {0x80ca, 0xe6, 0, 0}, {0x80cb, 0xfc, 0, 0},
+ {0x80cc, 0x08, 0, 0}, {0x80cd, 0xe6, 0, 0}, {0x80ce, 0xfd, 0, 0},
+ {0x80cf, 0x78, 0, 0}, {0x80d0, 0xbc, 0, 0}, {0x80d1, 0xe6, 0, 0},
+ {0x80d2, 0x25, 0, 0}, {0x80d3, 0xe0, 0, 0}, {0x80d4, 0x24, 0, 0},
+ {0x80d5, 0x4e, 0, 0}, {0x80d6, 0xf8, 0, 0}, {0x80d7, 0xa6, 0, 0},
+ {0x80d8, 0x04, 0, 0}, {0x80d9, 0x08, 0, 0}, {0x80da, 0xa6, 0, 0},
+ {0x80db, 0x05, 0, 0}, {0x80dc, 0xef, 0, 0}, {0x80dd, 0x12, 0, 0},
+ {0x80de, 0x0f, 0, 0}, {0x80df, 0x0b, 0, 0}, {0x80e0, 0xd3, 0, 0},
+ {0x80e1, 0x78, 0, 0}, {0x80e2, 0xb7, 0, 0}, {0x80e3, 0x96, 0, 0},
+ {0x80e4, 0xee, 0, 0}, {0x80e5, 0x18, 0, 0}, {0x80e6, 0x96, 0, 0},
+ {0x80e7, 0x40, 0, 0}, {0x80e8, 0x0d, 0, 0}, {0x80e9, 0x78, 0, 0},
+ {0x80ea, 0xbc, 0, 0}, {0x80eb, 0xe6, 0, 0}, {0x80ec, 0x78, 0, 0},
+ {0x80ed, 0xb9, 0, 0}, {0x80ee, 0xf6, 0, 0}, {0x80ef, 0x78, 0, 0},
+ {0x80f0, 0xb6, 0, 0}, {0x80f1, 0xa6, 0, 0}, {0x80f2, 0x06, 0, 0},
+ {0x80f3, 0x08, 0, 0}, {0x80f4, 0xa6, 0, 0}, {0x80f5, 0x07, 0, 0},
+ {0x80f6, 0x90, 0, 0}, {0x80f7, 0x0e, 0, 0}, {0x80f8, 0x8c, 0, 0},
+ {0x80f9, 0xe4, 0, 0}, {0x80fa, 0x93, 0, 0}, {0x80fb, 0x12, 0, 0},
+ {0x80fc, 0x0f, 0, 0}, {0x80fd, 0x0b, 0, 0}, {0x80fe, 0xc3, 0, 0},
+ {0x80ff, 0x78, 0, 0}, {0x8100, 0xc2, 0, 0}, {0x8101, 0x96, 0, 0},
+ {0x8102, 0xee, 0, 0}, {0x8103, 0x18, 0, 0}, {0x8104, 0x96, 0, 0},
+ {0x8105, 0x50, 0, 0}, {0x8106, 0x0d, 0, 0}, {0x8107, 0x78, 0, 0},
+ {0x8108, 0xbc, 0, 0}, {0x8109, 0xe6, 0, 0}, {0x810a, 0x78, 0, 0},
+ {0x810b, 0xba, 0, 0}, {0x810c, 0xf6, 0, 0}, {0x810d, 0x78, 0, 0},
+ {0x810e, 0xc1, 0, 0}, {0x810f, 0xa6, 0, 0}, {0x8110, 0x06, 0, 0},
+ {0x8111, 0x08, 0, 0}, {0x8112, 0xa6, 0, 0}, {0x8113, 0x07, 0, 0},
+ {0x8114, 0x78, 0, 0}, {0x8115, 0xb6, 0, 0}, {0x8116, 0xe6, 0, 0},
+ {0x8117, 0xfe, 0, 0}, {0x8118, 0x08, 0, 0}, {0x8119, 0xe6, 0, 0},
+ {0x811a, 0xc3, 0, 0}, {0x811b, 0x78, 0, 0}, {0x811c, 0xc2, 0, 0},
+ {0x811d, 0x96, 0, 0}, {0x811e, 0xff, 0, 0}, {0x811f, 0xee, 0, 0},
+ {0x8120, 0x18, 0, 0}, {0x8121, 0x96, 0, 0}, {0x8122, 0x78, 0, 0},
+ {0x8123, 0xc3, 0, 0}, {0x8124, 0xf6, 0, 0}, {0x8125, 0x08, 0, 0},
+ {0x8126, 0xa6, 0, 0}, {0x8127, 0x07, 0, 0}, {0x8128, 0x90, 0, 0},
+ {0x8129, 0x0e, 0, 0}, {0x812a, 0x95, 0, 0}, {0x812b, 0xe4, 0, 0},
+ {0x812c, 0x18, 0, 0}, {0x812d, 0x12, 0, 0}, {0x812e, 0x0e, 0, 0},
+ {0x812f, 0xe9, 0, 0}, {0x8130, 0x40, 0, 0}, {0x8131, 0x02, 0, 0},
+ {0x8132, 0xd2, 0, 0}, {0x8133, 0x37, 0, 0}, {0x8134, 0x78, 0, 0},
+ {0x8135, 0xbc, 0, 0}, {0x8136, 0xe6, 0, 0}, {0x8137, 0x08, 0, 0},
+ {0x8138, 0x26, 0, 0}, {0x8139, 0x08, 0, 0}, {0x813a, 0xf6, 0, 0},
+ {0x813b, 0xe5, 0, 0}, {0x813c, 0x1f, 0, 0}, {0x813d, 0x64, 0, 0},
+ {0x813e, 0x01, 0, 0}, {0x813f, 0x70, 0, 0}, {0x8140, 0x4a, 0, 0},
+ {0x8141, 0xe6, 0, 0}, {0x8142, 0xc3, 0, 0}, {0x8143, 0x78, 0, 0},
+ {0x8144, 0xc0, 0, 0}, {0x8145, 0x12, 0, 0}, {0x8146, 0x0e, 0, 0},
+ {0x8147, 0xdf, 0, 0}, {0x8148, 0x40, 0, 0}, {0x8149, 0x05, 0, 0},
+ {0x814a, 0x12, 0, 0}, {0x814b, 0x0e, 0, 0}, {0x814c, 0xda, 0, 0},
+ {0x814d, 0x40, 0, 0}, {0x814e, 0x39, 0, 0}, {0x814f, 0x12, 0, 0},
+ {0x8150, 0x0f, 0, 0}, {0x8151, 0x02, 0, 0}, {0x8152, 0x40, 0, 0},
+ {0x8153, 0x04, 0, 0}, {0x8154, 0x7f, 0, 0}, {0x8155, 0xfe, 0, 0},
+ {0x8156, 0x80, 0, 0}, {0x8157, 0x02, 0, 0}, {0x8158, 0x7f, 0, 0},
+ {0x8159, 0x02, 0, 0}, {0x815a, 0x78, 0, 0}, {0x815b, 0xbd, 0, 0},
+ {0x815c, 0xa6, 0, 0}, {0x815d, 0x07, 0, 0}, {0x815e, 0x78, 0, 0},
+ {0x815f, 0xb9, 0, 0}, {0x8160, 0xe6, 0, 0}, {0x8161, 0x24, 0, 0},
+ {0x8162, 0x03, 0, 0}, {0x8163, 0x78, 0, 0}, {0x8164, 0xbf, 0, 0},
+ {0x8165, 0xf6, 0, 0}, {0x8166, 0x78, 0, 0}, {0x8167, 0xb9, 0, 0},
+ {0x8168, 0xe6, 0, 0}, {0x8169, 0x24, 0, 0}, {0x816a, 0xfd, 0, 0},
+ {0x816b, 0x78, 0, 0}, {0x816c, 0xc0, 0, 0}, {0x816d, 0xf6, 0, 0},
+ {0x816e, 0x12, 0, 0}, {0x816f, 0x0f, 0, 0}, {0x8170, 0x02, 0, 0},
+ {0x8171, 0x40, 0, 0}, {0x8172, 0x06, 0, 0}, {0x8173, 0x78, 0, 0},
+ {0x8174, 0xc0, 0, 0}, {0x8175, 0xe6, 0, 0}, {0x8176, 0xff, 0, 0},
+ {0x8177, 0x80, 0, 0}, {0x8178, 0x04, 0, 0}, {0x8179, 0x78, 0, 0},
+ {0x817a, 0xbf, 0, 0}, {0x817b, 0xe6, 0, 0}, {0x817c, 0xff, 0, 0},
+ {0x817d, 0x78, 0, 0}, {0x817e, 0xbe, 0, 0}, {0x817f, 0xa6, 0, 0},
+ {0x8180, 0x07, 0, 0}, {0x8181, 0x75, 0, 0}, {0x8182, 0x1f, 0, 0},
+ {0x8183, 0x02, 0, 0}, {0x8184, 0x78, 0, 0}, {0x8185, 0xb8, 0, 0},
+ {0x8186, 0x76, 0, 0}, {0x8187, 0x01, 0, 0}, {0x8188, 0x02, 0, 0},
+ {0x8189, 0x02, 0, 0}, {0x818a, 0x4a, 0, 0}, {0x818b, 0xe5, 0, 0},
+ {0x818c, 0x1f, 0, 0}, {0x818d, 0x64, 0, 0}, {0x818e, 0x02, 0, 0},
+ {0x818f, 0x60, 0, 0}, {0x8190, 0x03, 0, 0}, {0x8191, 0x02, 0, 0},
+ {0x8192, 0x02, 0, 0}, {0x8193, 0x2a, 0, 0}, {0x8194, 0x78, 0, 0},
+ {0x8195, 0xbe, 0, 0}, {0x8196, 0xe6, 0, 0}, {0x8197, 0xff, 0, 0},
+ {0x8198, 0xc3, 0, 0}, {0x8199, 0x78, 0, 0}, {0x819a, 0xc0, 0, 0},
+ {0x819b, 0x12, 0, 0}, {0x819c, 0x0e, 0, 0}, {0x819d, 0xe0, 0, 0},
+ {0x819e, 0x40, 0, 0}, {0x819f, 0x08, 0, 0}, {0x81a0, 0x12, 0, 0},
+ {0x81a1, 0x0e, 0, 0}, {0x81a2, 0xda, 0, 0}, {0x81a3, 0x50, 0, 0},
+ {0x81a4, 0x03, 0, 0}, {0x81a5, 0x02, 0, 0}, {0x81a6, 0x02, 0, 0},
+ {0x81a7, 0x28, 0, 0}, {0x81a8, 0x12, 0, 0}, {0x81a9, 0x0f, 0, 0},
+ {0x81aa, 0x02, 0, 0}, {0x81ab, 0x40, 0, 0}, {0x81ac, 0x04, 0, 0},
+ {0x81ad, 0x7f, 0, 0}, {0x81ae, 0xff, 0, 0}, {0x81af, 0x80, 0, 0},
+ {0x81b0, 0x02, 0, 0}, {0x81b1, 0x7f, 0, 0}, {0x81b2, 0x01, 0, 0},
+ {0x81b3, 0x78, 0, 0}, {0x81b4, 0xbd, 0, 0}, {0x81b5, 0xa6, 0, 0},
+ {0x81b6, 0x07, 0, 0}, {0x81b7, 0x78, 0, 0}, {0x81b8, 0xb9, 0, 0},
+ {0x81b9, 0xe6, 0, 0}, {0x81ba, 0x04, 0, 0}, {0x81bb, 0x78, 0, 0},
+ {0x81bc, 0xbf, 0, 0}, {0x81bd, 0xf6, 0, 0}, {0x81be, 0x78, 0, 0},
+ {0x81bf, 0xb9, 0, 0}, {0x81c0, 0xe6, 0, 0}, {0x81c1, 0x14, 0, 0},
+ {0x81c2, 0x78, 0, 0}, {0x81c3, 0xc0, 0, 0}, {0x81c4, 0xf6, 0, 0},
+ {0x81c5, 0x18, 0, 0}, {0x81c6, 0x12, 0, 0}, {0x81c7, 0x0f, 0, 0},
+ {0x81c8, 0x04, 0, 0}, {0x81c9, 0x40, 0, 0}, {0x81ca, 0x04, 0, 0},
+ {0x81cb, 0xe6, 0, 0}, {0x81cc, 0xff, 0, 0}, {0x81cd, 0x80, 0, 0},
+ {0x81ce, 0x02, 0, 0}, {0x81cf, 0x7f, 0, 0}, {0x81d0, 0x00, 0, 0},
+ {0x81d1, 0x78, 0, 0}, {0x81d2, 0xbf, 0, 0}, {0x81d3, 0xa6, 0, 0},
+ {0x81d4, 0x07, 0, 0}, {0x81d5, 0xd3, 0, 0}, {0x81d6, 0x08, 0, 0},
+ {0x81d7, 0xe6, 0, 0}, {0x81d8, 0x64, 0, 0}, {0x81d9, 0x80, 0, 0},
+ {0x81da, 0x94, 0, 0}, {0x81db, 0x80, 0, 0}, {0x81dc, 0x40, 0, 0},
+ {0x81dd, 0x04, 0, 0}, {0x81de, 0xe6, 0, 0}, {0x81df, 0xff, 0, 0},
+ {0x81e0, 0x80, 0, 0}, {0x81e1, 0x02, 0, 0}, {0x81e2, 0x7f, 0, 0},
+ {0x81e3, 0x00, 0, 0}, {0x81e4, 0x78, 0, 0}, {0x81e5, 0xc0, 0, 0},
+ {0x81e6, 0xa6, 0, 0}, {0x81e7, 0x07, 0, 0}, {0x81e8, 0xc3, 0, 0},
+ {0x81e9, 0x18, 0, 0}, {0x81ea, 0xe6, 0, 0}, {0x81eb, 0x64, 0, 0},
+ {0x81ec, 0x80, 0, 0}, {0x81ed, 0x94, 0, 0}, {0x81ee, 0xb3, 0, 0},
+ {0x81ef, 0x50, 0, 0}, {0x81f0, 0x04, 0, 0}, {0x81f1, 0xe6, 0, 0},
+ {0x81f2, 0xff, 0, 0}, {0x81f3, 0x80, 0, 0}, {0x81f4, 0x02, 0, 0},
+ {0x81f5, 0x7f, 0, 0}, {0x81f6, 0x33, 0, 0}, {0x81f7, 0x78, 0, 0},
+ {0x81f8, 0xbf, 0, 0}, {0x81f9, 0xa6, 0, 0}, {0x81fa, 0x07, 0, 0},
+ {0x81fb, 0xc3, 0, 0}, {0x81fc, 0x08, 0, 0}, {0x81fd, 0xe6, 0, 0},
+ {0x81fe, 0x64, 0, 0}, {0x81ff, 0x80, 0, 0}, {0x8200, 0x94, 0, 0},
+ {0x8201, 0xb3, 0, 0}, {0x8202, 0x50, 0, 0}, {0x8203, 0x04, 0, 0},
+ {0x8204, 0xe6, 0, 0}, {0x8205, 0xff, 0, 0}, {0x8206, 0x80, 0, 0},
+ {0x8207, 0x02, 0, 0}, {0x8208, 0x7f, 0, 0}, {0x8209, 0x33, 0, 0},
+ {0x820a, 0x78, 0, 0}, {0x820b, 0xc0, 0, 0}, {0x820c, 0xa6, 0, 0},
+ {0x820d, 0x07, 0, 0}, {0x820e, 0x12, 0, 0}, {0x820f, 0x0f, 0, 0},
+ {0x8210, 0x02, 0, 0}, {0x8211, 0x40, 0, 0}, {0x8212, 0x06, 0, 0},
+ {0x8213, 0x78, 0, 0}, {0x8214, 0xc0, 0, 0}, {0x8215, 0xe6, 0, 0},
+ {0x8216, 0xff, 0, 0}, {0x8217, 0x80, 0, 0}, {0x8218, 0x04, 0, 0},
+ {0x8219, 0x78, 0, 0}, {0x821a, 0xbf, 0, 0}, {0x821b, 0xe6, 0, 0},
+ {0x821c, 0xff, 0, 0}, {0x821d, 0x78, 0, 0}, {0x821e, 0xbe, 0, 0},
+ {0x821f, 0xa6, 0, 0}, {0x8220, 0x07, 0, 0}, {0x8221, 0x75, 0, 0},
+ {0x8222, 0x1f, 0, 0}, {0x8223, 0x03, 0, 0}, {0x8224, 0x78, 0, 0},
+ {0x8225, 0xb8, 0, 0}, {0x8226, 0x76, 0, 0}, {0x8227, 0x01, 0, 0},
+ {0x8228, 0x80, 0, 0}, {0x8229, 0x20, 0, 0}, {0x822a, 0xe5, 0, 0},
+ {0x822b, 0x1f, 0, 0}, {0x822c, 0x64, 0, 0}, {0x822d, 0x03, 0, 0},
+ {0x822e, 0x70, 0, 0}, {0x822f, 0x26, 0, 0}, {0x8230, 0x78, 0, 0},
+ {0x8231, 0xbe, 0, 0}, {0x8232, 0xe6, 0, 0}, {0x8233, 0xff, 0, 0},
+ {0x8234, 0xc3, 0, 0}, {0x8235, 0x78, 0, 0}, {0x8236, 0xc0, 0, 0},
+ {0x8237, 0x12, 0, 0}, {0x8238, 0x0e, 0, 0}, {0x8239, 0xe0, 0, 0},
+ {0x823a, 0x40, 0, 0}, {0x823b, 0x05, 0, 0}, {0x823c, 0x12, 0, 0},
+ {0x823d, 0x0e, 0, 0}, {0x823e, 0xda, 0, 0}, {0x823f, 0x40, 0, 0},
+ {0x8240, 0x09, 0, 0}, {0x8241, 0x78, 0, 0}, {0x8242, 0xb9, 0, 0},
+ {0x8243, 0xe6, 0, 0}, {0x8244, 0x78, 0, 0}, {0x8245, 0xbe, 0, 0},
+ {0x8246, 0xf6, 0, 0}, {0x8247, 0x75, 0, 0}, {0x8248, 0x1f, 0, 0},
+ {0x8249, 0x04, 0, 0}, {0x824a, 0x78, 0, 0}, {0x824b, 0xbe, 0, 0},
+ {0x824c, 0xe6, 0, 0}, {0x824d, 0x75, 0, 0}, {0x824e, 0xf0, 0, 0},
+ {0x824f, 0x05, 0, 0}, {0x8250, 0xa4, 0, 0}, {0x8251, 0xf5, 0, 0},
+ {0x8252, 0x4b, 0, 0}, {0x8253, 0x02, 0, 0}, {0x8254, 0x0a, 0, 0},
+ {0x8255, 0xff, 0, 0}, {0x8256, 0xe5, 0, 0}, {0x8257, 0x1f, 0, 0},
+ {0x8258, 0xb4, 0, 0}, {0x8259, 0x04, 0, 0}, {0x825a, 0x10, 0, 0},
+ {0x825b, 0x90, 0, 0}, {0x825c, 0x0e, 0, 0}, {0x825d, 0x94, 0, 0},
+ {0x825e, 0xe4, 0, 0}, {0x825f, 0x78, 0, 0}, {0x8260, 0xc3, 0, 0},
+ {0x8261, 0x12, 0, 0}, {0x8262, 0x0e, 0, 0}, {0x8263, 0xe9, 0, 0},
+ {0x8264, 0x40, 0, 0}, {0x8265, 0x02, 0, 0}, {0x8266, 0xd2, 0, 0},
+ {0x8267, 0x37, 0, 0}, {0x8268, 0x75, 0, 0}, {0x8269, 0x1f, 0, 0},
+ {0x826a, 0x05, 0, 0}, {0x826b, 0x22, 0, 0}, {0x826c, 0x30, 0, 0},
+ {0x826d, 0x01, 0, 0}, {0x826e, 0x03, 0, 0}, {0x826f, 0x02, 0, 0},
+ {0x8270, 0x04, 0, 0}, {0x8271, 0xc0, 0, 0}, {0x8272, 0x30, 0, 0},
+ {0x8273, 0x02, 0, 0}, {0x8274, 0x03, 0, 0}, {0x8275, 0x02, 0, 0},
+ {0x8276, 0x04, 0, 0}, {0x8277, 0xc0, 0, 0}, {0x8278, 0x90, 0, 0},
+ {0x8279, 0x51, 0, 0}, {0x827a, 0xa5, 0, 0}, {0x827b, 0xe0, 0, 0},
+ {0x827c, 0x78, 0, 0}, {0x827d, 0x93, 0, 0}, {0x827e, 0xf6, 0, 0},
+ {0x827f, 0xa3, 0, 0}, {0x8280, 0xe0, 0, 0}, {0x8281, 0x08, 0, 0},
+ {0x8282, 0xf6, 0, 0}, {0x8283, 0xa3, 0, 0}, {0x8284, 0xe0, 0, 0},
+ {0x8285, 0x08, 0, 0}, {0x8286, 0xf6, 0, 0}, {0x8287, 0xe5, 0, 0},
+ {0x8288, 0x1f, 0, 0}, {0x8289, 0x70, 0, 0}, {0x828a, 0x3c, 0, 0},
+ {0x828b, 0x75, 0, 0}, {0x828c, 0x1e, 0, 0}, {0x828d, 0x20, 0, 0},
+ {0x828e, 0xd2, 0, 0}, {0x828f, 0x35, 0, 0}, {0x8290, 0x12, 0, 0},
+ {0x8291, 0x0c, 0, 0}, {0x8292, 0x7a, 0, 0}, {0x8293, 0x78, 0, 0},
+ {0x8294, 0x7e, 0, 0}, {0x8295, 0xa6, 0, 0}, {0x8296, 0x06, 0, 0},
+ {0x8297, 0x08, 0, 0}, {0x8298, 0xa6, 0, 0}, {0x8299, 0x07, 0, 0},
+ {0x829a, 0x78, 0, 0}, {0x829b, 0x8b, 0, 0}, {0x829c, 0xa6, 0, 0},
+ {0x829d, 0x09, 0, 0}, {0x829e, 0x18, 0, 0}, {0x829f, 0x76, 0, 0},
+ {0x82a0, 0x01, 0, 0}, {0x82a1, 0x12, 0, 0}, {0x82a2, 0x0c, 0, 0},
+ {0x82a3, 0x5b, 0, 0}, {0x82a4, 0x78, 0, 0}, {0x82a5, 0x4e, 0, 0},
+ {0x82a6, 0xa6, 0, 0}, {0x82a7, 0x06, 0, 0}, {0x82a8, 0x08, 0, 0},
+ {0x82a9, 0xa6, 0, 0}, {0x82aa, 0x07, 0, 0}, {0x82ab, 0x78, 0, 0},
+ {0x82ac, 0x8b, 0, 0}, {0x82ad, 0xe6, 0, 0}, {0x82ae, 0x78, 0, 0},
+ {0x82af, 0x6e, 0, 0}, {0x82b0, 0xf6, 0, 0}, {0x82b1, 0x75, 0, 0},
+ {0x82b2, 0x1f, 0, 0}, {0x82b3, 0x01, 0, 0}, {0x82b4, 0x78, 0, 0},
+ {0x82b5, 0x93, 0, 0}, {0x82b6, 0xe6, 0, 0}, {0x82b7, 0x78, 0, 0},
+ {0x82b8, 0x90, 0, 0}, {0x82b9, 0xf6, 0, 0}, {0x82ba, 0x78, 0, 0},
+ {0x82bb, 0x94, 0, 0}, {0x82bc, 0xe6, 0, 0}, {0x82bd, 0x78, 0, 0},
+ {0x82be, 0x91, 0, 0}, {0x82bf, 0xf6, 0, 0}, {0x82c0, 0x78, 0, 0},
+ {0x82c1, 0x95, 0, 0}, {0x82c2, 0xe6, 0, 0}, {0x82c3, 0x78, 0, 0},
+ {0x82c4, 0x92, 0, 0}, {0x82c5, 0xf6, 0, 0}, {0x82c6, 0x22, 0, 0},
+ {0x82c7, 0x79, 0, 0}, {0x82c8, 0x90, 0, 0}, {0x82c9, 0xe7, 0, 0},
+ {0x82ca, 0xd3, 0, 0}, {0x82cb, 0x78, 0, 0}, {0x82cc, 0x93, 0, 0},
+ {0x82cd, 0x96, 0, 0}, {0x82ce, 0x40, 0, 0}, {0x82cf, 0x05, 0, 0},
+ {0x82d0, 0xe7, 0, 0}, {0x82d1, 0x96, 0, 0}, {0x82d2, 0xff, 0, 0},
+ {0x82d3, 0x80, 0, 0}, {0x82d4, 0x08, 0, 0}, {0x82d5, 0xc3, 0, 0},
+ {0x82d6, 0x79, 0, 0}, {0x82d7, 0x93, 0, 0}, {0x82d8, 0xe7, 0, 0},
+ {0x82d9, 0x78, 0, 0}, {0x82da, 0x90, 0, 0}, {0x82db, 0x96, 0, 0},
+ {0x82dc, 0xff, 0, 0}, {0x82dd, 0x78, 0, 0}, {0x82de, 0x88, 0, 0},
+ {0x82df, 0x76, 0, 0}, {0x82e0, 0x00, 0, 0}, {0x82e1, 0x08, 0, 0},
+ {0x82e2, 0xa6, 0, 0}, {0x82e3, 0x07, 0, 0}, {0x82e4, 0x79, 0, 0},
+ {0x82e5, 0x91, 0, 0}, {0x82e6, 0xe7, 0, 0}, {0x82e7, 0xd3, 0, 0},
+ {0x82e8, 0x78, 0, 0}, {0x82e9, 0x94, 0, 0}, {0x82ea, 0x96, 0, 0},
+ {0x82eb, 0x40, 0, 0}, {0x82ec, 0x05, 0, 0}, {0x82ed, 0xe7, 0, 0},
+ {0x82ee, 0x96, 0, 0}, {0x82ef, 0xff, 0, 0}, {0x82f0, 0x80, 0, 0},
+ {0x82f1, 0x08, 0, 0}, {0x82f2, 0xc3, 0, 0}, {0x82f3, 0x79, 0, 0},
+ {0x82f4, 0x94, 0, 0}, {0x82f5, 0xe7, 0, 0}, {0x82f6, 0x78, 0, 0},
+ {0x82f7, 0x91, 0, 0}, {0x82f8, 0x96, 0, 0}, {0x82f9, 0xff, 0, 0},
+ {0x82fa, 0x12, 0, 0}, {0x82fb, 0x0c, 0, 0}, {0x82fc, 0x8e, 0, 0},
+ {0x82fd, 0x79, 0, 0}, {0x82fe, 0x92, 0, 0}, {0x82ff, 0xe7, 0, 0},
+ {0x8300, 0xd3, 0, 0}, {0x8301, 0x78, 0, 0}, {0x8302, 0x95, 0, 0},
+ {0x8303, 0x96, 0, 0}, {0x8304, 0x40, 0, 0}, {0x8305, 0x05, 0, 0},
+ {0x8306, 0xe7, 0, 0}, {0x8307, 0x96, 0, 0}, {0x8308, 0xff, 0, 0},
+ {0x8309, 0x80, 0, 0}, {0x830a, 0x08, 0, 0}, {0x830b, 0xc3, 0, 0},
+ {0x830c, 0x79, 0, 0}, {0x830d, 0x95, 0, 0}, {0x830e, 0xe7, 0, 0},
+ {0x830f, 0x78, 0, 0}, {0x8310, 0x92, 0, 0}, {0x8311, 0x96, 0, 0},
+ {0x8312, 0xff, 0, 0}, {0x8313, 0x12, 0, 0}, {0x8314, 0x0c, 0, 0},
+ {0x8315, 0x8e, 0, 0}, {0x8316, 0x12, 0, 0}, {0x8317, 0x0c, 0, 0},
+ {0x8318, 0x5b, 0, 0}, {0x8319, 0x78, 0, 0}, {0x831a, 0x8a, 0, 0},
+ {0x831b, 0xe6, 0, 0}, {0x831c, 0x25, 0, 0}, {0x831d, 0xe0, 0, 0},
+ {0x831e, 0x24, 0, 0}, {0x831f, 0x4e, 0, 0}, {0x8320, 0xf8, 0, 0},
+ {0x8321, 0xa6, 0, 0}, {0x8322, 0x06, 0, 0}, {0x8323, 0x08, 0, 0},
+ {0x8324, 0xa6, 0, 0}, {0x8325, 0x07, 0, 0}, {0x8326, 0x78, 0, 0},
+ {0x8327, 0x8a, 0, 0}, {0x8328, 0xe6, 0, 0}, {0x8329, 0x24, 0, 0},
+ {0x832a, 0x6e, 0, 0}, {0x832b, 0xf8, 0, 0}, {0x832c, 0xa6, 0, 0},
+ {0x832d, 0x09, 0, 0}, {0x832e, 0x78, 0, 0}, {0x832f, 0x8a, 0, 0},
+ {0x8330, 0xe6, 0, 0}, {0x8331, 0x24, 0, 0}, {0x8332, 0x01, 0, 0},
+ {0x8333, 0xff, 0, 0}, {0x8334, 0xe4, 0, 0}, {0x8335, 0x33, 0, 0},
+ {0x8336, 0xfe, 0, 0}, {0x8337, 0xd3, 0, 0}, {0x8338, 0xef, 0, 0},
+ {0x8339, 0x94, 0, 0}, {0x833a, 0x0f, 0, 0}, {0x833b, 0xee, 0, 0},
+ {0x833c, 0x64, 0, 0}, {0x833d, 0x80, 0, 0}, {0x833e, 0x94, 0, 0},
+ {0x833f, 0x80, 0, 0}, {0x8340, 0x40, 0, 0}, {0x8341, 0x04, 0, 0},
+ {0x8342, 0x7f, 0, 0}, {0x8343, 0x00, 0, 0}, {0x8344, 0x80, 0, 0},
+ {0x8345, 0x05, 0, 0}, {0x8346, 0x78, 0, 0}, {0x8347, 0x8a, 0, 0},
+ {0x8348, 0xe6, 0, 0}, {0x8349, 0x04, 0, 0}, {0x834a, 0xff, 0, 0},
+ {0x834b, 0x78, 0, 0}, {0x834c, 0x8a, 0, 0}, {0x834d, 0xa6, 0, 0},
+ {0x834e, 0x07, 0, 0}, {0x834f, 0xe5, 0, 0}, {0x8350, 0x1f, 0, 0},
+ {0x8351, 0xb4, 0, 0}, {0x8352, 0x01, 0, 0}, {0x8353, 0x0a, 0, 0},
+ {0x8354, 0xe6, 0, 0}, {0x8355, 0x60, 0, 0}, {0x8356, 0x03, 0, 0},
+ {0x8357, 0x02, 0, 0}, {0x8358, 0x04, 0, 0}, {0x8359, 0xc0, 0, 0},
+ {0x835a, 0x75, 0, 0}, {0x835b, 0x1f, 0, 0}, {0x835c, 0x02, 0, 0},
+ {0x835d, 0x22, 0, 0}, {0x835e, 0x12, 0, 0}, {0x835f, 0x0c, 0, 0},
+ {0x8360, 0x7a, 0, 0}, {0x8361, 0x78, 0, 0}, {0x8362, 0x80, 0, 0},
+ {0x8363, 0xa6, 0, 0}, {0x8364, 0x06, 0, 0}, {0x8365, 0x08, 0, 0},
+ {0x8366, 0xa6, 0, 0}, {0x8367, 0x07, 0, 0}, {0x8368, 0x12, 0, 0},
+ {0x8369, 0x0c, 0, 0}, {0x836a, 0x7a, 0, 0}, {0x836b, 0x78, 0, 0},
+ {0x836c, 0x82, 0, 0}, {0x836d, 0xa6, 0, 0}, {0x836e, 0x06, 0, 0},
+ {0x836f, 0x08, 0, 0}, {0x8370, 0xa6, 0, 0}, {0x8371, 0x07, 0, 0},
+ {0x8372, 0x78, 0, 0}, {0x8373, 0x6e, 0, 0}, {0x8374, 0xe6, 0, 0},
+ {0x8375, 0x78, 0, 0}, {0x8376, 0x8c, 0, 0}, {0x8377, 0xf6, 0, 0},
+ {0x8378, 0x78, 0, 0}, {0x8379, 0x6e, 0, 0}, {0x837a, 0xe6, 0, 0},
+ {0x837b, 0x78, 0, 0}, {0x837c, 0x8d, 0, 0}, {0x837d, 0xf6, 0, 0},
+ {0x837e, 0x7f, 0, 0}, {0x837f, 0x01, 0, 0}, {0x8380, 0xef, 0, 0},
+ {0x8381, 0x25, 0, 0}, {0x8382, 0xe0, 0, 0}, {0x8383, 0x24, 0, 0},
+ {0x8384, 0x4f, 0, 0}, {0x8385, 0xf9, 0, 0}, {0x8386, 0xc3, 0, 0},
+ {0x8387, 0x78, 0, 0}, {0x8388, 0x81, 0, 0}, {0x8389, 0xe6, 0, 0},
+ {0x838a, 0x97, 0, 0}, {0x838b, 0x18, 0, 0}, {0x838c, 0xe6, 0, 0},
+ {0x838d, 0x19, 0, 0}, {0x838e, 0x97, 0, 0}, {0x838f, 0x50, 0, 0},
+ {0x8390, 0x0a, 0, 0}, {0x8391, 0x12, 0, 0}, {0x8392, 0x0c, 0, 0},
+ {0x8393, 0x82, 0, 0}, {0x8394, 0x78, 0, 0}, {0x8395, 0x80, 0, 0},
+ {0x8396, 0xa6, 0, 0}, {0x8397, 0x04, 0, 0}, {0x8398, 0x08, 0, 0},
+ {0x8399, 0xa6, 0, 0}, {0x839a, 0x05, 0, 0}, {0x839b, 0x74, 0, 0},
+ {0x839c, 0x6e, 0, 0}, {0x839d, 0x2f, 0, 0}, {0x839e, 0xf9, 0, 0},
+ {0x839f, 0x78, 0, 0}, {0x83a0, 0x8c, 0, 0}, {0x83a1, 0xe6, 0, 0},
+ {0x83a2, 0xc3, 0, 0}, {0x83a3, 0x97, 0, 0}, {0x83a4, 0x50, 0, 0},
+ {0x83a5, 0x08, 0, 0}, {0x83a6, 0x74, 0, 0}, {0x83a7, 0x6e, 0, 0},
+ {0x83a8, 0x2f, 0, 0}, {0x83a9, 0xf8, 0, 0}, {0x83aa, 0xe6, 0, 0},
+ {0x83ab, 0x78, 0, 0}, {0x83ac, 0x8c, 0, 0}, {0x83ad, 0xf6, 0, 0},
+ {0x83ae, 0xef, 0, 0}, {0x83af, 0x25, 0, 0}, {0x83b0, 0xe0, 0, 0},
+ {0x83b1, 0x24, 0, 0}, {0x83b2, 0x4f, 0, 0}, {0x83b3, 0xf9, 0, 0},
+ {0x83b4, 0xd3, 0, 0}, {0x83b5, 0x78, 0, 0}, {0x83b6, 0x83, 0, 0},
+ {0x83b7, 0xe6, 0, 0}, {0x83b8, 0x97, 0, 0}, {0x83b9, 0x18, 0, 0},
+ {0x83ba, 0xe6, 0, 0}, {0x83bb, 0x19, 0, 0}, {0x83bc, 0x97, 0, 0},
+ {0x83bd, 0x40, 0, 0}, {0x83be, 0x0a, 0, 0}, {0x83bf, 0x12, 0, 0},
+ {0x83c0, 0x0c, 0, 0}, {0x83c1, 0x82, 0, 0}, {0x83c2, 0x78, 0, 0},
+ {0x83c3, 0x82, 0, 0}, {0x83c4, 0xa6, 0, 0}, {0x83c5, 0x04, 0, 0},
+ {0x83c6, 0x08, 0, 0}, {0x83c7, 0xa6, 0, 0}, {0x83c8, 0x05, 0, 0},
+ {0x83c9, 0x74, 0, 0}, {0x83ca, 0x6e, 0, 0}, {0x83cb, 0x2f, 0, 0},
+ {0x83cc, 0xf9, 0, 0}, {0x83cd, 0x78, 0, 0}, {0x83ce, 0x8d, 0, 0},
+ {0x83cf, 0xe6, 0, 0}, {0x83d0, 0xd3, 0, 0}, {0x83d1, 0x97, 0, 0},
+ {0x83d2, 0x40, 0, 0}, {0x83d3, 0x08, 0, 0}, {0x83d4, 0x74, 0, 0},
+ {0x83d5, 0x6e, 0, 0}, {0x83d6, 0x2f, 0, 0}, {0x83d7, 0xf8, 0, 0},
+ {0x83d8, 0xe6, 0, 0}, {0x83d9, 0x78, 0, 0}, {0x83da, 0x8d, 0, 0},
+ {0x83db, 0xf6, 0, 0}, {0x83dc, 0x0f, 0, 0}, {0x83dd, 0xef, 0, 0},
+ {0x83de, 0x64, 0, 0}, {0x83df, 0x10, 0, 0}, {0x83e0, 0x70, 0, 0},
+ {0x83e1, 0x9e, 0, 0}, {0x83e2, 0xc3, 0, 0}, {0x83e3, 0x79, 0, 0},
+ {0x83e4, 0x81, 0, 0}, {0x83e5, 0xe7, 0, 0}, {0x83e6, 0x78, 0, 0},
+ {0x83e7, 0x83, 0, 0}, {0x83e8, 0x96, 0, 0}, {0x83e9, 0xff, 0, 0},
+ {0x83ea, 0x19, 0, 0}, {0x83eb, 0xe7, 0, 0}, {0x83ec, 0x18, 0, 0},
+ {0x83ed, 0x96, 0, 0}, {0x83ee, 0x78, 0, 0}, {0x83ef, 0x84, 0, 0},
+ {0x83f0, 0xf6, 0, 0}, {0x83f1, 0x08, 0, 0}, {0x83f2, 0xa6, 0, 0},
+ {0x83f3, 0x07, 0, 0}, {0x83f4, 0xc3, 0, 0}, {0x83f5, 0x79, 0, 0},
+ {0x83f6, 0x8c, 0, 0}, {0x83f7, 0xe7, 0, 0}, {0x83f8, 0x78, 0, 0},
+ {0x83f9, 0x8d, 0, 0}, {0x83fa, 0x96, 0, 0}, {0x83fb, 0x08, 0, 0},
+ {0x83fc, 0xf6, 0, 0}, {0x83fd, 0xd3, 0, 0}, {0x83fe, 0x79, 0, 0},
+ {0x83ff, 0x81, 0, 0}, {0x8400, 0xe7, 0, 0}, {0x8401, 0x78, 0, 0},
+ {0x8402, 0x7f, 0, 0}, {0x8403, 0x96, 0, 0}, {0x8404, 0x19, 0, 0},
+ {0x8405, 0xe7, 0, 0}, {0x8406, 0x18, 0, 0}, {0x8407, 0x96, 0, 0},
+ {0x8408, 0x40, 0, 0}, {0x8409, 0x05, 0, 0}, {0x840a, 0x09, 0, 0},
+ {0x840b, 0xe7, 0, 0}, {0x840c, 0x08, 0, 0}, {0x840d, 0x80, 0, 0},
+ {0x840e, 0x06, 0, 0}, {0x840f, 0xc3, 0, 0}, {0x8410, 0x79, 0, 0},
+ {0x8411, 0x7f, 0, 0}, {0x8412, 0xe7, 0, 0}, {0x8413, 0x78, 0, 0},
+ {0x8414, 0x81, 0, 0}, {0x8415, 0x96, 0, 0}, {0x8416, 0xff, 0, 0},
+ {0x8417, 0x19, 0, 0}, {0x8418, 0xe7, 0, 0}, {0x8419, 0x18, 0, 0},
+ {0x841a, 0x96, 0, 0}, {0x841b, 0xfe, 0, 0}, {0x841c, 0x78, 0, 0},
+ {0x841d, 0x86, 0, 0}, {0x841e, 0xa6, 0, 0}, {0x841f, 0x06, 0, 0},
+ {0x8420, 0x08, 0, 0}, {0x8421, 0xa6, 0, 0}, {0x8422, 0x07, 0, 0},
+ {0x8423, 0x79, 0, 0}, {0x8424, 0x8c, 0, 0}, {0x8425, 0xe7, 0, 0},
+ {0x8426, 0xd3, 0, 0}, {0x8427, 0x78, 0, 0}, {0x8428, 0x8b, 0, 0},
+ {0x8429, 0x96, 0, 0}, {0x842a, 0x40, 0, 0}, {0x842b, 0x05, 0, 0},
+ {0x842c, 0xe7, 0, 0}, {0x842d, 0x96, 0, 0}, {0x842e, 0xff, 0, 0},
+ {0x842f, 0x80, 0, 0}, {0x8430, 0x08, 0, 0}, {0x8431, 0xc3, 0, 0},
+ {0x8432, 0x79, 0, 0}, {0x8433, 0x8b, 0, 0}, {0x8434, 0xe7, 0, 0},
+ {0x8435, 0x78, 0, 0}, {0x8436, 0x8c, 0, 0}, {0x8437, 0x96, 0, 0},
+ {0x8438, 0xff, 0, 0}, {0x8439, 0x78, 0, 0}, {0x843a, 0x8f, 0, 0},
+ {0x843b, 0xa6, 0, 0}, {0x843c, 0x07, 0, 0}, {0x843d, 0xe5, 0, 0},
+ {0x843e, 0x1f, 0, 0}, {0x843f, 0x64, 0, 0}, {0x8440, 0x02, 0, 0},
+ {0x8441, 0x70, 0, 0}, {0x8442, 0x69, 0, 0}, {0x8443, 0x90, 0, 0},
+ {0x8444, 0x0e, 0, 0}, {0x8445, 0x91, 0, 0}, {0x8446, 0x93, 0, 0},
+ {0x8447, 0xff, 0, 0}, {0x8448, 0x18, 0, 0}, {0x8449, 0xe6, 0, 0},
+ {0x844a, 0xc3, 0, 0}, {0x844b, 0x9f, 0, 0}, {0x844c, 0x50, 0, 0},
+ {0x844d, 0x72, 0, 0}, {0x844e, 0x12, 0, 0}, {0x844f, 0x0c, 0, 0},
+ {0x8450, 0x4a, 0, 0}, {0x8451, 0x12, 0, 0}, {0x8452, 0x0c, 0, 0},
+ {0x8453, 0x2f, 0, 0}, {0x8454, 0x90, 0, 0}, {0x8455, 0x0e, 0, 0},
+ {0x8456, 0x8e, 0, 0}, {0x8457, 0x12, 0, 0}, {0x8458, 0x0c, 0, 0},
+ {0x8459, 0x38, 0, 0}, {0x845a, 0x78, 0, 0}, {0x845b, 0x80, 0, 0},
+ {0x845c, 0x12, 0, 0}, {0x845d, 0x0c, 0, 0}, {0x845e, 0x6b, 0, 0},
+ {0x845f, 0x7b, 0, 0}, {0x8460, 0x04, 0, 0}, {0x8461, 0x12, 0, 0},
+ {0x8462, 0x0c, 0, 0}, {0x8463, 0x1d, 0, 0}, {0x8464, 0xc3, 0, 0},
+ {0x8465, 0x12, 0, 0}, {0x8466, 0x06, 0, 0}, {0x8467, 0x45, 0, 0},
+ {0x8468, 0x50, 0, 0}, {0x8469, 0x56, 0, 0}, {0x846a, 0x90, 0, 0},
+ {0x846b, 0x0e, 0, 0}, {0x846c, 0x92, 0, 0}, {0x846d, 0xe4, 0, 0},
+ {0x846e, 0x93, 0, 0}, {0x846f, 0xff, 0, 0}, {0x8470, 0x78, 0, 0},
+ {0x8471, 0x8f, 0, 0}, {0x8472, 0xe6, 0, 0}, {0x8473, 0x9f, 0, 0},
+ {0x8474, 0x40, 0, 0}, {0x8475, 0x02, 0, 0}, {0x8476, 0x80, 0, 0},
+ {0x8477, 0x11, 0, 0}, {0x8478, 0x90, 0, 0}, {0x8479, 0x0e, 0, 0},
+ {0x847a, 0x90, 0, 0}, {0x847b, 0xe4, 0, 0}, {0x847c, 0x93, 0, 0},
+ {0x847d, 0xff, 0, 0}, {0x847e, 0xd3, 0, 0}, {0x847f, 0x78, 0, 0},
+ {0x8480, 0x89, 0, 0}, {0x8481, 0xe6, 0, 0}, {0x8482, 0x9f, 0, 0},
+ {0x8483, 0x18, 0, 0}, {0x8484, 0xe6, 0, 0}, {0x8485, 0x94, 0, 0},
+ {0x8486, 0x00, 0, 0}, {0x8487, 0x40, 0, 0}, {0x8488, 0x03, 0, 0},
+ {0x8489, 0x75, 0, 0}, {0x848a, 0x1f, 0, 0}, {0x848b, 0x05, 0, 0},
+ {0x848c, 0x12, 0, 0}, {0x848d, 0x0c, 0, 0}, {0x848e, 0x4a, 0, 0},
+ {0x848f, 0x12, 0, 0}, {0x8490, 0x0c, 0, 0}, {0x8491, 0x2f, 0, 0},
+ {0x8492, 0x90, 0, 0}, {0x8493, 0x0e, 0, 0}, {0x8494, 0x8f, 0, 0},
+ {0x8495, 0x12, 0, 0}, {0x8496, 0x0c, 0, 0}, {0x8497, 0x38, 0, 0},
+ {0x8498, 0x78, 0, 0}, {0x8499, 0x7e, 0, 0}, {0x849a, 0x12, 0, 0},
+ {0x849b, 0x0c, 0, 0}, {0x849c, 0x6b, 0, 0}, {0x849d, 0x7b, 0, 0},
+ {0x849e, 0x40, 0, 0}, {0x849f, 0x12, 0, 0}, {0x84a0, 0x0c, 0, 0},
+ {0x84a1, 0x1d, 0, 0}, {0x84a2, 0xd3, 0, 0}, {0x84a3, 0x12, 0, 0},
+ {0x84a4, 0x06, 0, 0}, {0x84a5, 0x45, 0, 0}, {0x84a6, 0x40, 0, 0},
+ {0x84a7, 0x18, 0, 0}, {0x84a8, 0x75, 0, 0}, {0x84a9, 0x1f, 0, 0},
+ {0x84aa, 0x05, 0, 0}, {0x84ab, 0x22, 0, 0}, {0x84ac, 0xe5, 0, 0},
+ {0x84ad, 0x1f, 0, 0}, {0x84ae, 0xb4, 0, 0}, {0x84af, 0x05, 0, 0},
+ {0x84b0, 0x0f, 0, 0}, {0x84b1, 0xd2, 0, 0}, {0x84b2, 0x01, 0, 0},
+ {0x84b3, 0xc2, 0, 0}, {0x84b4, 0x02, 0, 0}, {0x84b5, 0xe4, 0, 0},
+ {0x84b6, 0xf5, 0, 0}, {0x84b7, 0x1f, 0, 0}, {0x84b8, 0xf5, 0, 0},
+ {0x84b9, 0x1e, 0, 0}, {0x84ba, 0xd2, 0, 0}, {0x84bb, 0x35, 0, 0},
+ {0x84bc, 0xd2, 0, 0}, {0x84bd, 0x33, 0, 0}, {0x84be, 0xd2, 0, 0},
+ {0x84bf, 0x36, 0, 0}, {0x84c0, 0x22, 0, 0}, {0x84c1, 0xef, 0, 0},
+ {0x84c2, 0x8d, 0, 0}, {0x84c3, 0xf0, 0, 0}, {0x84c4, 0xa4, 0, 0},
+ {0x84c5, 0xa8, 0, 0}, {0x84c6, 0xf0, 0, 0}, {0x84c7, 0xcf, 0, 0},
+ {0x84c8, 0x8c, 0, 0}, {0x84c9, 0xf0, 0, 0}, {0x84ca, 0xa4, 0, 0},
+ {0x84cb, 0x28, 0, 0}, {0x84cc, 0xce, 0, 0}, {0x84cd, 0x8d, 0, 0},
+ {0x84ce, 0xf0, 0, 0}, {0x84cf, 0xa4, 0, 0}, {0x84d0, 0x2e, 0, 0},
+ {0x84d1, 0xfe, 0, 0}, {0x84d2, 0x22, 0, 0}, {0x84d3, 0xbc, 0, 0},
+ {0x84d4, 0x00, 0, 0}, {0x84d5, 0x0b, 0, 0}, {0x84d6, 0xbe, 0, 0},
+ {0x84d7, 0x00, 0, 0}, {0x84d8, 0x29, 0, 0}, {0x84d9, 0xef, 0, 0},
+ {0x84da, 0x8d, 0, 0}, {0x84db, 0xf0, 0, 0}, {0x84dc, 0x84, 0, 0},
+ {0x84dd, 0xff, 0, 0}, {0x84de, 0xad, 0, 0}, {0x84df, 0xf0, 0, 0},
+ {0x84e0, 0x22, 0, 0}, {0x84e1, 0xe4, 0, 0}, {0x84e2, 0xcc, 0, 0},
+ {0x84e3, 0xf8, 0, 0}, {0x84e4, 0x75, 0, 0}, {0x84e5, 0xf0, 0, 0},
+ {0x84e6, 0x08, 0, 0}, {0x84e7, 0xef, 0, 0}, {0x84e8, 0x2f, 0, 0},
+ {0x84e9, 0xff, 0, 0}, {0x84ea, 0xee, 0, 0}, {0x84eb, 0x33, 0, 0},
+ {0x84ec, 0xfe, 0, 0}, {0x84ed, 0xec, 0, 0}, {0x84ee, 0x33, 0, 0},
+ {0x84ef, 0xfc, 0, 0}, {0x84f0, 0xee, 0, 0}, {0x84f1, 0x9d, 0, 0},
+ {0x84f2, 0xec, 0, 0}, {0x84f3, 0x98, 0, 0}, {0x84f4, 0x40, 0, 0},
+ {0x84f5, 0x05, 0, 0}, {0x84f6, 0xfc, 0, 0}, {0x84f7, 0xee, 0, 0},
+ {0x84f8, 0x9d, 0, 0}, {0x84f9, 0xfe, 0, 0}, {0x84fa, 0x0f, 0, 0},
+ {0x84fb, 0xd5, 0, 0}, {0x84fc, 0xf0, 0, 0}, {0x84fd, 0xe9, 0, 0},
+ {0x84fe, 0xe4, 0, 0}, {0x84ff, 0xce, 0, 0}, {0x8500, 0xfd, 0, 0},
+ {0x8501, 0x22, 0, 0}, {0x8502, 0xed, 0, 0}, {0x8503, 0xf8, 0, 0},
+ {0x8504, 0xf5, 0, 0}, {0x8505, 0xf0, 0, 0}, {0x8506, 0xee, 0, 0},
+ {0x8507, 0x84, 0, 0}, {0x8508, 0x20, 0, 0}, {0x8509, 0xd2, 0, 0},
+ {0x850a, 0x1c, 0, 0}, {0x850b, 0xfe, 0, 0}, {0x850c, 0xad, 0, 0},
+ {0x850d, 0xf0, 0, 0}, {0x850e, 0x75, 0, 0}, {0x850f, 0xf0, 0, 0},
+ {0x8510, 0x08, 0, 0}, {0x8511, 0xef, 0, 0}, {0x8512, 0x2f, 0, 0},
+ {0x8513, 0xff, 0, 0}, {0x8514, 0xed, 0, 0}, {0x8515, 0x33, 0, 0},
+ {0x8516, 0xfd, 0, 0}, {0x8517, 0x40, 0, 0}, {0x8518, 0x07, 0, 0},
+ {0x8519, 0x98, 0, 0}, {0x851a, 0x50, 0, 0}, {0x851b, 0x06, 0, 0},
+ {0x851c, 0xd5, 0, 0}, {0x851d, 0xf0, 0, 0}, {0x851e, 0xf2, 0, 0},
+ {0x851f, 0x22, 0, 0}, {0x8520, 0xc3, 0, 0}, {0x8521, 0x98, 0, 0},
+ {0x8522, 0xfd, 0, 0}, {0x8523, 0x0f, 0, 0}, {0x8524, 0xd5, 0, 0},
+ {0x8525, 0xf0, 0, 0}, {0x8526, 0xea, 0, 0}, {0x8527, 0x22, 0, 0},
+ {0x8528, 0xe8, 0, 0}, {0x8529, 0x8f, 0, 0}, {0x852a, 0xf0, 0, 0},
+ {0x852b, 0xa4, 0, 0}, {0x852c, 0xcc, 0, 0}, {0x852d, 0x8b, 0, 0},
+ {0x852e, 0xf0, 0, 0}, {0x852f, 0xa4, 0, 0}, {0x8530, 0x2c, 0, 0},
+ {0x8531, 0xfc, 0, 0}, {0x8532, 0xe9, 0, 0}, {0x8533, 0x8e, 0, 0},
+ {0x8534, 0xf0, 0, 0}, {0x8535, 0xa4, 0, 0}, {0x8536, 0x2c, 0, 0},
+ {0x8537, 0xfc, 0, 0}, {0x8538, 0x8a, 0, 0}, {0x8539, 0xf0, 0, 0},
+ {0x853a, 0xed, 0, 0}, {0x853b, 0xa4, 0, 0}, {0x853c, 0x2c, 0, 0},
+ {0x853d, 0xfc, 0, 0}, {0x853e, 0xea, 0, 0}, {0x853f, 0x8e, 0, 0},
+ {0x8540, 0xf0, 0, 0}, {0x8541, 0xa4, 0, 0}, {0x8542, 0xcd, 0, 0},
+ {0x8543, 0xa8, 0, 0}, {0x8544, 0xf0, 0, 0}, {0x8545, 0x8b, 0, 0},
+ {0x8546, 0xf0, 0, 0}, {0x8547, 0xa4, 0, 0}, {0x8548, 0x2d, 0, 0},
+ {0x8549, 0xcc, 0, 0}, {0x854a, 0x38, 0, 0}, {0x854b, 0x25, 0, 0},
+ {0x854c, 0xf0, 0, 0}, {0x854d, 0xfd, 0, 0}, {0x854e, 0xe9, 0, 0},
+ {0x854f, 0x8f, 0, 0}, {0x8550, 0xf0, 0, 0}, {0x8551, 0xa4, 0, 0},
+ {0x8552, 0x2c, 0, 0}, {0x8553, 0xcd, 0, 0}, {0x8554, 0x35, 0, 0},
+ {0x8555, 0xf0, 0, 0}, {0x8556, 0xfc, 0, 0}, {0x8557, 0xeb, 0, 0},
+ {0x8558, 0x8e, 0, 0}, {0x8559, 0xf0, 0, 0}, {0x855a, 0xa4, 0, 0},
+ {0x855b, 0xfe, 0, 0}, {0x855c, 0xa9, 0, 0}, {0x855d, 0xf0, 0, 0},
+ {0x855e, 0xeb, 0, 0}, {0x855f, 0x8f, 0, 0}, {0x8560, 0xf0, 0, 0},
+ {0x8561, 0xa4, 0, 0}, {0x8562, 0xcf, 0, 0}, {0x8563, 0xc5, 0, 0},
+ {0x8564, 0xf0, 0, 0}, {0x8565, 0x2e, 0, 0}, {0x8566, 0xcd, 0, 0},
+ {0x8567, 0x39, 0, 0}, {0x8568, 0xfe, 0, 0}, {0x8569, 0xe4, 0, 0},
+ {0x856a, 0x3c, 0, 0}, {0x856b, 0xfc, 0, 0}, {0x856c, 0xea, 0, 0},
+ {0x856d, 0xa4, 0, 0}, {0x856e, 0x2d, 0, 0}, {0x856f, 0xce, 0, 0},
+ {0x8570, 0x35, 0, 0}, {0x8571, 0xf0, 0, 0}, {0x8572, 0xfd, 0, 0},
+ {0x8573, 0xe4, 0, 0}, {0x8574, 0x3c, 0, 0}, {0x8575, 0xfc, 0, 0},
+ {0x8576, 0x22, 0, 0}, {0x8577, 0x75, 0, 0}, {0x8578, 0xf0, 0, 0},
+ {0x8579, 0x08, 0, 0}, {0x857a, 0x75, 0, 0}, {0x857b, 0x82, 0, 0},
+ {0x857c, 0x00, 0, 0}, {0x857d, 0xef, 0, 0}, {0x857e, 0x2f, 0, 0},
+ {0x857f, 0xff, 0, 0}, {0x8580, 0xee, 0, 0}, {0x8581, 0x33, 0, 0},
+ {0x8582, 0xfe, 0, 0}, {0x8583, 0xcd, 0, 0}, {0x8584, 0x33, 0, 0},
+ {0x8585, 0xcd, 0, 0}, {0x8586, 0xcc, 0, 0}, {0x8587, 0x33, 0, 0},
+ {0x8588, 0xcc, 0, 0}, {0x8589, 0xc5, 0, 0}, {0x858a, 0x82, 0, 0},
+ {0x858b, 0x33, 0, 0}, {0x858c, 0xc5, 0, 0}, {0x858d, 0x82, 0, 0},
+ {0x858e, 0x9b, 0, 0}, {0x858f, 0xed, 0, 0}, {0x8590, 0x9a, 0, 0},
+ {0x8591, 0xec, 0, 0}, {0x8592, 0x99, 0, 0}, {0x8593, 0xe5, 0, 0},
+ {0x8594, 0x82, 0, 0}, {0x8595, 0x98, 0, 0}, {0x8596, 0x40, 0, 0},
+ {0x8597, 0x0c, 0, 0}, {0x8598, 0xf5, 0, 0}, {0x8599, 0x82, 0, 0},
+ {0x859a, 0xee, 0, 0}, {0x859b, 0x9b, 0, 0}, {0x859c, 0xfe, 0, 0},
+ {0x859d, 0xed, 0, 0}, {0x859e, 0x9a, 0, 0}, {0x859f, 0xfd, 0, 0},
+ {0x85a0, 0xec, 0, 0}, {0x85a1, 0x99, 0, 0}, {0x85a2, 0xfc, 0, 0},
+ {0x85a3, 0x0f, 0, 0}, {0x85a4, 0xd5, 0, 0}, {0x85a5, 0xf0, 0, 0},
+ {0x85a6, 0xd6, 0, 0}, {0x85a7, 0xe4, 0, 0}, {0x85a8, 0xce, 0, 0},
+ {0x85a9, 0xfb, 0, 0}, {0x85aa, 0xe4, 0, 0}, {0x85ab, 0xcd, 0, 0},
+ {0x85ac, 0xfa, 0, 0}, {0x85ad, 0xe4, 0, 0}, {0x85ae, 0xcc, 0, 0},
+ {0x85af, 0xf9, 0, 0}, {0x85b0, 0xa8, 0, 0}, {0x85b1, 0x82, 0, 0},
+ {0x85b2, 0x22, 0, 0}, {0x85b3, 0xb8, 0, 0}, {0x85b4, 0x00, 0, 0},
+ {0x85b5, 0xc1, 0, 0}, {0x85b6, 0xb9, 0, 0}, {0x85b7, 0x00, 0, 0},
+ {0x85b8, 0x59, 0, 0}, {0x85b9, 0xba, 0, 0}, {0x85ba, 0x00, 0, 0},
+ {0x85bb, 0x2d, 0, 0}, {0x85bc, 0xec, 0, 0}, {0x85bd, 0x8b, 0, 0},
+ {0x85be, 0xf0, 0, 0}, {0x85bf, 0x84, 0, 0}, {0x85c0, 0xcf, 0, 0},
+ {0x85c1, 0xce, 0, 0}, {0x85c2, 0xcd, 0, 0}, {0x85c3, 0xfc, 0, 0},
+ {0x85c4, 0xe5, 0, 0}, {0x85c5, 0xf0, 0, 0}, {0x85c6, 0xcb, 0, 0},
+ {0x85c7, 0xf9, 0, 0}, {0x85c8, 0x78, 0, 0}, {0x85c9, 0x18, 0, 0},
+ {0x85ca, 0xef, 0, 0}, {0x85cb, 0x2f, 0, 0}, {0x85cc, 0xff, 0, 0},
+ {0x85cd, 0xee, 0, 0}, {0x85ce, 0x33, 0, 0}, {0x85cf, 0xfe, 0, 0},
+ {0x85d0, 0xed, 0, 0}, {0x85d1, 0x33, 0, 0}, {0x85d2, 0xfd, 0, 0},
+ {0x85d3, 0xec, 0, 0}, {0x85d4, 0x33, 0, 0}, {0x85d5, 0xfc, 0, 0},
+ {0x85d6, 0xeb, 0, 0}, {0x85d7, 0x33, 0, 0}, {0x85d8, 0xfb, 0, 0},
+ {0x85d9, 0x10, 0, 0}, {0x85da, 0xd7, 0, 0}, {0x85db, 0x03, 0, 0},
+ {0x85dc, 0x99, 0, 0}, {0x85dd, 0x40, 0, 0}, {0x85de, 0x04, 0, 0},
+ {0x85df, 0xeb, 0, 0}, {0x85e0, 0x99, 0, 0}, {0x85e1, 0xfb, 0, 0},
+ {0x85e2, 0x0f, 0, 0}, {0x85e3, 0xd8, 0, 0}, {0x85e4, 0xe5, 0, 0},
+ {0x85e5, 0xe4, 0, 0}, {0x85e6, 0xf9, 0, 0}, {0x85e7, 0xfa, 0, 0},
+ {0x85e8, 0x22, 0, 0}, {0x85e9, 0x78, 0, 0}, {0x85ea, 0x18, 0, 0},
+ {0x85eb, 0xef, 0, 0}, {0x85ec, 0x2f, 0, 0}, {0x85ed, 0xff, 0, 0},
+ {0x85ee, 0xee, 0, 0}, {0x85ef, 0x33, 0, 0}, {0x85f0, 0xfe, 0, 0},
+ {0x85f1, 0xed, 0, 0}, {0x85f2, 0x33, 0, 0}, {0x85f3, 0xfd, 0, 0},
+ {0x85f4, 0xec, 0, 0}, {0x85f5, 0x33, 0, 0}, {0x85f6, 0xfc, 0, 0},
+ {0x85f7, 0xc9, 0, 0}, {0x85f8, 0x33, 0, 0}, {0x85f9, 0xc9, 0, 0},
+ {0x85fa, 0x10, 0, 0}, {0x85fb, 0xd7, 0, 0}, {0x85fc, 0x05, 0, 0},
+ {0x85fd, 0x9b, 0, 0}, {0x85fe, 0xe9, 0, 0}, {0x85ff, 0x9a, 0, 0},
+ {0x8600, 0x40, 0, 0}, {0x8601, 0x07, 0, 0}, {0x8602, 0xec, 0, 0},
+ {0x8603, 0x9b, 0, 0}, {0x8604, 0xfc, 0, 0}, {0x8605, 0xe9, 0, 0},
+ {0x8606, 0x9a, 0, 0}, {0x8607, 0xf9, 0, 0}, {0x8608, 0x0f, 0, 0},
+ {0x8609, 0xd8, 0, 0}, {0x860a, 0xe0, 0, 0}, {0x860b, 0xe4, 0, 0},
+ {0x860c, 0xc9, 0, 0}, {0x860d, 0xfa, 0, 0}, {0x860e, 0xe4, 0, 0},
+ {0x860f, 0xcc, 0, 0}, {0x8610, 0xfb, 0, 0}, {0x8611, 0x22, 0, 0},
+ {0x8612, 0x75, 0, 0}, {0x8613, 0xf0, 0, 0}, {0x8614, 0x10, 0, 0},
+ {0x8615, 0xef, 0, 0}, {0x8616, 0x2f, 0, 0}, {0x8617, 0xff, 0, 0},
+ {0x8618, 0xee, 0, 0}, {0x8619, 0x33, 0, 0}, {0x861a, 0xfe, 0, 0},
+ {0x861b, 0xed, 0, 0}, {0x861c, 0x33, 0, 0}, {0x861d, 0xfd, 0, 0},
+ {0x861e, 0xcc, 0, 0}, {0x861f, 0x33, 0, 0}, {0x8620, 0xcc, 0, 0},
+ {0x8621, 0xc8, 0, 0}, {0x8622, 0x33, 0, 0}, {0x8623, 0xc8, 0, 0},
+ {0x8624, 0x10, 0, 0}, {0x8625, 0xd7, 0, 0}, {0x8626, 0x07, 0, 0},
+ {0x8627, 0x9b, 0, 0}, {0x8628, 0xec, 0, 0}, {0x8629, 0x9a, 0, 0},
+ {0x862a, 0xe8, 0, 0}, {0x862b, 0x99, 0, 0}, {0x862c, 0x40, 0, 0},
+ {0x862d, 0x0a, 0, 0}, {0x862e, 0xed, 0, 0}, {0x862f, 0x9b, 0, 0},
+ {0x8630, 0xfd, 0, 0}, {0x8631, 0xec, 0, 0}, {0x8632, 0x9a, 0, 0},
+ {0x8633, 0xfc, 0, 0}, {0x8634, 0xe8, 0, 0}, {0x8635, 0x99, 0, 0},
+ {0x8636, 0xf8, 0, 0}, {0x8637, 0x0f, 0, 0}, {0x8638, 0xd5, 0, 0},
+ {0x8639, 0xf0, 0, 0}, {0x863a, 0xda, 0, 0}, {0x863b, 0xe4, 0, 0},
+ {0x863c, 0xcd, 0, 0}, {0x863d, 0xfb, 0, 0}, {0x863e, 0xe4, 0, 0},
+ {0x863f, 0xcc, 0, 0}, {0x8640, 0xfa, 0, 0}, {0x8641, 0xe4, 0, 0},
+ {0x8642, 0xc8, 0, 0}, {0x8643, 0xf9, 0, 0}, {0x8644, 0x22, 0, 0},
+ {0x8645, 0xeb, 0, 0}, {0x8646, 0x9f, 0, 0}, {0x8647, 0xf5, 0, 0},
+ {0x8648, 0xf0, 0, 0}, {0x8649, 0xea, 0, 0}, {0x864a, 0x9e, 0, 0},
+ {0x864b, 0x42, 0, 0}, {0x864c, 0xf0, 0, 0}, {0x864d, 0xe9, 0, 0},
+ {0x864e, 0x9d, 0, 0}, {0x864f, 0x42, 0, 0}, {0x8650, 0xf0, 0, 0},
+ {0x8651, 0xe8, 0, 0}, {0x8652, 0x9c, 0, 0}, {0x8653, 0x45, 0, 0},
+ {0x8654, 0xf0, 0, 0}, {0x8655, 0x22, 0, 0}, {0x8656, 0xe8, 0, 0},
+ {0x8657, 0x60, 0, 0}, {0x8658, 0x0f, 0, 0}, {0x8659, 0xec, 0, 0},
+ {0x865a, 0xc3, 0, 0}, {0x865b, 0x13, 0, 0}, {0x865c, 0xfc, 0, 0},
+ {0x865d, 0xed, 0, 0}, {0x865e, 0x13, 0, 0}, {0x865f, 0xfd, 0, 0},
+ {0x8660, 0xee, 0, 0}, {0x8661, 0x13, 0, 0}, {0x8662, 0xfe, 0, 0},
+ {0x8663, 0xef, 0, 0}, {0x8664, 0x13, 0, 0}, {0x8665, 0xff, 0, 0},
+ {0x8666, 0xd8, 0, 0}, {0x8667, 0xf1, 0, 0}, {0x8668, 0x22, 0, 0},
+ {0x8669, 0xe8, 0, 0}, {0x866a, 0x60, 0, 0}, {0x866b, 0x0f, 0, 0},
+ {0x866c, 0xef, 0, 0}, {0x866d, 0xc3, 0, 0}, {0x866e, 0x33, 0, 0},
+ {0x866f, 0xff, 0, 0}, {0x8670, 0xee, 0, 0}, {0x8671, 0x33, 0, 0},
+ {0x8672, 0xfe, 0, 0}, {0x8673, 0xed, 0, 0}, {0x8674, 0x33, 0, 0},
+ {0x8675, 0xfd, 0, 0}, {0x8676, 0xec, 0, 0}, {0x8677, 0x33, 0, 0},
+ {0x8678, 0xfc, 0, 0}, {0x8679, 0xd8, 0, 0}, {0x867a, 0xf1, 0, 0},
+ {0x867b, 0x22, 0, 0}, {0x867c, 0xe4, 0, 0}, {0x867d, 0x93, 0, 0},
+ {0x867e, 0xfc, 0, 0}, {0x867f, 0x74, 0, 0}, {0x8680, 0x01, 0, 0},
+ {0x8681, 0x93, 0, 0}, {0x8682, 0xfd, 0, 0}, {0x8683, 0x74, 0, 0},
+ {0x8684, 0x02, 0, 0}, {0x8685, 0x93, 0, 0}, {0x8686, 0xfe, 0, 0},
+ {0x8687, 0x74, 0, 0}, {0x8688, 0x03, 0, 0}, {0x8689, 0x93, 0, 0},
+ {0x868a, 0xff, 0, 0}, {0x868b, 0x22, 0, 0}, {0x868c, 0xe6, 0, 0},
+ {0x868d, 0xfb, 0, 0}, {0x868e, 0x08, 0, 0}, {0x868f, 0xe6, 0, 0},
+ {0x8690, 0xf9, 0, 0}, {0x8691, 0x08, 0, 0}, {0x8692, 0xe6, 0, 0},
+ {0x8693, 0xfa, 0, 0}, {0x8694, 0x08, 0, 0}, {0x8695, 0xe6, 0, 0},
+ {0x8696, 0xcb, 0, 0}, {0x8697, 0xf8, 0, 0}, {0x8698, 0x22, 0, 0},
+ {0x8699, 0xec, 0, 0}, {0x869a, 0xf6, 0, 0}, {0x869b, 0x08, 0, 0},
+ {0x869c, 0xed, 0, 0}, {0x869d, 0xf6, 0, 0}, {0x869e, 0x08, 0, 0},
+ {0x869f, 0xee, 0, 0}, {0x86a0, 0xf6, 0, 0}, {0x86a1, 0x08, 0, 0},
+ {0x86a2, 0xef, 0, 0}, {0x86a3, 0xf6, 0, 0}, {0x86a4, 0x22, 0, 0},
+ {0x86a5, 0xa4, 0, 0}, {0x86a6, 0x25, 0, 0}, {0x86a7, 0x82, 0, 0},
+ {0x86a8, 0xf5, 0, 0}, {0x86a9, 0x82, 0, 0}, {0x86aa, 0xe5, 0, 0},
+ {0x86ab, 0xf0, 0, 0}, {0x86ac, 0x35, 0, 0}, {0x86ad, 0x83, 0, 0},
+ {0x86ae, 0xf5, 0, 0}, {0x86af, 0x83, 0, 0}, {0x86b0, 0x22, 0, 0},
+ {0x86b1, 0xd0, 0, 0}, {0x86b2, 0x83, 0, 0}, {0x86b3, 0xd0, 0, 0},
+ {0x86b4, 0x82, 0, 0}, {0x86b5, 0xf8, 0, 0}, {0x86b6, 0xe4, 0, 0},
+ {0x86b7, 0x93, 0, 0}, {0x86b8, 0x70, 0, 0}, {0x86b9, 0x12, 0, 0},
+ {0x86ba, 0x74, 0, 0}, {0x86bb, 0x01, 0, 0}, {0x86bc, 0x93, 0, 0},
+ {0x86bd, 0x70, 0, 0}, {0x86be, 0x0d, 0, 0}, {0x86bf, 0xa3, 0, 0},
+ {0x86c0, 0xa3, 0, 0}, {0x86c1, 0x93, 0, 0}, {0x86c2, 0xf8, 0, 0},
+ {0x86c3, 0x74, 0, 0}, {0x86c4, 0x01, 0, 0}, {0x86c5, 0x93, 0, 0},
+ {0x86c6, 0xf5, 0, 0}, {0x86c7, 0x82, 0, 0}, {0x86c8, 0x88, 0, 0},
+ {0x86c9, 0x83, 0, 0}, {0x86ca, 0xe4, 0, 0}, {0x86cb, 0x73, 0, 0},
+ {0x86cc, 0x74, 0, 0}, {0x86cd, 0x02, 0, 0}, {0x86ce, 0x93, 0, 0},
+ {0x86cf, 0x68, 0, 0}, {0x86d0, 0x60, 0, 0}, {0x86d1, 0xef, 0, 0},
+ {0x86d2, 0xa3, 0, 0}, {0x86d3, 0xa3, 0, 0}, {0x86d4, 0xa3, 0, 0},
+ {0x86d5, 0x80, 0, 0}, {0x86d6, 0xdf, 0, 0}, {0x86d7, 0x90, 0, 0},
+ {0x86d8, 0x38, 0, 0}, {0x86d9, 0x04, 0, 0}, {0x86da, 0x78, 0, 0},
+ {0x86db, 0x52, 0, 0}, {0x86dc, 0x12, 0, 0}, {0x86dd, 0x0b, 0, 0},
+ {0x86de, 0xfd, 0, 0}, {0x86df, 0x90, 0, 0}, {0x86e0, 0x38, 0, 0},
+ {0x86e1, 0x00, 0, 0}, {0x86e2, 0xe0, 0, 0}, {0x86e3, 0xfe, 0, 0},
+ {0x86e4, 0xa3, 0, 0}, {0x86e5, 0xe0, 0, 0}, {0x86e6, 0xfd, 0, 0},
+ {0x86e7, 0xed, 0, 0}, {0x86e8, 0xff, 0, 0}, {0x86e9, 0xc3, 0, 0},
+ {0x86ea, 0x12, 0, 0}, {0x86eb, 0x0b, 0, 0}, {0x86ec, 0x9e, 0, 0},
+ {0x86ed, 0x90, 0, 0}, {0x86ee, 0x38, 0, 0}, {0x86ef, 0x10, 0, 0},
+ {0x86f0, 0x12, 0, 0}, {0x86f1, 0x0b, 0, 0}, {0x86f2, 0x92, 0, 0},
+ {0x86f3, 0x90, 0, 0}, {0x86f4, 0x38, 0, 0}, {0x86f5, 0x06, 0, 0},
+ {0x86f6, 0x78, 0, 0}, {0x86f7, 0x54, 0, 0}, {0x86f8, 0x12, 0, 0},
+ {0x86f9, 0x0b, 0, 0}, {0x86fa, 0xfd, 0, 0}, {0x86fb, 0x90, 0, 0},
+ {0x86fc, 0x38, 0, 0}, {0x86fd, 0x02, 0, 0}, {0x86fe, 0xe0, 0, 0},
+ {0x86ff, 0xfe, 0, 0}, {0x8700, 0xa3, 0, 0}, {0x8701, 0xe0, 0, 0},
+ {0x8702, 0xfd, 0, 0}, {0x8703, 0xed, 0, 0}, {0x8704, 0xff, 0, 0},
+ {0x8705, 0xc3, 0, 0}, {0x8706, 0x12, 0, 0}, {0x8707, 0x0b, 0, 0},
+ {0x8708, 0x9e, 0, 0}, {0x8709, 0x90, 0, 0}, {0x870a, 0x38, 0, 0},
+ {0x870b, 0x12, 0, 0}, {0x870c, 0x12, 0, 0}, {0x870d, 0x0b, 0, 0},
+ {0x870e, 0x92, 0, 0}, {0x870f, 0xa3, 0, 0}, {0x8710, 0xe0, 0, 0},
+ {0x8711, 0xb4, 0, 0}, {0x8712, 0x31, 0, 0}, {0x8713, 0x07, 0, 0},
+ {0x8714, 0x78, 0, 0}, {0x8715, 0x52, 0, 0}, {0x8716, 0x79, 0, 0},
+ {0x8717, 0x52, 0, 0}, {0x8718, 0x12, 0, 0}, {0x8719, 0x0c, 0, 0},
+ {0x871a, 0x13, 0, 0}, {0x871b, 0x90, 0, 0}, {0x871c, 0x38, 0, 0},
+ {0x871d, 0x14, 0, 0}, {0x871e, 0xe0, 0, 0}, {0x871f, 0xb4, 0, 0},
+ {0x8720, 0x71, 0, 0}, {0x8721, 0x15, 0, 0}, {0x8722, 0x78, 0, 0},
+ {0x8723, 0x52, 0, 0}, {0x8724, 0xe6, 0, 0}, {0x8725, 0xfe, 0, 0},
+ {0x8726, 0x08, 0, 0}, {0x8727, 0xe6, 0, 0}, {0x8728, 0x78, 0, 0},
+ {0x8729, 0x02, 0, 0}, {0x872a, 0xce, 0, 0}, {0x872b, 0xc3, 0, 0},
+ {0x872c, 0x13, 0, 0}, {0x872d, 0xce, 0, 0}, {0x872e, 0x13, 0, 0},
+ {0x872f, 0xd8, 0, 0}, {0x8730, 0xf9, 0, 0}, {0x8731, 0x79, 0, 0},
+ {0x8732, 0x53, 0, 0}, {0x8733, 0xf7, 0, 0}, {0x8734, 0xee, 0, 0},
+ {0x8735, 0x19, 0, 0}, {0x8736, 0xf7, 0, 0}, {0x8737, 0x90, 0, 0},
+ {0x8738, 0x38, 0, 0}, {0x8739, 0x15, 0, 0}, {0x873a, 0xe0, 0, 0},
+ {0x873b, 0xb4, 0, 0}, {0x873c, 0x31, 0, 0}, {0x873d, 0x07, 0, 0},
+ {0x873e, 0x78, 0, 0}, {0x873f, 0x54, 0, 0}, {0x8740, 0x79, 0, 0},
+ {0x8741, 0x54, 0, 0}, {0x8742, 0x12, 0, 0}, {0x8743, 0x0c, 0, 0},
+ {0x8744, 0x13, 0, 0}, {0x8745, 0x90, 0, 0}, {0x8746, 0x38, 0, 0},
+ {0x8747, 0x15, 0, 0}, {0x8748, 0xe0, 0, 0}, {0x8749, 0xb4, 0, 0},
+ {0x874a, 0x71, 0, 0}, {0x874b, 0x15, 0, 0}, {0x874c, 0x78, 0, 0},
+ {0x874d, 0x54, 0, 0}, {0x874e, 0xe6, 0, 0}, {0x874f, 0xfe, 0, 0},
+ {0x8750, 0x08, 0, 0}, {0x8751, 0xe6, 0, 0}, {0x8752, 0x78, 0, 0},
+ {0x8753, 0x02, 0, 0}, {0x8754, 0xce, 0, 0}, {0x8755, 0xc3, 0, 0},
+ {0x8756, 0x13, 0, 0}, {0x8757, 0xce, 0, 0}, {0x8758, 0x13, 0, 0},
+ {0x8759, 0xd8, 0, 0}, {0x875a, 0xf9, 0, 0}, {0x875b, 0x79, 0, 0},
+ {0x875c, 0x55, 0, 0}, {0x875d, 0xf7, 0, 0}, {0x875e, 0xee, 0, 0},
+ {0x875f, 0x19, 0, 0}, {0x8760, 0xf7, 0, 0}, {0x8761, 0x79, 0, 0},
+ {0x8762, 0x52, 0, 0}, {0x8763, 0x12, 0, 0}, {0x8764, 0x0b, 0, 0},
+ {0x8765, 0xd9, 0, 0}, {0x8766, 0x09, 0, 0}, {0x8767, 0x12, 0, 0},
+ {0x8768, 0x0b, 0, 0}, {0x8769, 0xd9, 0, 0}, {0x876a, 0xaf, 0, 0},
+ {0x876b, 0x47, 0, 0}, {0x876c, 0x12, 0, 0}, {0x876d, 0x0b, 0, 0},
+ {0x876e, 0xb2, 0, 0}, {0x876f, 0xe5, 0, 0}, {0x8770, 0x44, 0, 0},
+ {0x8771, 0xfb, 0, 0}, {0x8772, 0x7a, 0, 0}, {0x8773, 0x00, 0, 0},
+ {0x8774, 0xfd, 0, 0}, {0x8775, 0x7c, 0, 0}, {0x8776, 0x00, 0, 0},
+ {0x8777, 0x12, 0, 0}, {0x8778, 0x04, 0, 0}, {0x8779, 0xd3, 0, 0},
+ {0x877a, 0x78, 0, 0}, {0x877b, 0x5a, 0, 0}, {0x877c, 0xa6, 0, 0},
+ {0x877d, 0x06, 0, 0}, {0x877e, 0x08, 0, 0}, {0x877f, 0xa6, 0, 0},
+ {0x8780, 0x07, 0, 0}, {0x8781, 0xaf, 0, 0}, {0x8782, 0x45, 0, 0},
+ {0x8783, 0x12, 0, 0}, {0x8784, 0x0b, 0, 0}, {0x8785, 0xb2, 0, 0},
+ {0x8786, 0xad, 0, 0}, {0x8787, 0x03, 0, 0}, {0x8788, 0x7c, 0, 0},
+ {0x8789, 0x00, 0, 0}, {0x878a, 0x12, 0, 0}, {0x878b, 0x04, 0, 0},
+ {0x878c, 0xd3, 0, 0}, {0x878d, 0x78, 0, 0}, {0x878e, 0x56, 0, 0},
+ {0x878f, 0xa6, 0, 0}, {0x8790, 0x06, 0, 0}, {0x8791, 0x08, 0, 0},
+ {0x8792, 0xa6, 0, 0}, {0x8793, 0x07, 0, 0}, {0x8794, 0xaf, 0, 0},
+ {0x8795, 0x48, 0, 0}, {0x8796, 0x78, 0, 0}, {0x8797, 0x54, 0, 0},
+ {0x8798, 0x12, 0, 0}, {0x8799, 0x0b, 0, 0}, {0x879a, 0xb4, 0, 0},
+ {0x879b, 0xe5, 0, 0}, {0x879c, 0x43, 0, 0}, {0x879d, 0xfb, 0, 0},
+ {0x879e, 0xfd, 0, 0}, {0x879f, 0x7c, 0, 0}, {0x87a0, 0x00, 0, 0},
+ {0x87a1, 0x12, 0, 0}, {0x87a2, 0x04, 0, 0}, {0x87a3, 0xd3, 0, 0},
+ {0x87a4, 0x78, 0, 0}, {0x87a5, 0x5c, 0, 0}, {0x87a6, 0xa6, 0, 0},
+ {0x87a7, 0x06, 0, 0}, {0x87a8, 0x08, 0, 0}, {0x87a9, 0xa6, 0, 0},
+ {0x87aa, 0x07, 0, 0}, {0x87ab, 0xaf, 0, 0}, {0x87ac, 0x46, 0, 0},
+ {0x87ad, 0x7e, 0, 0}, {0x87ae, 0x00, 0, 0}, {0x87af, 0x78, 0, 0},
+ {0x87b0, 0x54, 0, 0}, {0x87b1, 0x12, 0, 0}, {0x87b2, 0x0b, 0, 0},
+ {0x87b3, 0xb6, 0, 0}, {0x87b4, 0xad, 0, 0}, {0x87b5, 0x03, 0, 0},
+ {0x87b6, 0x7c, 0, 0}, {0x87b7, 0x00, 0, 0}, {0x87b8, 0x12, 0, 0},
+ {0x87b9, 0x04, 0, 0}, {0x87ba, 0xd3, 0, 0}, {0x87bb, 0x78, 0, 0},
+ {0x87bc, 0x58, 0, 0}, {0x87bd, 0xa6, 0, 0}, {0x87be, 0x06, 0, 0},
+ {0x87bf, 0x08, 0, 0}, {0x87c0, 0xa6, 0, 0}, {0x87c1, 0x07, 0, 0},
+ {0x87c2, 0xc3, 0, 0}, {0x87c3, 0x78, 0, 0}, {0x87c4, 0x5b, 0, 0},
+ {0x87c5, 0xe6, 0, 0}, {0x87c6, 0x94, 0, 0}, {0x87c7, 0x08, 0, 0},
+ {0x87c8, 0x18, 0, 0}, {0x87c9, 0xe6, 0, 0}, {0x87ca, 0x94, 0, 0},
+ {0x87cb, 0x00, 0, 0}, {0x87cc, 0x50, 0, 0}, {0x87cd, 0x05, 0, 0},
+ {0x87ce, 0x76, 0, 0}, {0x87cf, 0x00, 0, 0}, {0x87d0, 0x08, 0, 0},
+ {0x87d1, 0x76, 0, 0}, {0x87d2, 0x08, 0, 0}, {0x87d3, 0xc3, 0, 0},
+ {0x87d4, 0x78, 0, 0}, {0x87d5, 0x5d, 0, 0}, {0x87d6, 0xe6, 0, 0},
+ {0x87d7, 0x94, 0, 0}, {0x87d8, 0x08, 0, 0}, {0x87d9, 0x18, 0, 0},
+ {0x87da, 0xe6, 0, 0}, {0x87db, 0x94, 0, 0}, {0x87dc, 0x00, 0, 0},
+ {0x87dd, 0x50, 0, 0}, {0x87de, 0x05, 0, 0}, {0x87df, 0x76, 0, 0},
+ {0x87e0, 0x00, 0, 0}, {0x87e1, 0x08, 0, 0}, {0x87e2, 0x76, 0, 0},
+ {0x87e3, 0x08, 0, 0}, {0x87e4, 0x78, 0, 0}, {0x87e5, 0x5a, 0, 0},
+ {0x87e6, 0x12, 0, 0}, {0x87e7, 0x0b, 0, 0}, {0x87e8, 0xc6, 0, 0},
+ {0x87e9, 0xff, 0, 0}, {0x87ea, 0xd3, 0, 0}, {0x87eb, 0x78, 0, 0},
+ {0x87ec, 0x57, 0, 0}, {0x87ed, 0xe6, 0, 0}, {0x87ee, 0x9f, 0, 0},
+ {0x87ef, 0x18, 0, 0}, {0x87f0, 0xe6, 0, 0}, {0x87f1, 0x9e, 0, 0},
+ {0x87f2, 0x40, 0, 0}, {0x87f3, 0x0e, 0, 0}, {0x87f4, 0x78, 0, 0},
+ {0x87f5, 0x5a, 0, 0}, {0x87f6, 0xe6, 0, 0}, {0x87f7, 0x13, 0, 0},
+ {0x87f8, 0xfe, 0, 0}, {0x87f9, 0x08, 0, 0}, {0x87fa, 0xe6, 0, 0},
+ {0x87fb, 0x78, 0, 0}, {0x87fc, 0x57, 0, 0}, {0x87fd, 0x12, 0, 0},
+ {0x87fe, 0x0c, 0, 0}, {0x87ff, 0x08, 0, 0}, {0x8800, 0x80, 0, 0},
+ {0x8801, 0x04, 0, 0}, {0x8802, 0x7e, 0, 0}, {0x8803, 0x00, 0, 0},
+ {0x8804, 0x7f, 0, 0}, {0x8805, 0x00, 0, 0}, {0x8806, 0x78, 0, 0},
+ {0x8807, 0x5e, 0, 0}, {0x8808, 0x12, 0, 0}, {0x8809, 0x0b, 0, 0},
+ {0x880a, 0xbe, 0, 0}, {0x880b, 0xff, 0, 0}, {0x880c, 0xd3, 0, 0},
+ {0x880d, 0x78, 0, 0}, {0x880e, 0x59, 0, 0}, {0x880f, 0xe6, 0, 0},
+ {0x8810, 0x9f, 0, 0}, {0x8811, 0x18, 0, 0}, {0x8812, 0xe6, 0, 0},
+ {0x8813, 0x9e, 0, 0}, {0x8814, 0x40, 0, 0}, {0x8815, 0x0e, 0, 0},
+ {0x8816, 0x78, 0, 0}, {0x8817, 0x5c, 0, 0}, {0x8818, 0xe6, 0, 0},
+ {0x8819, 0x13, 0, 0}, {0x881a, 0xfe, 0, 0}, {0x881b, 0x08, 0, 0},
+ {0x881c, 0xe6, 0, 0}, {0x881d, 0x78, 0, 0}, {0x881e, 0x59, 0, 0},
+ {0x881f, 0x12, 0, 0}, {0x8820, 0x0c, 0, 0}, {0x8821, 0x08, 0, 0},
+ {0x8822, 0x80, 0, 0}, {0x8823, 0x04, 0, 0}, {0x8824, 0x7e, 0, 0},
+ {0x8825, 0x00, 0, 0}, {0x8826, 0x7f, 0, 0}, {0x8827, 0x00, 0, 0},
+ {0x8828, 0xe4, 0, 0}, {0x8829, 0xfc, 0, 0}, {0x882a, 0xfd, 0, 0},
+ {0x882b, 0x78, 0, 0}, {0x882c, 0x62, 0, 0}, {0x882d, 0x12, 0, 0},
+ {0x882e, 0x06, 0, 0}, {0x882f, 0x99, 0, 0}, {0x8830, 0x78, 0, 0},
+ {0x8831, 0x5a, 0, 0}, {0x8832, 0x12, 0, 0}, {0x8833, 0x0b, 0, 0},
+ {0x8834, 0xc6, 0, 0}, {0x8835, 0x78, 0, 0}, {0x8836, 0x57, 0, 0},
+ {0x8837, 0x26, 0, 0}, {0x8838, 0xff, 0, 0}, {0x8839, 0xee, 0, 0},
+ {0x883a, 0x18, 0, 0}, {0x883b, 0x36, 0, 0}, {0x883c, 0xfe, 0, 0},
+ {0x883d, 0x78, 0, 0}, {0x883e, 0x66, 0, 0}, {0x883f, 0x12, 0, 0},
+ {0x8840, 0x0b, 0, 0}, {0x8841, 0xbe, 0, 0}, {0x8842, 0x78, 0, 0},
+ {0x8843, 0x59, 0, 0}, {0x8844, 0x26, 0, 0}, {0x8845, 0xff, 0, 0},
+ {0x8846, 0xee, 0, 0}, {0x8847, 0x18, 0, 0}, {0x8848, 0x36, 0, 0},
+ {0x8849, 0xfe, 0, 0}, {0x884a, 0xe4, 0, 0}, {0x884b, 0xfc, 0, 0},
+ {0x884c, 0xfd, 0, 0}, {0x884d, 0x78, 0, 0}, {0x884e, 0x6a, 0, 0},
+ {0x884f, 0x12, 0, 0}, {0x8850, 0x06, 0, 0}, {0x8851, 0x99, 0, 0},
+ {0x8852, 0x12, 0, 0}, {0x8853, 0x0b, 0, 0}, {0x8854, 0xce, 0, 0},
+ {0x8855, 0x78, 0, 0}, {0x8856, 0x66, 0, 0}, {0x8857, 0x12, 0, 0},
+ {0x8858, 0x06, 0, 0}, {0x8859, 0x8c, 0, 0}, {0x885a, 0xd3, 0, 0},
+ {0x885b, 0x12, 0, 0}, {0x885c, 0x06, 0, 0}, {0x885d, 0x45, 0, 0},
+ {0x885e, 0x40, 0, 0}, {0x885f, 0x08, 0, 0}, {0x8860, 0x12, 0, 0},
+ {0x8861, 0x0b, 0, 0}, {0x8862, 0xce, 0, 0}, {0x8863, 0x78, 0, 0},
+ {0x8864, 0x66, 0, 0}, {0x8865, 0x12, 0, 0}, {0x8866, 0x06, 0, 0},
+ {0x8867, 0x99, 0, 0}, {0x8868, 0x78, 0, 0}, {0x8869, 0x54, 0, 0},
+ {0x886a, 0x12, 0, 0}, {0x886b, 0x0b, 0, 0}, {0x886c, 0xd0, 0, 0},
+ {0x886d, 0x78, 0, 0}, {0x886e, 0x6a, 0, 0}, {0x886f, 0x12, 0, 0},
+ {0x8870, 0x06, 0, 0}, {0x8871, 0x8c, 0, 0}, {0x8872, 0xd3, 0, 0},
+ {0x8873, 0x12, 0, 0}, {0x8874, 0x06, 0, 0}, {0x8875, 0x45, 0, 0},
+ {0x8876, 0x40, 0, 0}, {0x8877, 0x0a, 0, 0}, {0x8878, 0x78, 0, 0},
+ {0x8879, 0x54, 0, 0}, {0x887a, 0x12, 0, 0}, {0x887b, 0x0b, 0, 0},
+ {0x887c, 0xd0, 0, 0}, {0x887d, 0x78, 0, 0}, {0x887e, 0x6a, 0, 0},
+ {0x887f, 0x12, 0, 0}, {0x8880, 0x06, 0, 0}, {0x8881, 0x99, 0, 0},
+ {0x8882, 0x78, 0, 0}, {0x8883, 0x61, 0, 0}, {0x8884, 0xe6, 0, 0},
+ {0x8885, 0x90, 0, 0}, {0x8886, 0x60, 0, 0}, {0x8887, 0x01, 0, 0},
+ {0x8888, 0xf0, 0, 0}, {0x8889, 0x78, 0, 0}, {0x888a, 0x65, 0, 0},
+ {0x888b, 0xe6, 0, 0}, {0x888c, 0xa3, 0, 0}, {0x888d, 0xf0, 0, 0},
+ {0x888e, 0x78, 0, 0}, {0x888f, 0x69, 0, 0}, {0x8890, 0xe6, 0, 0},
+ {0x8891, 0xa3, 0, 0}, {0x8892, 0xf0, 0, 0}, {0x8893, 0x78, 0, 0},
+ {0x8894, 0x55, 0, 0}, {0x8895, 0xe6, 0, 0}, {0x8896, 0xa3, 0, 0},
+ {0x8897, 0xf0, 0, 0}, {0x8898, 0x7d, 0, 0}, {0x8899, 0x01, 0, 0},
+ {0x889a, 0x78, 0, 0}, {0x889b, 0x61, 0, 0}, {0x889c, 0x12, 0, 0},
+ {0x889d, 0x0b, 0, 0}, {0x889e, 0xe9, 0, 0}, {0x889f, 0x24, 0, 0},
+ {0x88a0, 0x01, 0, 0}, {0x88a1, 0x12, 0, 0}, {0x88a2, 0x0b, 0, 0},
+ {0x88a3, 0xa6, 0, 0}, {0x88a4, 0x78, 0, 0}, {0x88a5, 0x65, 0, 0},
+ {0x88a6, 0x12, 0, 0}, {0x88a7, 0x0b, 0, 0}, {0x88a8, 0xe9, 0, 0},
+ {0x88a9, 0x24, 0, 0}, {0x88aa, 0x02, 0, 0}, {0x88ab, 0x12, 0, 0},
+ {0x88ac, 0x0b, 0, 0}, {0x88ad, 0xa6, 0, 0}, {0x88ae, 0x78, 0, 0},
+ {0x88af, 0x69, 0, 0}, {0x88b0, 0x12, 0, 0}, {0x88b1, 0x0b, 0, 0},
+ {0x88b2, 0xe9, 0, 0}, {0x88b3, 0x24, 0, 0}, {0x88b4, 0x03, 0, 0},
+ {0x88b5, 0x12, 0, 0}, {0x88b6, 0x0b, 0, 0}, {0x88b7, 0xa6, 0, 0},
+ {0x88b8, 0x78, 0, 0}, {0x88b9, 0x6d, 0, 0}, {0x88ba, 0x12, 0, 0},
+ {0x88bb, 0x0b, 0, 0}, {0x88bc, 0xe9, 0, 0}, {0x88bd, 0x24, 0, 0},
+ {0x88be, 0x04, 0, 0}, {0x88bf, 0x12, 0, 0}, {0x88c0, 0x0b, 0, 0},
+ {0x88c1, 0xa6, 0, 0}, {0x88c2, 0x0d, 0, 0}, {0x88c3, 0xbd, 0, 0},
+ {0x88c4, 0x05, 0, 0}, {0x88c5, 0xd4, 0, 0}, {0x88c6, 0xc2, 0, 0},
+ {0x88c7, 0x0e, 0, 0}, {0x88c8, 0xc2, 0, 0}, {0x88c9, 0x06, 0, 0},
+ {0x88ca, 0x22, 0, 0}, {0x88cb, 0x85, 0, 0}, {0x88cc, 0x08, 0, 0},
+ {0x88cd, 0x41, 0, 0}, {0x88ce, 0x90, 0, 0}, {0x88cf, 0x30, 0, 0},
+ {0x88d0, 0x24, 0, 0}, {0x88d1, 0xe0, 0, 0}, {0x88d2, 0xf5, 0, 0},
+ {0x88d3, 0x3d, 0, 0}, {0x88d4, 0xa3, 0, 0}, {0x88d5, 0xe0, 0, 0},
+ {0x88d6, 0xf5, 0, 0}, {0x88d7, 0x3e, 0, 0}, {0x88d8, 0xa3, 0, 0},
+ {0x88d9, 0xe0, 0, 0}, {0x88da, 0xf5, 0, 0}, {0x88db, 0x3f, 0, 0},
+ {0x88dc, 0xa3, 0, 0}, {0x88dd, 0xe0, 0, 0}, {0x88de, 0xf5, 0, 0},
+ {0x88df, 0x40, 0, 0}, {0x88e0, 0xa3, 0, 0}, {0x88e1, 0xe0, 0, 0},
+ {0x88e2, 0xf5, 0, 0}, {0x88e3, 0x3c, 0, 0}, {0x88e4, 0xd2, 0, 0},
+ {0x88e5, 0x34, 0, 0}, {0x88e6, 0xe5, 0, 0}, {0x88e7, 0x41, 0, 0},
+ {0x88e8, 0x12, 0, 0}, {0x88e9, 0x06, 0, 0}, {0x88ea, 0xb1, 0, 0},
+ {0x88eb, 0x09, 0, 0}, {0x88ec, 0x31, 0, 0}, {0x88ed, 0x03, 0, 0},
+ {0x88ee, 0x09, 0, 0}, {0x88ef, 0x35, 0, 0}, {0x88f0, 0x04, 0, 0},
+ {0x88f1, 0x09, 0, 0}, {0x88f2, 0x3b, 0, 0}, {0x88f3, 0x05, 0, 0},
+ {0x88f4, 0x09, 0, 0}, {0x88f5, 0x3e, 0, 0}, {0x88f6, 0x06, 0, 0},
+ {0x88f7, 0x09, 0, 0}, {0x88f8, 0x41, 0, 0}, {0x88f9, 0x07, 0, 0},
+ {0x88fa, 0x09, 0, 0}, {0x88fb, 0x4a, 0, 0}, {0x88fc, 0x08, 0, 0},
+ {0x88fd, 0x09, 0, 0}, {0x88fe, 0x5b, 0, 0}, {0x88ff, 0x12, 0, 0},
+ {0x8900, 0x09, 0, 0}, {0x8901, 0x73, 0, 0}, {0x8902, 0x18, 0, 0},
+ {0x8903, 0x09, 0, 0}, {0x8904, 0x89, 0, 0}, {0x8905, 0x19, 0, 0},
+ {0x8906, 0x09, 0, 0}, {0x8907, 0x5e, 0, 0}, {0x8908, 0x1a, 0, 0},
+ {0x8909, 0x09, 0, 0}, {0x890a, 0x6a, 0, 0}, {0x890b, 0x1b, 0, 0},
+ {0x890c, 0x09, 0, 0}, {0x890d, 0xad, 0, 0}, {0x890e, 0x80, 0, 0},
+ {0x890f, 0x09, 0, 0}, {0x8910, 0xb2, 0, 0}, {0x8911, 0x81, 0, 0},
+ {0x8912, 0x0a, 0, 0}, {0x8913, 0x1d, 0, 0}, {0x8914, 0x8f, 0, 0},
+ {0x8915, 0x0a, 0, 0}, {0x8916, 0x09, 0, 0}, {0x8917, 0x90, 0, 0},
+ {0x8918, 0x0a, 0, 0}, {0x8919, 0x1d, 0, 0}, {0x891a, 0x91, 0, 0},
+ {0x891b, 0x0a, 0, 0}, {0x891c, 0x1d, 0, 0}, {0x891d, 0x92, 0, 0},
+ {0x891e, 0x0a, 0, 0}, {0x891f, 0x1d, 0, 0}, {0x8920, 0x93, 0, 0},
+ {0x8921, 0x0a, 0, 0}, {0x8922, 0x1d, 0, 0}, {0x8923, 0x94, 0, 0},
+ {0x8924, 0x0a, 0, 0}, {0x8925, 0x1d, 0, 0}, {0x8926, 0x98, 0, 0},
+ {0x8927, 0x0a, 0, 0}, {0x8928, 0x17, 0, 0}, {0x8929, 0x9f, 0, 0},
+ {0x892a, 0x0a, 0, 0}, {0x892b, 0x1a, 0, 0}, {0x892c, 0xec, 0, 0},
+ {0x892d, 0x00, 0, 0}, {0x892e, 0x00, 0, 0}, {0x892f, 0x0a, 0, 0},
+ {0x8930, 0x38, 0, 0}, {0x8931, 0x12, 0, 0}, {0x8932, 0x0f, 0, 0},
+ {0x8933, 0x74, 0, 0}, {0x8934, 0x22, 0, 0}, {0x8935, 0x12, 0, 0},
+ {0x8936, 0x0f, 0, 0}, {0x8937, 0x74, 0, 0}, {0x8938, 0xd2, 0, 0},
+ {0x8939, 0x03, 0, 0}, {0x893a, 0x22, 0, 0}, {0x893b, 0xd2, 0, 0},
+ {0x893c, 0x03, 0, 0}, {0x893d, 0x22, 0, 0}, {0x893e, 0xc2, 0, 0},
+ {0x893f, 0x03, 0, 0}, {0x8940, 0x22, 0, 0}, {0x8941, 0xa2, 0, 0},
+ {0x8942, 0x37, 0, 0}, {0x8943, 0xe4, 0, 0}, {0x8944, 0x33, 0, 0},
+ {0x8945, 0xf5, 0, 0}, {0x8946, 0x3c, 0, 0}, {0x8947, 0x02, 0, 0},
+ {0x8948, 0x0a, 0, 0}, {0x8949, 0x1d, 0, 0}, {0x894a, 0xc2, 0, 0},
+ {0x894b, 0x01, 0, 0}, {0x894c, 0xc2, 0, 0}, {0x894d, 0x02, 0, 0},
+ {0x894e, 0xc2, 0, 0}, {0x894f, 0x03, 0, 0}, {0x8950, 0x12, 0, 0},
+ {0x8951, 0x0d, 0, 0}, {0x8952, 0x0d, 0, 0}, {0x8953, 0x75, 0, 0},
+ {0x8954, 0x1e, 0, 0}, {0x8955, 0x70, 0, 0}, {0x8956, 0xd2, 0, 0},
+ {0x8957, 0x35, 0, 0}, {0x8958, 0x02, 0, 0}, {0x8959, 0x0a, 0, 0},
+ {0x895a, 0x1d, 0, 0}, {0x895b, 0x02, 0, 0}, {0x895c, 0x0a, 0, 0},
+ {0x895d, 0x04, 0, 0}, {0x895e, 0x85, 0, 0}, {0x895f, 0x40, 0, 0},
+ {0x8960, 0x4a, 0, 0}, {0x8961, 0x85, 0, 0}, {0x8962, 0x3c, 0, 0},
+ {0x8963, 0x4b, 0, 0}, {0x8964, 0x12, 0, 0}, {0x8965, 0x0a, 0, 0},
+ {0x8966, 0xff, 0, 0}, {0x8967, 0x02, 0, 0}, {0x8968, 0x0a, 0, 0},
+ {0x8969, 0x1d, 0, 0}, {0x896a, 0x85, 0, 0}, {0x896b, 0x4a, 0, 0},
+ {0x896c, 0x40, 0, 0}, {0x896d, 0x85, 0, 0}, {0x896e, 0x4b, 0, 0},
+ {0x896f, 0x3c, 0, 0}, {0x8970, 0x02, 0, 0}, {0x8971, 0x0a, 0, 0},
+ {0x8972, 0x1d, 0, 0}, {0x8973, 0xe4, 0, 0}, {0x8974, 0xf5, 0, 0},
+ {0x8975, 0x22, 0, 0}, {0x8976, 0xf5, 0, 0}, {0x8977, 0x23, 0, 0},
+ {0x8978, 0x85, 0, 0}, {0x8979, 0x40, 0, 0}, {0x897a, 0x31, 0, 0},
+ {0x897b, 0x85, 0, 0}, {0x897c, 0x3f, 0, 0}, {0x897d, 0x30, 0, 0},
+ {0x897e, 0x85, 0, 0}, {0x897f, 0x3e, 0, 0}, {0x8980, 0x2f, 0, 0},
+ {0x8981, 0x85, 0, 0}, {0x8982, 0x3d, 0, 0}, {0x8983, 0x2e, 0, 0},
+ {0x8984, 0x12, 0, 0}, {0x8985, 0x0f, 0, 0}, {0x8986, 0x46, 0, 0},
+ {0x8987, 0x80, 0, 0}, {0x8988, 0x1f, 0, 0}, {0x8989, 0x75, 0, 0},
+ {0x898a, 0x22, 0, 0}, {0x898b, 0x00, 0, 0}, {0x898c, 0x75, 0, 0},
+ {0x898d, 0x23, 0, 0}, {0x898e, 0x01, 0, 0}, {0x898f, 0x74, 0, 0},
+ {0x8990, 0xff, 0, 0}, {0x8991, 0xf5, 0, 0}, {0x8992, 0x2d, 0, 0},
+ {0x8993, 0xf5, 0, 0}, {0x8994, 0x2c, 0, 0}, {0x8995, 0xf5, 0, 0},
+ {0x8996, 0x2b, 0, 0}, {0x8997, 0xf5, 0, 0}, {0x8998, 0x2a, 0, 0},
+ {0x8999, 0x12, 0, 0}, {0x899a, 0x0f, 0, 0}, {0x899b, 0x46, 0, 0},
+ {0x899c, 0x85, 0, 0}, {0x899d, 0x2d, 0, 0}, {0x899e, 0x40, 0, 0},
+ {0x899f, 0x85, 0, 0}, {0x89a0, 0x2c, 0, 0}, {0x89a1, 0x3f, 0, 0},
+ {0x89a2, 0x85, 0, 0}, {0x89a3, 0x2b, 0, 0}, {0x89a4, 0x3e, 0, 0},
+ {0x89a5, 0x85, 0, 0}, {0x89a6, 0x2a, 0, 0}, {0x89a7, 0x3d, 0, 0},
+ {0x89a8, 0xe4, 0, 0}, {0x89a9, 0xf5, 0, 0}, {0x89aa, 0x3c, 0, 0},
+ {0x89ab, 0x80, 0, 0}, {0x89ac, 0x70, 0, 0}, {0x89ad, 0x12, 0, 0},
+ {0x89ae, 0x0f, 0, 0}, {0x89af, 0x16, 0, 0}, {0x89b0, 0x80, 0, 0},
+ {0x89b1, 0x6b, 0, 0}, {0x89b2, 0x85, 0, 0}, {0x89b3, 0x3d, 0, 0},
+ {0x89b4, 0x45, 0, 0}, {0x89b5, 0x85, 0, 0}, {0x89b6, 0x3e, 0, 0},
+ {0x89b7, 0x46, 0, 0}, {0x89b8, 0xe5, 0, 0}, {0x89b9, 0x47, 0, 0},
+ {0x89ba, 0xc3, 0, 0}, {0x89bb, 0x13, 0, 0}, {0x89bc, 0xff, 0, 0},
+ {0x89bd, 0xe5, 0, 0}, {0x89be, 0x45, 0, 0}, {0x89bf, 0xc3, 0, 0},
+ {0x89c0, 0x9f, 0, 0}, {0x89c1, 0x50, 0, 0}, {0x89c2, 0x02, 0, 0},
+ {0x89c3, 0x8f, 0, 0}, {0x89c4, 0x45, 0, 0}, {0x89c5, 0xe5, 0, 0},
+ {0x89c6, 0x48, 0, 0}, {0x89c7, 0xc3, 0, 0}, {0x89c8, 0x13, 0, 0},
+ {0x89c9, 0xff, 0, 0}, {0x89ca, 0xe5, 0, 0}, {0x89cb, 0x46, 0, 0},
+ {0x89cc, 0xc3, 0, 0}, {0x89cd, 0x9f, 0, 0}, {0x89ce, 0x50, 0, 0},
+ {0x89cf, 0x02, 0, 0}, {0x89d0, 0x8f, 0, 0}, {0x89d1, 0x46, 0, 0},
+ {0x89d2, 0xe5, 0, 0}, {0x89d3, 0x47, 0, 0}, {0x89d4, 0xc3, 0, 0},
+ {0x89d5, 0x13, 0, 0}, {0x89d6, 0xff, 0, 0}, {0x89d7, 0xfd, 0, 0},
+ {0x89d8, 0xe5, 0, 0}, {0x89d9, 0x45, 0, 0}, {0x89da, 0x2d, 0, 0},
+ {0x89db, 0xfd, 0, 0}, {0x89dc, 0xe4, 0, 0}, {0x89dd, 0x33, 0, 0},
+ {0x89de, 0xfc, 0, 0}, {0x89df, 0xe5, 0, 0}, {0x89e0, 0x44, 0, 0},
+ {0x89e1, 0x12, 0, 0}, {0x89e2, 0x0f, 0, 0}, {0x89e3, 0x90, 0, 0},
+ {0x89e4, 0x40, 0, 0}, {0x89e5, 0x05, 0, 0}, {0x89e6, 0xe5, 0, 0},
+ {0x89e7, 0x44, 0, 0}, {0x89e8, 0x9f, 0, 0}, {0x89e9, 0xf5, 0, 0},
+ {0x89ea, 0x45, 0, 0}, {0x89eb, 0xe5, 0, 0}, {0x89ec, 0x48, 0, 0},
+ {0x89ed, 0xc3, 0, 0}, {0x89ee, 0x13, 0, 0}, {0x89ef, 0xff, 0, 0},
+ {0x89f0, 0xfd, 0, 0}, {0x89f1, 0xe5, 0, 0}, {0x89f2, 0x46, 0, 0},
+ {0x89f3, 0x2d, 0, 0}, {0x89f4, 0xfd, 0, 0}, {0x89f5, 0xe4, 0, 0},
+ {0x89f6, 0x33, 0, 0}, {0x89f7, 0xfc, 0, 0}, {0x89f8, 0xe5, 0, 0},
+ {0x89f9, 0x43, 0, 0}, {0x89fa, 0x12, 0, 0}, {0x89fb, 0x0f, 0, 0},
+ {0x89fc, 0x90, 0, 0}, {0x89fd, 0x40, 0, 0}, {0x89fe, 0x05, 0, 0},
+ {0x89ff, 0xe5, 0, 0}, {0x8a00, 0x43, 0, 0}, {0x8a01, 0x9f, 0, 0},
+ {0x8a02, 0xf5, 0, 0}, {0x8a03, 0x46, 0, 0}, {0x8a04, 0x12, 0, 0},
+ {0x8a05, 0x06, 0, 0}, {0x8a06, 0xd7, 0, 0}, {0x8a07, 0x80, 0, 0},
+ {0x8a08, 0x14, 0, 0}, {0x8a09, 0x85, 0, 0}, {0x8a0a, 0x40, 0, 0},
+ {0x8a0b, 0x48, 0, 0}, {0x8a0c, 0x85, 0, 0}, {0x8a0d, 0x3f, 0, 0},
+ {0x8a0e, 0x47, 0, 0}, {0x8a0f, 0x85, 0, 0}, {0x8a10, 0x3e, 0, 0},
+ {0x8a11, 0x46, 0, 0}, {0x8a12, 0x85, 0, 0}, {0x8a13, 0x3d, 0, 0},
+ {0x8a14, 0x45, 0, 0}, {0x8a15, 0x80, 0, 0}, {0x8a16, 0x06, 0, 0},
+ {0x8a17, 0x02, 0, 0}, {0x8a18, 0x06, 0, 0}, {0x8a19, 0xd7, 0, 0},
+ {0x8a1a, 0x12, 0, 0}, {0x8a1b, 0x0d, 0, 0}, {0x8a1c, 0x7e, 0, 0},
+ {0x8a1d, 0x90, 0, 0}, {0x8a1e, 0x30, 0, 0}, {0x8a1f, 0x24, 0, 0},
+ {0x8a20, 0xe5, 0, 0}, {0x8a21, 0x3d, 0, 0}, {0x8a22, 0xf0, 0, 0},
+ {0x8a23, 0xa3, 0, 0}, {0x8a24, 0xe5, 0, 0}, {0x8a25, 0x3e, 0, 0},
+ {0x8a26, 0xf0, 0, 0}, {0x8a27, 0xa3, 0, 0}, {0x8a28, 0xe5, 0, 0},
+ {0x8a29, 0x3f, 0, 0}, {0x8a2a, 0xf0, 0, 0}, {0x8a2b, 0xa3, 0, 0},
+ {0x8a2c, 0xe5, 0, 0}, {0x8a2d, 0x40, 0, 0}, {0x8a2e, 0xf0, 0, 0},
+ {0x8a2f, 0xa3, 0, 0}, {0x8a30, 0xe5, 0, 0}, {0x8a31, 0x3c, 0, 0},
+ {0x8a32, 0xf0, 0, 0}, {0x8a33, 0x90, 0, 0}, {0x8a34, 0x30, 0, 0},
+ {0x8a35, 0x23, 0, 0}, {0x8a36, 0xe4, 0, 0}, {0x8a37, 0xf0, 0, 0},
+ {0x8a38, 0x22, 0, 0}, {0x8a39, 0xc0, 0, 0}, {0x8a3a, 0xe0, 0, 0},
+ {0x8a3b, 0xc0, 0, 0}, {0x8a3c, 0x83, 0, 0}, {0x8a3d, 0xc0, 0, 0},
+ {0x8a3e, 0x82, 0, 0}, {0x8a3f, 0xc0, 0, 0}, {0x8a40, 0xd0, 0, 0},
+ {0x8a41, 0x90, 0, 0}, {0x8a42, 0x3f, 0, 0}, {0x8a43, 0x0c, 0, 0},
+ {0x8a44, 0xe0, 0, 0}, {0x8a45, 0xf5, 0, 0}, {0x8a46, 0x32, 0, 0},
+ {0x8a47, 0xe5, 0, 0}, {0x8a48, 0x32, 0, 0}, {0x8a49, 0x30, 0, 0},
+ {0x8a4a, 0xe3, 0, 0}, {0x8a4b, 0x74, 0, 0}, {0x8a4c, 0x30, 0, 0},
+ {0x8a4d, 0x36, 0, 0}, {0x8a4e, 0x66, 0, 0}, {0x8a4f, 0x90, 0, 0},
+ {0x8a50, 0x60, 0, 0}, {0x8a51, 0x19, 0, 0}, {0x8a52, 0xe0, 0, 0},
+ {0x8a53, 0xf5, 0, 0}, {0x8a54, 0x0a, 0, 0}, {0x8a55, 0xa3, 0, 0},
+ {0x8a56, 0xe0, 0, 0}, {0x8a57, 0xf5, 0, 0}, {0x8a58, 0x0b, 0, 0},
+ {0x8a59, 0x90, 0, 0}, {0x8a5a, 0x60, 0, 0}, {0x8a5b, 0x1d, 0, 0},
+ {0x8a5c, 0xe0, 0, 0}, {0x8a5d, 0xf5, 0, 0}, {0x8a5e, 0x14, 0, 0},
+ {0x8a5f, 0xa3, 0, 0}, {0x8a60, 0xe0, 0, 0}, {0x8a61, 0xf5, 0, 0},
+ {0x8a62, 0x15, 0, 0}, {0x8a63, 0x90, 0, 0}, {0x8a64, 0x60, 0, 0},
+ {0x8a65, 0x21, 0, 0}, {0x8a66, 0xe0, 0, 0}, {0x8a67, 0xf5, 0, 0},
+ {0x8a68, 0x0c, 0, 0}, {0x8a69, 0xa3, 0, 0}, {0x8a6a, 0xe0, 0, 0},
+ {0x8a6b, 0xf5, 0, 0}, {0x8a6c, 0x0d, 0, 0}, {0x8a6d, 0x90, 0, 0},
+ {0x8a6e, 0x60, 0, 0}, {0x8a6f, 0x29, 0, 0}, {0x8a70, 0xe0, 0, 0},
+ {0x8a71, 0xf5, 0, 0}, {0x8a72, 0x0e, 0, 0}, {0x8a73, 0xa3, 0, 0},
+ {0x8a74, 0xe0, 0, 0}, {0x8a75, 0xf5, 0, 0}, {0x8a76, 0x0f, 0, 0},
+ {0x8a77, 0x90, 0, 0}, {0x8a78, 0x60, 0, 0}, {0x8a79, 0x31, 0, 0},
+ {0x8a7a, 0xe0, 0, 0}, {0x8a7b, 0xf5, 0, 0}, {0x8a7c, 0x10, 0, 0},
+ {0x8a7d, 0xa3, 0, 0}, {0x8a7e, 0xe0, 0, 0}, {0x8a7f, 0xf5, 0, 0},
+ {0x8a80, 0x11, 0, 0}, {0x8a81, 0x90, 0, 0}, {0x8a82, 0x60, 0, 0},
+ {0x8a83, 0x39, 0, 0}, {0x8a84, 0xe0, 0, 0}, {0x8a85, 0xf5, 0, 0},
+ {0x8a86, 0x12, 0, 0}, {0x8a87, 0xa3, 0, 0}, {0x8a88, 0xe0, 0, 0},
+ {0x8a89, 0xf5, 0, 0}, {0x8a8a, 0x13, 0, 0}, {0x8a8b, 0x30, 0, 0},
+ {0x8a8c, 0x01, 0, 0}, {0x8a8d, 0x06, 0, 0}, {0x8a8e, 0x30, 0, 0},
+ {0x8a8f, 0x33, 0, 0}, {0x8a90, 0x03, 0, 0}, {0x8a91, 0xd3, 0, 0},
+ {0x8a92, 0x80, 0, 0}, {0x8a93, 0x01, 0, 0}, {0x8a94, 0xc3, 0, 0},
+ {0x8a95, 0x92, 0, 0}, {0x8a96, 0x09, 0, 0}, {0x8a97, 0x30, 0, 0},
+ {0x8a98, 0x02, 0, 0}, {0x8a99, 0x06, 0, 0}, {0x8a9a, 0x30, 0, 0},
+ {0x8a9b, 0x33, 0, 0}, {0x8a9c, 0x03, 0, 0}, {0x8a9d, 0xd3, 0, 0},
+ {0x8a9e, 0x80, 0, 0}, {0x8a9f, 0x01, 0, 0}, {0x8aa0, 0xc3, 0, 0},
+ {0x8aa1, 0x92, 0, 0}, {0x8aa2, 0x0a, 0, 0}, {0x8aa3, 0x30, 0, 0},
+ {0x8aa4, 0x33, 0, 0}, {0x8aa5, 0x0c, 0, 0}, {0x8aa6, 0x30, 0, 0},
+ {0x8aa7, 0x03, 0, 0}, {0x8aa8, 0x09, 0, 0}, {0x8aa9, 0x20, 0, 0},
+ {0x8aaa, 0x02, 0, 0}, {0x8aab, 0x06, 0, 0}, {0x8aac, 0x20, 0, 0},
+ {0x8aad, 0x01, 0, 0}, {0x8aae, 0x03, 0, 0}, {0x8aaf, 0xd3, 0, 0},
+ {0x8ab0, 0x80, 0, 0}, {0x8ab1, 0x01, 0, 0}, {0x8ab2, 0xc3, 0, 0},
+ {0x8ab3, 0x92, 0, 0}, {0x8ab4, 0x0b, 0, 0}, {0x8ab5, 0x90, 0, 0},
+ {0x8ab6, 0x30, 0, 0}, {0x8ab7, 0x01, 0, 0}, {0x8ab8, 0xe0, 0, 0},
+ {0x8ab9, 0x44, 0, 0}, {0x8aba, 0x40, 0, 0}, {0x8abb, 0xf0, 0, 0},
+ {0x8abc, 0xe0, 0, 0}, {0x8abd, 0x54, 0, 0}, {0x8abe, 0xbf, 0, 0},
+ {0x8abf, 0xf0, 0, 0}, {0x8ac0, 0xe5, 0, 0}, {0x8ac1, 0x32, 0, 0},
+ {0x8ac2, 0x30, 0, 0}, {0x8ac3, 0xe1, 0, 0}, {0x8ac4, 0x14, 0, 0},
+ {0x8ac5, 0x30, 0, 0}, {0x8ac6, 0x34, 0, 0}, {0x8ac7, 0x11, 0, 0},
+ {0x8ac8, 0x90, 0, 0}, {0x8ac9, 0x30, 0, 0}, {0x8aca, 0x22, 0, 0},
+ {0x8acb, 0xe0, 0, 0}, {0x8acc, 0xf5, 0, 0}, {0x8acd, 0x08, 0, 0},
+ {0x8ace, 0xe4, 0, 0}, {0x8acf, 0xf0, 0, 0}, {0x8ad0, 0x30, 0, 0},
+ {0x8ad1, 0x00, 0, 0}, {0x8ad2, 0x03, 0, 0}, {0x8ad3, 0xd3, 0, 0},
+ {0x8ad4, 0x80, 0, 0}, {0x8ad5, 0x01, 0, 0}, {0x8ad6, 0xc3, 0, 0},
+ {0x8ad7, 0x92, 0, 0}, {0x8ad8, 0x08, 0, 0}, {0x8ad9, 0xe5, 0, 0},
+ {0x8ada, 0x32, 0, 0}, {0x8adb, 0x30, 0, 0}, {0x8adc, 0xe5, 0, 0},
+ {0x8add, 0x12, 0, 0}, {0x8ade, 0x90, 0, 0}, {0x8adf, 0x56, 0, 0},
+ {0x8ae0, 0xa1, 0, 0}, {0x8ae1, 0xe0, 0, 0}, {0x8ae2, 0xf5, 0, 0},
+ {0x8ae3, 0x09, 0, 0}, {0x8ae4, 0x30, 0, 0}, {0x8ae5, 0x31, 0, 0},
+ {0x8ae6, 0x09, 0, 0}, {0x8ae7, 0x30, 0, 0}, {0x8ae8, 0x05, 0, 0},
+ {0x8ae9, 0x03, 0, 0}, {0x8aea, 0xd3, 0, 0}, {0x8aeb, 0x80, 0, 0},
+ {0x8aec, 0x01, 0, 0}, {0x8aed, 0xc3, 0, 0}, {0x8aee, 0x92, 0, 0},
+ {0x8aef, 0x0d, 0, 0}, {0x8af0, 0x90, 0, 0}, {0x8af1, 0x3f, 0, 0},
+ {0x8af2, 0x0c, 0, 0}, {0x8af3, 0xe5, 0, 0}, {0x8af4, 0x32, 0, 0},
+ {0x8af5, 0xf0, 0, 0}, {0x8af6, 0xd0, 0, 0}, {0x8af7, 0xd0, 0, 0},
+ {0x8af8, 0xd0, 0, 0}, {0x8af9, 0x82, 0, 0}, {0x8afa, 0xd0, 0, 0},
+ {0x8afb, 0x83, 0, 0}, {0x8afc, 0xd0, 0, 0}, {0x8afd, 0xe0, 0, 0},
+ {0x8afe, 0x32, 0, 0}, {0x8aff, 0x90, 0, 0}, {0x8b00, 0x0e, 0, 0},
+ {0x8b01, 0x7e, 0, 0}, {0x8b02, 0xe4, 0, 0}, {0x8b03, 0x93, 0, 0},
+ {0x8b04, 0xfe, 0, 0}, {0x8b05, 0x74, 0, 0}, {0x8b06, 0x01, 0, 0},
+ {0x8b07, 0x93, 0, 0}, {0x8b08, 0xff, 0, 0}, {0x8b09, 0xc3, 0, 0},
+ {0x8b0a, 0x90, 0, 0}, {0x8b0b, 0x0e, 0, 0}, {0x8b0c, 0x7c, 0, 0},
+ {0x8b0d, 0x74, 0, 0}, {0x8b0e, 0x01, 0, 0}, {0x8b0f, 0x93, 0, 0},
+ {0x8b10, 0x9f, 0, 0}, {0x8b11, 0xff, 0, 0}, {0x8b12, 0xe4, 0, 0},
+ {0x8b13, 0x93, 0, 0}, {0x8b14, 0x9e, 0, 0}, {0x8b15, 0xfe, 0, 0},
+ {0x8b16, 0xe4, 0, 0}, {0x8b17, 0x8f, 0, 0}, {0x8b18, 0x3b, 0, 0},
+ {0x8b19, 0x8e, 0, 0}, {0x8b1a, 0x3a, 0, 0}, {0x8b1b, 0xf5, 0, 0},
+ {0x8b1c, 0x39, 0, 0}, {0x8b1d, 0xf5, 0, 0}, {0x8b1e, 0x38, 0, 0},
+ {0x8b1f, 0xab, 0, 0}, {0x8b20, 0x3b, 0, 0}, {0x8b21, 0xaa, 0, 0},
+ {0x8b22, 0x3a, 0, 0}, {0x8b23, 0xa9, 0, 0}, {0x8b24, 0x39, 0, 0},
+ {0x8b25, 0xa8, 0, 0}, {0x8b26, 0x38, 0, 0}, {0x8b27, 0xaf, 0, 0},
+ {0x8b28, 0x4b, 0, 0}, {0x8b29, 0xfc, 0, 0}, {0x8b2a, 0xfd, 0, 0},
+ {0x8b2b, 0xfe, 0, 0}, {0x8b2c, 0x12, 0, 0}, {0x8b2d, 0x05, 0, 0},
+ {0x8b2e, 0x28, 0, 0}, {0x8b2f, 0x12, 0, 0}, {0x8b30, 0x0d, 0, 0},
+ {0x8b31, 0xe1, 0, 0}, {0x8b32, 0xe4, 0, 0}, {0x8b33, 0x7b, 0, 0},
+ {0x8b34, 0xff, 0, 0}, {0x8b35, 0xfa, 0, 0}, {0x8b36, 0xf9, 0, 0},
+ {0x8b37, 0xf8, 0, 0}, {0x8b38, 0x12, 0, 0}, {0x8b39, 0x05, 0, 0},
+ {0x8b3a, 0xb3, 0, 0}, {0x8b3b, 0x12, 0, 0}, {0x8b3c, 0x0d, 0, 0},
+ {0x8b3d, 0xe1, 0, 0}, {0x8b3e, 0x90, 0, 0}, {0x8b3f, 0x0e, 0, 0},
+ {0x8b40, 0x69, 0, 0}, {0x8b41, 0xe4, 0, 0}, {0x8b42, 0x12, 0, 0},
+ {0x8b43, 0x0d, 0, 0}, {0x8b44, 0xf6, 0, 0}, {0x8b45, 0x12, 0, 0},
+ {0x8b46, 0x0d, 0, 0}, {0x8b47, 0xe1, 0, 0}, {0x8b48, 0xe4, 0, 0},
+ {0x8b49, 0x85, 0, 0}, {0x8b4a, 0x4a, 0, 0}, {0x8b4b, 0x37, 0, 0},
+ {0x8b4c, 0xf5, 0, 0}, {0x8b4d, 0x36, 0, 0}, {0x8b4e, 0xf5, 0, 0},
+ {0x8b4f, 0x35, 0, 0}, {0x8b50, 0xf5, 0, 0}, {0x8b51, 0x34, 0, 0},
+ {0x8b52, 0xaf, 0, 0}, {0x8b53, 0x37, 0, 0}, {0x8b54, 0xae, 0, 0},
+ {0x8b55, 0x36, 0, 0}, {0x8b56, 0xad, 0, 0}, {0x8b57, 0x35, 0, 0},
+ {0x8b58, 0xac, 0, 0}, {0x8b59, 0x34, 0, 0}, {0x8b5a, 0xa3, 0, 0},
+ {0x8b5b, 0x12, 0, 0}, {0x8b5c, 0x0d, 0, 0}, {0x8b5d, 0xf6, 0, 0},
+ {0x8b5e, 0x8f, 0, 0}, {0x8b5f, 0x37, 0, 0}, {0x8b60, 0x8e, 0, 0},
+ {0x8b61, 0x36, 0, 0}, {0x8b62, 0x8d, 0, 0}, {0x8b63, 0x35, 0, 0},
+ {0x8b64, 0x8c, 0, 0}, {0x8b65, 0x34, 0, 0}, {0x8b66, 0xe5, 0, 0},
+ {0x8b67, 0x3b, 0, 0}, {0x8b68, 0x45, 0, 0}, {0x8b69, 0x37, 0, 0},
+ {0x8b6a, 0xf5, 0, 0}, {0x8b6b, 0x3b, 0, 0}, {0x8b6c, 0xe5, 0, 0},
+ {0x8b6d, 0x3a, 0, 0}, {0x8b6e, 0x45, 0, 0}, {0x8b6f, 0x36, 0, 0},
+ {0x8b70, 0xf5, 0, 0}, {0x8b71, 0x3a, 0, 0}, {0x8b72, 0xe5, 0, 0},
+ {0x8b73, 0x39, 0, 0}, {0x8b74, 0x45, 0, 0}, {0x8b75, 0x35, 0, 0},
+ {0x8b76, 0xf5, 0, 0}, {0x8b77, 0x39, 0, 0}, {0x8b78, 0xe5, 0, 0},
+ {0x8b79, 0x38, 0, 0}, {0x8b7a, 0x45, 0, 0}, {0x8b7b, 0x34, 0, 0},
+ {0x8b7c, 0xf5, 0, 0}, {0x8b7d, 0x38, 0, 0}, {0x8b7e, 0xe4, 0, 0},
+ {0x8b7f, 0xf5, 0, 0}, {0x8b80, 0x22, 0, 0}, {0x8b81, 0xf5, 0, 0},
+ {0x8b82, 0x23, 0, 0}, {0x8b83, 0x85, 0, 0}, {0x8b84, 0x3b, 0, 0},
+ {0x8b85, 0x31, 0, 0}, {0x8b86, 0x85, 0, 0}, {0x8b87, 0x3a, 0, 0},
+ {0x8b88, 0x30, 0, 0}, {0x8b89, 0x85, 0, 0}, {0x8b8a, 0x39, 0, 0},
+ {0x8b8b, 0x2f, 0, 0}, {0x8b8c, 0x85, 0, 0}, {0x8b8d, 0x38, 0, 0},
+ {0x8b8e, 0x2e, 0, 0}, {0x8b8f, 0x02, 0, 0}, {0x8b90, 0x0f, 0, 0},
+ {0x8b91, 0x46, 0, 0}, {0x8b92, 0xe0, 0, 0}, {0x8b93, 0xa3, 0, 0},
+ {0x8b94, 0xe0, 0, 0}, {0x8b95, 0x75, 0, 0}, {0x8b96, 0xf0, 0, 0},
+ {0x8b97, 0x02, 0, 0}, {0x8b98, 0xa4, 0, 0}, {0x8b99, 0xff, 0, 0},
+ {0x8b9a, 0xae, 0, 0}, {0x8b9b, 0xf0, 0, 0}, {0x8b9c, 0xc3, 0, 0},
+ {0x8b9d, 0x08, 0, 0}, {0x8b9e, 0xe6, 0, 0}, {0x8b9f, 0x9f, 0, 0},
+ {0x8ba0, 0xf6, 0, 0}, {0x8ba1, 0x18, 0, 0}, {0x8ba2, 0xe6, 0, 0},
+ {0x8ba3, 0x9e, 0, 0}, {0x8ba4, 0xf6, 0, 0}, {0x8ba5, 0x22, 0, 0},
+ {0x8ba6, 0xff, 0, 0}, {0x8ba7, 0xe5, 0, 0}, {0x8ba8, 0xf0, 0, 0},
+ {0x8ba9, 0x34, 0, 0}, {0x8baa, 0x60, 0, 0}, {0x8bab, 0x8f, 0, 0},
+ {0x8bac, 0x82, 0, 0}, {0x8bad, 0xf5, 0, 0}, {0x8bae, 0x83, 0, 0},
+ {0x8baf, 0xec, 0, 0}, {0x8bb0, 0xf0, 0, 0}, {0x8bb1, 0x22, 0, 0},
+ {0x8bb2, 0x78, 0, 0}, {0x8bb3, 0x52, 0, 0}, {0x8bb4, 0x7e, 0, 0},
+ {0x8bb5, 0x00, 0, 0}, {0x8bb6, 0xe6, 0, 0}, {0x8bb7, 0xfc, 0, 0},
+ {0x8bb8, 0x08, 0, 0}, {0x8bb9, 0xe6, 0, 0}, {0x8bba, 0xfd, 0, 0},
+ {0x8bbb, 0x02, 0, 0}, {0x8bbc, 0x04, 0, 0}, {0x8bbd, 0xc1, 0, 0},
+ {0x8bbe, 0xe4, 0, 0}, {0x8bbf, 0xfc, 0, 0}, {0x8bc0, 0xfd, 0, 0},
+ {0x8bc1, 0x12, 0, 0}, {0x8bc2, 0x06, 0, 0}, {0x8bc3, 0x99, 0, 0},
+ {0x8bc4, 0x78, 0, 0}, {0x8bc5, 0x5c, 0, 0}, {0x8bc6, 0xe6, 0, 0},
+ {0x8bc7, 0xc3, 0, 0}, {0x8bc8, 0x13, 0, 0}, {0x8bc9, 0xfe, 0, 0},
+ {0x8bca, 0x08, 0, 0}, {0x8bcb, 0xe6, 0, 0}, {0x8bcc, 0x13, 0, 0},
+ {0x8bcd, 0x22, 0, 0}, {0x8bce, 0x78, 0, 0}, {0x8bcf, 0x52, 0, 0},
+ {0x8bd0, 0xe6, 0, 0}, {0x8bd1, 0xfe, 0, 0}, {0x8bd2, 0x08, 0, 0},
+ {0x8bd3, 0xe6, 0, 0}, {0x8bd4, 0xff, 0, 0}, {0x8bd5, 0xe4, 0, 0},
+ {0x8bd6, 0xfc, 0, 0}, {0x8bd7, 0xfd, 0, 0}, {0x8bd8, 0x22, 0, 0},
+ {0x8bd9, 0xe7, 0, 0}, {0x8bda, 0xc4, 0, 0}, {0x8bdb, 0xf8, 0, 0},
+ {0x8bdc, 0x54, 0, 0}, {0x8bdd, 0xf0, 0, 0}, {0x8bde, 0xc8, 0, 0},
+ {0x8bdf, 0x68, 0, 0}, {0x8be0, 0xf7, 0, 0}, {0x8be1, 0x09, 0, 0},
+ {0x8be2, 0xe7, 0, 0}, {0x8be3, 0xc4, 0, 0}, {0x8be4, 0x54, 0, 0},
+ {0x8be5, 0x0f, 0, 0}, {0x8be6, 0x48, 0, 0}, {0x8be7, 0xf7, 0, 0},
+ {0x8be8, 0x22, 0, 0}, {0x8be9, 0xe6, 0, 0}, {0x8bea, 0xfc, 0, 0},
+ {0x8beb, 0xed, 0, 0}, {0x8bec, 0x75, 0, 0}, {0x8bed, 0xf0, 0, 0},
+ {0x8bee, 0x04, 0, 0}, {0x8bef, 0xa4, 0, 0}, {0x8bf0, 0x22, 0, 0},
+ {0x8bf1, 0x12, 0, 0}, {0x8bf2, 0x06, 0, 0}, {0x8bf3, 0x7c, 0, 0},
+ {0x8bf4, 0x8f, 0, 0}, {0x8bf5, 0x48, 0, 0}, {0x8bf6, 0x8e, 0, 0},
+ {0x8bf7, 0x47, 0, 0}, {0x8bf8, 0x8d, 0, 0}, {0x8bf9, 0x46, 0, 0},
+ {0x8bfa, 0x8c, 0, 0}, {0x8bfb, 0x45, 0, 0}, {0x8bfc, 0x22, 0, 0},
+ {0x8bfd, 0xe0, 0, 0}, {0x8bfe, 0xfe, 0, 0}, {0x8bff, 0xa3, 0, 0},
+ {0x8c00, 0xe0, 0, 0}, {0x8c01, 0xfd, 0, 0}, {0x8c02, 0xee, 0, 0},
+ {0x8c03, 0xf6, 0, 0}, {0x8c04, 0xed, 0, 0}, {0x8c05, 0x08, 0, 0},
+ {0x8c06, 0xf6, 0, 0}, {0x8c07, 0x22, 0, 0}, {0x8c08, 0x13, 0, 0},
+ {0x8c09, 0xff, 0, 0}, {0x8c0a, 0xc3, 0, 0}, {0x8c0b, 0xe6, 0, 0},
+ {0x8c0c, 0x9f, 0, 0}, {0x8c0d, 0xff, 0, 0}, {0x8c0e, 0x18, 0, 0},
+ {0x8c0f, 0xe6, 0, 0}, {0x8c10, 0x9e, 0, 0}, {0x8c11, 0xfe, 0, 0},
+ {0x8c12, 0x22, 0, 0}, {0x8c13, 0xe6, 0, 0}, {0x8c14, 0xc3, 0, 0},
+ {0x8c15, 0x13, 0, 0}, {0x8c16, 0xf7, 0, 0}, {0x8c17, 0x08, 0, 0},
+ {0x8c18, 0xe6, 0, 0}, {0x8c19, 0x13, 0, 0}, {0x8c1a, 0x09, 0, 0},
+ {0x8c1b, 0xf7, 0, 0}, {0x8c1c, 0x22, 0, 0}, {0x8c1d, 0xad, 0, 0},
+ {0x8c1e, 0x39, 0, 0}, {0x8c1f, 0xac, 0, 0}, {0x8c20, 0x38, 0, 0},
+ {0x8c21, 0xfa, 0, 0}, {0x8c22, 0xf9, 0, 0}, {0x8c23, 0xf8, 0, 0},
+ {0x8c24, 0x12, 0, 0}, {0x8c25, 0x05, 0, 0}, {0x8c26, 0x28, 0, 0},
+ {0x8c27, 0x8f, 0, 0}, {0x8c28, 0x3b, 0, 0}, {0x8c29, 0x8e, 0, 0},
+ {0x8c2a, 0x3a, 0, 0}, {0x8c2b, 0x8d, 0, 0}, {0x8c2c, 0x39, 0, 0},
+ {0x8c2d, 0x8c, 0, 0}, {0x8c2e, 0x38, 0, 0}, {0x8c2f, 0xab, 0, 0},
+ {0x8c30, 0x37, 0, 0}, {0x8c31, 0xaa, 0, 0}, {0x8c32, 0x36, 0, 0},
+ {0x8c33, 0xa9, 0, 0}, {0x8c34, 0x35, 0, 0}, {0x8c35, 0xa8, 0, 0},
+ {0x8c36, 0x34, 0, 0}, {0x8c37, 0x22, 0, 0}, {0x8c38, 0x93, 0, 0},
+ {0x8c39, 0xff, 0, 0}, {0x8c3a, 0xe4, 0, 0}, {0x8c3b, 0xfc, 0, 0},
+ {0x8c3c, 0xfd, 0, 0}, {0x8c3d, 0xfe, 0, 0}, {0x8c3e, 0x12, 0, 0},
+ {0x8c3f, 0x05, 0, 0}, {0x8c40, 0x28, 0, 0}, {0x8c41, 0x8f, 0, 0},
+ {0x8c42, 0x37, 0, 0}, {0x8c43, 0x8e, 0, 0}, {0x8c44, 0x36, 0, 0},
+ {0x8c45, 0x8d, 0, 0}, {0x8c46, 0x35, 0, 0}, {0x8c47, 0x8c, 0, 0},
+ {0x8c48, 0x34, 0, 0}, {0x8c49, 0x22, 0, 0}, {0x8c4a, 0x78, 0, 0},
+ {0x8c4b, 0x84, 0, 0}, {0x8c4c, 0xe6, 0, 0}, {0x8c4d, 0xfe, 0, 0},
+ {0x8c4e, 0x08, 0, 0}, {0x8c4f, 0xe6, 0, 0}, {0x8c50, 0xff, 0, 0},
+ {0x8c51, 0xe4, 0, 0}, {0x8c52, 0x8f, 0, 0}, {0x8c53, 0x37, 0, 0},
+ {0x8c54, 0x8e, 0, 0}, {0x8c55, 0x36, 0, 0}, {0x8c56, 0xf5, 0, 0},
+ {0x8c57, 0x35, 0, 0}, {0x8c58, 0xf5, 0, 0}, {0x8c59, 0x34, 0, 0},
+ {0x8c5a, 0x22, 0, 0}, {0x8c5b, 0x90, 0, 0}, {0x8c5c, 0x0e, 0, 0},
+ {0x8c5d, 0x8c, 0, 0}, {0x8c5e, 0xe4, 0, 0}, {0x8c5f, 0x93, 0, 0},
+ {0x8c60, 0x25, 0, 0}, {0x8c61, 0xe0, 0, 0}, {0x8c62, 0x24, 0, 0},
+ {0x8c63, 0x0a, 0, 0}, {0x8c64, 0xf8, 0, 0}, {0x8c65, 0xe6, 0, 0},
+ {0x8c66, 0xfe, 0, 0}, {0x8c67, 0x08, 0, 0}, {0x8c68, 0xe6, 0, 0},
+ {0x8c69, 0xff, 0, 0}, {0x8c6a, 0x22, 0, 0}, {0x8c6b, 0xe6, 0, 0},
+ {0x8c6c, 0xfe, 0, 0}, {0x8c6d, 0x08, 0, 0}, {0x8c6e, 0xe6, 0, 0},
+ {0x8c6f, 0xff, 0, 0}, {0x8c70, 0xe4, 0, 0}, {0x8c71, 0x8f, 0, 0},
+ {0x8c72, 0x3b, 0, 0}, {0x8c73, 0x8e, 0, 0}, {0x8c74, 0x3a, 0, 0},
+ {0x8c75, 0xf5, 0, 0}, {0x8c76, 0x39, 0, 0}, {0x8c77, 0xf5, 0, 0},
+ {0x8c78, 0x38, 0, 0}, {0x8c79, 0x22, 0, 0}, {0x8c7a, 0x78, 0, 0},
+ {0x8c7b, 0x4e, 0, 0}, {0x8c7c, 0xe6, 0, 0}, {0x8c7d, 0xfe, 0, 0},
+ {0x8c7e, 0x08, 0, 0}, {0x8c7f, 0xe6, 0, 0}, {0x8c80, 0xff, 0, 0},
+ {0x8c81, 0x22, 0, 0}, {0x8c82, 0xef, 0, 0}, {0x8c83, 0x25, 0, 0},
+ {0x8c84, 0xe0, 0, 0}, {0x8c85, 0x24, 0, 0}, {0x8c86, 0x4e, 0, 0},
+ {0x8c87, 0xf8, 0, 0}, {0x8c88, 0xe6, 0, 0}, {0x8c89, 0xfc, 0, 0},
+ {0x8c8a, 0x08, 0, 0}, {0x8c8b, 0xe6, 0, 0}, {0x8c8c, 0xfd, 0, 0},
+ {0x8c8d, 0x22, 0, 0}, {0x8c8e, 0x78, 0, 0}, {0x8c8f, 0x89, 0, 0},
+ {0x8c90, 0xef, 0, 0}, {0x8c91, 0x26, 0, 0}, {0x8c92, 0xf6, 0, 0},
+ {0x8c93, 0x18, 0, 0}, {0x8c94, 0xe4, 0, 0}, {0x8c95, 0x36, 0, 0},
+ {0x8c96, 0xf6, 0, 0}, {0x8c97, 0x22, 0, 0}, {0x8c98, 0x75, 0, 0},
+ {0x8c99, 0x89, 0, 0}, {0x8c9a, 0x03, 0, 0}, {0x8c9b, 0x75, 0, 0},
+ {0x8c9c, 0xa8, 0, 0}, {0x8c9d, 0x01, 0, 0}, {0x8c9e, 0x75, 0, 0},
+ {0x8c9f, 0xb8, 0, 0}, {0x8ca0, 0x04, 0, 0}, {0x8ca1, 0x75, 0, 0},
+ {0x8ca2, 0x34, 0, 0}, {0x8ca3, 0xff, 0, 0}, {0x8ca4, 0x75, 0, 0},
+ {0x8ca5, 0x35, 0, 0}, {0x8ca6, 0x0e, 0, 0}, {0x8ca7, 0x75, 0, 0},
+ {0x8ca8, 0x36, 0, 0}, {0x8ca9, 0x15, 0, 0}, {0x8caa, 0x75, 0, 0},
+ {0x8cab, 0x37, 0, 0}, {0x8cac, 0x0d, 0, 0}, {0x8cad, 0x12, 0, 0},
+ {0x8cae, 0x0e, 0, 0}, {0x8caf, 0x9a, 0, 0}, {0x8cb0, 0x12, 0, 0},
+ {0x8cb1, 0x00, 0, 0}, {0x8cb2, 0x09, 0, 0}, {0x8cb3, 0x12, 0, 0},
+ {0x8cb4, 0x0f, 0, 0}, {0x8cb5, 0x16, 0, 0}, {0x8cb6, 0x12, 0, 0},
+ {0x8cb7, 0x00, 0, 0}, {0x8cb8, 0x06, 0, 0}, {0x8cb9, 0xd2, 0, 0},
+ {0x8cba, 0x00, 0, 0}, {0x8cbb, 0xd2, 0, 0}, {0x8cbc, 0x34, 0, 0},
+ {0x8cbd, 0xd2, 0, 0}, {0x8cbe, 0xaf, 0, 0}, {0x8cbf, 0x75, 0, 0},
+ {0x8cc0, 0x34, 0, 0}, {0x8cc1, 0xff, 0, 0}, {0x8cc2, 0x75, 0, 0},
+ {0x8cc3, 0x35, 0, 0}, {0x8cc4, 0x0e, 0, 0}, {0x8cc5, 0x75, 0, 0},
+ {0x8cc6, 0x36, 0, 0}, {0x8cc7, 0x49, 0, 0}, {0x8cc8, 0x75, 0, 0},
+ {0x8cc9, 0x37, 0, 0}, {0x8cca, 0x03, 0, 0}, {0x8ccb, 0x12, 0, 0},
+ {0x8ccc, 0x0e, 0, 0}, {0x8ccd, 0x9a, 0, 0}, {0x8cce, 0x30, 0, 0},
+ {0x8ccf, 0x08, 0, 0}, {0x8cd0, 0x09, 0, 0}, {0x8cd1, 0xc2, 0, 0},
+ {0x8cd2, 0x34, 0, 0}, {0x8cd3, 0x12, 0, 0}, {0x8cd4, 0x08, 0, 0},
+ {0x8cd5, 0xcb, 0, 0}, {0x8cd6, 0xc2, 0, 0}, {0x8cd7, 0x08, 0, 0},
+ {0x8cd8, 0xd2, 0, 0}, {0x8cd9, 0x34, 0, 0}, {0x8cda, 0x30, 0, 0},
+ {0x8cdb, 0x0b, 0, 0}, {0x8cdc, 0x09, 0, 0}, {0x8cdd, 0xc2, 0, 0},
+ {0x8cde, 0x36, 0, 0}, {0x8cdf, 0x12, 0, 0}, {0x8ce0, 0x02, 0, 0},
+ {0x8ce1, 0x6c, 0, 0}, {0x8ce2, 0xc2, 0, 0}, {0x8ce3, 0x0b, 0, 0},
+ {0x8ce4, 0xd2, 0, 0}, {0x8ce5, 0x36, 0, 0}, {0x8ce6, 0x30, 0, 0},
+ {0x8ce7, 0x09, 0, 0}, {0x8ce8, 0x09, 0, 0}, {0x8ce9, 0xc2, 0, 0},
+ {0x8cea, 0x36, 0, 0}, {0x8ceb, 0x12, 0, 0}, {0x8cec, 0x00, 0, 0},
+ {0x8ced, 0x0e, 0, 0}, {0x8cee, 0xc2, 0, 0}, {0x8cef, 0x09, 0, 0},
+ {0x8cf0, 0xd2, 0, 0}, {0x8cf1, 0x36, 0, 0}, {0x8cf2, 0x30, 0, 0},
+ {0x8cf3, 0x0e, 0, 0}, {0x8cf4, 0x03, 0, 0}, {0x8cf5, 0x12, 0, 0},
+ {0x8cf6, 0x06, 0, 0}, {0x8cf7, 0xd7, 0, 0}, {0x8cf8, 0x30, 0, 0},
+ {0x8cf9, 0x35, 0, 0}, {0x8cfa, 0xd3, 0, 0}, {0x8cfb, 0x90, 0, 0},
+ {0x8cfc, 0x30, 0, 0}, {0x8cfd, 0x29, 0, 0}, {0x8cfe, 0xe5, 0, 0},
+ {0x8cff, 0x1e, 0, 0}, {0x8d00, 0xf0, 0, 0}, {0x8d01, 0xb4, 0, 0},
+ {0x8d02, 0x10, 0, 0}, {0x8d03, 0x05, 0, 0}, {0x8d04, 0x90, 0, 0},
+ {0x8d05, 0x30, 0, 0}, {0x8d06, 0x23, 0, 0}, {0x8d07, 0xe4, 0, 0},
+ {0x8d08, 0xf0, 0, 0}, {0x8d09, 0xc2, 0, 0}, {0x8d0a, 0x35, 0, 0},
+ {0x8d0b, 0x80, 0, 0}, {0x8d0c, 0xc1, 0, 0}, {0x8d0d, 0xe4, 0, 0},
+ {0x8d0e, 0xf5, 0, 0}, {0x8d0f, 0x4b, 0, 0}, {0x8d10, 0x90, 0, 0},
+ {0x8d11, 0x0e, 0, 0}, {0x8d12, 0x7a, 0, 0}, {0x8d13, 0x93, 0, 0},
+ {0x8d14, 0xff, 0, 0}, {0x8d15, 0xe4, 0, 0}, {0x8d16, 0x8f, 0, 0},
+ {0x8d17, 0x37, 0, 0}, {0x8d18, 0xf5, 0, 0}, {0x8d19, 0x36, 0, 0},
+ {0x8d1a, 0xf5, 0, 0}, {0x8d1b, 0x35, 0, 0}, {0x8d1c, 0xf5, 0, 0},
+ {0x8d1d, 0x34, 0, 0}, {0x8d1e, 0xaf, 0, 0}, {0x8d1f, 0x37, 0, 0},
+ {0x8d20, 0xae, 0, 0}, {0x8d21, 0x36, 0, 0}, {0x8d22, 0xad, 0, 0},
+ {0x8d23, 0x35, 0, 0}, {0x8d24, 0xac, 0, 0}, {0x8d25, 0x34, 0, 0},
+ {0x8d26, 0x90, 0, 0}, {0x8d27, 0x0e, 0, 0}, {0x8d28, 0x6a, 0, 0},
+ {0x8d29, 0x12, 0, 0}, {0x8d2a, 0x0d, 0, 0}, {0x8d2b, 0xf6, 0, 0},
+ {0x8d2c, 0x8f, 0, 0}, {0x8d2d, 0x37, 0, 0}, {0x8d2e, 0x8e, 0, 0},
+ {0x8d2f, 0x36, 0, 0}, {0x8d30, 0x8d, 0, 0}, {0x8d31, 0x35, 0, 0},
+ {0x8d32, 0x8c, 0, 0}, {0x8d33, 0x34, 0, 0}, {0x8d34, 0x90, 0, 0},
+ {0x8d35, 0x0e, 0, 0}, {0x8d36, 0x72, 0, 0}, {0x8d37, 0x12, 0, 0},
+ {0x8d38, 0x06, 0, 0}, {0x8d39, 0x7c, 0, 0}, {0x8d3a, 0xef, 0, 0},
+ {0x8d3b, 0x45, 0, 0}, {0x8d3c, 0x37, 0, 0}, {0x8d3d, 0xf5, 0, 0},
+ {0x8d3e, 0x37, 0, 0}, {0x8d3f, 0xee, 0, 0}, {0x8d40, 0x45, 0, 0},
+ {0x8d41, 0x36, 0, 0}, {0x8d42, 0xf5, 0, 0}, {0x8d43, 0x36, 0, 0},
+ {0x8d44, 0xed, 0, 0}, {0x8d45, 0x45, 0, 0}, {0x8d46, 0x35, 0, 0},
+ {0x8d47, 0xf5, 0, 0}, {0x8d48, 0x35, 0, 0}, {0x8d49, 0xec, 0, 0},
+ {0x8d4a, 0x45, 0, 0}, {0x8d4b, 0x34, 0, 0}, {0x8d4c, 0xf5, 0, 0},
+ {0x8d4d, 0x34, 0, 0}, {0x8d4e, 0xe4, 0, 0}, {0x8d4f, 0xf5, 0, 0},
+ {0x8d50, 0x22, 0, 0}, {0x8d51, 0xf5, 0, 0}, {0x8d52, 0x23, 0, 0},
+ {0x8d53, 0x85, 0, 0}, {0x8d54, 0x37, 0, 0}, {0x8d55, 0x31, 0, 0},
+ {0x8d56, 0x85, 0, 0}, {0x8d57, 0x36, 0, 0}, {0x8d58, 0x30, 0, 0},
+ {0x8d59, 0x85, 0, 0}, {0x8d5a, 0x35, 0, 0}, {0x8d5b, 0x2f, 0, 0},
+ {0x8d5c, 0x85, 0, 0}, {0x8d5d, 0x34, 0, 0}, {0x8d5e, 0x2e, 0, 0},
+ {0x8d5f, 0x12, 0, 0}, {0x8d60, 0x0f, 0, 0}, {0x8d61, 0x46, 0, 0},
+ {0x8d62, 0xe4, 0, 0}, {0x8d63, 0xf5, 0, 0}, {0x8d64, 0x22, 0, 0},
+ {0x8d65, 0xf5, 0, 0}, {0x8d66, 0x23, 0, 0}, {0x8d67, 0x90, 0, 0},
+ {0x8d68, 0x0e, 0, 0}, {0x8d69, 0x72, 0, 0}, {0x8d6a, 0x12, 0, 0},
+ {0x8d6b, 0x0d, 0, 0}, {0x8d6c, 0xea, 0, 0}, {0x8d6d, 0x12, 0, 0},
+ {0x8d6e, 0x0f, 0, 0}, {0x8d6f, 0x46, 0, 0}, {0x8d70, 0xe4, 0, 0},
+ {0x8d71, 0xf5, 0, 0}, {0x8d72, 0x22, 0, 0}, {0x8d73, 0xf5, 0, 0},
+ {0x8d74, 0x23, 0, 0}, {0x8d75, 0x90, 0, 0}, {0x8d76, 0x0e, 0, 0},
+ {0x8d77, 0x6e, 0, 0}, {0x8d78, 0x12, 0, 0}, {0x8d79, 0x0d, 0, 0},
+ {0x8d7a, 0xea, 0, 0}, {0x8d7b, 0x02, 0, 0}, {0x8d7c, 0x0f, 0, 0},
+ {0x8d7d, 0x46, 0, 0}, {0x8d7e, 0xe5, 0, 0}, {0x8d7f, 0x40, 0, 0},
+ {0x8d80, 0x24, 0, 0}, {0x8d81, 0xf2, 0, 0}, {0x8d82, 0xf5, 0, 0},
+ {0x8d83, 0x37, 0, 0}, {0x8d84, 0xe5, 0, 0}, {0x8d85, 0x3f, 0, 0},
+ {0x8d86, 0x34, 0, 0}, {0x8d87, 0x43, 0, 0}, {0x8d88, 0xf5, 0, 0},
+ {0x8d89, 0x36, 0, 0}, {0x8d8a, 0xe5, 0, 0}, {0x8d8b, 0x3e, 0, 0},
+ {0x8d8c, 0x34, 0, 0}, {0x8d8d, 0xa2, 0, 0}, {0x8d8e, 0xf5, 0, 0},
+ {0x8d8f, 0x35, 0, 0}, {0x8d90, 0xe5, 0, 0}, {0x8d91, 0x3d, 0, 0},
+ {0x8d92, 0x34, 0, 0}, {0x8d93, 0x28, 0, 0}, {0x8d94, 0xf5, 0, 0},
+ {0x8d95, 0x34, 0, 0}, {0x8d96, 0xe5, 0, 0}, {0x8d97, 0x37, 0, 0},
+ {0x8d98, 0xff, 0, 0}, {0x8d99, 0xe4, 0, 0}, {0x8d9a, 0xfe, 0, 0},
+ {0x8d9b, 0xfd, 0, 0}, {0x8d9c, 0xfc, 0, 0}, {0x8d9d, 0x78, 0, 0},
+ {0x8d9e, 0x18, 0, 0}, {0x8d9f, 0x12, 0, 0}, {0x8da0, 0x06, 0, 0},
+ {0x8da1, 0x69, 0, 0}, {0x8da2, 0x8f, 0, 0}, {0x8da3, 0x40, 0, 0},
+ {0x8da4, 0x8e, 0, 0}, {0x8da5, 0x3f, 0, 0}, {0x8da6, 0x8d, 0, 0},
+ {0x8da7, 0x3e, 0, 0}, {0x8da8, 0x8c, 0, 0}, {0x8da9, 0x3d, 0, 0},
+ {0x8daa, 0xe5, 0, 0}, {0x8dab, 0x37, 0, 0}, {0x8dac, 0x54, 0, 0},
+ {0x8dad, 0xa0, 0, 0}, {0x8dae, 0xff, 0, 0}, {0x8daf, 0xe5, 0, 0},
+ {0x8db0, 0x36, 0, 0}, {0x8db1, 0xfe, 0, 0}, {0x8db2, 0xe4, 0, 0},
+ {0x8db3, 0xfd, 0, 0}, {0x8db4, 0xfc, 0, 0}, {0x8db5, 0x78, 0, 0},
+ {0x8db6, 0x07, 0, 0}, {0x8db7, 0x12, 0, 0}, {0x8db8, 0x06, 0, 0},
+ {0x8db9, 0x56, 0, 0}, {0x8dba, 0x78, 0, 0}, {0x8dbb, 0x10, 0, 0},
+ {0x8dbc, 0x12, 0, 0}, {0x8dbd, 0x0f, 0, 0}, {0x8dbe, 0x9a, 0, 0},
+ {0x8dbf, 0xe4, 0, 0}, {0x8dc0, 0xff, 0, 0}, {0x8dc1, 0xfe, 0, 0},
+ {0x8dc2, 0xe5, 0, 0}, {0x8dc3, 0x35, 0, 0}, {0x8dc4, 0xfd, 0, 0},
+ {0x8dc5, 0xe4, 0, 0}, {0x8dc6, 0xfc, 0, 0}, {0x8dc7, 0x78, 0, 0},
+ {0x8dc8, 0x0e, 0, 0}, {0x8dc9, 0x12, 0, 0}, {0x8dca, 0x06, 0, 0},
+ {0x8dcb, 0x56, 0, 0}, {0x8dcc, 0x12, 0, 0}, {0x8dcd, 0x0f, 0, 0},
+ {0x8dce, 0x9d, 0, 0}, {0x8dcf, 0xe4, 0, 0}, {0x8dd0, 0xff, 0, 0},
+ {0x8dd1, 0xfe, 0, 0}, {0x8dd2, 0xfd, 0, 0}, {0x8dd3, 0xe5, 0, 0},
+ {0x8dd4, 0x34, 0, 0}, {0x8dd5, 0xfc, 0, 0}, {0x8dd6, 0x78, 0, 0},
+ {0x8dd7, 0x18, 0, 0}, {0x8dd8, 0x12, 0, 0}, {0x8dd9, 0x06, 0, 0},
+ {0x8dda, 0x56, 0, 0}, {0x8ddb, 0x78, 0, 0}, {0x8ddc, 0x08, 0, 0},
+ {0x8ddd, 0x12, 0, 0}, {0x8dde, 0x0f, 0, 0}, {0x8ddf, 0x9a, 0, 0},
+ {0x8de0, 0x22, 0, 0}, {0x8de1, 0x8f, 0, 0}, {0x8de2, 0x3b, 0, 0},
+ {0x8de3, 0x8e, 0, 0}, {0x8de4, 0x3a, 0, 0}, {0x8de5, 0x8d, 0, 0},
+ {0x8de6, 0x39, 0, 0}, {0x8de7, 0x8c, 0, 0}, {0x8de8, 0x38, 0, 0},
+ {0x8de9, 0x22, 0, 0}, {0x8dea, 0x12, 0, 0}, {0x8deb, 0x06, 0, 0},
+ {0x8dec, 0x7c, 0, 0}, {0x8ded, 0x8f, 0, 0}, {0x8dee, 0x31, 0, 0},
+ {0x8def, 0x8e, 0, 0}, {0x8df0, 0x30, 0, 0}, {0x8df1, 0x8d, 0, 0},
+ {0x8df2, 0x2f, 0, 0}, {0x8df3, 0x8c, 0, 0}, {0x8df4, 0x2e, 0, 0},
+ {0x8df5, 0x22, 0, 0}, {0x8df6, 0x93, 0, 0}, {0x8df7, 0xf9, 0, 0},
+ {0x8df8, 0xf8, 0, 0}, {0x8df9, 0x02, 0, 0}, {0x8dfa, 0x06, 0, 0},
+ {0x8dfb, 0x69, 0, 0}, {0x8dfc, 0x00, 0, 0}, {0x8dfd, 0x00, 0, 0},
+ {0x8dfe, 0x00, 0, 0}, {0x8dff, 0x00, 0, 0}, {0x8e00, 0x12, 0, 0},
+ {0x8e01, 0x01, 0, 0}, {0x8e02, 0x17, 0, 0}, {0x8e03, 0x08, 0, 0},
+ {0x8e04, 0x31, 0, 0}, {0x8e05, 0x15, 0, 0}, {0x8e06, 0x53, 0, 0},
+ {0x8e07, 0x54, 0, 0}, {0x8e08, 0x44, 0, 0}, {0x8e09, 0x20, 0, 0},
+ {0x8e0a, 0x20, 0, 0}, {0x8e0b, 0x20, 0, 0}, {0x8e0c, 0x20, 0, 0},
+ {0x8e0d, 0x20, 0, 0}, {0x8e0e, 0x13, 0, 0}, {0x8e0f, 0x01, 0, 0},
+ {0x8e10, 0x10, 0, 0}, {0x8e11, 0x01, 0, 0}, {0x8e12, 0x56, 0, 0},
+ {0x8e13, 0x40, 0, 0}, {0x8e14, 0x1a, 0, 0}, {0x8e15, 0x30, 0, 0},
+ {0x8e16, 0x29, 0, 0}, {0x8e17, 0x7e, 0, 0}, {0x8e18, 0x00, 0, 0},
+ {0x8e19, 0x30, 0, 0}, {0x8e1a, 0x04, 0, 0}, {0x8e1b, 0x20, 0, 0},
+ {0x8e1c, 0xdf, 0, 0}, {0x8e1d, 0x30, 0, 0}, {0x8e1e, 0x05, 0, 0},
+ {0x8e1f, 0x40, 0, 0}, {0x8e20, 0xbf, 0, 0}, {0x8e21, 0x50, 0, 0},
+ {0x8e22, 0x03, 0, 0}, {0x8e23, 0x00, 0, 0}, {0x8e24, 0xfd, 0, 0},
+ {0x8e25, 0x50, 0, 0}, {0x8e26, 0x27, 0, 0}, {0x8e27, 0x01, 0, 0},
+ {0x8e28, 0xfe, 0, 0}, {0x8e29, 0x60, 0, 0}, {0x8e2a, 0x00, 0, 0},
+ {0x8e2b, 0x11, 0, 0}, {0x8e2c, 0x00, 0, 0}, {0x8e2d, 0x3f, 0, 0},
+ {0x8e2e, 0x05, 0, 0}, {0x8e2f, 0x30, 0, 0}, {0x8e30, 0x00, 0, 0},
+ {0x8e31, 0x3f, 0, 0}, {0x8e32, 0x06, 0, 0}, {0x8e33, 0x22, 0, 0},
+ {0x8e34, 0x00, 0, 0}, {0x8e35, 0x3f, 0, 0}, {0x8e36, 0x01, 0, 0},
+ {0x8e37, 0x2a, 0, 0}, {0x8e38, 0x00, 0, 0}, {0x8e39, 0x3f, 0, 0},
+ {0x8e3a, 0x02, 0, 0}, {0x8e3b, 0x00, 0, 0}, {0x8e3c, 0x00, 0, 0},
+ {0x8e3d, 0x36, 0, 0}, {0x8e3e, 0x06, 0, 0}, {0x8e3f, 0x07, 0, 0},
+ {0x8e40, 0x00, 0, 0}, {0x8e41, 0x3f, 0, 0}, {0x8e42, 0x0b, 0, 0},
+ {0x8e43, 0x0f, 0, 0}, {0x8e44, 0xf0, 0, 0}, {0x8e45, 0x00, 0, 0},
+ {0x8e46, 0x00, 0, 0}, {0x8e47, 0x00, 0, 0}, {0x8e48, 0x00, 0, 0},
+ {0x8e49, 0x30, 0, 0}, {0x8e4a, 0x01, 0, 0}, {0x8e4b, 0x40, 0, 0},
+ {0x8e4c, 0xbf, 0, 0}, {0x8e4d, 0x30, 0, 0}, {0x8e4e, 0x01, 0, 0},
+ {0x8e4f, 0x00, 0, 0}, {0x8e50, 0xbf, 0, 0}, {0x8e51, 0x30, 0, 0},
+ {0x8e52, 0x29, 0, 0}, {0x8e53, 0x70, 0, 0}, {0x8e54, 0x00, 0, 0},
+ {0x8e55, 0x3a, 0, 0}, {0x8e56, 0x00, 0, 0}, {0x8e57, 0x00, 0, 0},
+ {0x8e58, 0xff, 0, 0}, {0x8e59, 0x3a, 0, 0}, {0x8e5a, 0x00, 0, 0},
+ {0x8e5b, 0x00, 0, 0}, {0x8e5c, 0xff, 0, 0}, {0x8e5d, 0x36, 0, 0},
+ {0x8e5e, 0x03, 0, 0}, {0x8e5f, 0x36, 0, 0}, {0x8e60, 0x02, 0, 0},
+ {0x8e61, 0x41, 0, 0}, {0x8e62, 0x44, 0, 0}, {0x8e63, 0x58, 0, 0},
+ {0x8e64, 0x20, 0, 0}, {0x8e65, 0x18, 0, 0}, {0x8e66, 0x10, 0, 0},
+ {0x8e67, 0x0a, 0, 0}, {0x8e68, 0x04, 0, 0}, {0x8e69, 0x04, 0, 0},
+ {0x8e6a, 0x00, 0, 0}, {0x8e6b, 0x03, 0, 0}, {0x8e6c, 0xff, 0, 0},
+ {0x8e6d, 0x64, 0, 0}, {0x8e6e, 0x00, 0, 0}, {0x8e6f, 0x00, 0, 0},
+ {0x8e70, 0x80, 0, 0}, {0x8e71, 0x00, 0, 0}, {0x8e72, 0x00, 0, 0},
+ {0x8e73, 0x00, 0, 0}, {0x8e74, 0x00, 0, 0}, {0x8e75, 0x00, 0, 0},
+ {0x8e76, 0x00, 0, 0}, {0x8e77, 0x02, 0, 0}, {0x8e78, 0x04, 0, 0},
+ {0x8e79, 0x06, 0, 0}, {0x8e7a, 0x06, 0, 0}, {0x8e7b, 0x00, 0, 0},
+ {0x8e7c, 0x02, 0, 0}, {0x8e7d, 0x60, 0, 0}, {0x8e7e, 0x00, 0, 0},
+ {0x8e7f, 0x70, 0, 0}, {0x8e80, 0x50, 0, 0}, {0x8e81, 0x3c, 0, 0},
+ {0x8e82, 0x28, 0, 0}, {0x8e83, 0x1e, 0, 0}, {0x8e84, 0x10, 0, 0},
+ {0x8e85, 0x10, 0, 0}, {0x8e86, 0x50, 0, 0}, {0x8e87, 0x2d, 0, 0},
+ {0x8e88, 0x28, 0, 0}, {0x8e89, 0x16, 0, 0}, {0x8e8a, 0x10, 0, 0},
+ {0x8e8b, 0x10, 0, 0}, {0x8e8c, 0x02, 0, 0}, {0x8e8d, 0x00, 0, 0},
+ {0x8e8e, 0x10, 0, 0}, {0x8e8f, 0x30, 0, 0}, {0x8e90, 0x0a, 0, 0},
+ {0x8e91, 0x04, 0, 0}, {0x8e92, 0x05, 0, 0}, {0x8e93, 0x08, 0, 0},
+ {0x8e94, 0x06, 0, 0}, {0x8e95, 0x05, 0, 0}, {0x8e96, 0x00, 0, 0},
+ {0x8e97, 0xa5, 0, 0}, {0x8e98, 0x5a, 0, 0}, {0x8e99, 0x00, 0, 0},
+ {0x8e9a, 0xae, 0, 0}, {0x8e9b, 0x35, 0, 0}, {0x8e9c, 0xaf, 0, 0},
+ {0x8e9d, 0x36, 0, 0}, {0x8e9e, 0xe4, 0, 0}, {0x8e9f, 0xfd, 0, 0},
+ {0x8ea0, 0xed, 0, 0}, {0x8ea1, 0xc3, 0, 0}, {0x8ea2, 0x95, 0, 0},
+ {0x8ea3, 0x37, 0, 0}, {0x8ea4, 0x50, 0, 0}, {0x8ea5, 0x33, 0, 0},
+ {0x8ea6, 0x12, 0, 0}, {0x8ea7, 0x0f, 0, 0}, {0x8ea8, 0xe2, 0, 0},
+ {0x8ea9, 0xe4, 0, 0}, {0x8eaa, 0x93, 0, 0}, {0x8eab, 0xf5, 0, 0},
+ {0x8eac, 0x38, 0, 0}, {0x8ead, 0x74, 0, 0}, {0x8eae, 0x01, 0, 0},
+ {0x8eaf, 0x93, 0, 0}, {0x8eb0, 0xf5, 0, 0}, {0x8eb1, 0x39, 0, 0},
+ {0x8eb2, 0x45, 0, 0}, {0x8eb3, 0x38, 0, 0}, {0x8eb4, 0x60, 0, 0},
+ {0x8eb5, 0x23, 0, 0}, {0x8eb6, 0x85, 0, 0}, {0x8eb7, 0x39, 0, 0},
+ {0x8eb8, 0x82, 0, 0}, {0x8eb9, 0x85, 0, 0}, {0x8eba, 0x38, 0, 0},
+ {0x8ebb, 0x83, 0, 0}, {0x8ebc, 0xe0, 0, 0}, {0x8ebd, 0xfc, 0, 0},
+ {0x8ebe, 0x12, 0, 0}, {0x8ebf, 0x0f, 0, 0}, {0x8ec0, 0xe2, 0, 0},
+ {0x8ec1, 0x74, 0, 0}, {0x8ec2, 0x03, 0, 0}, {0x8ec3, 0x93, 0, 0},
+ {0x8ec4, 0x52, 0, 0}, {0x8ec5, 0x04, 0, 0}, {0x8ec6, 0x12, 0, 0},
+ {0x8ec7, 0x0f, 0, 0}, {0x8ec8, 0xe2, 0, 0}, {0x8ec9, 0x74, 0, 0},
+ {0x8eca, 0x02, 0, 0}, {0x8ecb, 0x93, 0, 0}, {0x8ecc, 0x42, 0, 0},
+ {0x8ecd, 0x04, 0, 0}, {0x8ece, 0x85, 0, 0}, {0x8ecf, 0x39, 0, 0},
+ {0x8ed0, 0x82, 0, 0}, {0x8ed1, 0x85, 0, 0}, {0x8ed2, 0x38, 0, 0},
+ {0x8ed3, 0x83, 0, 0}, {0x8ed4, 0xec, 0, 0}, {0x8ed5, 0xf0, 0, 0},
+ {0x8ed6, 0x0d, 0, 0}, {0x8ed7, 0x80, 0, 0}, {0x8ed8, 0xc7, 0, 0},
+ {0x8ed9, 0x22, 0, 0}, {0x8eda, 0x78, 0, 0}, {0x8edb, 0xbe, 0, 0},
+ {0x8edc, 0xe6, 0, 0}, {0x8edd, 0xd3, 0, 0}, {0x8ede, 0x08, 0, 0},
+ {0x8edf, 0xff, 0, 0}, {0x8ee0, 0xe6, 0, 0}, {0x8ee1, 0x64, 0, 0},
+ {0x8ee2, 0x80, 0, 0}, {0x8ee3, 0xf8, 0, 0}, {0x8ee4, 0xef, 0, 0},
+ {0x8ee5, 0x64, 0, 0}, {0x8ee6, 0x80, 0, 0}, {0x8ee7, 0x98, 0, 0},
+ {0x8ee8, 0x22, 0, 0}, {0x8ee9, 0x93, 0, 0}, {0x8eea, 0xff, 0, 0},
+ {0x8eeb, 0x7e, 0, 0}, {0x8eec, 0x00, 0, 0}, {0x8eed, 0xe6, 0, 0},
+ {0x8eee, 0xfc, 0, 0}, {0x8eef, 0x08, 0, 0}, {0x8ef0, 0xe6, 0, 0},
+ {0x8ef1, 0xfd, 0, 0}, {0x8ef2, 0x12, 0, 0}, {0x8ef3, 0x04, 0, 0},
+ {0x8ef4, 0xc1, 0, 0}, {0x8ef5, 0x78, 0, 0}, {0x8ef6, 0xc1, 0, 0},
+ {0x8ef7, 0xe6, 0, 0}, {0x8ef8, 0xfc, 0, 0}, {0x8ef9, 0x08, 0, 0},
+ {0x8efa, 0xe6, 0, 0}, {0x8efb, 0xfd, 0, 0}, {0x8efc, 0xd3, 0, 0},
+ {0x8efd, 0xef, 0, 0}, {0x8efe, 0x9d, 0, 0}, {0x8eff, 0xee, 0, 0},
+ {0x8f00, 0x9c, 0, 0}, {0x8f01, 0x22, 0, 0}, {0x8f02, 0x78, 0, 0},
+ {0x8f03, 0xbd, 0, 0}, {0x8f04, 0xd3, 0, 0}, {0x8f05, 0xe6, 0, 0},
+ {0x8f06, 0x64, 0, 0}, {0x8f07, 0x80, 0, 0}, {0x8f08, 0x94, 0, 0},
+ {0x8f09, 0x80, 0, 0}, {0x8f0a, 0x22, 0, 0}, {0x8f0b, 0x25, 0, 0},
+ {0x8f0c, 0xe0, 0, 0}, {0x8f0d, 0x24, 0, 0}, {0x8f0e, 0x0a, 0, 0},
+ {0x8f0f, 0xf8, 0, 0}, {0x8f10, 0xe6, 0, 0}, {0x8f11, 0xfe, 0, 0},
+ {0x8f12, 0x08, 0, 0}, {0x8f13, 0xe6, 0, 0}, {0x8f14, 0xff, 0, 0},
+ {0x8f15, 0x22, 0, 0}, {0x8f16, 0xe5, 0, 0}, {0x8f17, 0x3c, 0, 0},
+ {0x8f18, 0xd3, 0, 0}, {0x8f19, 0x94, 0, 0}, {0x8f1a, 0x00, 0, 0},
+ {0x8f1b, 0x40, 0, 0}, {0x8f1c, 0x0b, 0, 0}, {0x8f1d, 0x90, 0, 0},
+ {0x8f1e, 0x0e, 0, 0}, {0x8f1f, 0x88, 0, 0}, {0x8f20, 0x12, 0, 0},
+ {0x8f21, 0x0b, 0, 0}, {0x8f22, 0xf1, 0, 0}, {0x8f23, 0x90, 0, 0},
+ {0x8f24, 0x0e, 0, 0}, {0x8f25, 0x86, 0, 0}, {0x8f26, 0x80, 0, 0},
+ {0x8f27, 0x09, 0, 0}, {0x8f28, 0x90, 0, 0}, {0x8f29, 0x0e, 0, 0},
+ {0x8f2a, 0x82, 0, 0}, {0x8f2b, 0x12, 0, 0}, {0x8f2c, 0x0b, 0, 0},
+ {0x8f2d, 0xf1, 0, 0}, {0x8f2e, 0x90, 0, 0}, {0x8f2f, 0x0e, 0, 0},
+ {0x8f30, 0x80, 0, 0}, {0x8f31, 0xe4, 0, 0}, {0x8f32, 0x93, 0, 0},
+ {0x8f33, 0xf5, 0, 0}, {0x8f34, 0x44, 0, 0}, {0x8f35, 0xa3, 0, 0},
+ {0x8f36, 0xe4, 0, 0}, {0x8f37, 0x93, 0, 0}, {0x8f38, 0xf5, 0, 0},
+ {0x8f39, 0x43, 0, 0}, {0x8f3a, 0xd2, 0, 0}, {0x8f3b, 0x06, 0, 0},
+ {0x8f3c, 0x30, 0, 0}, {0x8f3d, 0x06, 0, 0}, {0x8f3e, 0x03, 0, 0},
+ {0x8f3f, 0xd3, 0, 0}, {0x8f40, 0x80, 0, 0}, {0x8f41, 0x01, 0, 0},
+ {0x8f42, 0xc3, 0, 0}, {0x8f43, 0x92, 0, 0}, {0x8f44, 0x0e, 0, 0},
+ {0x8f45, 0x22, 0, 0}, {0x8f46, 0xa2, 0, 0}, {0x8f47, 0xaf, 0, 0},
+ {0x8f48, 0x92, 0, 0}, {0x8f49, 0x32, 0, 0}, {0x8f4a, 0xc2, 0, 0},
+ {0x8f4b, 0xaf, 0, 0}, {0x8f4c, 0xe5, 0, 0}, {0x8f4d, 0x23, 0, 0},
+ {0x8f4e, 0x45, 0, 0}, {0x8f4f, 0x22, 0, 0}, {0x8f50, 0x90, 0, 0},
+ {0x8f51, 0x0e, 0, 0}, {0x8f52, 0x5d, 0, 0}, {0x8f53, 0x60, 0, 0},
+ {0x8f54, 0x0e, 0, 0}, {0x8f55, 0x12, 0, 0}, {0x8f56, 0x0f, 0, 0},
+ {0x8f57, 0xcb, 0, 0}, {0x8f58, 0xe0, 0, 0}, {0x8f59, 0xf5, 0, 0},
+ {0x8f5a, 0x2c, 0, 0}, {0x8f5b, 0x12, 0, 0}, {0x8f5c, 0x0f, 0, 0},
+ {0x8f5d, 0xc8, 0, 0}, {0x8f5e, 0xe0, 0, 0}, {0x8f5f, 0xf5, 0, 0},
+ {0x8f60, 0x2d, 0, 0}, {0x8f61, 0x80, 0, 0}, {0x8f62, 0x0c, 0, 0},
+ {0x8f63, 0x12, 0, 0}, {0x8f64, 0x0f, 0, 0}, {0x8f65, 0xcb, 0, 0},
+ {0x8f66, 0xe5, 0, 0}, {0x8f67, 0x30, 0, 0}, {0x8f68, 0xf0, 0, 0},
+ {0x8f69, 0x12, 0, 0}, {0x8f6a, 0x0f, 0, 0}, {0x8f6b, 0xc8, 0, 0},
+ {0x8f6c, 0xe5, 0, 0}, {0x8f6d, 0x31, 0, 0}, {0x8f6e, 0xf0, 0, 0},
+ {0x8f6f, 0xa2, 0, 0}, {0x8f70, 0x32, 0, 0}, {0x8f71, 0x92, 0, 0},
+ {0x8f72, 0xaf, 0, 0}, {0x8f73, 0x22, 0, 0}, {0x8f74, 0xd2, 0, 0},
+ {0x8f75, 0x01, 0, 0}, {0x8f76, 0xc2, 0, 0}, {0x8f77, 0x02, 0, 0},
+ {0x8f78, 0xe4, 0, 0}, {0x8f79, 0xf5, 0, 0}, {0x8f7a, 0x1f, 0, 0},
+ {0x8f7b, 0xf5, 0, 0}, {0x8f7c, 0x1e, 0, 0}, {0x8f7d, 0xd2, 0, 0},
+ {0x8f7e, 0x35, 0, 0}, {0x8f7f, 0xd2, 0, 0}, {0x8f80, 0x33, 0, 0},
+ {0x8f81, 0xd2, 0, 0}, {0x8f82, 0x36, 0, 0}, {0x8f83, 0xd2, 0, 0},
+ {0x8f84, 0x01, 0, 0}, {0x8f85, 0xc2, 0, 0}, {0x8f86, 0x02, 0, 0},
+ {0x8f87, 0xf5, 0, 0}, {0x8f88, 0x1f, 0, 0}, {0x8f89, 0xf5, 0, 0},
+ {0x8f8a, 0x1e, 0, 0}, {0x8f8b, 0xd2, 0, 0}, {0x8f8c, 0x35, 0, 0},
+ {0x8f8d, 0xd2, 0, 0}, {0x8f8e, 0x33, 0, 0}, {0x8f8f, 0x22, 0, 0},
+ {0x8f90, 0xfb, 0, 0}, {0x8f91, 0xd3, 0, 0}, {0x8f92, 0xed, 0, 0},
+ {0x8f93, 0x9b, 0, 0}, {0x8f94, 0x74, 0, 0}, {0x8f95, 0x80, 0, 0},
+ {0x8f96, 0xf8, 0, 0}, {0x8f97, 0x6c, 0, 0}, {0x8f98, 0x98, 0, 0},
+ {0x8f99, 0x22, 0, 0}, {0x8f9a, 0x12, 0, 0}, {0x8f9b, 0x06, 0, 0},
+ {0x8f9c, 0x69, 0, 0}, {0x8f9d, 0xe5, 0, 0}, {0x8f9e, 0x40, 0, 0},
+ {0x8f9f, 0x2f, 0, 0}, {0x8fa0, 0xf5, 0, 0}, {0x8fa1, 0x40, 0, 0},
+ {0x8fa2, 0xe5, 0, 0}, {0x8fa3, 0x3f, 0, 0}, {0x8fa4, 0x3e, 0, 0},
+ {0x8fa5, 0xf5, 0, 0}, {0x8fa6, 0x3f, 0, 0}, {0x8fa7, 0xe5, 0, 0},
+ {0x8fa8, 0x3e, 0, 0}, {0x8fa9, 0x3d, 0, 0}, {0x8faa, 0xf5, 0, 0},
+ {0x8fab, 0x3e, 0, 0}, {0x8fac, 0xe5, 0, 0}, {0x8fad, 0x3d, 0, 0},
+ {0x8fae, 0x3c, 0, 0}, {0x8faf, 0xf5, 0, 0}, {0x8fb0, 0x3d, 0, 0},
+ {0x8fb1, 0x22, 0, 0}, {0x8fb2, 0xc0, 0, 0}, {0x8fb3, 0xe0, 0, 0},
+ {0x8fb4, 0xc0, 0, 0}, {0x8fb5, 0x83, 0, 0}, {0x8fb6, 0xc0, 0, 0},
+ {0x8fb7, 0x82, 0, 0}, {0x8fb8, 0x90, 0, 0}, {0x8fb9, 0x3f, 0, 0},
+ {0x8fba, 0x0d, 0, 0}, {0x8fbb, 0xe0, 0, 0}, {0x8fbc, 0xf5, 0, 0},
+ {0x8fbd, 0x33, 0, 0}, {0x8fbe, 0xe5, 0, 0}, {0x8fbf, 0x33, 0, 0},
+ {0x8fc0, 0xf0, 0, 0}, {0x8fc1, 0xd0, 0, 0}, {0x8fc2, 0x82, 0, 0},
+ {0x8fc3, 0xd0, 0, 0}, {0x8fc4, 0x83, 0, 0}, {0x8fc5, 0xd0, 0, 0},
+ {0x8fc6, 0xe0, 0, 0}, {0x8fc7, 0x32, 0, 0}, {0x8fc8, 0x90, 0, 0},
+ {0x8fc9, 0x0e, 0, 0}, {0x8fca, 0x5f, 0, 0}, {0x8fcb, 0xe4, 0, 0},
+ {0x8fcc, 0x93, 0, 0}, {0x8fcd, 0xfe, 0, 0}, {0x8fce, 0x74, 0, 0},
+ {0x8fcf, 0x01, 0, 0}, {0x8fd0, 0x93, 0, 0}, {0x8fd1, 0xf5, 0, 0},
+ {0x8fd2, 0x82, 0, 0}, {0x8fd3, 0x8e, 0, 0}, {0x8fd4, 0x83, 0, 0},
+ {0x8fd5, 0x22, 0, 0}, {0x8fd6, 0x78, 0, 0}, {0x8fd7, 0x7f, 0, 0},
+ {0x8fd8, 0xe4, 0, 0}, {0x8fd9, 0xf6, 0, 0}, {0x8fda, 0xd8, 0, 0},
+ {0x8fdb, 0xfd, 0, 0}, {0x8fdc, 0x75, 0, 0}, {0x8fdd, 0x81, 0, 0},
+ {0x8fde, 0xcd, 0, 0}, {0x8fdf, 0x02, 0, 0}, {0x8fe0, 0x0c, 0, 0},
+ {0x8fe1, 0x98, 0, 0}, {0x8fe2, 0x8f, 0, 0}, {0x8fe3, 0x82, 0, 0},
+ {0x8fe4, 0x8e, 0, 0}, {0x8fe5, 0x83, 0, 0}, {0x8fe6, 0x75, 0, 0},
+ {0x8fe7, 0xf0, 0, 0}, {0x8fe8, 0x04, 0, 0}, {0x8fe9, 0xed, 0, 0},
+ {0x8fea, 0x02, 0, 0}, {0x8feb, 0x06, 0, 0}, {0x8fec, 0xa5, 0, 0}
+};
diff --git a/drivers/media/platform/mxc/capture/ov5640_mipi.c b/drivers/media/platform/mxc/capture/ov5640_mipi.c
index 4b19076..39125c0 100644
--- a/drivers/media/platform/mxc/capture/ov5640_mipi.c
+++ b/drivers/media/platform/mxc/capture/ov5640_mipi.c
@@ -105,6 +105,10 @@ struct ov5640_mode_info {
static struct sensor_data ov5640_data;
static int pwn_gpio, rst_gpio;
+/* Mutex is needed since register access can happen both from ioctls
+ * and from workqueue */
+static DEFINE_MUTEX(ov5640_mutex);
+
static struct reg_value ov5640_init_setting_30fps_VGA[] = {
{0x3103, 0x11, 0, 0}, {0x3008, 0x82, 0, 5}, {0x3008, 0x42, 0, 0},
@@ -1309,6 +1313,579 @@ err:
return retval;
}
+
+/* AF firmware BLOB */
+
+/* FIXME: "no firmware" should become a state, and firmware loading should
+ * be moved to workqueue. This is the only sane way to handle reloading
+ * firmware and then restore state after resume.
+ * Current code just breaks after suspend (because after chip powercycle
+ * firmware will be no longer running).
+ *
+ * FIXME: implement firmware timeout: if command is not ack'ed in time, reset
+ * microcontroller and/or reload firmware
+ */
+
+#include "ov5640_af_firmware.c"
+
+/* AF-related registers */
+
+#define REG_SYSTEM_RESET00 0x3000
+#define REG_AF_CMD_MAIN 0x3022
+#define REG_AF_CMD_ACK 0x3023
+#define REG_AF_PARAM0 0x3024
+#define REG_AF_PARAM1 0x3025
+#define REG_AF_PARAM2 0x3026
+#define REG_AF_PARAM3 0x3027
+#define REG_AF_RESULT 0x3028
+#define REG_AF_FW_STATUS 0x3029
+
+#define REG_SYSTEM_RESET00_RESET_MC BIT(5)
+
+/* Firmware load timeout (ms) */
+#define AF_FW_INIT_TIMEOUT 1000
+
+/* Formware status values */
+#define AF_FW_STATUS_NOT_RUNNING 0x7f
+#define AF_FW_STATUS_INITIALIZING 0x7e
+#define AF_FW_STATUS_IDLE 0x70
+
+/* REG_AF_CMD_MAIN command codes */
+#define AF_CMD_SINGLE 0x03
+#define AF_CMD_CONTINUOUS 0x04
+#define AF_CMD_PAUSE 0x06
+#define AF_CMD_RELEASE 0x08
+
+/* REG_AF_CMD_ACK values */
+#define AF_ACK_SET 0x01
+#define AF_ACK_DONE 0x00
+
+/* REG_AF_RESULT values */
+#define AF_RESULT_FAILED 0x00
+
+/* AF states visible to driver */
+
+enum {
+ AF_STATE_RELEASED, /* focus is released to infinity */
+ AF_STATE_FOCUSED, /* single AF done, lens stay */
+ AF_STATE_CONTINUOUS, /* continuous AF running */
+ AF_STATE_PAUSED, /* continuous AF paused */
+
+ AF_STATE_FOCUSING, /* single AF started but not completed */
+ AF_STATE_STARTING, /* starting continuous AF */
+ AF_STATE_PAUSING, /* pausing continuous AF */
+ AF_STATE_RELEASING, /* releasing focus */
+
+ AF_STATE_PENDING_REFOCUS, /* was focused but new focus pending */
+ AF_STATE_PENDING_RELEASE, /* could not send release command */
+};
+
+
+static bool af_fw_ok; /* is firmware operational? */
+static int af_state; /* current firmware state */
+static int af_target_state; /* state needed to reach to complete
+ request */
+static bool af_error; /* last focusing failed? */
+static DECLARE_WAIT_QUEUE_HEAD(af_state_wait);
+
+static void af_work_func(struct work_struct *work);
+static DECLARE_DELAYED_WORK(af_work, af_work_func);
+
+static inline void af_schedule_work(void)
+{
+ mod_delayed_work(system_wq, &af_work, 0);
+}
+static inline void af_reschedule_work(void)
+{
+ mod_delayed_work(system_wq, &af_work, 1);
+}
+
+static bool focus_auto = false;
+static int focus_range = V4L2_AUTO_FOCUS_RANGE_NORMAL;
+static bool focus_locked = false;
+
+static int af_init(void)
+{
+ u8 reg;
+ unsigned long timeout;
+ int ret = -EIO;
+
+ static struct reg_value init_af_firmware[] = {
+ {REG_AF_CMD_MAIN, 0x00, 0, 0},
+ {REG_AF_CMD_ACK, 0x00, 0, 0},
+ {REG_AF_PARAM0, 0x00, 0, 0},
+ {REG_AF_PARAM1, 0x00, 0, 0},
+ {REG_AF_PARAM2, 0x00, 0, 0},
+ {REG_AF_PARAM3, 0x00, 0, 0},
+ {REG_AF_RESULT, 0x00, 0, 0},
+ {REG_AF_FW_STATUS, AF_FW_STATUS_NOT_RUNNING, 0, 0},
+ };
+
+ mutex_lock(&ov5640_mutex);
+
+ af_fw_ok = false;
+
+ /* Move microcontroller to reset */
+
+ ret = ov5640_read_reg(REG_SYSTEM_RESET00, ®);
+ if (ret < 0) {
+ pr_err("%s: microcontroller status read failed\n", __func__);
+ goto out;
+ }
+
+ reg |= REG_SYSTEM_RESET00_RESET_MC;
+ ret = ov5640_write_reg(REG_SYSTEM_RESET00, reg);
+ if (ret < 0) {
+ pr_err("%s: microcontroller reset failed\n", __func__);
+ goto out;
+ }
+
+ /* Download firmware */
+ /* FIXME: better to download firmware using group writes */
+
+ ret = ov5640_download_firmware(ov5640_af_firmware,
+ ARRAY_SIZE(ov5640_af_firmware));
+ if (ret < 0) {
+ pr_err("%s: AF firmware download failed\n", __func__);
+ goto out;
+ }
+
+ /* Set firmware's interface registers to initial values */
+
+ ret = ov5640_download_firmware(init_af_firmware,
+ ARRAY_SIZE(init_af_firmware));
+ if (ret < 0) {
+ pr_err("%s: AF firmware init failed\n", __func__);
+ goto out;
+ }
+
+ /* Start microcontroller */
+
+ reg &= ~REG_SYSTEM_RESET00_RESET_MC;
+ ret = ov5640_write_reg(REG_SYSTEM_RESET00, reg);
+ if (ret < 0) {
+ pr_err("%s: microcontroller start failed\n", __func__);
+ goto out;
+ }
+
+ /* Wait for firmware to become ready */
+
+ timeout = jiffies + msecs_to_jiffies(AF_FW_INIT_TIMEOUT);
+ do {
+ msleep(1);
+ ret = ov5640_read_reg(REG_AF_FW_STATUS, ®);
+ if (ret < 0) {
+ pr_err("%s: firmware status read failed\n", __func__);
+ goto out;
+ }
+ } while (reg != AF_FW_STATUS_IDLE && time_before(jiffies, timeout));
+
+ if (reg != AF_FW_STATUS_IDLE) {
+ pr_err("%s: firmware is not respoinding\n", __func__);
+ goto out;
+ }
+
+ pr_debug("ov5640_mipi: initialized AF successufully\n");
+
+ af_fw_ok = true;
+ af_state = af_target_state = AF_STATE_RELEASED;
+ af_error = false;
+ focus_auto = false;
+ focus_range = V4L2_AUTO_FOCUS_RANGE_NORMAL;
+ focus_locked = false;
+
+ ret = 0;
+out:
+ mutex_unlock(&ov5640_mutex);
+ return ret;
+}
+
+static void af_deinit(void)
+{
+ if (!af_fw_ok)
+ return;
+
+ mutex_lock(&ov5640_mutex);
+ af_target_state = AF_STATE_RELEASED;
+ af_schedule_work();
+ mutex_unlock(&ov5640_mutex);
+
+ wait_event_interruptible_timeout(af_state_wait,
+ af_state == AF_STATE_RELEASED, HZ);
+
+ if (unlikely(af_state != AF_STATE_RELEASED))
+ cancel_delayed_work_sync(&af_work);
+
+ af_fw_ok = false;
+}
+
+static void af_set_state(int state)
+{
+ af_state = state;
+
+ if (state == AF_STATE_FOCUSED || state == AF_STATE_PAUSED ||
+ state == AF_STATE_RELEASED)
+ wake_up_interruptible_all(&af_state_wait);
+}
+
+static int af_state_while_running_command(u8 command)
+{
+ switch (command) {
+ case AF_CMD_SINGLE:
+ return AF_STATE_FOCUSING;
+ case AF_CMD_CONTINUOUS:
+ return AF_STATE_STARTING;
+ case AF_CMD_PAUSE:
+ return AF_STATE_PAUSING;
+ case AF_CMD_RELEASE:
+ return AF_STATE_RELEASING;
+ default:
+ BUG();
+ return AF_STATE_RELEASED; /* unreached */
+ }
+}
+
+static int af_next_state(int state)
+{
+ switch (state) {
+ case AF_STATE_STARTING:
+ return AF_STATE_CONTINUOUS;
+ case AF_STATE_PAUSING:
+ return AF_STATE_PAUSED;
+ case AF_STATE_RELEASING:
+ return AF_STATE_RELEASED;
+ default:
+ BUG();
+ return AF_STATE_RELEASED; /* unreached */
+ }
+}
+
+static int af_send_command(u8 command)
+{
+ if (ov5640_write_reg(REG_AF_CMD_ACK, AF_ACK_SET) < 0)
+ return -EIO;;
+
+ if (ov5640_write_reg(REG_AF_CMD_MAIN, command) < 0)
+ return -EIO;
+
+ af_state = af_state_while_running_command(command);
+ return 0;
+}
+
+static void af_work_func(struct work_struct *work)
+{
+ u8 reg;
+
+ mutex_lock(&ov5640_mutex);
+
+ /* If in intermediate state, firmware won't accept a new command
+ * anyway. Thus check hardware's progress and update state if
+ * needed, otherwise just wait */
+
+ if (af_state == AF_STATE_FOCUSING || af_state == AF_STATE_STARTING ||
+ af_state == AF_STATE_PAUSING || af_state == AF_STATE_RELEASING) {
+
+ if (ov5640_read_reg(REG_AF_CMD_ACK, ®) < 0)
+ goto out; /* check later */
+
+ if (reg != AF_ACK_DONE)
+ goto out; /* no state update yet */
+
+ if (af_state == AF_STATE_FOCUSING) {
+
+ /* single AF done - check status */
+
+ if (ov5640_read_reg(REG_AF_RESULT, ®) < 0)
+ goto out; /* try later */
+
+ if (reg == AF_RESULT_FAILED) {
+ if (af_target_state == AF_STATE_FOCUSED) {
+ af_error = true;
+ af_target_state = AF_STATE_RELEASED;
+ }
+ if (af_send_command(AF_CMD_RELEASE) < 0)
+ af_set_state(AF_STATE_PENDING_RELEASE);
+ goto out;
+ }
+
+ af_set_state(AF_STATE_FOCUSED);
+
+ } else /* other intermediate state */
+ af_set_state(af_next_state(af_state));
+ }
+
+ /* Stop if achieved target state */
+
+ if (likely(af_state == af_target_state))
+ goto out_no_check;
+
+ /* Failed attempts to release must be retried */
+
+ if (unlikely(af_state == AF_STATE_PENDING_RELEASE)) {
+ af_send_command(AF_CMD_RELEASE);
+ goto out;
+ }
+
+ /* Do step to achieve target state */
+
+ switch (af_target_state) {
+
+ case AF_STATE_FOCUSED:
+
+ switch (af_state) {
+ case AF_STATE_RELEASED:
+ case AF_STATE_PENDING_REFOCUS:
+ case AF_STATE_PAUSED:
+ af_send_command(AF_CMD_SINGLE);
+ break;
+ case AF_STATE_CONTINUOUS:
+ af_send_command(AF_CMD_PAUSE);
+ break;
+ default:
+ BUG();
+ }
+ break;
+
+ case AF_STATE_CONTINUOUS:
+
+ switch (af_state) {
+ case AF_STATE_RELEASED:
+ case AF_STATE_PENDING_REFOCUS:
+ case AF_STATE_FOCUSED:
+ case AF_STATE_PAUSED:
+ af_send_command(AF_CMD_CONTINUOUS);
+ break;
+ default:
+ BUG();
+ }
+ break;
+
+ case AF_STATE_PAUSED:
+
+ switch (af_state) {
+ case AF_STATE_RELEASED:
+ af_send_command(AF_CMD_CONTINUOUS); /* enable VCM */
+ break;
+ case AF_STATE_PENDING_REFOCUS:
+ case AF_STATE_FOCUSED:
+ af_set_state(AF_STATE_PAUSED); /* already there */
+ break;
+ case AF_STATE_CONTINUOUS:
+ af_send_command(AF_CMD_PAUSE);
+ break;
+ default:
+ BUG();
+ }
+ break;
+
+ case AF_STATE_RELEASED:
+
+ if (af_send_command(AF_CMD_RELEASE) < 0)
+ af_set_state(AF_STATE_PENDING_RELEASE);
+ break;
+
+ default:
+ BUG();
+ }
+
+out:
+ if (af_state != af_target_state)
+ af_reschedule_work();
+out_no_check:
+ mutex_unlock(&ov5640_mutex);
+}
+
+/* Singe autofocus support:
+ * - supports V4L2_AUTO_FOCUS_RANGE_NORMAL and V4L2_AUTO_FOCUS_RANGE_INFINITY
+ * - in V4L2_AUTO_FOCUS_RANGE_NORMAL:
+ * - V4L2_CID_AUTO_FOCUS_START triggers single auto focus,
+ * - V4L2_CID_AUTO_FOCUS_STOP releases focus,
+ * - V4L2_CID_AUTO_FOCUS_STATUS returns focusing state,
+ * - in V4L2_AUTO_FOCUS_RANGE_INFINITY:
+ * - V4L2_CID_AUTO_FOCUS_START releases focus
+ * - V4L2_CID_AUTO_FOCUS_STOP also releases focus
+ * - V4L2_CID_AUTO_FOCUS_STATUS returns V4L2_AUTO_FOCUS_STATUS_REACHED for
+ * released focus and V4L2_AUTO_FOCUS_STATUS_BUSY for not yet released
+ * focus
+ */
+static void af_start_single(void)
+{
+ mutex_lock(&ov5640_mutex);
+
+ /* Ignore request is AF firmware is not ok */
+ if (!af_fw_ok)
+ goto out;
+
+ /* Ignore request if V4L2_CID_FOCUS_AUTO is set to TRUE */
+ if (focus_auto)
+ goto out;
+
+ switch (focus_range) {
+ case V4L2_AUTO_FOCUS_RANGE_NORMAL:
+ af_target_state = AF_STATE_FOCUSED;
+ if (af_state == AF_STATE_FOCUSED)
+ af_state = AF_STATE_PENDING_REFOCUS;
+ break;
+ case V4L2_AUTO_FOCUS_RANGE_INFINITY:
+ af_target_state = AF_STATE_RELEASED;
+ break;
+ default:
+ BUG();
+ }
+ af_error = false;
+ af_schedule_work();
+
+out:
+ mutex_unlock(&ov5640_mutex);
+}
+
+static void af_stop_single(void)
+{
+ mutex_lock(&ov5640_mutex);
+
+ /* Ignore request is AF firmware is not ok */
+ if (!af_fw_ok)
+ goto out;
+
+ /* Ignore request if V4L2_CID_FOCUS_AUTO is set to TRUE */
+ if (focus_auto)
+ goto out;
+
+ af_target_state = AF_STATE_RELEASED;
+ af_error = false;
+ af_schedule_work();
+
+out:
+ mutex_unlock(&ov5640_mutex);
+}
+
+static int af_get_status(void)
+{
+ int ret;
+
+ mutex_lock(&ov5640_mutex);
+
+ if (!af_fw_ok || af_error) {
+ ret = V4L2_AUTO_FOCUS_STATUS_FAILED;
+ goto out;
+ }
+
+ switch (focus_range) {
+
+ case V4L2_AUTO_FOCUS_RANGE_NORMAL:
+ if (af_state == AF_STATE_FOCUSED)
+ ret = V4L2_AUTO_FOCUS_STATUS_REACHED;
+ else if (af_state == AF_STATE_RELEASED)
+ ret = V4L2_AUTO_FOCUS_STATUS_IDLE;
+ else
+ ret = V4L2_AUTO_FOCUS_STATUS_BUSY;
+ break;
+
+ case V4L2_AUTO_FOCUS_RANGE_INFINITY:
+ if (af_state == AF_STATE_RELEASED)
+ ret = V4L2_AUTO_FOCUS_STATUS_REACHED;
+ else
+ ret = V4L2_AUTO_FOCUS_STATUS_BUSY;
+ break;
+
+ default:
+ BUG();
+ }
+
+out:
+ mutex_unlock(&ov5640_mutex);
+
+ return ret;
+}
+
+/* V4L2_CID_FOCUS_AUTO support:
+ *
+ * - mutually exclusive with V4L2_CID_AUTO_FOCUS_(START|STOP)
+ * - supports V4L2_AUTO_FOCUS_RANGE_NORMAL and V4L2_AUTO_FOCUS_RANGE_INFINITY
+ * - RANGE_NORMAL corresponds to STATE_CONTINUOUS
+ * RANGE_INFINITY corresponds to STATE_RELEASED
+ * - V4L2_CID_3A_LOCK(focus):
+ * - moves STATE_CONTINUOUS to STATE_PAUSED,
+ * - delays applying of RANGE change
+ */
+static void apply_focus_auto_update(void)
+{
+ int wanted_state;
+
+ if (focus_auto) {
+ if (focus_locked) {
+ if (af_target_state == AF_STATE_CONTINUOUS)
+ wanted_state = AF_STATE_PAUSED;
+ else
+ wanted_state = af_target_state;
+ } else if (focus_range == V4L2_AUTO_FOCUS_RANGE_NORMAL)
+ wanted_state = AF_STATE_CONTINUOUS;
+ else
+ wanted_state = AF_STATE_RELEASED;
+ } else
+ wanted_state = AF_STATE_RELEASED;
+
+ if (wanted_state != af_target_state) {
+ af_target_state = wanted_state;
+ af_schedule_work();
+ }
+}
+
+static void af_set_auto(bool enable)
+{
+ mutex_lock(&ov5640_mutex);
+
+ if (af_fw_ok && (enable != focus_auto)) {
+ focus_auto = enable;
+ af_error = false;
+ focus_locked = false;
+ apply_focus_auto_update();
+ }
+
+ mutex_unlock(&ov5640_mutex);
+}
+
+static void af_set_focus_range(int range)
+{
+ mutex_lock(&ov5640_mutex);
+
+ if (af_fw_ok) {
+ if (range == V4L2_AUTO_FOCUS_RANGE_INFINITY)
+ focus_range = V4L2_AUTO_FOCUS_RANGE_INFINITY;
+ else
+ focus_range = V4L2_AUTO_FOCUS_RANGE_NORMAL;
+
+ if (focus_auto)
+ apply_focus_auto_update();
+ else if (focus_range == V4L2_AUTO_FOCUS_RANGE_INFINITY &&
+ af_target_state != AF_STATE_RELEASED) {
+ af_target_state = AF_STATE_RELEASED;
+ af_schedule_work();
+ }
+ }
+
+ mutex_unlock(&ov5640_mutex);
+}
+
+static int af_set_focus_lock(bool locked)
+{
+ mutex_lock(&ov5640_mutex);
+
+ if (af_fw_ok && focus_auto && (locked != focus_locked)) {
+ focus_locked = locked;
+ apply_focus_auto_update();
+ if (locked) {
+ /* wait for lock to apply */
+ mutex_unlock(&ov5640_mutex);
+ return wait_event_interruptible(af_state_wait,
+ af_state == af_target_state);
+ }
+ }
+
+ mutex_unlock(&ov5640_mutex);
+ return 0;
+}
+
static int ov5640_init_mode(enum ov5640_frame_rate frame_rate,
enum ov5640_mode mode, enum ov5640_mode orig_mode)
{
@@ -1605,8 +2182,10 @@ static int ioctl_s_parm(struct v4l2_int_device *s, struct v4l2_streamparm *a)
}
orig_mode = sensor->streamcap.capturemode;
+ mutex_lock(&ov5640_mutex);
ret = ov5640_init_mode(frame_rate,
(u32)a->parm.capture.capturemode, orig_mode);
+ mutex_unlock(&ov5640_mutex);
if (ret < 0)
return ret;
@@ -1690,6 +2269,18 @@ static int ioctl_g_ctrl(struct v4l2_int_device *s, struct v4l2_control *vc)
case V4L2_CID_EXPOSURE:
vc->value = ov5640_data.ae_mode;
break;
+ case V4L2_CID_AUTO_FOCUS_STATUS:
+ vc->value = af_get_status();
+ break;
+ case V4L2_CID_FOCUS_AUTO:
+ vc->value = focus_auto;
+ break;
+ case V4L2_CID_AUTO_FOCUS_RANGE:
+ vc->value = focus_range;
+ break;
+ case V4L2_CID_3A_LOCK:
+ vc->value = focus_locked ? V4L2_LOCK_FOCUS : 0;
+ break;
default:
ret = -EINVAL;
}
@@ -1742,6 +2333,21 @@ static int ioctl_s_ctrl(struct v4l2_int_device *s, struct v4l2_control *vc)
break;
case V4L2_CID_VFLIP:
break;
+ case V4L2_CID_AUTO_FOCUS_START:
+ af_start_single();
+ break;
+ case V4L2_CID_AUTO_FOCUS_STOP:
+ af_stop_single();
+ break;
+ case V4L2_CID_FOCUS_AUTO:
+ af_set_auto(!!vc->value);
+ break;
+ case V4L2_CID_AUTO_FOCUS_RANGE:
+ af_set_focus_range(vc->value);
+ break;
+ case V4L2_CID_3A_LOCK:
+ af_set_focus_lock(!(vc->value & V4L2_LOCK_FOCUS));
+ break;
default:
retval = -EPERM;
break;
@@ -1898,7 +2504,14 @@ static int ioctl_dev_init(struct v4l2_int_device *s)
return -EPERM;
}
+ mutex_lock(&ov5640_mutex);
ret = ov5640_init_mode(frame_rate, ov5640_mode_INIT, ov5640_mode_INIT);
+ mutex_unlock(&ov5640_mutex);
+
+ if (ret == 0) {
+ if (af_init())
+ pr_warning("OV5640 AF init failed\n");
+ }
return ret;
}
@@ -1913,6 +2526,8 @@ static int ioctl_dev_exit(struct v4l2_int_device *s)
{
void *mipi_csi2_info;
+ af_deinit();
+
mipi_csi2_info = mipi_csi2_get_info();
/* disable mipi csi2 */
--
2.1.4
[-- Attachment #4: qtmultimedia-recipe-append.tar.bz2 --]
[-- Type: application/x-bzip, Size: 74184 bytes --]
[-- Attachment #5: v4l2src-implement-autofocus-control.patch --]
[-- Type: text/x-patch, Size: 24913 bytes --]
From 3e449256ec94772eef6ea4b65ec3cde66890f8b7 Mon Sep 17 00:00:00 2001
From: Nikita Yushchenko <nyushchenko@dev.rtsoft.ru>
Date: Sat, 26 Sep 2015 11:12:23 +0300
Subject: [PATCH] v4l2src: implement autofocus control
This patch adds simple GstPhotography integration, and implements
autofocus related part of GstPhotography.
GstPhotography implementation is fare incomplete - only autofocus
related part is implemented.
Side effect: had to rename capture-mode property to imx-capture mode, to
avoid conflict with "capture-mode" setting from WrapperCameraBinSrc.
Signed-off-by: Nikita Yushchenko <nyushchenko@dev.rtsoft.ru>
---
src/v4l2src/v4l2src.c | 558 +++++++++++++++++++++++++++++++++++++++++++++++++-
src/v4l2src/v4l2src.h | 4 +
src/v4l2src/wscript | 2 +-
wscript | 1 +
4 files changed, 556 insertions(+), 9 deletions(-)
diff --git a/src/v4l2src/v4l2src.c b/src/v4l2src/v4l2src.c
index cbf4190..6bb59d1 100644
--- a/src/v4l2src/v4l2src.c
+++ b/src/v4l2src/v4l2src.c
@@ -21,6 +21,7 @@
#include <gst/gst.h>
#include <gst/base/gstpushsrc.h>
+#include <gst/interfaces/photography.h>
#include <fcntl.h>
#include <stdint.h>
#include <string.h>
@@ -47,6 +48,29 @@ enum
IMX_V4L2SRC_INPUT,
IMX_V4L2SRC_DEVICE,
IMX_V4L2SRC_QUEUE_SIZE,
+
+ /* Properties required to be recongnized by GstPhotography implementor */
+ PROP_WB_MODE,
+ PROP_COLOR_TONE,
+ PROP_SCENE_MODE,
+ PROP_FLASH_MODE,
+ PROP_FLICKER_MODE,
+ PROP_FOCUS_MODE,
+ PROP_CAPABILITIES,
+ PROP_EV_COMP,
+ PROP_ISO_SPEED,
+ PROP_APERTURE,
+ PROP_EXPOSURE_TIME,
+ PROP_IMAGE_CAPTURE_SUPPORTED_CAPS,
+ PROP_IMAGE_PREVIEW_SUPPORTED_CAPS,
+ PROP_ZOOM,
+ PROP_COLOR_TEMPERATURE,
+ PROP_WHITE_POINT,
+ PROP_ANALOG_GAIN,
+ PROP_LENS_FOCUS,
+ PROP_MIN_EXPOSURE_TIME,
+ PROP_MAX_EXPOSURE_TIME,
+ PROP_NOISE_REDUCTION,
};
static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE(
@@ -67,11 +91,21 @@ GST_DEBUG_CATEGORY_STATIC(gst_imx_v4l2src_debug_category);
static void gst_imx_v4l2src_uri_handler_init(gpointer g_iface,
gpointer iface_data);
+static void gst_imx_v4l2src_photography_init(gpointer g_iface,
+ gpointer iface_data);
G_DEFINE_TYPE_WITH_CODE(GstImxV4l2VideoSrc, gst_imx_v4l2src, GST_TYPE_PUSH_SRC,
G_IMPLEMENT_INTERFACE(GST_TYPE_URI_HANDLER, gst_imx_v4l2src_uri_handler_init);
+ G_IMPLEMENT_INTERFACE(GST_TYPE_PHOTOGRAPHY, gst_imx_v4l2src_photography_init);
DEBUG_INIT)
+static void gst_imx_v4l2src_apply_focus_settings(GstImxV4l2VideoSrc *v4l2src,
+ gboolean activate);
+static gboolean gst_imx_v4l2src_set_focus_mode(GstPhotography *photo,
+ GstPhotographyFocusMode focus_mode);
+static gboolean gst_imx_v4l2src_get_focus_mode(GstPhotography *photo,
+ GstPhotographyFocusMode *focus_mode);
+
static gint gst_imx_v4l2src_capture_setup(GstImxV4l2VideoSrc *v4l2src)
{
struct v4l2_format fmt = {0};
@@ -186,6 +220,10 @@ static gboolean gst_imx_v4l2src_start(GstBaseSrc *src)
v4l2src->fps_d, v4l2src->fps_n);
v4l2src->count = 0;
+ g_mutex_lock(&v4l2src->af_mutex);
+ gst_imx_v4l2src_apply_focus_settings(v4l2src, TRUE);
+ g_mutex_unlock(&v4l2src->af_mutex);
+
return TRUE;
}
@@ -195,6 +233,10 @@ static gboolean gst_imx_v4l2src_stop(GstBaseSrc *src)
GST_LOG_OBJECT(v4l2src, "stop");
+ g_mutex_lock(&v4l2src->af_mutex);
+ gst_imx_v4l2src_apply_focus_settings(v4l2src, FALSE);
+ g_mutex_unlock(&v4l2src->af_mutex);
+
gst_imx_fd_object_unref(v4l2src->fd_obj_v4l);
return TRUE;
@@ -280,10 +322,8 @@ static GstFlowReturn gst_imx_v4l2src_fill(GstPushSrc *src, GstBuffer *buf)
return GST_FLOW_OK;
}
-static gboolean gst_imx_v4l2src_negotiate(GstBaseSrc *src)
+static GstCaps *gst_imx_v4l2src_caps_for_current_setup(GstImxV4l2VideoSrc *v4l2src)
{
- GstImxV4l2VideoSrc *v4l2src = GST_IMX_V4L2SRC(src);
- GstCaps *caps;
GstVideoFormat gst_fmt;
const gchar *pixel_format = NULL;
const gchar *interlace_mode = "progressive";
@@ -292,7 +332,7 @@ static gboolean gst_imx_v4l2src_negotiate(GstBaseSrc *src)
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl(GST_IMX_FD_OBJECT_GET_FD(v4l2src->fd_obj_v4l), VIDIOC_G_FMT, &fmt) < 0) {
GST_ERROR_OBJECT(v4l2src, "VIDIOC_G_FMT failed");
- return FALSE;
+ return NULL;
}
switch (fmt.fmt.pix.pixelformat) {
@@ -310,9 +350,7 @@ static gboolean gst_imx_v4l2src_negotiate(GstBaseSrc *src)
if (fmt.fmt.pix.field == V4L2_FIELD_INTERLACED)
interlace_mode = "interleaved";
- /* not much to negotiate;
- * we already performed setup, so that is what will be streamed */
- caps = gst_caps_new_simple("video/x-raw",
+ return gst_caps_new_simple("video/x-raw",
"format", G_TYPE_STRING, pixel_format,
"width", G_TYPE_INT, v4l2src->capture_width,
"height", G_TYPE_INT, v4l2src->capture_height,
@@ -320,6 +358,18 @@ static gboolean gst_imx_v4l2src_negotiate(GstBaseSrc *src)
"framerate", GST_TYPE_FRACTION, v4l2src->fps_n, v4l2src->fps_d,
"pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
NULL);
+}
+
+static gboolean gst_imx_v4l2src_negotiate(GstBaseSrc *src)
+{
+ GstImxV4l2VideoSrc *v4l2src = GST_IMX_V4L2SRC(src);
+ GstCaps *caps;
+
+ /* not much to negotiate;
+ * we already performed setup, so that is what will be streamed */
+ caps = gst_imx_v4l2src_caps_for_current_setup(v4l2src);
+ if (!caps)
+ return FALSE;
GST_INFO_OBJECT(src, "negotiated caps %" GST_PTR_FORMAT, (gpointer)caps);
@@ -387,6 +437,33 @@ static void gst_imx_v4l2src_set_property(GObject *object, guint prop_id,
v4l2src->queue_size = g_value_get_int(value);
break;
+ case PROP_FOCUS_MODE:
+ gst_imx_v4l2src_set_focus_mode(GST_PHOTOGRAPHY(v4l2src), g_value_get_enum(value));
+ break;
+
+ case PROP_WB_MODE:
+ case PROP_COLOR_TONE:
+ case PROP_SCENE_MODE:
+ case PROP_FLASH_MODE:
+ case PROP_FLICKER_MODE:
+ case PROP_CAPABILITIES:
+ case PROP_EV_COMP:
+ case PROP_ISO_SPEED:
+ case PROP_APERTURE:
+ case PROP_EXPOSURE_TIME:
+ case PROP_IMAGE_CAPTURE_SUPPORTED_CAPS:
+ case PROP_IMAGE_PREVIEW_SUPPORTED_CAPS:
+ case PROP_ZOOM:
+ case PROP_COLOR_TEMPERATURE:
+ case PROP_WHITE_POINT:
+ case PROP_ANALOG_GAIN:
+ case PROP_LENS_FOCUS:
+ case PROP_MIN_EXPOSURE_TIME:
+ case PROP_MAX_EXPOSURE_TIME:
+ case PROP_NOISE_REDUCTION:
+ GST_WARNING_OBJECT(v4l2src, "setting GstPhotography properties is not supported");
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -420,6 +497,93 @@ static void gst_imx_v4l2src_get_property(GObject *object, guint prop_id,
g_value_set_int(value, v4l2src->queue_size);
break;
+ case PROP_FOCUS_MODE:
+ {
+ GstPhotographyFocusMode focus_mode;
+ gst_imx_v4l2src_get_focus_mode(GST_PHOTOGRAPHY(v4l2src), &focus_mode);
+ g_value_set_enum(value, focus_mode);
+ }
+ break;
+
+ case PROP_WB_MODE:
+ g_value_set_enum(value, GST_PHOTOGRAPHY_WB_MODE_AUTO);
+ break;
+
+ case PROP_COLOR_TONE:
+ g_value_set_enum(value, GST_PHOTOGRAPHY_COLOR_TONE_MODE_NORMAL);
+ break;
+
+ case PROP_SCENE_MODE:
+ g_value_set_enum(value, GST_TYPE_PHOTOGRAPHY_SCENE_MODE);
+ break;
+
+ case PROP_FLASH_MODE:
+ g_value_set_enum(value, GST_PHOTOGRAPHY_FLASH_MODE_AUTO);
+ break;
+
+ case PROP_FLICKER_MODE:
+ g_value_set_enum(value, GST_PHOTOGRAPHY_FLICKER_REDUCTION_OFF);
+ break;
+
+ case PROP_CAPABILITIES:
+ g_value_set_ulong(value, GST_PHOTOGRAPHY_CAPS_NONE);
+ break;
+
+ case PROP_EV_COMP:
+ g_value_set_float(value, 0.0f);
+ break;
+
+ case PROP_ISO_SPEED:
+ g_value_set_uint(value, 0);
+ break;
+
+ case PROP_APERTURE:
+ g_value_set_uint(value, 0);
+ break;
+
+ case PROP_EXPOSURE_TIME:
+ g_value_set_uint(value, 0);
+ break;
+
+ case PROP_IMAGE_CAPTURE_SUPPORTED_CAPS:
+ case PROP_IMAGE_PREVIEW_SUPPORTED_CAPS:
+ if (v4l2src->fd_obj_v4l)
+ gst_value_set_caps(value, gst_imx_v4l2src_caps_for_current_setup(v4l2src));
+ else
+ GST_DEBUG_OBJECT(v4l2src, "not connected to hardware, don't know supported caps");
+ break;
+
+ case PROP_ZOOM:
+ g_value_set_float(value, 1.0f);
+ break;
+
+ case PROP_COLOR_TEMPERATURE:
+ g_value_set_uint(value, 0);
+ break;
+
+ case PROP_WHITE_POINT:
+ g_value_set_boxed(value, NULL);
+ break;
+
+ case PROP_ANALOG_GAIN:
+ g_value_set_float(value, 1.0f);
+ break;
+
+ case PROP_LENS_FOCUS:
+ g_value_set_float(value, 0.0f);
+ break;
+
+ case PROP_MIN_EXPOSURE_TIME:
+ g_value_set_uint(value, 0);
+ break;
+
+ case PROP_MAX_EXPOSURE_TIME:
+ g_value_set_uint(value, 0);
+ break;
+
+ case PROP_NOISE_REDUCTION:
+ g_value_set_flags(value, 0);
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -436,10 +600,24 @@ static void gst_imx_v4l2src_init(GstImxV4l2VideoSrc *v4l2src)
v4l2src->queue_size = DEFAULT_QUEUE_SIZE;
v4l2src->fd_obj_v4l = NULL;
+ g_mutex_init(&v4l2src->af_mutex);
+ v4l2src->focus_mode = GST_PHOTOGRAPHY_FOCUS_MODE_AUTO;
+ v4l2src->af_clock_id = NULL;
+
gst_base_src_set_format(GST_BASE_SRC(v4l2src), GST_FORMAT_TIME);
gst_base_src_set_live(GST_BASE_SRC(v4l2src), TRUE);
}
+static void gst_imx_v4l2src_finalize(GObject *object)
+{
+ GstImxV4l2VideoSrc *v4l2src = GST_IMX_V4L2SRC(object);
+
+ g_free(v4l2src->devicename);
+ g_mutex_clear(&v4l2src->af_mutex);
+
+ G_OBJECT_CLASS(gst_imx_v4l2src_parent_class)->finalize(object);
+}
+
static void gst_imx_v4l2src_class_init(GstImxV4l2VideoSrcClass *klass)
{
GObjectClass *gobject_class;
@@ -454,9 +632,10 @@ static void gst_imx_v4l2src_class_init(GstImxV4l2VideoSrcClass *klass)
gobject_class->set_property = gst_imx_v4l2src_set_property;
gobject_class->get_property = gst_imx_v4l2src_get_property;
+ gobject_class->finalize = gst_imx_v4l2src_finalize;
g_object_class_install_property(gobject_class, IMX_V4L2SRC_CAPTURE_MODE,
- g_param_spec_int("capture-mode", "Capture mode",
+ g_param_spec_int("imx-capture-mode", "Capture mode",
"Capture mode of camera, varies with each v4l2 driver,\n"
"\t\t\t\tfor example ov5460:\n "
"\t\t\t\tov5640_mode_VGA_640_480 = 0,\n"
@@ -491,6 +670,51 @@ static void gst_imx_v4l2src_class_init(GstImxV4l2VideoSrcClass *klass)
0, G_MAXINT, DEFAULT_QUEUE_SIZE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /* Being GstPhotography implementation implies overriding all properties
+ * defined by GstPhotography */
+ g_object_class_override_property(gobject_class,
+ PROP_WB_MODE, GST_PHOTOGRAPHY_PROP_WB_MODE);
+ g_object_class_override_property(gobject_class,
+ PROP_COLOR_TONE, GST_PHOTOGRAPHY_PROP_COLOR_TONE);
+ g_object_class_override_property(gobject_class,
+ PROP_SCENE_MODE, GST_PHOTOGRAPHY_PROP_SCENE_MODE);
+ g_object_class_override_property(gobject_class,
+ PROP_FLASH_MODE, GST_PHOTOGRAPHY_PROP_FLASH_MODE);
+ g_object_class_override_property(gobject_class,
+ PROP_FLICKER_MODE, GST_PHOTOGRAPHY_PROP_FLICKER_MODE);
+ g_object_class_override_property(gobject_class,
+ PROP_FOCUS_MODE, GST_PHOTOGRAPHY_PROP_FOCUS_MODE);
+ g_object_class_override_property(gobject_class,
+ PROP_CAPABILITIES, GST_PHOTOGRAPHY_PROP_CAPABILITIES);
+ g_object_class_override_property(gobject_class,
+ PROP_EV_COMP, GST_PHOTOGRAPHY_PROP_EV_COMP);
+ g_object_class_override_property(gobject_class,
+ PROP_ISO_SPEED, GST_PHOTOGRAPHY_PROP_ISO_SPEED);
+ g_object_class_override_property(gobject_class,
+ PROP_APERTURE, GST_PHOTOGRAPHY_PROP_APERTURE);
+ g_object_class_override_property(gobject_class,
+ PROP_EXPOSURE_TIME, GST_PHOTOGRAPHY_PROP_EXPOSURE_TIME);
+ g_object_class_override_property(gobject_class,
+ PROP_IMAGE_CAPTURE_SUPPORTED_CAPS, GST_PHOTOGRAPHY_PROP_IMAGE_CAPTURE_SUPPORTED_CAPS);
+ g_object_class_override_property(gobject_class,
+ PROP_IMAGE_PREVIEW_SUPPORTED_CAPS, GST_PHOTOGRAPHY_PROP_IMAGE_PREVIEW_SUPPORTED_CAPS);
+ g_object_class_override_property(gobject_class,
+ PROP_ZOOM, GST_PHOTOGRAPHY_PROP_ZOOM);
+ g_object_class_override_property(gobject_class,
+ PROP_COLOR_TEMPERATURE, GST_PHOTOGRAPHY_PROP_COLOR_TEMPERATURE);
+ g_object_class_override_property(gobject_class,
+ PROP_WHITE_POINT, GST_PHOTOGRAPHY_PROP_WHITE_POINT);
+ g_object_class_override_property(gobject_class,
+ PROP_ANALOG_GAIN, GST_PHOTOGRAPHY_PROP_ANALOG_GAIN);
+ g_object_class_override_property(gobject_class,
+ PROP_LENS_FOCUS, GST_PHOTOGRAPHY_PROP_LENS_FOCUS);
+ g_object_class_override_property(gobject_class,
+ PROP_MIN_EXPOSURE_TIME, GST_PHOTOGRAPHY_PROP_MIN_EXPOSURE_TIME);
+ g_object_class_override_property(gobject_class,
+ PROP_MAX_EXPOSURE_TIME, GST_PHOTOGRAPHY_PROP_MAX_EXPOSURE_TIME);
+ g_object_class_override_property(gobject_class,
+ PROP_NOISE_REDUCTION, GST_PHOTOGRAPHY_PROP_NOISE_REDUCTION);
+
basesrc_class->negotiate = gst_imx_v4l2src_negotiate;
basesrc_class->get_caps = gst_imx_v4l2src_get_caps;
basesrc_class->set_caps = gst_imx_v4l2src_set_caps;
@@ -559,6 +783,324 @@ static void gst_imx_v4l2src_uri_handler_init(gpointer g_iface, gpointer iface_da
iface->set_uri = gst_imx_v4l2src_uri_set_uri;
}
+/* GstPhotographyFocusMode actually incapsulates two independent parameters:
+ * - where to focus (infinity/normal/macro)
+ * - when to focus (single/continuous)
+ *
+ * What is implemented:
+ * - if GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_* is set:
+ * - V4L2 focus range is set to NORMAL, and continuous autofocus is enabled
+ * and kept on while element is in PLAYING state,
+ * - set_autofocus(TRUE) locks focus via V4L2_CID_3A_LOCK
+ * - set_autofocus(FALSE) unlocks focus via V4L2_CID_3A_LOCK
+ * - if other supported mode is set:
+ * - set_autofocus(TRUE) triggers autofocus via V4L2_CID_AUTO_FOCUS_START
+ * - set_autofocus(FALSE) stops autofocus via V4L2_CID_AUTO_FOCUS_STOP
+ * - GST_PHOTOGRAPHY_FOCUS_DONE message is generated when focused
+ * - mode is mapped to V4L2 focus range as follows:
+ * GST_PHOTOGRAPHY_FOCUS_MODE_AUTO => V4L2_AUTO_FOCUS_RANGE_AUTO
+ * GST_PHOTOGRAPHY_FOCUS_MODE_MACRO => V4L2_AUTO_FOCUS_RANGE_MACRO
+ * GST_PHOTOGRAPHY_FOCUS_MODE_PORTRAIT => V4L2_AUTO_FOCUS_RANGE_NORMAL
+ * GST_PHOTOGRAPHY_FOCUS_MODE_INFINITY => V4L2_AUTO_FOCUS_RANGE_INFINITY
+ * - not supported:
+ * - GST_PHOTOGRAPHY_FOCUS_MODE_HYPERFOCAL
+ * - GST_PHOTOGRAPHY_FOCUS_MODE_EXTENDED
+ * - GST_PHOTOGRAPHY_FOCUS_MODE_MANUAL
+ */
+
+static inline const char *ctrl_name(int id)
+{
+ switch (id) {
+ case V4L2_CID_FOCUS_AUTO:
+ return "V4L2_CID_FOCUS_AUTO";
+ case V4L2_CID_AUTO_FOCUS_RANGE:
+ return "V4L2_CID_FOCUS_RANGE";
+ case V4L2_CID_AUTO_FOCUS_START:
+ return "V4L2_CID_AUTO_FOCUS_START";
+ case V4L2_CID_AUTO_FOCUS_STOP:
+ return "V4L2_CID_AUTO_FOCUS_STOP";
+ case V4L2_CID_AUTO_FOCUS_STATUS:
+ return "V4L2_CID_AUTO_FOCUS_STATUS";
+ case V4L2_CID_3A_LOCK:
+ return "V4L2_CID_3A_LOCK";
+ default:
+ return "<fixme>";
+ }
+}
+
+static int v4l2_g_ctrl(GstImxV4l2VideoSrc *v4l2src, int id, int *value)
+{
+ struct v4l2_control control;
+ int ret;
+
+ control.id = id;
+ ret = ioctl(GST_IMX_FD_OBJECT_GET_FD(v4l2src->fd_obj_v4l), VIDIOC_G_CTRL, &control);
+
+ if (ret < 0)
+ GST_LOG_OBJECT(v4l2src, "VIDIOC_G_CTRL(%s) failed", ctrl_name(id));
+ else {
+ GST_LOG_OBJECT(v4l2src, "VIDIOC_G_CTRL(%s) returned %d", ctrl_name(id), control.value);
+ *value = control.value;
+ }
+
+ return ret;
+}
+
+static inline int v4l2_s_ctrl(GstImxV4l2VideoSrc *v4l2src, int id, int value)
+{
+ struct v4l2_control control;
+ int ret;
+
+ GST_LOG_OBJECT(v4l2src, "VIDIOC_S_CTRL(%s, %d)", ctrl_name(id), value);
+
+ control.id = id;
+ control.value = value;
+ ret = ioctl(GST_IMX_FD_OBJECT_GET_FD(v4l2src->fd_obj_v4l), VIDIOC_S_CTRL, &control);
+
+ if (ret < 0)
+ GST_LOG_OBJECT(v4l2src, "VIDIOC_S_CTRL(%s, %d) failed", ctrl_name(id), value);
+ else
+ GST_LOG_OBJECT(v4l2src, "VIDIOC_S_CTRL(%s, %d) succeed", ctrl_name(id), value);
+
+ return ret;
+}
+
+static void gst_imx_v4l2src_apply_focus_settings(GstImxV4l2VideoSrc *v4l2src,
+ gboolean activate)
+{
+ int locks, range;
+
+ /* even when activating, first ensure that it is not running */
+
+ /* ensure that continuous autofocus is not running */
+ v4l2_s_ctrl(v4l2src, V4L2_CID_FOCUS_AUTO, 0);
+ /* ensure that single shot AF is not running */
+ v4l2_s_ctrl(v4l2src, V4L2_CID_AUTO_FOCUS_STOP, 0);
+ if (v4l2src->af_clock_id) {
+ gst_clock_id_unschedule(v4l2src->af_clock_id);
+ gst_clock_id_unref(v4l2src->af_clock_id);
+ v4l2src->af_clock_id = NULL;
+ }
+ /* ensure that focus is not locked */
+ if (v4l2_g_ctrl(v4l2src, V4L2_CID_3A_LOCK, &locks) == 0 && (locks & V4L2_LOCK_FOCUS))
+ v4l2_s_ctrl(v4l2src, V4L2_CID_3A_LOCK, locks & ~V4L2_LOCK_FOCUS);
+
+ if (activate) {
+
+ /* set focus range */
+
+ switch (v4l2src->focus_mode) {
+ case GST_PHOTOGRAPHY_FOCUS_MODE_AUTO:
+ range = V4L2_AUTO_FOCUS_RANGE_AUTO;
+ break;
+ case GST_PHOTOGRAPHY_FOCUS_MODE_MACRO:
+ range = V4L2_AUTO_FOCUS_RANGE_MACRO;
+ break;
+ case GST_PHOTOGRAPHY_FOCUS_MODE_INFINITY:
+ range = V4L2_AUTO_FOCUS_RANGE_INFINITY;
+ break;
+ default:
+ range = V4L2_AUTO_FOCUS_RANGE_NORMAL;
+ break;
+ }
+ v4l2_s_ctrl(v4l2src, V4L2_CID_AUTO_FOCUS_RANGE, range);
+
+ /* enable continuous autofocus if requested */
+
+ if (v4l2src->focus_mode == GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_NORMAL)
+ v4l2_s_ctrl(v4l2src, V4L2_CID_FOCUS_AUTO, 1);
+ }
+}
+
+static gboolean gst_imx_v4l2src_set_focus_mode(GstPhotography *photo,
+ GstPhotographyFocusMode focus_mode)
+{
+ GstImxV4l2VideoSrc *v4l2src = GST_IMX_V4L2SRC(photo);
+
+ GST_LOG_OBJECT(v4l2src, "setting focus mode to %d", focus_mode);
+
+ switch (focus_mode) {
+ case GST_PHOTOGRAPHY_FOCUS_MODE_AUTO:
+ case GST_PHOTOGRAPHY_FOCUS_MODE_MACRO:
+ case GST_PHOTOGRAPHY_FOCUS_MODE_PORTRAIT:
+ case GST_PHOTOGRAPHY_FOCUS_MODE_INFINITY:
+ break;
+ case GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_NORMAL:
+ case GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_EXTENDED:
+ focus_mode = GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_NORMAL;
+ break;
+ default:
+ GST_WARNING_OBJECT(v4l2src, "focus mode %d is not supported", focus_mode);
+ return FALSE;
+ }
+
+ g_mutex_lock(&v4l2src->af_mutex);
+
+ if (v4l2src->focus_mode != focus_mode) {
+ v4l2src->focus_mode = focus_mode;
+
+ if (GST_STATE(v4l2src) == GST_STATE_PAUSED || GST_STATE(v4l2src) == GST_STATE_PLAYING)
+ gst_imx_v4l2src_apply_focus_settings(v4l2src, TRUE);
+ }
+
+ g_mutex_unlock(&v4l2src->af_mutex);
+
+ return TRUE;
+}
+
+static gboolean gst_imx_v4l2src_get_focus_mode(GstPhotography *photo,
+ GstPhotographyFocusMode *focus_mode)
+{
+ GstImxV4l2VideoSrc *v4l2src = GST_IMX_V4L2SRC(photo);
+
+ g_mutex_lock(&v4l2src->af_mutex);
+ *focus_mode = v4l2src->focus_mode;
+ g_mutex_unlock(&v4l2src->af_mutex);
+
+ return TRUE;
+}
+
+
+static gboolean gst_imx_v4l2src_af_status_cb(GstClock *clock, GstClockTime time,
+ GstClockID id, gpointer user_data);
+
+static void gst_imx_v4l2src_af_check_status(GstImxV4l2VideoSrc *v4l2src)
+{
+ int status;
+ gboolean send_message;
+ GstPhotographyFocusStatus message_status;
+ gboolean schedule_recheck;
+
+ if (v4l2_g_ctrl(v4l2src, V4L2_CID_AUTO_FOCUS_STATUS, &status) < 0)
+ goto none;
+
+ switch (status) {
+ case V4L2_AUTO_FOCUS_STATUS_IDLE:
+ default:
+ none:
+ send_message = TRUE;
+ message_status = GST_PHOTOGRAPHY_FOCUS_STATUS_NONE;
+ schedule_recheck = FALSE;
+ break;
+ case V4L2_AUTO_FOCUS_STATUS_BUSY:
+ send_message = FALSE;
+ schedule_recheck = TRUE;
+ break;
+ case V4L2_AUTO_FOCUS_STATUS_REACHED:
+ send_message = TRUE;
+ message_status = GST_PHOTOGRAPHY_FOCUS_STATUS_SUCCESS;
+ schedule_recheck = FALSE;
+ break;
+ case V4L2_AUTO_FOCUS_STATUS_FAILED:
+ send_message = TRUE;
+ message_status = GST_PHOTOGRAPHY_FOCUS_STATUS_FAIL;
+ schedule_recheck = FALSE;
+ break;
+ }
+
+ if (send_message) {
+ GstStructure *s;
+ GstMessage *m;
+
+ s = gst_structure_new(GST_PHOTOGRAPHY_AUTOFOCUS_DONE,
+ "status", G_TYPE_INT, message_status,
+ NULL);
+ m = gst_message_new_custom(GST_MESSAGE_ELEMENT,
+ GST_OBJECT(v4l2src), s);
+
+ if (!gst_element_post_message(GST_ELEMENT(v4l2src), m))
+ GST_ERROR_OBJECT(v4l2src, "failed to post message");
+ }
+
+ if (schedule_recheck) {
+ GstClock *c;
+ GstClockTime t;
+
+ c = gst_system_clock_obtain();
+ t = gst_clock_get_time(c) + 50 * GST_MSECOND;
+ v4l2src->af_clock_id = gst_clock_new_single_shot_id(c, t);
+ gst_object_unref(c);
+
+ if (gst_clock_id_wait_async(v4l2src->af_clock_id,
+ gst_imx_v4l2src_af_status_cb,
+ v4l2src, NULL) != GST_CLOCK_OK)
+ GST_ERROR_OBJECT(v4l2src, "failed to schedule recheck");
+ }
+}
+
+static gboolean gst_imx_v4l2src_af_status_cb(GstClock *clock, GstClockTime time,
+ GstClockID id, gpointer user_data)
+{
+ GstImxV4l2VideoSrc *v4l2src = GST_IMX_V4L2SRC(user_data);
+
+ g_mutex_lock(&v4l2src->af_mutex);
+
+ if (v4l2src->af_clock_id == id) {
+ gst_clock_id_unref(v4l2src->af_clock_id);
+ v4l2src->af_clock_id = NULL;
+
+ gst_imx_v4l2src_af_check_status(v4l2src);
+ }
+
+ g_mutex_unlock(&v4l2src->af_mutex);
+ return TRUE;
+}
+
+void gst_imx_v4l2src_set_autofocus(GstPhotography *photo, gboolean on)
+{
+ GstImxV4l2VideoSrc *v4l2src = GST_IMX_V4L2SRC(photo);
+ int locks;
+
+ g_mutex_lock(&v4l2src->af_mutex);
+
+ if (v4l2src->af_clock_id) {
+ gst_clock_id_unschedule(v4l2src->af_clock_id);
+ gst_clock_id_unref(v4l2src->af_clock_id);
+ v4l2src->af_clock_id = NULL;
+ }
+
+ if (v4l2src->focus_mode == GST_PHOTOGRAPHY_FOCUS_MODE_CONTINUOUS_NORMAL) {
+
+ if (v4l2_g_ctrl(v4l2src, V4L2_CID_3A_LOCK, &locks) == 0) {
+ if (on && !(locks & V4L2_LOCK_FOCUS))
+ v4l2_s_ctrl(v4l2src, V4L2_CID_3A_LOCK, locks | V4L2_LOCK_FOCUS);
+ else if (!on && (locks & V4L2_LOCK_FOCUS))
+ v4l2_s_ctrl(v4l2src, V4L2_CID_3A_LOCK, locks & ~V4L2_LOCK_FOCUS);
+ }
+
+ } else {
+
+ if (on) {
+ if (v4l2_s_ctrl(v4l2src, V4L2_CID_AUTO_FOCUS_START, 0) == 0)
+ gst_imx_v4l2src_af_check_status(v4l2src);
+ } else
+ v4l2_s_ctrl(v4l2src, V4L2_CID_AUTO_FOCUS_STOP, 0);
+ }
+
+ g_mutex_unlock(&v4l2src->af_mutex);
+}
+
+static gboolean gst_imx_v4lsrc_prepare_for_capture(GstPhotography *photo,
+ GstPhotographyCapturePrepared func, GstCaps *capture_caps, gpointer user_data)
+{
+ GstImxV4l2VideoSrc *v4l2src = GST_IMX_V4L2SRC(photo);
+
+ GST_LOG_OBJECT(v4l2src, "capture_caps: %" GST_PTR_FORMAT, capture_caps);
+
+ func(user_data, capture_caps);
+ return TRUE;
+}
+
+static void gst_imx_v4l2src_photography_init(gpointer g_iface, gpointer iface_data)
+{
+ GstPhotographyInterface *iface = (GstPhotographyInterface *) g_iface;
+
+ iface->set_focus_mode = gst_imx_v4l2src_set_focus_mode;
+ iface->get_focus_mode = gst_imx_v4l2src_get_focus_mode;
+ iface->set_autofocus = gst_imx_v4l2src_set_autofocus;
+ iface->prepare_for_capture = gst_imx_v4lsrc_prepare_for_capture;
+}
+
static gboolean plugin_init(GstPlugin *plugin)
{
return gst_element_register(plugin, "imxv4l2videosrc", GST_RANK_PRIMARY,
diff --git a/src/v4l2src/v4l2src.h b/src/v4l2src/v4l2src.h
index 3c4ab20..e9fbee6 100644
--- a/src/v4l2src/v4l2src.h
+++ b/src/v4l2src/v4l2src.h
@@ -51,6 +51,10 @@ struct _GstImxV4l2VideoSrc
guint32 count;
GstClockTime time_per_frame;
+ GMutex af_mutex;
+ GstPhotographyFocusMode focus_mode;
+ GstClockID af_clock_id;
+
/* properties */
gint capture_mode;
gint fps_n;
diff --git a/src/v4l2src/wscript b/src/v4l2src/wscript
index 9e32ced..81c3406 100644
--- a/src/v4l2src/wscript
+++ b/src/v4l2src/wscript
@@ -11,7 +11,7 @@ def build(bld):
features = ['c', bld.env['CLIBTYPE']],
includes = ['.', '../..'],
uselib = bld.env['COMMON_USELIB'],
- use = 'gstimxcommon',
+ use = 'gstimxcommon GSTPHOTOGRAPHY',
target = 'gstimxv4l2videosrc',
source = bld.path.ant_glob('*.c'),
install_path = bld.env['PLUGIN_INSTALL_PATH']
diff --git a/wscript b/wscript
index 8d1583f..6b9909c 100644
--- a/wscript
+++ b/wscript
@@ -157,6 +157,7 @@ def configure(conf):
conf.check_cfg(package = 'gstreamer-base-1.0 >= 1.2.0', uselib_store = 'GSTREAMER_BASE', args = '--cflags --libs', mandatory = 1)
conf.check_cfg(package = 'gstreamer-audio-1.0 >= 1.2.0', uselib_store = 'GSTREAMER_VIDEO', args = '--cflags --libs', mandatory = 0)
conf.check_cfg(package = 'gstreamer-video-1.0 >= 1.2.0', uselib_store = 'GSTREAMER_VIDEO', args = '--cflags --libs', mandatory = 1)
+ conf.check_cc(lib = 'gstphotography-1.0', uselib_store = 'GSTPHOTOGRAPHY', mandatory = 1)
# check the kernel header path
--
2.1.4
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: OV5640 autofocus kernel+gstreamer+Qt implementation
2015-09-29 20:10 OV5640 autofocus kernel+gstreamer+Qt implementation Nikita Yushchenko
@ 2015-09-29 22:03 ` Dmitriy B.
2015-10-05 6:50 ` Nikita Yushchenko
2015-10-02 8:34 ` Carlos Rafael Giani
1 sibling, 1 reply; 6+ messages in thread
From: Dmitriy B. @ 2015-09-29 22:03 UTC (permalink / raw)
To: meta-freescale@yoctoproject.org, Carlos Rafael Giani
[-- Attachment #1: Type: text/plain, Size: 2986 bytes --]
2015-09-29 23:10 GMT+03:00 Nikita Yushchenko <nyushchenko@dev.rtsoft.ru>:
> Hi list.
>
> I've recently been working on integrating autofocus functionality of
> OV5640 camera into software stack on imx6-based board.
>
> This mail contains patches to kernel, gstreamer-imx and Qt5 that make
> things somehow working. In particular, declarative-camera example
> focuses ok, custom Qt-based project also does.
>
>
Nice. Thanks for sharing.
>
> Kernel patches are against imx_3.14.28_1.0.0_ga branch.
>
> First patch is generic mxc_v4l2_capture cleanup. Unfortunately driver
> was quite racy and did not survive even streaming stop+start from within
> Qt. Had to do some cleanup to mitigate that.
>
> Second patch contains actual implementation of focus-related v4l ioctls.
>
> Autofocus firmware embedded into patch was taken from
> http://crewrktablets.arctablet.com:8080/opendev/kernel_rockchip.git,
> branch rockchip-3.10-rk3288
> file drivers/media/video/ov5640_af_firmware.c
> and converted to format that existing driver uses. I've tried different
> firmwares found over the net, this one shows the best behaviour.
>
Interesting, you seem to have better implementation of AF than
https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_3.10.53_1.1.1_ga/drivers/media/platform/mxc/capture/ov5640_mipi.c#L120
> *) Legal status of AF firmware is unclear.
>
Boundarydevices and Arrow (Wandcam) distribute the above mentioned source
of AF firmware for long time now.
Should not be a problem, since they already licensed it. Another question
is if you changed it or distribute unknown Chinese unlicensed manufacturer
firmware.
> *) Setting camera parameters is not implemented. Camera always captures
> at 640x480 with all default settings.
>
boundarydevices implemented that
https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_3.10.53_1.1.1_ga/drivers/media/platform/mxc/capture/ov5640_mipi.c#L56
>
> *) Middleware (QT plugin + gstreamer) is incomplete and quite unfriendly
> to debug and use. It basically works for trivial scenarios (streaming
> video from camera to viewfinder, starting/stopping, capturing images)
> but tends to fail on anything else. On failure, it just displays
> "CameraBin error" message and stops working. This happens in different
> cases, which includes inaccurate Qt application behavior (such as too
> long frame processing, failing to release buffer in time, etc).
> Extracting details on what happened is possible via GST_DEBUG but is
> quite cumbersome and requires understanding of gstreamer internals.
>
> *) 'imx-ipuv3 2400000.ipu: IPU Warning - IPU_INT_STAT_5 = 0x00000001'
> message sometimes appears
>
Carlos might know? I remember seeing something like this when using gst-imx.
> Any comments on all this are welcome.
>
> Nikita Yushchenko,
> System Software Engineer at Software Development Center, RTsoft
BR,
Dmitriy Beykun
[-- Attachment #2: Type: text/html, Size: 4998 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: OV5640 autofocus kernel+gstreamer+Qt implementation
2015-09-29 22:03 ` Dmitriy B.
@ 2015-10-05 6:50 ` Nikita Yushchenko
2015-10-05 16:22 ` Pushpal Sidhu
0 siblings, 1 reply; 6+ messages in thread
From: Nikita Yushchenko @ 2015-10-05 6:50 UTC (permalink / raw)
To: Dmitriy B.; +Cc: Gennady Kuznetsov, meta-freescale@yoctoproject.org, arusalin
Hi Dmitry.
Sorry missed your mail (I'm not at list)
>> Kernel patches are against imx_3.14.28_1.0.0_ga branch.
>>
>> First patch is generic mxc_v4l2_capture cleanup. Unfortunately driver
>> was quite racy and did not survive even streaming stop+start from within
>> Qt. Had to do some cleanup to mitigate that.
>>
>> Second patch contains actual implementation of focus-related v4l ioctls.
>>
>> Autofocus firmware embedded into patch was taken from
>> http://crewrktablets.arctablet.com:8080/opendev/kernel_rockchip.git,
>> branch rockchip-3.10-rk3288
>> file drivers/media/video/ov5640_af_firmware.c
>> and converted to format that existing driver uses. I've tried different
>> firmwares found over the net, this one shows the best behaviour.
>>
>
> Interesting, you seem to have better implementation of AF than
> https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_3.10.53_1.1.1_ga/drivers/media/platform/mxc/capture/ov5640_mipi.c#L120
I've seen that, but it is incomplete, single AF only, no notifications, etc.
My implementation does not have manual adjustment ... but I do not like
idea to use custom command for that, V4L has
V4L2_CID_FOCUS_ABSOLUTE / V4L2_CID_FOCUS_RELATIVE for that.
Also, I did the full stack - from Qt through gstreamer to kernel. This
is what I believe is not yet available in opensource ... at least I was
not able find any GstPhotography implementation in the net, just
mentions that it was used in Maemo and probably is used in some closed
projects.
>> *) Legal status of AF firmware is unclear.
>>
>
> Boundarydevices and Arrow (Wandcam) distribute the above mentioned source
> of AF firmware for long time now.
> Should not be a problem, since they already licensed it. Another question
> is if you changed it or distribute unknown Chinese unlicensed manufacturer
> firmware.
Firmware version that I got from crewrktablets kernel_rockchip repo has
working continuous AF. BoundaryDevices version does not.
Internally, we are working with OmniVision to get official supported
firmware - but that will likely be under NDA and thus I won't be able to
share it. By re-distributing firmware from crewrktablets repo, I just
publish what is already available.
>> *) Setting camera parameters is not implemented. Camera always captures
>> at 640x480 with all default settings.
>
> boundarydevices implemented that
> https://github.com/boundarydevices/linux-imx6/blob/boundary-imx_3.10.53_1.1.1_ga/drivers/media/platform/mxc/capture/ov5640_mipi.c#L56
Thanks for the link, will check.
>> *) 'imx-ipuv3 2400000.ipu: IPU Warning - IPU_INT_STAT_5 = 0x00000001'
>> message sometimes appears
>>
>
> Carlos might know? I remember seeing something like this when using gst-imx.
Any hint here will be useful...
>
>
>> Any comments on all this are welcome.
>>
>> Nikita Yushchenko,
>> System Software Engineer at Software Development Center, RTsoft
>
>
> BR,
> Dmitriy Beykun
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL: <http://lists.yoctoproject.org/pipermail/meta-freescale/attachments/20150930/4a44bfb6/attachment.html>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: OV5640 autofocus kernel+gstreamer+Qt implementation
2015-10-05 6:50 ` Nikita Yushchenko
@ 2015-10-05 16:22 ` Pushpal Sidhu
0 siblings, 0 replies; 6+ messages in thread
From: Pushpal Sidhu @ 2015-10-05 16:22 UTC (permalink / raw)
To: Nikita Yushchenko
Cc: Gennady Kuznetsov, meta-freescale@yoctoproject.org, arusalin
Hi,
On Sun, Oct 4, 2015 at 11:50 PM, Nikita Yushchenko
<nyushchenko@dev.rtsoft.ru> wrote:
> >> *) 'imx-ipuv3 2400000.ipu: IPU Warning - IPU_INT_STAT_5 = 0x00000001'
> >> message sometimes appears
> >>
> >
> > Carlos might know? I remember seeing something like this when using gst-imx.
>
> Any hint here will be useful...
Just reading the code and reading the IMX6DQRM, it looks like it was
an IDMAC_NFB4EOF_ERR_0 error bit getting set. From my understanding,
this just means that a new frame arrive into the IPU before one could
be pushed out and *probably* isn't a big deal, especially if it only
occurs occasionally.
- Pushpal
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: OV5640 autofocus kernel+gstreamer+Qt implementation
2015-09-29 20:10 OV5640 autofocus kernel+gstreamer+Qt implementation Nikita Yushchenko
2015-09-29 22:03 ` Dmitriy B.
@ 2015-10-02 8:34 ` Carlos Rafael Giani
2015-10-08 8:47 ` Nikita Yushchenko
1 sibling, 1 reply; 6+ messages in thread
From: Carlos Rafael Giani @ 2015-10-02 8:34 UTC (permalink / raw)
To: meta-freescale
[-- Attachment #1: Type: text/plain, Size: 5816 bytes --]
Thanks, I integrated that patch into gstreamer-imx.
I am however thinking of copying the gstphotography files into
gstreamer-imx until the GstPhotography API becomes stable, to avoid any
future compilation problems due to API changes.
Carlos
Am 2015-09-29 um 22:10 schrieb Nikita Yushchenko:
> Hi list.
>
> I've recently been working on integrating autofocus functionality of
> OV5640 camera into software stack on imx6-based board.
>
> This mail contains patches to kernel, gstreamer-imx and Qt5 that make
> things somehow working. In particular, declarative-camera example
> focuses ok, custom Qt-based project also does.
>
>
> Kernel patches are against imx_3.14.28_1.0.0_ga branch.
>
> First patch is generic mxc_v4l2_capture cleanup. Unfortunately driver
> was quite racy and did not survive even streaming stop+start from within
> Qt. Had to do some cleanup to mitigate that.
>
> Second patch contains actual implementation of focus-related v4l ioctls.
>
> Autofocus firmware embedded into patch was taken from
> http://crewrktablets.arctablet.com:8080/opendev/kernel_rockchip.git,
> branch rockchip-3.10-rk3288
> file drivers/media/video/ov5640_af_firmware.c
> and converted to format that existing driver uses. I've tried different
> firmwares found over the net, this one shows the best behaviour.
>
>
> For gstreamer, I had to add GstPhotography implementation stub to
> imxv4l2videosrc. Implementation is far incomplete, only focus-related
> operations are there.
>
> gstreamer-imx patch is against version 0.11.1
>
>
> For Qt, need several patches to qtmultimedia. We use meta-qt5 layer,
> frodo branch, which is Qt 5.4 based. We had to backport several patches
> from 5.5 for better GStreamer 1.0 support. Also we had to create several
> new patches. Attaching a tarball with all these.
>
>
> With all these changes, single autofocus works ok with unmodified Qt's
> declarative-camera example.
>
> Easy way to check continuous autofocus is:
>
> - apply this to declarative-camera.qml
>
> --- a/declarative-camera.qml 2015-09-26 11:29:54.000000000 +0300
> +++ b/declarative-camera.qml 2015-09-16 13:12:51.000000000 +0300
> @@ -56,6 +56,7 @@
> StateChangeScript {
> script: {
> camera.captureMode = Camera.CaptureStillImage
> + camera.focus.focusMode = Camera.FocusAuto
> camera.start()
> }
> }
> @@ -68,6 +69,7 @@
> StateChangeScript {
> script: {
> camera.captureMode = Camera.CaptureVideo
> + camera.focus.focusMode = Camera.FocusContinuous
> camera.start()
> }
> }
>
> - start it via /usr/bin/qt5/qmlscene /path/to/declarative-camera.qml
> [running declarative-camera binary without recompilation won't get these
> changes since binary has qml embedded and does not re-read it from files
> at execution time]
>
> - from within demo, switch to "video" mode
>
> - take a sheet of paper with printed text and try moving in near camera
>
> - on playback screen, see camera's attempts to keep focused
>
>
>
> Known issues/limitations:
>
> *) Legal status of AF firmware is unclear.
>
> *) AF firmware is loaded using byte operations, loading using group
> writes is not implemented.
>
> *) AF firmware is loaded unconditionally on device open; better to do it
> on first focus-related operation.
>
> *) Reloading AF firmware on suspend-resume is not implemented. With
> current implementation, autofocus will stop working after suspend-resume
> cycle. To restore, need to close and reopen camera device (which usually
> means - restart camera-using program).
>
> Proper fix for the two above should be: make "firmware not loaded" a
> state of firmware-control automata and threat firmware loading as
> required step for requested state changes; when suspending, just force
> "firmware not loaded" state.
>
> *) Driver does not have protection against AF firmware misfunction (such
> as - operation not completes in reasonable time). Such misfuction
> sometimes does happen. It is not fatal (newly issued operation succeeds)
> but still incorrect.
>
> *) Setting camera parameters is not implemented. Camera always captures
> at 640x480 with all default settings.
>
> *) Middleware (QT plugin + gstreamer) is incomplete and quite unfriendly
> to debug and use. It basically works for trivial scenarios (streaming
> video from camera to viewfinder, starting/stopping, capturing images)
> but tends to fail on anything else. On failure, it just displays
> "CameraBin error" message and stops working. This happens in different
> cases, which includes inaccurate Qt application behavior (such as too
> long frame processing, failing to release buffer in time, etc).
> Extracting details on what happened is possible via GST_DEBUG but is
> quite cumbersome and requires understanding of gstreamer internals.
>
> *) 'imx-ipuv3 2400000.ipu: IPU Warning - IPU_INT_STAT_5 = 0x00000001'
> message sometimes appears
>
> *) 'ERROR: unrecognized std! 0 (PAL=ff, NTSC=b000)' message sometimes
> appears
>
> *) pressing Capture button in Qt C++ camera example
> (qt5/examples/multimediawidgets/camera/camera) causes CameraBin error
> (tried to investigate this, immediate reason is that after streaming
> restart, QPainterVideoSurface receives first two frames ok but does not
> become back ready after that and refuses 3rd frame; why this happens is
> not clear yet)
>
>
> Any comments on all this are welcome.
>
> Nikita Yushchenko,
> System Software Engineer at Software Development Center, RTsoft
>
>
[-- Attachment #2: Type: text/html, Size: 6166 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: OV5640 autofocus kernel+gstreamer+Qt implementation
2015-10-02 8:34 ` Carlos Rafael Giani
@ 2015-10-08 8:47 ` Nikita Yushchenko
0 siblings, 0 replies; 6+ messages in thread
From: Nikita Yushchenko @ 2015-10-08 8:47 UTC (permalink / raw)
To: Carlos Rafael Giani; +Cc: meta-freescale@yoctoproject.org
02.10.2015 11:34, Carlos Rafael Giani пишет:
> Thanks, I integrated that patch into gstreamer-imx.
> I am however thinking of copying the gstphotography files into
> gstreamer-imx until the GstPhotography API becomes stable, to avoid any
> future compilation problems due to API changes.
Thanks for that.
Not sure copying GstPhotography worths - it does not seem to be actively
developed.
Also, what is really used (by Qt) is CameraBin which is also in
gst-plugins-bad and depends on GstPhotography.
Nikita
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-10-08 8:47 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-09-29 20:10 OV5640 autofocus kernel+gstreamer+Qt implementation Nikita Yushchenko
2015-09-29 22:03 ` Dmitriy B.
2015-10-05 6:50 ` Nikita Yushchenko
2015-10-05 16:22 ` Pushpal Sidhu
2015-10-02 8:34 ` Carlos Rafael Giani
2015-10-08 8:47 ` Nikita Yushchenko
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.