- From: Anders Blomdell <anders.blomdell_at_control.lth.se>
- Date: Fri, 29 Jun 2007 19:19:41 +0200
Frank Mori Hess wrote: > On Friday 15 June 2007 12:54, Anders Blomdell wrote: >> Still work to do, but this version seems to be fully working > > Hi Anders, > > Thanks for the driver. The binary firmware shouldn't be compiled into the > driver though. The firmware should go in a subdirectory of the > comedi_nonfree_firmware tarball (we can probably add a directory for it to > cvs if that would help) and be loaded to the driver from userspace. You > can either use the support for loading firmware in comedi_config, or > figure out how to use the kernel's generic firmware loading support (no > drivers do this yet). OK, Updated patch with support for firmware upload (place jr3pci.idm in /lib/firmware/comedi). Regards Anders Blomdell -- Anders Blomdell Email: anders.blomdell_at_control.lth.se Department of Automatic Control Lund University Phone: +46 46 222 4625 P.O. Box 118 Fax: +46 46 138118 SE-221 00 Lund, Sweden
diff -urbN --exclude '*.ko' --exclude '*.cache' --exclude '*.cmd' --exclude '*.o' --exclude '*.mod.c' --exclude '*~' comedi.orig/comedi/drivers/jr3_pci.c comedi/comedi/drivers/jr3_pci.c
--- comedi.orig/comedi/drivers/jr3_pci.c 1970-01-01 01:00:00.000000000 +0100
+++ comedi/comedi/drivers/jr3_pci.c 2007-06-29 18:51:29.000000000 +0200
_at__at_ -0,0 +1,882 _at__at_
+/*
+ comedi/drivers/jr3_pci.c
+ hardware driver for JR3/PCI force sensor board
+
+ COMEDI - Linux Control and Measurement Device Interface
+ Copyright (C) 2007 Anders Blomdell <anders.blomdell_at_control.lth.se>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+/*
+ Driver: jr3_pci.o
+ Description: JR3/PCI force sensor board
+ Author: Anders Blomdell <anders.blomdell_at_control.lth.se>
+ Status: works
+ Devices: [JR3] PCI force sensor board (jr3_pci)
+
+ The DSP on the board requires initialization code, which can
+ be loaded by placing it in /lib/firmware/comedi.
+ The initialization code should be somewhere on the media you got
+ with your card. One version is available from http://www.comedi.org
+ in the comedi_nonfree_firmware tarball.
+
+ Configuration options:
+ [0] - PCI bus number - if bus number and slot number are 0,
+ then driver search for first unused card
+ [1] - PCI slot number
+
+*/
+
+#include <linux/comedidev.h>
+
+#include <linux/delay.h>
+#include <linux/pci.h>
+#include <linux/ctype.h>
+#include <linux/firmware.h>
+#include <linux/firmware.h>
+#include "jr3_pci.h"
+
+/* Hotplug firmware loading stuff */
+
+static void comedi_fw_release(struct device *dev)
+{
+ printk(KERN_DEBUG "firmware_sample_driver: ghost_release\n");
+}
+
+static struct device comedi_fw_device = {
+ .bus_id = "comedi",
+ .release = comedi_fw_release
+};
+
+typedef int comedi_firmware_callback(comedi_device *dev,
+ u8 *data,
+ size_t size);
+
+static int comedi_load_firmware(comedi_device *dev,
+ char *name,
+ comedi_firmware_callback cb) {
+ int result = 0;
+ const struct firmware *fw;
+ char *firmware_path;
+ static const char *prefix = "comedi/";
+
+ firmware_path = kmalloc(strlen(prefix) + strlen(name) + 1, GFP_KERNEL);
+ if (!firmware_path) {
+ result = -ENOMEM;
+ } else {
+ firmware_path[0] = '\0';
+ strcat(firmware_path, prefix);
+ strcat(firmware_path, name);
+ result = device_register(&comedi_fw_device);
+ if (result == 0) {
+ result = request_firmware(&fw, firmware_path, &comedi_fw_device);
+ if (result == 0) {
+ if (!cb) {
+ result = -EINVAL;
+ } else {
+ result = cb(dev, fw->data, fw->size);
+ }
+ release_firmware(fw);
+ }
+ device_unregister(&comedi_fw_device);
+ }
+ kfree(firmware_path);
+ }
+ return result;
+}
+
+
+
+#define PCI_VENDOR_ID_JR3 0x1762
+#define PCI_DEVICE_ID_JR3_1_CHANNEL 0x3111
+#define PCI_DEVICE_ID_JR3_2_CHANNEL 0x3112
+#define PCI_DEVICE_ID_JR3_3_CHANNEL 0x3113
+#define PCI_DEVICE_ID_JR3_4_CHANNEL 0x3114
+
+static int jr3_pci_attach(comedi_device *dev,comedi_devconfig *it);
+static int jr3_pci_detach(comedi_device *dev);
+
+static comedi_driver driver_jr3_pci = {
+ driver_name: "jr3_pci",
+ module: THIS_MODULE,
+ attach: jr3_pci_attach,
+ detach: jr3_pci_detach,
+};
+
+static struct pci_device_id jr3_pci_pci_table[] __devinitdata = {
+ { PCI_VENDOR_ID_JR3, PCI_DEVICE_ID_JR3_1_CHANNEL,
+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+ { PCI_VENDOR_ID_JR3, PCI_DEVICE_ID_JR3_2_CHANNEL,
+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+ { PCI_VENDOR_ID_JR3, PCI_DEVICE_ID_JR3_3_CHANNEL,
+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+ { PCI_VENDOR_ID_JR3, PCI_DEVICE_ID_JR3_4_CHANNEL,
+ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+ { 0 }
+};
+MODULE_DEVICE_TABLE(pci, jr3_pci_pci_table);
+
+typedef struct {
+ struct pci_dev *pci_dev;
+ volatile jr3_t *iobase;
+ int n_channels;
+ struct timer_list timer;
+} jr3_pci_dev_private;
+
+typedef struct {
+ int min;
+ int max;
+} poll_delay_t;
+
+typedef struct {
+ volatile jr3_channel_t *channel;
+ unsigned long next_time_min;
+ unsigned long next_time_max;
+ enum { state_jr3_poll,
+ state_jr3_init_wait_for_offset,
+ state_jr3_init_transform_complete,
+ state_jr3_init_set_full_scale_complete,
+ state_jr3_init_use_offset_complete,
+ state_jr3_done } state;
+ int channel_no;
+ int serial_no;
+ int model_no;
+ struct {
+ int length;
+ comedi_krange range;
+ } range[9];
+ comedi_lrange *range_table_list[8 * 7 + 2];
+ lsampl_t maxdata_list[8 * 7 + 2];
+ u16 errors;
+ int retries;
+} jr3_pci_subdev_private;
+
+static poll_delay_t poll_delay_min_max(int min, int max)
+{
+ poll_delay_t result;
+
+ result.min = min;
+ result.max = max;
+ return result;
+}
+
+static int is_complete(volatile jr3_channel_t *channel)
+{
+ return get_s16(channel->command_word0) == 0;
+}
+
+typedef struct {
+ struct {
+ u16 link_type;
+ s16 link_amount;
+ } link[8];
+} transform_t;
+
+static void set_transforms(volatile jr3_channel_t *channel,
+ transform_t transf,
+ short num)
+{
+ int i;
+
+ num &= 0x000f; // Make sure that 0 <= num <= 15
+ for (i = 0 ; i < 8 ; i++) {
+
+ set_u16(&channel->transforms[num].link[i].link_type,
+ transf.link[i].link_type);
+ comedi_udelay(1);
+ set_s16(&channel->transforms[num].link[i].link_amount,
+ transf.link[i].link_amount);
+ comedi_udelay(1);
+ if (transf.link[i].link_type == end_x_form) {
+ break;
+ }
+ }
+}
+
+static void use_transform(volatile jr3_channel_t *channel,
+ short transf_num)
+{
+ set_s16(&channel->command_word0, 0x0500 + (transf_num & 0x000f));
+}
+
+static void use_offset(volatile jr3_channel_t *channel, short offset_num)
+{
+ set_s16(&channel->command_word0, 0x0600 + (offset_num & 0x000f));
+}
+
+static void set_offset(volatile jr3_channel_t *channel)
+{
+ set_s16(&channel->command_word0, 0x0700);
+}
+
+typedef struct {
+ s16 fx;
+ s16 fy;
+ s16 fz;
+ s16 mx;
+ s16 my;
+ s16 mz;
+} six_axis_t;
+
+static void set_full_scales(volatile jr3_channel_t *channel,
+ six_axis_t full_scale)
+{
+ printk("%d %d %d %d %d %d\n",
+ full_scale.fx,
+ full_scale.fy,
+ full_scale.fz,
+ full_scale.mx,
+ full_scale.my,
+ full_scale.mz);
+ set_s16(&channel->full_scale.fx, full_scale.fx);
+ set_s16(&channel->full_scale.fy, full_scale.fy);
+ set_s16(&channel->full_scale.fz, full_scale.fz);
+ set_s16(&channel->full_scale.mx, full_scale.mx);
+ set_s16(&channel->full_scale.my, full_scale.my);
+ set_s16(&channel->full_scale.mz, full_scale.mz);
+ set_s16(&channel->command_word0, 0x0a00);
+}
+
+static six_axis_t get_min_full_scales(volatile jr3_channel_t *channel)
+{
+ six_axis_t result;
+ result.fx = get_s16(channel->min_full_scale.fx);
+ result.fy = get_s16(channel->min_full_scale.fy);
+ result.fz = get_s16(channel->min_full_scale.fz);
+ result.mx = get_s16(channel->min_full_scale.mx);
+ result.my = get_s16(channel->min_full_scale.my);
+ result.mz = get_s16(channel->min_full_scale.mz);
+ return result;
+}
+
+static six_axis_t get_max_full_scales(volatile jr3_channel_t *channel)
+{
+ six_axis_t result;
+ result.fx = get_s16(channel->max_full_scale.fx);
+ result.fy = get_s16(channel->max_full_scale.fy);
+ result.fz = get_s16(channel->max_full_scale.fz);
+ result.mx = get_s16(channel->max_full_scale.mx);
+ result.my = get_s16(channel->max_full_scale.my);
+ result.mz = get_s16(channel->max_full_scale.mz);
+ return result;
+}
+
+static int jr3_pci_ai_insn_read(comedi_device *dev, comedi_subdevice *s,
+ comedi_insn *insn, lsampl_t *data)
+{
+ int result;
+ jr3_pci_subdev_private *p;
+ int channel;
+
+ p = s->private;
+ channel = CR_CHAN(insn->chanspec);
+ if (p == NULL || channel > 57) {
+ result = -EINVAL;
+ } else {
+ int i;
+
+ result = insn->n;
+ if (p->state != state_jr3_done ||
+ (get_u16(p->channel->errors) & 0xe800) != 0) {
+ /* No sensor or sensor changed */
+ if (p->state == state_jr3_done) {
+ /* Restart polling */
+ p->state = state_jr3_poll;
+ }
+ result = -EAGAIN;
+ }
+ for(i = 0 ; i < insn->n ; i++){
+ if (channel < 56) {
+ int axis, filter;
+
+ axis = channel % 8;
+ filter = channel / 8;
+ if (p->state != state_jr3_done) {
+ data[i] = 0;
+ } else {
+ int F = 0;
+ switch (axis) {
+ case 0: {
+ F = get_s16(p->channel->filter[filter].fx);
+ } break;
+ case 1: {
+ F = get_s16(p->channel->filter[filter].fy);
+ } break;
+ case 2: {
+ F = get_s16(p->channel->filter[filter].fz);
+ } break;
+ case 3: {
+ F = get_s16(p->channel->filter[filter].mx);
+ } break;
+ case 4: {
+ F = get_s16(p->channel->filter[filter].my);
+ } break;
+ case 5: {
+ F = get_s16(p->channel->filter[filter].mz);
+ } break;
+ case 6: {
+ F = get_s16(p->channel->filter[filter].v1);
+ } break;
+ case 7: {
+ F = get_s16(p->channel->filter[filter].v2);
+ } break;
+ }
+ data[i] = F + 0x4000;
+ }
+ } else if (channel == 56) {
+ if (p->state != state_jr3_done) {
+ data[i] = 0;
+ } else {
+ data[i] = get_u16(p->channel->model_no);
+ }
+ } else if (channel == 57) {
+ if (p->state != state_jr3_done) {
+ data[i] = 0;
+ } else {
+ data[i] = get_u16(p->channel->serial_no);
+ }
+ }
+ }
+ }
+ return result;
+}
+
+static void jr3_pci_open(comedi_device *dev)
+{
+ int i;
+ jr3_pci_dev_private *devpriv = dev->private;
+
+ printk("jr3_pci_open\n");
+ for (i = 0 ; i < devpriv->n_channels ; i++) {
+ jr3_pci_subdev_private *p;
+
+ p = dev->subdevices[i].private;
+ if (p) {
+ printk("serial: %p %d (%d)\n", p, p->serial_no, p->channel_no);
+ }
+ }
+}
+
+int read_idm_word(u8 *data, size_t size, int *pos, unsigned int *val) {
+ int result = 0;
+ if (pos != 0 && val != 0) {
+ // Skip over non hex
+ for ( ; *pos < size && !isxdigit(data[*pos]) ; (*pos)++) {}
+ // Collect value
+ *val = 0;
+ for ( ; *pos < size && isxdigit(data[*pos]) ; (*pos)++) {
+ char ch = tolower(data[*pos]);
+ result = 1;
+ if ('0' <= ch && ch <= '9') {
+ *val = (*val << 4) + (ch - '0');
+ } else if ('a' <= ch && ch <= 'f') {
+ *val = (*val << 4) + (ch - 'a' + 10);
+ }
+ }
+ }
+ return result;
+}
+
+static int jr3_download_firmware(comedi_device *dev,
+ u8 *data,
+ size_t size)
+{
+ /*
+ * IDM file format is:
+ * { count, address, data <count> } *
+ * ffff
+ */
+ int result, more, pos, OK;
+
+ result = 0;
+ more = 1;
+ pos = 0;
+ OK = 0;
+ while (more) {
+ unsigned int count, addr;
+
+ more = more && read_idm_word(data, size, &pos, &count);
+ if (more && count == 0xffff) {
+ OK = 1;
+ break;
+ }
+ more = more && read_idm_word(data, size, &pos, &addr);
+ while (more && count > 0) {
+ unsigned int dummy;
+ more = more && read_idm_word(data, size, &pos, &dummy);
+ count--;
+ }
+ }
+
+ if (!OK) {
+ result = -ENODATA;
+ } else {
+ int i;
+ jr3_pci_dev_private *p = dev->private;
+
+ for (i = 0 ; i < p->n_channels ; i++) {
+ jr3_pci_subdev_private *sp;
+
+ sp = dev->subdevices[i].private;
+ more = 1;
+ pos = 0;
+ while (more) {
+ unsigned int count, addr;
+ more = more && read_idm_word(data, size, &pos, &count);
+ if (more && count == 0xffff) {
+ break;
+ }
+ more = more && read_idm_word(data, size, &pos, &addr);
+ printk("Loading#%d %4.4x bytes at %4.4x\n", i, count, addr);
+ while (more && count > 0) {
+ if (addr & 0x4000) {
+ // 16 bit data, never seen in real life!!
+ unsigned int data1;
+
+ more = more && read_idm_word(data, size, &pos, &data1);
+ count--;
+ // printk("jr3_data, not tested\n");
+ // jr3[addr + 0x20000 * pnum] = data1;
+ } else {
+ // Download 24 bit program
+ unsigned int data1, data2;
+
+ more = more && read_idm_word(data, size, &pos, &data1);
+ more = more && read_idm_word(data, size, &pos, &data2);
+ count -= 2;
+ if (more) {
+ set_u16(&p->iobase->channel[i].program_low[addr], data1);
+ comedi_udelay(1);
+ set_u16(&p->iobase->channel[i].program_high[addr], data2);
+ comedi_udelay(1);
+
+ }
+ }
+ addr++;
+ }
+ }
+ }
+ }
+ return result;
+}
+
+static poll_delay_t jr3_pci_poll_subdevice(comedi_subdevice *s)
+{
+ poll_delay_t result = poll_delay_min_max(1000, 2000);
+ jr3_pci_subdev_private *p = s->private;
+
+ if (p) {
+ volatile jr3_channel_t *channel = p->channel;
+ int errors = get_u16(channel->errors);
+
+ if (errors != p->errors) {
+ printk("Errors: %x -> %x\n", p->errors, errors);
+ p->errors = errors;
+ }
+ if ((errors & 0xe800) != 0) {
+ // Sensor communication lost, force poll mode
+ p->state = state_jr3_poll;
+
+ }
+ switch (p->state) {
+ case state_jr3_poll: {
+ u16 model_no = get_u16(channel->model_no);
+ u16 serial_no = get_u16(channel->serial_no);
+ if ((errors & 0xe000) != 0 || model_no == 0 || serial_no == 0) {
+ // Still no sensor, keep on polling. Since it takes up to
+ // 10 seconds for offsets to stabilize, polling each
+ // second should suffice.
+ result = poll_delay_min_max(1000, 2000);
+ } else {
+ p->retries = 0;
+ p->state = state_jr3_init_wait_for_offset;
+ result = poll_delay_min_max(1000, 2000);
+ }
+ } break;
+ case state_jr3_init_wait_for_offset: {
+ p->retries++;
+ if (p->retries < 10) {
+ // Wait for offeset to stabilize (< 10 s according to manual)
+ result = poll_delay_min_max(1000, 2000);
+ } else {
+ transform_t transf;
+
+ p->model_no = get_u16(channel->model_no);
+ p->serial_no = get_u16(channel->serial_no);
+
+ printk("Setting transform for channel %d\n", p->channel_no);
+ printk("Sensor Model = %i\n", p->model_no);
+ printk("Sensor Serial = %i\n", p->serial_no);
+
+ // Transformation all zeros
+ transf.link[0].link_type=(enum link_types)0;
+ transf.link[0].link_amount=0;
+ transf.link[1].link_type=(enum link_types)0;
+ transf.link[1].link_amount=0;
+ transf.link[2].link_type=(enum link_types)0;
+ transf.link[2].link_amount=0;
+ transf.link[3].link_type=(enum link_types)0;
+ transf.link[3].link_amount=0;
+
+ set_transforms(channel, transf, 0);
+ use_transform(channel, 0);
+ p->state = state_jr3_init_transform_complete;
+ result = poll_delay_min_max(20, 100); // Allow 20 ms for completion
+ }
+ } break;
+ case state_jr3_init_transform_complete: {
+ if (! is_complete(channel)) {
+ printk("state_jr3_init_transform_complete complete = %d\n",
+ is_complete(channel));
+ result = poll_delay_min_max(20, 100);
+ } else {
+ // Set full scale
+ six_axis_t min_full_scale;
+ six_axis_t max_full_scale;
+
+ min_full_scale = get_min_full_scales(channel);
+ printk("Obtained Min. Full Scales:\n");
+ printk("%i ", (min_full_scale).fx);
+ printk("%i ", (min_full_scale).fy);
+ printk("%i ", (min_full_scale).fz);
+ printk("%i ", (min_full_scale).mx);
+ printk("%i ", (min_full_scale).my);
+ printk("%i ", (min_full_scale).mz);
+ printk("\n");
+
+
+ max_full_scale = get_max_full_scales(channel);
+ printk("Obtained Max. Full Scales:\n");
+ printk("%i ", (max_full_scale).fx);
+ printk("%i ", (max_full_scale).fy);
+ printk("%i ", (max_full_scale).fz);
+ printk("%i ", (max_full_scale).mx);
+ printk("%i ", (max_full_scale).my);
+ printk("%i ", (max_full_scale).mz);
+ printk("\n");
+
+ set_full_scales(channel, max_full_scale);
+
+ p->state = state_jr3_init_set_full_scale_complete;
+ result = poll_delay_min_max(20, 100); // Allow 20 ms for completion
+ }
+ } break;
+ case state_jr3_init_set_full_scale_complete: {
+ if (! is_complete(channel)) {
+ printk("state_jr3_init_set_full_scale_complete complete = %d\n",
+ is_complete(channel));
+ result = poll_delay_min_max(20, 100);
+ } else {
+ volatile force_array_t *full_scale;
+
+ // Use ranges in kN or we will overflow arount 2000N!
+ full_scale = &channel->full_scale;
+ p->range[0].range.min = -get_s16(full_scale->fx) * 1000;
+ p->range[0].range.max = get_s16(full_scale->fx) * 1000;
+ p->range[1].range.min = -get_s16(full_scale->fy) * 1000;
+ p->range[1].range.max = get_s16(full_scale->fy) * 1000;
+ p->range[2].range.min = -get_s16(full_scale->fz) * 1000;
+ p->range[2].range.max = get_s16(full_scale->fz) * 1000;
+ p->range[3].range.min = -get_s16(full_scale->mx) * 100;
+ p->range[3].range.max = get_s16(full_scale->mx) * 100;
+ p->range[4].range.min = -get_s16(full_scale->my) * 100;
+ p->range[4].range.max = get_s16(full_scale->my) * 100;
+ p->range[5].range.min = -get_s16(full_scale->mz) * 100;
+ p->range[5].range.max = get_s16(full_scale->mz) * 100;
+ p->range[6].range.min = -get_s16(full_scale->v1) * 100; // ??
+ p->range[6].range.max = get_s16(full_scale->v1) * 100; // ??
+ p->range[7].range.min = -get_s16(full_scale->v2) * 100; // ??
+ p->range[7].range.max = get_s16(full_scale->v2) * 100; // ??
+ p->range[8].range.min = 0;
+ p->range[8].range.max = 65535;
+
+ {
+ int i;
+ for (i = 0 ; i < 9 ; i++) {
+ printk("%d %d - %d\n",
+ i, p->range[i].range.min, p->range[i].range.max);
+ }
+ }
+
+ use_offset(channel, 0);
+ p->state = state_jr3_init_use_offset_complete;
+ result = poll_delay_min_max(40, 100); // Allow 40 ms for completion
+ }
+ } break;
+ case state_jr3_init_use_offset_complete: {
+ if (! is_complete(channel)) {
+ printk("state_jr3_init_use_offset_complete complete = %d\n",
+ is_complete(channel));
+ result = poll_delay_min_max(20, 100);
+ } else {
+ printk("Default offsets %d %d %d %d %d %d\n",
+ get_s16(channel->offsets.fx),
+ get_s16(channel->offsets.fy),
+ get_s16(channel->offsets.fz),
+ get_s16(channel->offsets.mx),
+ get_s16(channel->offsets.my),
+ get_s16(channel->offsets.mz));
+
+ set_s16(&channel->offsets.fx, 0);
+ set_s16(&channel->offsets.fy, 0);
+ set_s16(&channel->offsets.fz, 0);
+ set_s16(&channel->offsets.mx, 0);
+ set_s16(&channel->offsets.my, 0);
+ set_s16(&channel->offsets.mz, 0);
+
+ set_offset(channel);
+
+ p->state = state_jr3_done;
+ }
+ } break;
+ case state_jr3_done: {
+ poll_delay_min_max(10000, 20000);
+ } break;
+ default: {
+ poll_delay_min_max(1000, 2000);
+ } break;
+ }
+ }
+ return result;
+}
+
+static void jr3_pci_poll_dev(unsigned long data)
+{
+ unsigned long flags;
+ comedi_device *dev = (comedi_device*)data;
+ jr3_pci_dev_private *devpriv = dev->private;
+ unsigned long now;
+ int delay;
+ int i;
+
+ comedi_spin_lock_irqsave(&dev->spinlock, flags);
+ delay = 1000;
+ now = jiffies;
+ // Poll all channels that are ready to be polled
+ for (i = 0 ; i < devpriv->n_channels ;i++) {
+ jr3_pci_subdev_private *subdevpriv = dev->subdevices[i].private;
+ if (now > subdevpriv->next_time_min) {
+ poll_delay_t sub_delay;
+
+ sub_delay = jr3_pci_poll_subdevice(&dev->subdevices[i]);
+ subdevpriv->next_time_min = jiffies + msecs_to_jiffies(sub_delay.min);
+ subdevpriv->next_time_max = jiffies + msecs_to_jiffies(sub_delay.max);
+ if (sub_delay.max && sub_delay.max < delay) {
+ // Wake up as late as possible -> poll as many channels as
+ // possible at once
+ delay = sub_delay.max;
+ }
+ }
+ }
+ comedi_spin_unlock_irqrestore(&dev->spinlock, flags);
+
+ devpriv->timer.expires = jiffies + msecs_to_jiffies(delay);
+ add_timer (&devpriv->timer);
+}
+
+static int jr3_pci_attach(comedi_device *dev, comedi_devconfig *it)
+{
+ int result = 0;
+ struct pci_dev *card = NULL;
+ int opt_bus, opt_slot, i;
+ jr3_pci_dev_private *devpriv;
+
+ printk("comedi%d: jr3_pci\n", dev->minor);
+
+ opt_bus = it->options[0];
+ opt_slot = it->options[1];
+
+ if (sizeof(jr3_channel_t) != 0xc00) {
+ printk("sizeof(jr3_channel_t) = %x [expected %x]\n",
+ sizeof(jr3_channel_t), 0xc00);
+ return -EINVAL;
+ }
+
+ result = alloc_private(dev, sizeof(jr3_pci_dev_private));
+ if(result < 0){
+ return -ENOMEM;
+ }
+ card = NULL;
+ devpriv = dev->private;
+ init_timer (&devpriv->timer);
+ while(1) {
+ card = pci_get_device(PCI_VENDOR_ID_JR3, PCI_ANY_ID, card);
+ if (card == NULL) {
+ /* No card found */
+ break;
+ } else {
+ switch(card->device) {
+ case PCI_DEVICE_ID_JR3_1_CHANNEL: {
+ devpriv->n_channels = 1;
+ } break;
+ case PCI_DEVICE_ID_JR3_2_CHANNEL: {
+ devpriv->n_channels = 2;
+ } break;
+ case PCI_DEVICE_ID_JR3_3_CHANNEL: {
+ devpriv->n_channels = 3;
+ } break;
+ case PCI_DEVICE_ID_JR3_4_CHANNEL: {
+ devpriv->n_channels = 4;
+ } break;
+ default: {
+ devpriv->n_channels = 0;
+ }
+ }
+ if (devpriv->n_channels >= 1) {
+ if (opt_bus == 0 && opt_slot == 0) {
+ /* Take first available card */
+ break;
+ } else if (opt_bus == card->bus->number &&
+ opt_slot == PCI_SLOT(card->devfn)) {
+ /* Take requested card */
+ break;
+ }
+ }
+ }
+ }
+ if (!card) {
+ printk(" no jr3_pci found\n");
+ return -EIO;
+ }else{
+ devpriv->pci_dev = card;
+ dev->board_name = "jr3_pci";
+ }
+ if((result = pci_enable_device(card))<0){
+ return -EIO;
+ }
+ if((result = pci_request_regions(card, "jr3_pci")) < 0) {
+ return -EIO;
+ }
+ devpriv->iobase = ioremap(pci_resource_start(card,0), sizeof(jr3_t));
+ result = alloc_subdevices(dev, devpriv->n_channels);
+ if(result < 0) goto out;
+
+ dev->open = jr3_pci_open;
+ for (i = 0 ; i < devpriv->n_channels ; i++) {
+ dev->subdevices[i].type = COMEDI_SUBD_AI;
+ dev->subdevices[i].subdev_flags = SDF_READABLE|SDF_GROUND;
+ dev->subdevices[i].n_chan = 8 * 7 + 2;
+ dev->subdevices[i].insn_read = jr3_pci_ai_insn_read;
+ dev->subdevices[i].private = kmalloc(sizeof(jr3_pci_subdev_private),
+ GFP_KERNEL);
+ if (dev->subdevices[i].private) {
+ jr3_pci_subdev_private *p;
+ int j;
+
+ p = dev->subdevices[i].private;
+ memset(p, 0, sizeof(*p));
+ p->channel = &devpriv->iobase->channel[i].data;
+ printk("p->channel %p %p (%x)\n",
+ p->channel, devpriv->iobase,
+ (int)(p->channel) - (int)(devpriv->iobase));
+ p->channel_no = i;
+ for (j = 0 ; j < 8 ; j++) {
+ int k;
+
+ p->range[j].length = 1;
+ p->range[j].range.min = -1000000;
+ p->range[j].range.max = 1000000;
+ for (k = 0 ; k < 7 ; k++) {
+ p->range_table_list[j + k * 8] = (comedi_lrange*)&p->range[j];
+ p->maxdata_list[j + k * 8] = 0x7fff;
+ }
+ }
+ p->range[8].length = 1;
+ p->range[8].range.min = 0;
+ p->range[8].range.max = 65536;
+
+ p->range_table_list[56] = (comedi_lrange*)&p->range[8];
+ p->range_table_list[57] = (comedi_lrange*)&p->range[8];
+ p->maxdata_list[56] = 0xffff;
+ p->maxdata_list[57] = 0xffff;
+ // Channel specific range and maxdata
+ dev->subdevices[i].range_table = 0;
+ dev->subdevices[i].range_table_list = p->range_table_list;
+ dev->subdevices[i].maxdata = 0;
+ dev->subdevices[i].maxdata_list = p->maxdata_list;
+ }
+ }
+
+ // Reset DSP card
+ devpriv->iobase->channel[0].reset = 0;
+
+ result = comedi_load_firmware(dev, "jr3pci.idm", jr3_download_firmware);
+ printk("Firmare load %d\n", result);
+
+ if (result < 0) {
+ goto out;
+ }
+
+ // TODO: use firmware to load preferred offset tables. Suggested format:
+ // model serial Fx Fy Fz Mx My Mz\n
+ //
+ // comedi_load_firmware(dev, "jr3_offsets_table", jr3_download_firmware);
+
+ // It takes a few milliseconds for software to settle
+ // as much as we can read firmware version
+ msleep_interruptible(25);
+ for (i=0 ; i < 0x18 ; i++){
+ printk("%c", get_u16(devpriv->iobase->channel[0].data.copyright[i])>>8);
+ }
+
+ // Start card timer
+ for (i = 0 ; i < devpriv->n_channels ; i++) {
+ jr3_pci_subdev_private *p = dev->subdevices[i].private;
+
+ p->next_time_min = jiffies + msecs_to_jiffies(500);
+ p->next_time_max = jiffies + msecs_to_jiffies(2000);
+ }
+
+ devpriv->timer.data = (unsigned long)dev;
+ devpriv->timer.function = jr3_pci_poll_dev;
+ devpriv->timer.expires = jiffies + msecs_to_jiffies(1000);
+ add_timer(&devpriv->timer);
+
+ out:
+ return result;
+}
+
+static int jr3_pci_detach(comedi_device * dev)
+{
+ int i;
+ jr3_pci_dev_private *devpriv = dev->private;
+
+ printk("comedi%d: jr3_pci: remove\n", dev->minor);
+ if (devpriv) {
+ del_timer_sync(&devpriv->timer);
+
+ if (dev->subdevices) {
+ for (i = 0 ; i < devpriv->n_channels ;i++) {
+ kfree(dev->subdevices[i].private);
+ }
+ }
+
+ if(devpriv->iobase) {
+ iounmap((void*)devpriv->iobase);
+
+ pci_release_regions(devpriv->pci_dev);
+ pci_disable_device(devpriv->pci_dev);
+ }
+
+ if (devpriv->pci_dev) {
+ pci_dev_put(devpriv->pci_dev);
+ }
+ }
+ return 0;
+}
+
+COMEDI_INITCLEANUP(driver_jr3_pci);
+
diff -urbN --exclude '*.ko' --exclude '*.cache' --exclude '*.cmd' --exclude '*.o' --exclude '*.mod.c' --exclude '*~' comedi.orig/comedi/drivers/jr3_pci.h comedi/comedi/drivers/jr3_pci.h
--- comedi.orig/comedi/drivers/jr3_pci.h 1970-01-01 01:00:00.000000000 +0100
+++ comedi/comedi/drivers/jr3_pci.h 2007-06-28 17:40:26.000000000 +0200
_at__at_ -0,0 +1,619 _at__at_
+// Helper types to take care of the fact that the DSP card memory
+// is 16 bits, but aligned on a 32 bit PCI boundary
+typedef union {
+ u8 as_u8;
+ u16 as_u16;
+ u32 as_u32;
+} u_val_t;
+
+typedef union {
+ s8 as_s8;
+ s16 as_s16;
+ s32 as_s32;
+} s_val_t;
+
+static inline u16 get_u16(volatile u_val_t val)
+{
+ u_val_t tmp;
+ tmp.as_u32 = le32_to_cpu(val.as_u32);
+ return tmp.as_u16;
+}
+
+static inline void set_u16(volatile u_val_t *p, u16 val)
+{
+ u_val_t tmp;
+ tmp.as_u16 = val;
+ p->as_u32 = cpu_to_le32(tmp.as_u32);
+}
+
+static inline s16 get_s16(volatile s_val_t val)
+{
+ s_val_t tmp;
+ tmp.as_s32 = le32_to_cpu(val.as_s32);
+ return tmp.as_s16;
+}
+
+static inline void set_s16(volatile s_val_t *p, s16 val)
+{
+ s_val_t tmp;
+ tmp.as_s16 = val;
+ p->as_s32 = cpu_to_le32(tmp.as_s32);
+}
+
+// The raw data is stored in a format which facilitates rapid
+// processing by the JR3 DSP chip. The raw_channel structure shows the
+// format for a single channel of data. Each channel takes four,
+// two-byte words.
+//
+// Raw_time is an unsigned integer which shows the value of the JR3
+// DSP's internal clock at the time the sample was received. The clock
+// runs at 1/10 the JR3 DSP cycle time. JR3's slowest DSP runs at 10
+// Mhz. At 10 Mhz raw_time would therefore clock at 1 Mhz.
+//
+// Raw_data is the raw data received directly from the sensor. The
+// sensor data stream is capable of representing 16 different
+// channels. Channel 0 shows the excitation voltage at the sensor. It
+// is used to regulate the voltage over various cable lengths.
+// Channels 1-6 contain the coupled force data Fx through Mz. Channel
+// 7 contains the sensor's calibration data. The use of channels 8-15
+// varies with different sensors.
+typedef struct raw_channel
+{
+ u_val_t raw_time;
+ s_val_t raw_data;
+ s_val_t reserved[2];
+} raw_channel_t;
+
+// The force_array structure shows the layout for the decoupled and
+// filtered force data.
+typedef struct force_array
+{
+ s_val_t fx;
+ s_val_t fy;
+ s_val_t fz;
+ s_val_t mx;
+ s_val_t my;
+ s_val_t mz;
+ s_val_t v1;
+ s_val_t v2;
+} force_array_t;
+
+// The six_axis_array structure shows the layout for the offsets and
+// the full scales.
+typedef struct six_axis_array
+{
+ s_val_t fx;
+ s_val_t fy;
+ s_val_t fz;
+ s_val_t mx;
+ s_val_t my;
+ s_val_t mz;
+} six_axis_array_t;
+
+// VECT_BITS
+// Indicates which axis are to be used when computing the vectors. A vector
+// is composed by 3 components and its "magnitude" is placed in V1 and V2.
+// V1 defaults to a force vector and V2 defaults to a moment vector.
+// Setting changeV1 or changeV2 will change that vector to be the opposite of
+// its default.
+
+// *** Check this norby ***
+// This is badly defined at JR3 Manual. Correct definition follows:
+typedef struct vect_bits
+{
+ unsigned fx : 1;
+ unsigned fy : 1;
+ unsigned fz : 1;
+ unsigned mx : 1;
+ unsigned my : 1;
+ unsigned mz : 1;
+ unsigned changeV1 : 1;
+ unsigned changeV2 : 1;
+ unsigned reserved : 8;
+} vect_bits;
+
+// WARNINGS
+// Bit pattern for the warning word: xx_near_sat means that a near saturation
+// has been reached or exceeded.
+typedef struct warning_bits
+{
+ unsigned fx_near_sat : 1;
+ unsigned fy_near_sat : 1;
+ unsigned fz_near_sat : 1;
+ unsigned mx_near_sat : 1;
+ unsigned my_near_sat : 1;
+ unsigned mz_near_sat : 1;
+ unsigned reserved : 10;
+} warning_bits;
+
+// ERROR_BITS
+// Bit pattern for the error word:
+// 1. xx_sat means that a near saturation has been reached or exceeded.
+// 2. memory_error indicates RAM memory error during power up.
+// 3. sensor_change indicates that the sensor plugged in (different from the
+// original one) has passed CRC check. The user must reset this bit.
+// 4. system_busyindicates system busy: transf. change, new full scale or new
+// sennsor plugged in.
+// 5. cal_crc_bad means that it was a problem transmiting the calibration data
+// stored inside the sensor. If this bit does not come to zero 2s after the
+// sensor has been plugged in, there is a problem with the sensor's calibra-
+// tion data.
+// 6. watch_dog2 indicates that sensor data and clock are being received.
+// 7. watch_dog indicates that data line seems to be acting correctly.
+// If either watch dog barks, the sensor data is not beig receive correctly.
+#if 0
+typedef struct error_bits
+{
+ unsigned fx_sat : 1;
+ unsigned fy_sat : 1;
+ unsigned fz_sat : 1;
+ unsigned mx_sat : 1;
+ unsigned my_sat : 1;
+ unsigned mz_sat : 1;
+ unsigned reserved : 4;
+ unsigned memory_error : 1;
+ unsigned sensor_change : 1;
+ unsigned system_busy : 1;
+ unsigned cal_crc_bad : 1;
+ unsigned watch_dog2 : 1;
+ unsigned watch_dog : 1;
+} error_bits;
+#endif
+
+// THRESH_STRUCT
+// This structure shows the layout for a single threshold packet inside of a
+// load envelope. Each load envelope can contain several threshold structures.
+// 1. data_address contains the address of the data for that threshold. This
+// includes filtered, unfiltered, raw, rate, counters, error and warning data
+// 2. threshold is the is the value at which, if data is above or below, the
+// bits will be set ... (pag.24).
+// 3. bit_pattern contains the bits that will be set if the threshold value is
+// met or exceeded.
+typedef struct thresh_struct
+{
+ s32 data_address;
+ s32 threshold;
+ s32 bit_pattern;
+} thresh_struct;
+
+// LE_STRUCT
+// Layout of a load enveloped packet. Four thresholds are showed ... for more
+// see manual (pag.25)
+// 1. latch_bits is a bit pattern that show which bits the user wants to latch.
+// The latched bits will not be reset once the threshold which set them is
+// no longer true. In that case the user must reset them using the reset_bit
+// command.
+// 2. number_of_xx_thresholds specify how many GE/LE threshold there are.
+typedef struct {
+ s32 latch_bits;
+ s32 number_of_ge_thresholds;
+ s32 number_of_le_thresholds;
+ struct thresh_struct thresholds[4];
+ s32 reserved;
+} le_struct_t;
+
+// LINK_TYPES
+// Link types is an enumerated value showing the different possible transform
+// link types.
+// 0 - end transform packet
+// 1 - translate along X axis (TX)
+// 2 - translate along Y axis (TY)
+// 3 - translate along Z axis (TZ)
+// 4 - rotate about X axis (RX)
+// 5 - rotate about Y axis (RY)
+// 6 - rotate about Z axis (RZ)
+// 7 - negate all axes (NEG)
+typedef enum link_types
+{
+ end_x_form,
+ tx,
+ ty,
+ tz,
+ rx,
+ ry,
+ rz,
+ neg
+} link_types;
+
+// TRANSFORM
+// Structure used to describe a transform.
+typedef struct {
+ struct {
+ u_val_t link_type;
+ s_val_t link_amount;
+ } link[8];
+} intern_transform_t;
+
+// JR3 force/torque sensor data definition. For more information see sensor and
+// hardware manuals.
+
+typedef struct force_sensor_data
+{
+ // Raw_channels is the area used to store the raw data coming from
+ // the sensor.
+
+ raw_channel_t raw_channels[16]; /* offset 0x0000 */
+
+ // Copyright is a null terminated ASCII string containing the JR3
+ // copyright notice.
+
+ u_val_t copyright[0x0018]; /* offset 0x0040 */
+ s_val_t reserved1[0x0008]; /* offset 0x0058 */
+
+ // Shunts contains the sensor shunt readings. Some JR3 sensors have
+ // the ability to have their gains adjusted. This allows the
+ // hardware full scales to be adjusted to potentially allow
+ // better resolution or dynamic range. For sensors that have
+ // this ability, the gain of each sensor channel is measured at
+ // the time of calibration using a shunt resistor. The shunt
+ // resistor is placed across one arm of the resistor bridge, and
+ // the resulting change in the output of that channel is
+ // measured. This measurement is called the shunt reading, and
+ // is recorded here. If the user has changed the gain of the //
+ // sensor, and made new shunt measurements, those shunt
+ // measurements can be placed here. The JR3 DSP will then scale
+ // the calibration matrix such so that the gains are again
+ // proper for the indicated shunt readings. If shunts is 0, then
+ // the sensor cannot have its gain changed. For details on
+ // changing the sensor gain, and making shunts readings, please
+ // see the sensor manual. To make these values take effect the
+ // user must call either command (5) use transform # (pg. 33) or
+ // command (10) set new full scales (pg. 38).
+
+ six_axis_array_t shunts; /* offset 0x0060 */
+ s32 reserved2[2]; /* offset 0x0066 */
+
+ // Default_FS contains the full scale that is used if the user does
+ // not set a full scale.
+
+ six_axis_array_t default_FS; /* offset 0x0068 */
+ s_val_t reserved3; /* offset 0x006e */
+
+ // Load_envelope_num is the load envelope number that is currently
+ // in use. This value is set by the user after one of the load
+ // envelopes has been initialized.
+
+ s_val_t load_envelope_num; /* offset 0x006f */
+
+ // Min_full_scale is the recommend minimum full scale.
+ //
+ // These values in conjunction with max_full_scale (pg. 9) helps
+ // determine the appropriate value for setting the full scales. The
+ // software allows the user to set the sensor full scale to an
+ // arbitrary value. But setting the full scales has some hazards. If
+ // the full scale is set too low, the data will saturate
+ // prematurely, and dynamic range will be lost. If the full scale is
+ // set too high, then resolution is lost as the data is shifted to
+ // the right and the least significant bits are lost. Therefore the
+ // maximum full scale is the maximum value at which no resolution is
+ // lost, and the minimum full scale is the value at which the data
+ // will not saturate prematurely. These values are calculated
+ // whenever a new coordinate transformation is calculated. It is
+ // possible for the recommended maximum to be less than the
+ // recommended minimum. This comes about primarily when using
+ // coordinate translations. If this is the case, it means that any
+ // full scale selection will be a compromise between dynamic range
+ // and resolution. It is usually recommended to compromise in favor
+ // of resolution which means that the recommend maximum full scale
+ // should be chosen.
+ //
+ // WARNING: Be sure that the full scale is no less than 0.4% of the
+ // recommended minimum full scale. Full scales below this value will
+ // cause erroneous results.
+
+ six_axis_array_t min_full_scale; /* offset 0x0070 */
+ s_val_t reserved4; /* offset 0x0076 */
+
+ // Transform_num is the transform number that is currently in use.
+ // This value is set by the JR3 DSP after the user has used command
+ // (5) use transform # (pg. 33).
+
+ s_val_t transform_num; /* offset 0x0077 */
+
+ // Max_full_scale is the recommended maximum full scale. See
+ // min_full_scale (pg. 9) for more details.
+
+ six_axis_array_t max_full_scale; /* offset 0x0078 */
+ s_val_t reserved5; /* offset 0x007e */
+
+ // Peak_address is the address of the data which will be monitored
+ // by the peak routine. This value is set by the user. The peak
+ // routine will monitor any 8 contiguous addresses for peak values.
+ // (ex. to watch filter3 data for peaks, set this value to 0x00a8).
+
+ s_val_t peak_address; /* offset 0x007f */
+
+ // Full_scale is the sensor full scales which are currently in use.
+ // Decoupled and filtered data is scaled so that +/- 16384 is equal
+ // to the full scales. The engineering units used are indicated by
+ // the units value discussed on page 16. The full scales for Fx, Fy,
+ // Fz, Mx, My and Mz can be written by the user prior to calling
+ // command (10) set new full scales (pg. 38). The full scales for V1
+ // and V2 are set whenever the full scales are changed or when the
+ // axes used to calculate the vectors are changed. The full scale of
+ // V1 and V2 will always be equal to the largest full scale of the
+ // axes used for each vector respectively.
+
+ force_array_t full_scale; /* offset 0x0080 */
+
+ // Offsets contains the sensor offsets. These values are subtracted from
+ // the sensor data to obtain the decoupled data. The offsets are set a
+ // few seconds (< 10) after the calibration data has been received.
+ // They are set so that the output data will be zero. These values
+ // can be written as well as read. The JR3 DSP will use the values
+ // written here within 2 ms of being written. To set future
+ // decoupled data to zero, add these values to the current decoupled
+ // data values and place the sum here. The JR3 DSP will change these
+ // values when a new transform is applied. So if the offsets are
+ // such that FX is 5 and all other values are zero, after rotating
+ // about Z by 90 degrees, FY would be 5 and all others would be zero.
+
+ six_axis_array_t offsets; /* offset 0x0088 */
+
+ // Offset_num is the number of the offset currently in use. This
+ // value is set by the JR3 DSP after the user has executed the use
+ // offset # command (pg. 34). It can vary between 0 and 15.
+
+ s_val_t offset_num; /* offset 0x008e */
+
+ // Vect_axes is a bit map showing which of the axes are being used
+ // in the vector calculations. This value is set by the JR3 DSP
+ // after the user has executed the set vector axes command (pg. 37).
+
+ u_val_t vect_axes; /* offset 0x008f */
+
+ // Filter0 is the decoupled, unfiltered data from the JR3 sensor.
+ // This data has had the offsets removed.
+ //
+ // These force_arrays hold the filtered data. The decoupled data is
+ // passed through cascaded low pass filters. Each succeeding filter
+ // has a cutoff frequency of 1/4 of the preceding filter. The cutoff
+ // frequency of filter1 is 1/16 of the sample rate from the sensor.
+ // For a typical sensor with a sample rate of 8 kHz, the cutoff
+ // frequency of filter1 would be 500 Hz. The following filters would
+ // cutoff at 125 Hz, 31.25 Hz, 7.813 Hz, 1.953 Hz and 0.4883 Hz.
+
+ struct force_array filter[7]; /* offset 0x0090,
+ offset 0x0098,
+ offset 0x00a0,
+ offset 0x00a8,
+ offset 0x00b0,
+ offset 0x00b8 ,
+ offset 0x00c0 */
+
+ // Rate_data is the calculated rate data. It is a first derivative
+ // calculation. It is calculated at a frequency specified by the
+ // variable rate_divisor (pg. 12). The data on which the rate is
+ // calculated is specified by the variable rate_address (pg. 12).
+
+ force_array_t rate_data; /* offset 0x00c8 */
+
+ // Minimum_data & maximum_data are the minimum and maximum (peak)
+ // data values. The JR3 DSP can monitor any 8 contiguous data items
+ // for minimums and maximums at full sensor bandwidth. This area is
+ // only updated at user request. This is done so that the user does
+ // not miss any peaks. To read the data, use either the read peaks
+ // command (pg. 40), or the read and reset peaks command (pg. 39).
+ // The address of the data to watch for peaks is stored in the
+ // variable peak_address (pg. 10). Peak data is lost when executing
+ // a coordinate transformation or a full scale change. Peak data is
+ // also lost when plugging in a new sensor.
+
+ force_array_t minimum_data; /* offset 0x00d0 */
+ force_array_t maximum_data; /* offset 0x00d8 */
+
+ // Near_sat_value & sat_value contain the value used to determine if
+ // the raw sensor is saturated. Because of decoupling and offset
+ // removal, it is difficult to tell from the processed data if the
+ // sensor is saturated. These values, in conjunction with the error
+ // and warning words (pg. 14), provide this critical information.
+ // These two values may be set by the host processor. These values
+ // are positive signed values, since the saturation logic uses the
+ // absolute values of the raw data. The near_sat_value defaults to
+ // approximately 80% of the ADC's full scale, which is 26214, while
+ // sat_value defaults to the ADC's full scale:
+ //
+ // sat_value = 32768 - 2^(16 - ADC bits)
+
+
+ s_val_t near_sat_value; /* offset 0x00e0 */
+ s_val_t sat_value; /* offset 0x00e1 */
+
+ // Rate_address, rate_divisor & rate_count contain the data used to
+ // control the calculations of the rates. Rate_address is the
+ // address of the data used for the rate calculation. The JR3 DSP
+ // will calculate rates for any 8 contiguous values (ex. to
+ // calculate rates for filter3 data set rate_address to 0x00a8).
+ // Rate_divisor is how often the rate is calculated. If rate_divisor
+ // is 1, the rates are calculated at full sensor bandwidth. If
+ // rate_divisor is 200, rates are calculated every 200 samples.
+ // Rate_divisor can be any value between 1 and 65536. Set
+ // rate_divisor to 0 to calculate rates every 65536 samples.
+ // Rate_count starts at zero and counts until it equals
+ // rate_divisor, at which point the rates are calculated, and
+ // rate_count is reset to 0. When setting a new rate divisor, it is
+ // a good idea to set rate_count to one less than rate divisor. This
+ // will minimize the time necessary to start the rate calculations.
+
+ s_val_t rate_address; /* offset 0x00e2 */
+ u_val_t rate_divisor; /* offset 0x00e3 */
+ u_val_t rate_count; /* offset 0x00e4 */
+
+ // Command_word2 through command_word0 are the locations used to
+ // send commands to the JR3 DSP. Their usage varies with the command
+ // and is detailed later in the Command Definitions section (pg.
+ // 29). In general the user places values into various memory
+ // locations, and then places the command word into command_word0.
+ // The JR3 DSP will process the command and place a 0 into
+ // command_word0 to indicate successful completion. Alternatively
+ // the JR3 DSP will place a negative number into command_word0 to
+ // indicate an error condition. Please note the command locations
+ // are numbered backwards. (I.E. command_word2 comes before
+ // command_word1).
+
+ s_val_t command_word2; /* offset 0x00e5 */
+ s_val_t command_word1; /* offset 0x00e6 */
+ s_val_t command_word0; /* offset 0x00e7 */
+
+ // Count1 through count6 are unsigned counters which are incremented
+ // every time the matching filters are calculated. Filter1 is
+ // calculated at the sensor data bandwidth. So this counter would
+ // increment at 8 kHz for a typical sensor. The rest of the counters
+ // are incremented at 1/4 the interval of the counter immediately
+ // preceding it, so they would count at 2 kHz, 500 Hz, 125 Hz etc.
+ // These counters can be used to wait for data. Each time the
+ // counter changes, the corresponding data set can be sampled, and
+ // this will insure that the user gets each sample, once, and only
+ // once.
+
+ u_val_t count1; /* offset 0x00e8 */
+ u_val_t count2; /* offset 0x00e9 */
+ u_val_t count3; /* offset 0x00ea */
+ u_val_t count4; /* offset 0x00eb */
+ u_val_t count5; /* offset 0x00ec */
+ u_val_t count6; /* offset 0x00ed */
+
+ // Error_count is a running count of data reception errors. If this
+ // counter is changing rapidly, it probably indicates a bad sensor
+ // cable connection or other hardware problem. In most installations
+ // error_count should not change at all. But it is possible in an
+ // extremely noisy environment to experience occasional errors even
+ // without a hardware problem. If the sensor is well grounded, this
+ // is probably unavoidable in these environments. On the occasions
+ // where this counter counts a bad sample, that sample is ignored.
+
+ u_val_t error_count; /* offset 0x00ee */
+
+
+ // Count_x is a counter which is incremented every time the JR3 DSP
+ // searches its job queues and finds nothing to do. It indicates the
+ // amount of idle time the JR3 DSP has available. It can also be
+ // used to determine if the JR3 DSP is alive. See the Performance
+ // Issues section on pg. 49 for more details.
+
+ u_val_t count_x; /* offset 0x00ef */
+
+ // Warnings & errors contain the warning and error bits
+ // respectively. The format of these two words is discussed on page
+ // 21 under the headings warnings_bits and error_bits.
+
+ u_val_t warnings; /* offset 0x00f0 */
+ u_val_t errors; /* offset 0x00f1 */
+
+ // Threshold_bits is a word containing the bits that are set by the
+ // load envelopes. See load_envelopes (pg. 17) and thresh_struct
+ // (pg. 23) for more details.
+
+ s_val_t threshold_bits; /* offset 0x00f2 */
+
+ // Last_crc is the value that shows the actual calculated CRC. CRC
+ // is short for cyclic redundancy code. It should be zero. See the
+ // description for cal_crc_bad (pg. 21) for more information.
+
+ s_val_t last_CRC; /* offset 0x00f3 */
+
+ // EEProm_ver_no contains the version number of the sensor EEProm.
+ // EEProm version numbers can vary between 0 and 255.
+ // Software_ver_no contains the software version number. Version
+ // 3.02 would be stored as 302.
+
+ s_val_t eeprom_ver_no; /* offset 0x00f4 */
+ s_val_t software_ver_no; /* offset 0x00f5 */
+
+ // Software_day & software_year are the release date of the software
+ // the JR3 DSP is currently running. Day is the day of the year,
+ // with January 1 being 1, and December 31, being 365 for non leap
+ // years.
+
+ s_val_t software_day; /* offset 0x00f6 */
+ s_val_t software_year; /* offset 0x00f7 */
+
+ // Serial_no & model_no are the two values which uniquely identify a
+ // sensor. This model number does not directly correspond to the JR3
+ // model number, but it will provide a unique identifier for
+ // different sensor configurations.
+
+ u_val_t serial_no; /* offset 0x00f8 */
+ u_val_t model_no; /* offset 0x00f9 */
+
+ // Cal_day & cal_year are the sensor calibration date. Day is the
+ // day of the year, with January 1 being 1, and December 31, being
+ // 366 for leap years.
+
+ s_val_t cal_day; /* offset 0x00fa */
+ s_val_t cal_year; /* offset 0x00fb */
+
+ // Units is an enumerated read only value defining the engineering
+ // units used in the sensor full scale. The meanings of particular
+ // values are discussed in the section detailing the force_units
+ // structure on page 22. The engineering units are setto customer
+ // specifications during sensor manufacture and cannot be changed by
+ // writing to Units.
+ //
+ // Bits contains the number of bits of resolution of the ADC
+ // currently in use.
+ //
+ // Channels is a bit field showing which channels the current sensor
+ // is capable of sending. If bit 0 is active, this sensor can send
+ // channel 0, if bit 13 is active, this sensor can send channel 13,
+ // etc. This bit can be active, even if the sensor is not currently
+ // sending this channel. Some sensors are configurable as to which
+ // channels to send, and this field only contains information on the
+ // channels available to send, not on the current configuration. To
+ // find which channels are currently being sent, monitor the
+ // Raw_time fields (pg. 19) in the raw_channels array (pg. 7). If
+ // the time is changing periodically, then that channel is being
+ // received.
+
+ u_val_t units; /* offset 0x00fc */
+ s_val_t bits; /* offset 0x00fd */
+ s_val_t channels; /* offset 0x00fe */
+
+ // Thickness specifies the overall thickness of the sensor from
+ // flange to flange. The engineering units for this value are
+ // contained in units (pg. 16). The sensor calibration is relative
+ // to the center of the sensor. This value allows easy coordinate
+ // transformation from the center of the sensor to either flange.
+
+ s_val_t thickness; /* offset 0x00ff */
+
+ // Load_envelopes is a table containing the load envelope
+ // descriptions. There are 16 possible load envelope slots in the
+ // table. The slots are on 16 word boundaries and are numbered 0-15.
+ // Each load envelope needs to start at the beginning of a slot but
+ // need not be fully contained in that slot. That is to say that a
+ // single load envelope can be larger than a single slot. The
+ // software has been tested and ran satisfactorily with 50
+ // thresholds active. A single load envelope this large would take
+ // up 5 of the 16 slots. The load envelope data is laid out in an
+ // order that is most efficient for the JR3 DSP. The structure is
+ // detailed later in the section showing the definition of the
+ // le_struct structure (pg. 23).
+
+ le_struct_t load_envelopes[0x10]; /* offset 0x0100 */
+
+ // Transforms is a table containing the transform descriptions.
+ // There are 16 possible transform slots in the table. The slots are
+ // on 16 word boundaries and are numbered 0-15. Each transform needs
+ // to start at the beginning of a slot but need not be fully
+ // contained in that slot. That is to say that a single transform
+ // can be larger than a single slot. A transform is 2 * no of links
+ // + 1 words in length. So a single slot can contain a transform
+ // with 7 links. Two slots can contain a transform that is 15 links.
+ // The layout is detailed later in the section showing the
+ // definition of the transform structure (pg. 26).
+
+ intern_transform_t transforms[0x10]; /* offset 0x0200 */
+} jr3_channel_t;
+
+typedef struct {
+ struct {
+ u_val_t program_low[0x4000]; // 0x00000 - 0x10000
+ jr3_channel_t data; // 0x10000 - 0x10c00
+ char pad2[0x30000 - 0x00c00]; // 0x10c00 - 0x40000
+ u_val_t program_high[0x8000]; // 0x40000 - 0x60000
+ u32 reset; // 0x60000 - 0x60004
+ char pad3[0x20000 - 0x00004]; // 0x60004 - 0x80000
+ } channel[4];
+} jr3_t;
+
diff -urbN --exclude '*.ko' --exclude '*.cache' --exclude '*.cmd' --exclude '*.o' --exclude '*.mod.c' --exclude '*~' comedi.orig/comedi/drivers/Kbuild comedi/comedi/drivers/Kbuild
--- comedi.orig/comedi/drivers/Kbuild 2006-12-08 17:53:38.000000000 +0100
+++ comedi/comedi/drivers/Kbuild 2007-06-08 09:47:47.000000000 +0200
_at__at_ -64,6 +64,7 _at__at_
obj-m += gsc_hpdi.o
obj-m += ii_pci20kc.o
obj-m += icp_multi.o
+obj-m += jr3_pci.o
obj-m += ke_counter.o
obj-m += me_daq.o
obj-m += me4000.o
diff -urbN --exclude '*.ko' --exclude '*.cache' --exclude '*.cmd' --exclude '*.o' --exclude '*.mod.c' --exclude '*~' comedi.orig/comedi/drivers/Makefile.am comedi/comedi/drivers/Makefile.am
--- comedi.orig/comedi/drivers/Makefile.am 2007-01-31 04:13:55.000000000 +0100
+++ comedi/comedi/drivers/Makefile.am 2007-06-08 09:41:30.000000000 +0200
_at__at_ -133,6 +133,7 _at__at_
gsc_hpdi.ko \
ii_pci20kc.ko \
icp_multi.ko \
+ jr3_pci.ko \
ke_counter.ko \
me_daq.ko \
me4000.ko \
_at__at_ -227,7 +228,7 _at__at_
gsc_hpdi_ko_SOURCES = gsc_hpdi.c
ii_pci20kc_ko_SOURCES = ii_pci20kc.c
icp_multi_ko_SOURCES = icp_multi.c
+jr3_pci_ko_SOURCES = jr3_pci.c
ke_counter_ko_SOURCES = ke_counter.c
me4000_ko_SOURCES = me4000.c
me_daq_ko_SOURCES = me_daq.c
131C 0004 0C00 0030 83FF 00F1 4F7F 00F5 2389 000F 93FF 00FA 820E 00E5 2228 000F 3C03 00FC 920E 00EA 93FF 00F1 0A00 001F FFFF 00FF FFFF 00FF FFFF 00FF FFFF 00FF FFFF 00FF FFFF 00FF FFFF 00FF 0310 0000 0324 0000 0338 0000 0354 0000 0390 0000 03CC 0000 0408 0000 3240 0000 0053 0000 AACC 0000 08B7 0000 1CCE 0000 FFFF 00FF FFFF 00FF 0C00 0030 0D03 00E8 0F06 0002 0D01 00E0 0D04 000F 83FF 00CF 6800 00F1 0D03 00FA 6800 00F1 6000 00F1 6E78 00FD 0D04 000E 0A00 0010 0A00 000F 4003 00C0 2380 000F 0D04 000A 8E0E 006A 1802 009F 0140 0000 015E 0000 0100 0000 0103 0000 0106 0000 0109 0000 010C 0000 010F 0000 085E 0000 5422 0000 CE29 0000 0989 0000 F2E7 0000 0989 0000 5422 0000 CE29 0000 614F 0000 D577 0000 0BDC 0000 F420 0000 0BDC 0000 614F 0000 D577 0000 74F3 0000 E300 0000 065F 0000 0535 0000 065F 0000 74F3 0000 E300 0000 3801 0002 36FD 0000 82F9 005C 82F9 004B 8000 0056 1C21 00EF 9209 000A 36E8 00F0 36E9 0071 1C25 00AF 9209 008A 0A00 000F 3801 0012 36FD 0080 82F9 007C 82F9 006B 8000 0096 1C21 00EF 9209 001A 36E9 00D0 36EA 0051 1C25 00AF 9209 009A 0A00 000F 3801 0022 36FE 0000 82F9 009C 82F9 008B 8000 00D6 1C21 00EF 9209 002A 36EA 00B0 36EB 0031 1C25 00AF 9209 00AA 0A00 000F 3801 0032 36FE 0080 82F9 00BC 82F9 00AB 8001 0016 1C21 00EF 9209 003A 36EB 0090 36EC 0011 1C25 00AF 9209 00BA 0A00 000F 3801 0042 36FF 0000 82F9 00DC 82F9 00CB 8001 0056 1C21 00EF 9209 004A 36EC 0070 36EC 00F1 1C25 00AF 9209 00CA 0A00 000F 3801 0052 36FF 0080 82F9 00FC 82F9 00EB 8001 0096 1C21 00EF 9209 005A 36ED 0050 36ED 00D1 1C25 00AF 9209 00DA 0A00 000F 820E 0084 4000 0010 2780 000F 180B 0041 867A 0000 388B 00C1 1C8C 002F 9209 006A 867A 0070 388B 00F1 1C8C 002F 9209 007A 820E 0084 4000 0030 2780 000F 180B 0041 86E0 0062 36E7 0000 8EE6 00F5 140B 002E 6000 0001 6800 0009 96E0 0062 1C87 002F 1C80 009F 4FFF 00FA 8000 0010 4600 0004 26E0 000F 180B 00C2 4000 000A 0D0C 009A 820E 0084 2220 000F 920E 008A 0A00 000F 4000 0084 2260 000F 0D04 0000 0D04 001A 3800 0084 7000 00A4 1C25 00AF 7800 00A6 0A00 000F 8209 008A 36EE 0030 36EE 00B1 1C25 00AF 920A 000A 0A00 000F 8209 009A 36EF 0010 36EF 0091 1C25 00AF 920A 001A 0A00 000F 8209 00AA 36EF 00F0 36F0 0071 1C25 00AF 920A 002A 0A00 000F 8209 00BA 36F0 00D0 36F1 0051 1C25 00AF 920A 003A 0A00 000F 8209 00CA 36F1 00B0 36F2 0031 1C25 00AF 920A 004A 0A00 000F 8209 00DA 36F2 0090 36F3 0011 1C25 00AF 920A 005A 0A00 000F 3A0A 0001 42F3 0070 180C 001F 3A0A 0011 42F4 0050 180C 001F 3A0A 0021 42F5 0030 180C 001F 3A0A 0031 42F6 0010 180C 001F 3A0A 0041 42F6 00F0 180C 001F 3A0A 0051 42F7 00D0 180C 001F 3A0A 0081 42D0 0040 180C 001F 3A0A 0091 42D1 0020 180C 001F 3A0A 00A1 42D2 0000 180C 001F 3A0A 00B1 42D2 00E0 180C 001F 3A0A 00C1 42D3 00C0 180C 001F 3A0A 00D1 42D4 00A0 180C 001F 3A0B 0001 42D5 0080 180C 001F 3A0B 0011 42D6 0060 180C 001F 3A0B 0021 42D7 0040 180C 001F 3A0B 0031 42D8 0020 180C 001F 3A0B 0041 42D9 0000 180C 001F 3A0B 0051 42D9 00E0 180C 001F 3A0B 0081 42DA 00C0 180C 001F 3A0B 0091 42DB 00A0 180C 001F 3A0B 00A1 42DC 0080 180C 001F 3A0B 00B1 42DD 0060 180C 001F 3A0B 00C1 42DE 0040 180C 001F 3A0B 00D1 42DF 0020 180C 001F 867A 0010 388B 00C1 1C8C 002F 9209 00EA 0A00 000F 867A 0020 388B 00C1 1C8C 002F 920A 006A 0A00 000F 867A 0030 388B 00C1 1C8C 002F 920A 00EA 0A00 000F 867A 0040 388B 00C1 1C8C 002F 920B 006A 0A00 000F 867A 0050 388B 00C1 1C8C 002F 920B 00EA 0A00 000F 867A 0060 388B 00C1 1C8C 002F 920C 006A 0A00 000F 867A 0080 388B 00F1 1C8C 002F 9209 00FA 0A00 000F 867A 0090 388B 00F1 1C8C 002F 920A 007A 0A00 000F 867A 00A0 388B 00F1 1C8C 002F 920A 00FA 0A00 000F 867A 00B0 388B 00F1 1C8C 002F 920B 007A 0A00 000F 867A 00C0 388B 00F1 1C8C 002F 920B 00FA 0A00 000F 867A 00D0 388B 00F1 1C8C 002F 920C 007A 0A00 000F 86E0 00E2 A077 0009 96E0 00E2 4000 0000 92F8 00D0 3638 00E0 3606 0081 3400 00A4 3C00 0065 1417 00DE 6000 0000 6800 0005 8238 0000 8238 0015 400F 00F1 2389 000F 820F 0084 820F 0091 2E00 005A 2679 0000 1818 00E0 26E0 000F 26E9 0000 1818 00E0 820F 0014 4080 0001 23A1 000F 920F 001A 920F 0080 920F 0095 8238 0030 400F 00F4 2380 000F 0F02 00FC 920F 00CF 0F16 0004 0D00 004F 2220 000F 820F 00D1 920F 00DA 8238 0018 0F10 0008 920F 004F 4001 0004 2321 000F 0D00 009A 4000 0018 0E00 000F 4800 0005 232F 000F 0D00 001A 820F 00DA 2322 000F 0D00 009A 4000 0018 0E00 000F 232F 000F 0D00 000A 820E 0014 2200 000F 181B 0040 2321 000F 181B 0040 2320 000F 181B 0045 0D00 0004 920E 0010 820E 0000 4666 0064 22E0 000F 2278 0001 181B 00B1 920E 0004 8238 0040 920F 00E0 823F 00E0 920F 00F0 8238 002A 405B 0054 407B 00C5 2608 000F 4000 0041 141C 0065 22E2 000F 2671 000F 2262 000F 2731 000F 4016 00E4 2630 000F 22E2 000F 181D 0014 4016 00D4 141D 0005 22E2 000F 2630 000F 2262 000F 4000 0014 2262 000F 920F 00AA 2310 000F 920F 00BA 363C 0010 365C 0081 3A06 0001 3C00 0065 141D 00EE 6000 0001 7800 0005 6800 0005 0A00 000F 0000 0000 CC01 0000 D801 0000 1400 0000 F001 0000 3C00 0000 2800 0000 E401 0000 A001 0000 6C00 0000 7800 0000 B401 0000 5000 0000 9C01 0000 8801 0000 4400 0000 401E 0000 4FFF 00C9 4000 00F1 6000 00F1 141F 00FE 3C00 0045 141F 00EE 2FC7 008F 2791 000F 2270 000F 0D08 001A 5200 0056 0E02 000F 23CF 000F 1000 004A 6000 00F1 0A00 000F 3630 0000 3C08 0005 4000 0004 1C1F 000F 920F 0034 820F 001A 4DFF 00F5 238A 000F 920F 001A 2600 000F 1821 0000 4200 0005 23AA 000F 920F 001A 0A00 000F 4000 0004 92E0 0024 3630 0000 3638 0001 3C08 0005 1421 007E 6000 0001 6800 0005 820F 0080 8230 0004 22E0 000F 0A00 0000 1C17 002F 1871 008F 5800 0069 6000 0021 E980 0091 E980 0091 E980 0091 E980 0091 E980 0091 6060 0091 1822 00CC 1213 0091 0E3C 000F 0D00 00CE 0D00 00DF 2458 000F 0500 0000 0D00 00AC 0A00 000F 3408 0004 8001 00D8 0F00 00F7 4230 0004 2267 000F 0D04 000A 6000 0002 400F 00F1 2E79 0040 4000 0015 0F16 0001 238F 000F 4FFF 0089 0E16 0000 2761 0000 2790 000F 23B6 000F 6EE2 00A0 6000 0042 36E0 0030 1825 0031 66E2 00A2 22EA 0000 6800 00A2 4DFF 00F5 26EA 000F 0A00 0001 82E0 002A 227A 000F 1824 00E0 1820 001F 920F 003A 820F 001A 238A 000F 920F 001A 0A00 000F 6EE2 0052 82E0 002A 22EA 0000 26E0 000F 226A 0000 92E0 002A 0A00 000F 3C00 0035 37FF 00D4 1426 00AE E898 00D5 E9A0 00D7 6920 0025 0D00 00BC 0D00 00CD E800 00D1 ED00 00D1 5101 006D E902 00D1 E9A0 00D0 6920 0031 6858 00B5 0500 0000 6A7C 00A1 6800 0021 6800 00A1 0A00 000F 2E60 0031 0D00 0075 2029 000F 0500 0000 0E64 000F 1044 0009 2270 000F 0A00 000F 2BE1 00E5 1827 00B6 27E6 000F 22F2 000F 1827 00F4 0D00 0081 0F30 00FF 2B00 001E 0D00 004A 22E0 000F 4000 0004 2E79 0015 0611 0000 3C00 00F5 1428 005E 0711 0000 2E7A 0084 0E60 000F 1040 0009 2270 000F 0A00 000F 6000 0003 7000 0047 6660 0030 7210 0074 2829 001A 0500 0000 0E64 000F 1044 0059 6269 0003 0D00 001A 7000 0047 142A 008E 6660 0030 72F1 0074 1829 00F2 2829 009A 0500 0000 2A10 005C 1027 001A 182A 004F 267A 000F 22B0 000F 2829 009A 0500 0000 1024 005F 626F 0003 0E6A 000F 1042 0059 7269 0047 0D00 001A 0A00 000F 37FF 00F4 3BFF 0054 3C00 0065 3651 00F1 4244 0074 142C 002E 0D03 0065 4000 0062 20E0 000F 2263 000F 0D00 002A 3C00 0065 142C 001E 0D04 0002 0D03 0005 0D03 0045 2260 000F 424C 00B4 2262 000F 0D08 001A 3C00 0055 1C28 00BF 6800 00A7 6800 00F7 4244 0074 0A00 000F 37FF 00F4 3BFF 00F4 364E 0031 3C00 0065 142D 003E 0D03 0065 4000 0062 20E0 000F 4248 00F4 2263 000F 0D08 001A 3645 0030 3C00 0055 1C28 00BF 6800 00A7 6800 00F7 0A00 000F 364D 0080 3A49 0001 182D 009F 3649 0000 3C04 0085 142D 00CE 6000 0001 7800 0005 0A00 000F 4000 0000 3644 0080 3C04 0085 142E 002E 6800 0001 4400 0000 4000 0011 1C2F 001F 2200 000F 0A00 0003 4000 0070 2320 000F 0A00 0002 4001 0050 2260 000F 0D08 001A 5208 0006 0D08 0010 0B00 004F 3A44 0081 3800 00D4 3C00 0065 142F 006E 7800 0005 7800 0014 0A00 000F 0E62 000F 1042 0009 0D00 001F 4418 0095 4000 0064 1C26 00EF 0D00 000A 0D00 001F 2B3F 002A 1830 0067 0D00 0042 2220 000F 0D00 002A 4400 000A 0D00 006A 0A00 000F 1C26 00EF 0D00 000A 0D00 001F 0E60 000F 1040 0049 0D00 005F 1C27 006F 0A00 000F 1C2F 008F 825B 00A8 0E60 000F 1040 0049 0D00 005F 825B 00C8 1C30 008F 9247 00CF 9247 00DA 0D00 0016 0D00 0002 825B 0098 0E60 000F 1040 0049 0D00 005F 825B 00D8 1C30 008F 9248 006F 9248 007A 0A00 000F 1C2F 008F 825B 0088 0E60 000F 1040 0049 0D00 005F 825B 00D8 1C30 008F 9248 004F 9248 005A 0D00 0016 0D00 0002 825B 00A8 0E60 000F 1040 0049 0D00 005F 825B 00B8 1C30 008F 9247 000F 9247 001A 0A00 000F 1C2F 008F 825B 0098 0E60 000F 1040 0049 0D00 005F 825B 00B8 1C30 008F 9246 00EF 9246 00FA 0D00 0016 0D00 0002 825B 0088 0E60 000F 1040 0049 0D00 005F 825B 00C8 1C30 008F 9247 008F 9247 009A 0A00 000F 0D00 0046 2AA0 0042 1835 0027 2220 000F 0D00 002A 4400 000A 0D00 006A 0A00 000F 0D00 001A 1C8A 000F 0E62 000F 0E42 000F 9245 006F 9245 0079 9246 004F 9246 0059 9248 000F 9248 0019 9248 00EF 9248 00F9 0D00 0051 1C8A 003F 0E62 000F 0E42 000F 0D00 0029 0D00 006F 0D00 0002 0D00 0016 825B 00A8 0E60 000F 1040 0049 0D00 005F 825B 0098 1C30 008F 9245 008F 9245 009A 0D00 0002 0D00 0016 825B 00D8 0E60 000F 1040 0049 0D00 005F 825B 00C8 1C30 008F 9248 002F 9248 003A 1C34 00CF 0D00 0002 0D00 0016 825B 0098 0E60 000F 1040 0049 0D00 005F 825B 00A8 1C30 008F 9246 002F 9246 003A 0D00 0002 0D00 0016 825B 00C8 0E60 000F 1040 0049 0D00 005F 825B 00D8 1C30 008F 9248 00CF 9248 00DA 0A00 000F 0D00 001A 1C8A 000F 0E62 000F 0E42 000F 9244 008F 9244 0099 9246 004F 9246 0059 9247 002F 9247 0039 9248 00EF 9248 00F9 0D00 0051 1C8A 003F 0E62 000F 0E42 000F 0D00 0029 0D00 006F 0D00 0002 0D00 0016 825B 0088 0E60 000F 1040 0049 0D00 005F 825B 00A8 1C30 008F 9246 000F 9246 001A 0D00 0002 0D00 0016 825B 00B8 0E60 000F 1040 0049 0D00 005F 825B 00D8 1C30 008F 9248 00AF 9248 00BA 1C34 00CF 0D00 0002 0D00 0016 825B 00A8 0E60 000F 1040 0049 0D00 005F 825B 0088 1C30 008F 9244 00CF 9244 00DA 0D00 0002 0D00 0016 825B 00D8 0E60 000F 1040 0049 0D00 005F 825B 00B8 1C30 008F 9247 006F 9247 007A 0A00 000F 0D00 001A 1C8A 000F 0E62 000F 0E42 000F 9244 008F 9244 0099 9245 006F 9245 0079 9247 002F 9247 0039 9248 000F 9248 0019 0D00 0051 1C8A 003F 0E62 000F 0E42 000F 0D00 0029 0D00 006F 0D00 0002 0D00 0016 825B 0098 0E60 000F 1040 0049 0D00 005F 825B 0088 1C30 008F 9244 00AF 9244 00BA 0D00 0002 0D00 0016 825B 00C8 0E60 000F 1040 0049 0D00 005F 825B 00B8 1C30 008F 9247 004F 9247 005A 1C34 00CF 0D00 0002 0D00 0016 825B 0088 0E60 000F 1040 0049 0D00 005F 825B 0098 1C30 008F 9245 004F 9245 005A 0D00 0002 0D00 0016 825B 00B8 0E60 000F 1040 0049 0D00 005F 825B 00C8 1C30 008F 9247 00EF 9247 00FA 0A00 000F 4800 0000 4000 0001 1C2F 001F 0A00 000F 364D 0080 365B 0081 3A07 0001 3C00 0065 1442 00EE 6000 0011 6000 0001 3C00 0055 6000 0051 1441 008E 6000 0041 1C45 007F 6000 0051 0900 0003 6000 0085 0E60 000F 1040 0049 0D00 005F 1C26 00EF 0D00 000A 0D00 001F 1C46 003F 47FF 00F5 4000 0004 1C27 006F 0D00 009A 227A 000F 1842 00A3 4000 0009 47FF 00FF 0E27 000F 0D00 004F 2E7E 00AF 2220 0001 7800 00A5 3649 0000 365B 0081 3A07 0081 3400 0064 3C00 0025 1445 005E 3C00 0035 1445 004E 6000 0011 6000 0001 6000 0051 6000 0041 1C45 007F 6000 0051 6000 0041 1C45 007F 6000 0085 0E60 000F 1040 0049 0D00 005F 1C26 00EF 0D00 000A 0D00 001F 1C46 003F 4001 0004 820F 00DA 22E2 000F 0D00 004A 47FF 00F5 1C27 006F 227A 000F 0D00 009A 1845 0023 4000 0009 47FF 00FF 0E27 000F 7800 00F5 0900 0000 0900 0000 0A00 000F 26E0 000F 0A00 0002 1846 0004 2FE1 00A5 0A00 0006 23E2 000F 1846 0006 22F2 000F 0A00 0004 0D00 0004 0D00 0015 0A00 000F 23E1 000F 0D00 001A 0A00 0007 4000 0014 2260 000F 0D00 000A 4400 0001 0A00 000F 009D 0000 0055 0000 0061 0000 006D 0000 0079 0000 0085 0000 0091 0000 022F 0000 00C0 0000 00C0 0000 00C0 0000 00C0 0000 00C0 0000 00C0 0000 00C0 0000 00C0 0000 8000 0000 000F 0000 2E5F 0000 4000 0000 2000 0000 1000 0000 0800 0000 0400 0000 0200 0000 0100 0000 0080 0000 0040 0000 0020 0000 0010 0000 0008 0000 0004 0000 0002 0000 0001 0000 0001 0000 4320 0000 6F20 0000 7020 0000 7920 0000 7220 0000 6920 0000 6720 0000 6820 0000 7420 0000 2020 0000 4A20 0000 5220 0000 3320 0000 2020 0000 3120 0000 3920 0000 3920 0000 3320 0000 2D20 0000 3220 0000 3020 0000 3020 0000 3020 0000 0000 0000 00CA 0000 00D0 0000 00D6 0000 00DC 0000 00E2 0000 00E8 0000 082E 0000 0136 0000 0154 0000 0883 0000 05C3 0000 078F 0000 00EE 0000 00F1 0000 00F4 0000 00F7 0000 00FA 0000 00FD 0000 085A 0000 013B 0000 0159 0000 0145 0000 0163 0000 0112 0000 0115 0000 0118 0000 011B 0000 011E 0000 0121 0000 014A 0000 0168 0000 0862 0000 0124 0000 0127 0000 012A 0000 012D 0000 0130 0000 0133 0000 014F 0000 016D 0000 0866 0000 05FD 0000 0754 0000 0757 0000 075D 0000 0762 0000 0712 0000 0781 0000 079A 0000 0767 0000 08E0 0000 0729 0000 0825 0000 081B 0000 0032 0000 4002 0080 93FF 00B0 4FFF 00E0 93FF 00C0 4FFF 00E0 93FF 00D0 3C00 0074 3C06 0001 4000 0000 93FF 00E0 41C0 0000 93FF 00F0 0200 008F 4000 0000 93FE 00F0 4000 00F0 93FF 0000 4000 0000 93FF 0010 42A1 00F0 93FF 0020 4000 0000 93FF 0030 4000 0030 93FF 0040 4000 0000 93FF 0050 42A0 0030 93FF 0060 4000 0000 93FF 0070 4000 0000 93FF 0080 4000 0000 93FF 0090 4000 0000 93FF 00A0 3400 0008 3400 0009 3800 0008 3800 0009 3400 0015 3400 0006 37FF 00F7 3800 0015 3800 0006 3BFF 00F7 3804 0003 3801 005B 3800 006A 36E1 0003 3401 000B 3401 000A 0C00 0030 4000 0000 4000 0001 4000 0004 4000 0005 4000 0002 4000 0003 4000 0006 4000 0007 4000 0008 4000 0009 4000 000A 4000 000B 4000 000C 4000 000D 4000 000E 4000 000F 0C00 0020 1853 000F 4A5A 0054 45A5 00A5 1452 00EE 6800 0042 6000 0002 6BC0 0052 67B2 0002 23C8 000F 27B2 000F A000 0001 0A00 000F 2618 000F 3600 0000 3D00 0005 1C52 005F 1853 0070 4040 0000 920F 0010 4800 0000 92FD 0000 92FD 0080 92FE 0000 92FE 0080 92FF 0000 92FF 0080 4FFF 0000 92FD 0060 92FD 00E0 92FE 0060 92FE 00E0 92FF 0060 92FF 00E0 4000 0000 92FD 0070 92FD 00F0 92FE 0070 92FE 00F0 92FF 0070 92FF 00F0 3600 0020 3846 00B1 3400 0044 3C01 0005 1455 002E 5000 0005 6800 0000 36E0 0050 A2E1 0001 A2E2 0001 A2E2 0001 A2E3 0001 A2E3 0001 A2C0 0001 A2C0 0001 A2C1 0001 A2C1 0001 A2C2 0001 A2C2 0001 4280 0000 42BF 00F4 2720 000F 2230 000F 92E0 0000 92E0 001A 4300 0004 820F 001A 23A2 000F 920F 003A 920F 001A 3C01 0035 36E5 00C0 3847 00B1 1456 00FE 5000 0005 6800 0001 82E5 00E0 9006 0010 4012 00CA 920F 005A 4014 007A 920F 006A 407D 001A 920F 007A 3C01 0085 3848 00E1 3604 0000 1457 00DE 5000 0005 6800 0001 4003 00F0 9208 00F0 4000 0000 920E 0030 4209 0000 920E 0020 9207 00F0 3C00 00B5 36E6 00F0 384A 0061 A000 00B1 1458 00BE 5000 0005 6800 0001 3C00 00A5 36E7 00F0 384B 0011 A000 00A1 1459 002E 5000 0005 6800 0001 3C00 0095 36C3 0000 3803 0071 A000 0091 1459 009E 5000 0005 6800 0001 3C00 00B5 36C4 0000 384B 00B1 A000 00B1 145A 000E 5000 0005 6800 0001 3C00 0095 36C5 0000 384C 0061 A000 0091 145A 007E 5000 0005 6800 0001 3C00 00E5 36E4 0000 384C 00F1 145A 00DE 5000 0005 6800 0001 188B 008F 3A00 0061 3800 0044 3C00 0025 145B 009E 3C00 0065 145B 008E 7000 0004 0D08 0020 0B00 009F 3800 0044 3A00 0061 8208 00E4 1C78 001F 820F 0010 4EFF 00F4 2380 000F 920F 001A 4000 0004 0180 0004 185F 008F 4210 000B 8206 00F2 4000 0086 2160 000F 0D04 000B 6000 0041 820F 002A 6382 0001 6678 0051 185D 0050 0D0C 0050 145D 004E 6000 0001 6000 0041 0D04 0010 6000 0006 66E0 0041 23A2 0005 2608 000F 185D 00F0 0D0C 0055 145D 00EE 6000 0001 6000 0041 0D04 0010 6000 0006 66E0 0041 23A2 0003 920F 002A 2782 001F 0203 0001 0202 0000 2782 005F 020C 0001 0208 0000 0A00 000F 86E0 0052 6000 000A 2678 000F 1863 0091 820E 0074 2200 000F 1860 0003 0F02 00F8 4000 00D5 22EF 000F 36E4 0000 185F 0052 0D04 004F 0900 0000 6000 00A2 0D08 001A 0B00 005F 82E0 004A 920E 007A 4000 000A 92E0 004A 1860 000F 4801 004A 92E0 004A 0A00 000F 36E0 0070 86E0 0072 6218 000A 6E78 00A9 1863 0041 36E0 0090 86E0 0092 6218 000A 6E78 00A9 1863 0041 36E0 00B0 86E0 00B2 6218 000A 6E78 00A9 1863 0041 36E0 00D0 86E0 00D2 6218 000A 6E78 00A9 1863 0041 36E0 00F0 86E0 00F2 6218 000A 6E78 00A9 1863 0041 820E 00F4 2220 000F 920E 00FA 4C00 0005 0100 0010 9203 0030 2780 00DF 1862 00A1 83FF 00C4 8200 0000 2720 000F 403E 0080 2730 000F 4000 0005 1862 00A4 93FF 00C0 4400 0005 820F 0010 43FF 00F4 2380 000F 23AA 000F 920F 001A 2608 000F 185E 0070 4000 0001 0D0C 0091 185E 007F 0D08 0010 0D01 0002 6800 0002 0B00 005F 185E 007F A000 0009 96E0 0052 0D08 0010 0B00 005F 185E 007F 3644 0071 3C02 0045 1465 00FE 0D03 0085 0F00 00FF 267F 000F 2677 000F 2677 000F 0D03 00A5 4000 0065 1464 00A2 22EA 000F 2630 000F 4238 0030 2270 000F 0D04 000A 267E 000F 1865 0045 6000 00E1 6000 00E1 6000 00F1 1865 008F 6000 0083 0F00 00F8 6000 0083 0F18 00F8 2B3E 009F 1865 00E7 0D00 0049 2220 000F 0D00 009A 4400 000A 6800 0097 6800 00A7 3C00 0065 3638 00E0 3608 0001 3A5B 0081 3400 00A4 1466 008E 6000 0000 7800 0005 6800 0005 363C 0010 365C 0081 3C00 0065 1466 00EE 6000 0001 6800 0005 0A00 000F 8207 0072 4000 0086 4220 000B 2160 000F 92F8 00BB 4000 0004 92F8 00C4 1C2D 00EF 3644 0080 1C2D 006F 82F8 00C4 2220 000F 92F8 00CA 86F8 00B0 6000 0041 6200 0051 96F8 00B0 1868 0080 2608 000F 1867 00A0 1C2D 00EF 1C2A 00AF 1C2D 005F 1867 00AF 3A52 0001 1C2D 008F 3A44 0081 1C2D 008F 3640 0000 1C2D 006F 1C2A 00AF 3AFF 00F1 3651 00F0 37FF 00E4 3BFF 0074 4001 0005 3C00 0065 146B 006E 6000 00A0 3C00 0055 1469 00BE 6000 0040 26E2 000F 2200 0004 227A 000F 2218 0004 7AEA 00A7 7A6A 00A7 0D03 00F5 4000 0076 2887 0046 2B27 000A 0D00 00CA 4000 00C5 3C00 0065 146B 005E 0D03 0045 2263 000F 2262 000F 26E4 000F 22EA 0004 424C 0094 2262 000F 0D04 001A 6000 0047 2320 000F 0D00 009A 6000 0087 0E20 000F 7800 00F7 4001 0005 1C40 00CF 4000 0004 1C2D 00EF 3644 0080 1C2D 006F 86F8 00B0 37FF 00D4 0900 0000 96F8 00B0 82F8 00C4 2300 000F 92F8 00CA 186D 0000 86F8 00B0 6000 0053 62A8 0043 96F8 00B0 186C 0000 186C 00B7 47FF 00FA 0D00 005A 1C2D 00EF 1C2A 00AF 1C2D 005F 186C 000F 3A56 0081 1C2D 008F 0A00 000F 3640 0000 365B 0081 3A5B 0001 3C00 0065 6000 0086 146E 00AE 0E60 000F 1040 0009 7000 0085 6800 0085 1060 001F 1040 0049 0D00 005F 1C27 006F 0D00 004A 0D00 005F 3C00 0065 146E 009E 6000 0011 6000 0003 1C26 00EF 6800 00F1 6800 00A1 6000 0086 365B 0000 3608 0001 3C00 0065 146F 000E 6000 0001 6800 0005 0A00 000F 3640 0000 365C 0081 3A06 0001 3C00 0065 1471 000E 7000 0085 1060 0028 1040 0049 667F 0086 1870 00E0 1060 005F 1040 0009 2E7F 001F 1870 00E0 6800 0026 1C27 006F 0D00 004A 0D00 005F 3400 00B4 3C00 0065 1470 00BE 6000 0011 6000 0003 1C26 00EF 6800 00F1 6800 00A0 37FB 0084 0900 0000 0900 0005 0900 0001 0900 0001 0A00 000F 4000 00F0 820E 0074 2380 000F 9207 007A 1C94 00CF 1875 000F 1C94 00CF 825B 0000 2278 000F 1874 00E1 365B 00D1 3A06 00D1 7218 0047 3C00 0065 1472 003E 6000 0007 76E0 0047 2210 0001 3A06 0081 627A 0005 1C97 0081 1C63 00EF 1875 000F 1C94 00CF 825B 0000 3608 0000 6278 0002 1873 0011 2278 000F 1875 0000 1874 005F 3C00 0065 2278 000F 1873 00C1 365B 0001 3A06 0081 3C00 0065 1473 00AE 7000 0005 6800 0001 6800 00A5 1874 00BF 365B 0051 3A08 0051 7218 0047 1474 002E 6000 0007 76E0 0047 2210 0001 227A 000F 1875 0000 3608 0000 365B 0001 3C00 0065 1474 00AE 6000 0001 6800 0005 365B 0081 3A08 0001 1C97 008F 1C63 00EF 1C6D 003F 1C6F 002F 1C67 000F 1C92 007F 0A00 000F 860E 0060 6000 0042 1875 00BF 860E 0060 6000 0042 820E 005A 6800 00A2 920E 0054 0A00 000F 860E 0060 820E 005A 6000 0042 23A2 000F 1875 00AF 860E 0060 820E 005A 6362 0042 2382 000F 1875 00AF 3608 0080 360A 0001 3C00 0065 6000 0045 1476 00EE 6000 0002 6260 0045 6800 00A1 1879 00AF 82F8 00D0 820E 00D4 2278 000F 1877 00B1 4000 0080 2260 000F 92F8 00DA 86E0 00E2 A077 0009 96E0 00E2 0A00 000F 22E0 000F 1877 0072 1C76 007F 4000 0000 92F8 00D0 0A00 000F 4000 00F0 2380 000F 9208 00EA 1C7B 000F 36F8 00E0 3608 0081 3C00 0065 0C0C 0000 1478 00CE 6000 00A1 233A 000F 6800 00A5 0C08 0000 0A00 000F 36F9 0030 3608 00D1 3C00 0065 2218 000F 6000 0047 1479 007E 6000 0003 6660 0047 2210 0001 227A 000F 0A00 0000 8208 00E6 4000 00DB 20E3 000F 4261 0095 226B 000F 0D04 001A 3608 00D0 3C00 0065 0C0C 0000 147A 00AE 1C7C 007F 6000 00A2 233A 000F 0E22 000F 6B3A 00F7 6800 00A3 6800 00E7 0C08 0000 37FF 0044 0900 0004 A000 0017 A000 0006 8208 00E6 4000 00DB 20E3 000F 4260 00E5 226B 000F 0D08 001A 36F9 0040 3C00 00C5 147B 00AE 7000 0055 6800 0051 36F9 0030 36F9 00F1 3C00 0065 147C 005E 1C7C 007F 6000 0087 1240 0087 1258 0052 6EEF 00F3 1C7D 000F 0000 0000 0A00 000F 0D03 0085 0F10 0003 42FC 00F5 226E 000F 0D08 001A 7000 0056 22A8 000F 0D00 009A 0A00 000F 3A08 00F1 0D0B 0045 4000 0076 0D03 00B5 70E3 0064 0D08 004B 7218 0016 2A71 001A 3AE8 0011 0900 0014 1C7F 002F 3AED 0051 0900 0014 1C7F 002F 3AF2 0091 0900 0014 1C7F 002F 3ACF 0061 0900 0014 1C7F 002F 3AD4 00A1 0900 0014 1C7F 002F 3AD9 00E1 0900 0014 1C7F 002F 3A08 00F1 0D0B 0045 0900 0014 3800 0084 3C00 0075 147F 000E 7800 00A4 0A00 000F 3C00 0085 147F 004E 7800 00A5 3C00 0065 147F 007E 7800 0015 0A00 000F 7FFF 0000 8000 0000 7FFF 0000 8000 0000 7FFF 0000 8000 0000 7FFF 0000 8000 0000 7FFF 0000 8000 0000 7FFF 0000 8000 0000 7FFF 0000 8000 0000 7FFF 0000 8000 0000 8607 00F1 387F 0091 3800 0024 3BFF 00E7 3C00 0085 C000 0055 52E0 0055 1481 008E 1881 0045 5000 0017 5800 0004 C2E8 0055 1881 0083 526A 0017 5800 00A4 52E0 0055 3BFF 00F7 0A00 000F 360D 0000 360D 0081 387F 0091 3C00 0085 1482 003E 5000 0005 6800 0001 5000 0005 6800 0005 0A00 000F 1C81 00BF 8607 00F1 387F 0091 3C00 0085 1482 00CE 6000 0005 5800 0005 5800 0005 0A00 000F 820E 0094 2220 000F 920E 009A 4000 0030 2780 000F 0A00 0001 86E0 0082 36E8 0000 8EE7 00F5 1483 009E 6000 0001 6800 0009 96E0 0082 4000 00F0 2780 000F 0A00 0001 86E0 00A2 36C3 0010 8EC3 0005 1484 003E 6000 0001 6800 0009 96E0 00A2 4003 00F0 2780 000F 0A00 0001 86E0 00C2 36C4 0010 8EC4 0005 1484 00DE 6000 0001 6800 0009 96E0 00C2 400F 00F0 2780 000F 0A00 0001 86E0 00E2 36C5 0010 8EC5 0005 1485 007E 6000 0001 6800 0009 96E0 00E2 0A00 000F 820E 00A4 2220 000F 920E 00AA 0A00 000F 820E 00B4 2220 000F 920E 00BA 0A00 000F 820E 00C4 2220 000F 920E 00CA 0A00 000F 820E 00D4 2220 000F 920E 00DA 0A00 000F 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 360E 0040 6000 0043 6220 0041 6EE2 00A2 0A00 0001 A000 0002 860E 0020 360C 0081 3886 00A1 0C0C 0000 3C00 0085 1488 000E C000 0061 5AE0 0005 6800 00A5 0C08 0000 0A00 000F 3400 0050 3400 0044 360E 0001 4FFC 0004 820F 0001 6381 0000 820F 0011 2B81 00BA 0D00 00CA 3C00 0065 4000 001F 4000 0019 1489 00CE 23E0 000F 6000 0045 2360 0006 26E2 000F 6000 0047 1889 00C4 0D00 005F 2BAB 000A 2AE0 00BA 1889 00C4 23AC 000F 0D00 00CA 1207 0000 920F 000B 920F 001C 0A00 000F 4400 0004 2262 000F 0D00 005A 4400 0000 2F88 00A5 22A8 0001 47FF 00F4 2382 000F 0D00 007A 3801 00D1 542A 0035 5089 0035 3C00 0035 148A 00FE 2111 000F 5432 0035 2111 000F 0F24 0003 0F1B 0003 227F 000F 2200 0004 2608 000F 233A 0004 0A00 000F 1C8E 003F 3C03 00FC 3C20 0023 185A 00FF C000 0000 C000 0000 8000 0000 8000 0000 8000 0000 8000 0000 E800 0051 E820 0051 2820 00EC EA7C 0051 2020 000F 3AE5 00C1 0D00 006C 2884 006A 2902 006E 7106 0045 0500 0000 0E64 000F 0E73 000F 2BC4 0059 2A28 00CA 0F22 00FF 7000 0045 2267 000F 7000 0045 0A00 0000 0D0C 005A 2327 000F 0D08 001A 7218 0045 148D 00EE 23A2 000F 0D00 006A 75E2 0045 22E2 000C 0A00 000F 400F 00F0 2380 000F 9208 00FA 8208 00FF 365B 0080 365B 00B1 4209 000B 4209 003C 400C 0004 2787 000F 188F 0020 4008 0004 2787 000F 188F 0001 0D00 00CB 0D05 0010 0D00 00BC 0D05 0001 3A5C 0001 4FFF 00F9 1C91 006F 0D05 0001 1C91 006F 367A 0000 4000 0084 0D00 00AB 3C00 0075 148F 00CE 6A62 00A1 0D00 00AC 3C00 0075 1490 000E 6A62 00A1 365C 0000 3608 0061 1C91 00DF 0D00 000A 1C91 00DF 0D00 001A 365C 0000 388B 00C1 3C00 0025 1491 004E 3C00 0035 1491 003E 6218 0051 2EA8 004A 3C00 00F5 0610 0000 1491 002E 0710 0000 5800 0045 0D00 0001 0A00 000F 3C00 0035 1491 00BE 1207 00A1 267E 000F 2218 0000 7800 00A5 0A00 000F 4000 000A 3C00 0035 1492 003E 6000 0011 27E1 000F 26F2 000F 23E1 0003 6800 00A5 2238 0000 0A00 000F 3652 0000 1C2D 006F 3660 0000 6000 0001 3C01 0005 1494 00AE 6A78 0001 1894 0080 3644 0081 3C00 00C5 1493 003E 6000 0001 6800 0005 0D01 0080 1C2C 004F 0D04 0008 364D 0081 3C00 0065 1494 006E 0D03 0085 0F10 0003 4300 0065 232E 000F 0D08 001A 7000 0055 6000 0085 6000 0005 22E8 000F 0D00 009A 0E30 000F 6800 00E1 6800 00F1 1894 00AF 3401 0084 0900 0000 6000 0001 0A00 000F 3656 0080 1C2D 006F 3660 0000 3400 00C4 3C01 0005 1497 006E 6000 0001 6278 0013 6800 0011 6800 0011 0900 0000 1897 0051 2279 000F 1897 0050 3644 0081 3C00 0065 1496 00AE 0D03 0085 0F10 0003 4300 0075 232E 000F 0D08 001A 7000 0055 6000 00E1 6000 00C1 0E64 000F 0E76 000F 0E56 000F 104C 00A9 6A6A 00F5 6800 00A5 0D01 0080 1C2C 004F 0D04 0008 364D 0081 37FE 0084 0900 0000 3C00 00C5 1497 004E 6000 0005 6800 0001 3400 00C4 0900 0000 0A00 000F 3660 0020 3401 0094 3C00 0065 1499 000E 6000 0085 0E60 000F 1040 0009 7000 0085 1060 001F 1040 0049 0D00 005F 1C27 006F 0D00 004A 0D00 005F 0D01 0080 3C01 0005 1498 00DE 6000 0011 6000 0003 1C26 00EF 6800 00F1 6800 00A0 0D04 0008 0900 0001 0900 0001 0A00 000F 0002 0000 184D 00DF ffff
Received on 2007-06-29Z16:19:41