Re: JR3 force sensor driver

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