« Return to Thread: Lirc won't compile with 2.6.20-rc4

Re: Lirc won't compile with 2.6.20-rc4

by Vassilis Virvilis :: Rate this Message:

Reply to Author | View in Thread

arandamandi wrote:
>


>> I tried latest cvs and 0.8.1
>> but nothing to do..:(
>> Please help
>>
> Solved,i have create a patch
> for driver lirc_atiusb,on my pc works
> on others..i don't know
> :)
> http://www.nabble.com/file/5594/lirc_atiusb.diff.gz lirc_atiusb.diff.gz

Hi,

Since you are a lirc_atiusb user and I don't own a ATI remote, would you
care to test this patch and report back. The patch adds support for XBOX
and I had to reorganize atiusb code. I would like to make sure there are
no ill effects for the already supported models.

http://sourceforge.net/mailarchive/forum.php?thread_id=31318758&forum_id=5339

I am attaching also to make it easier if you decide to test it.

Best regards

    .bill

--- ../../lirc-modules.orig/lirc/drivers/lirc_atiusb/lirc_atiusb.c 2006-09-18 16:39:16.000000000 +0300
+++ drivers/lirc_atiusb/lirc_atiusb.c 2006-12-16 20:46:04.000000000 +0200
@@ -11,6 +11,10 @@
  *      "USB StreamZap remote driver" (LIRC)
  *   Artur Lipowski <alipowski@...>'s 2002
  *      "lirc_dev" and "lirc_gpio" LIRC modules
+ *   Michael Wojciechowski
+ *      initial xbox support
+ *   Vassilis Virvilis <vasvir@...> 2006
+ *      reworked the patch for lirc submission
  *
  * $Id: lirc_atiusb.c,v 1.53 2006/03/04 22:36:38 lirc Exp $
  */
@@ -64,9 +68,9 @@
 #define DRIVER_DESC "USB remote driver for LIRC"
 #define DRIVER_NAME "lirc_atiusb"
 
-#define CODE_LENGTH 5
-#define CODE_LENGTH_ATI2 3
-#define CODE_MIN_LENGTH 3
+#define CODE_LENGTH code_length[ir->remote_type]
+#define CODE_MIN_LENGTH code_min_length[ir->remote_type]
+#define DECODE_LENGTH decode_length[ir->remote_type]
 
 #define RW2_MODENAV_KEYCODE 0x3F
 #define RW2_NULL_MODE 0xFF
@@ -89,6 +93,14 @@
  if(debug) printk(KERN_DEBUG fmt, ## args);    \
  }while(0)
 
+// ATI, ATI2, XBOX
+static const int code_length[] = {5, 3, 6};
+static const int code_min_length[] = {3, 3, 6};
+static const int decode_length[] = {5, 3, 1};
+// USB_BUFF_LEN must be the maximum value of the code_length array.
+// It is used for static arrays.
+#define USB_BUFF_LEN 6
+
 static int mask = 0xFFFF; // channel acceptance bit mask
 static int unique = 0; // enable channel-specific codes
 static int repeat = 10; // repeat time in 1/100 sec
@@ -120,6 +132,8 @@
 
 #define VENDOR_ATI1 0x0bc7
 #define VENDOR_ATI2 0x0471
+#define VENDOR_MS1 0x040b
+#define VENDOR_MS2 0x045e
 
 static struct usb_device_id usb_remote_table [] = {
  { USB_DEVICE(VENDOR_ATI1, 0x0002) }, /* X10 USB Firecracker Interface */
@@ -140,6 +154,8 @@
  { USB_DEVICE(VENDOR_ATI2, 0x0602) }, /* ATI Remote Wonder 2: Input Device */
  { USB_DEVICE(VENDOR_ATI2, 0x0603) }, /* ATI Remote Wonder 2: Controller (???) */
 
+ { USB_DEVICE(VENDOR_MS1, 0x6521) }, /* Gamester Xbox DVD Movie Playback Kit IR */
+ { USB_DEVICE(VENDOR_MS2, 0x0284) }, /* Microsoft Xbox DVD Movie Playback Kit IR */
  { } /* Terminating entry */
 };
 
@@ -168,7 +184,7 @@
 #endif
 
  /* handle repeats */
- unsigned char old[CODE_LENGTH];
+ unsigned char old[USB_BUFF_LEN];
  unsigned long old_jiffies;
 };
 
@@ -206,7 +222,8 @@
  /* remote type based on usb_device_id tables */
  enum {
  ATI1_COMPATIBLE,
- ATI2_COMPATIBLE
+ ATI2_COMPATIBLE,
+ XBOX_COMPATIBLE
  } remote_type;
 
  /* rw2 current mode (mirror's remote's state) */
@@ -369,13 +386,14 @@
 
 static void print_data(struct in_endpt *iep, char *buf, int len)
 {
- char codes[CODE_LENGTH*3 + 1];
+ const int clen = code_length[iep->ir->remote_type];
+ char codes[clen * 3 + 1];
  int i;
 
  if (len <= 0)
  return;
 
- for (i = 0; i < len && i < CODE_LENGTH; i++) {
+ for (i = 0; i < len && i < clen; i++) {
  snprintf(codes+i*3, 4, "%02x ", buf[i] & 0xFF);
  }
  printk(DRIVER_NAME "[%d]: data received %s (ep=0x%x length=%d)\n",
@@ -506,7 +524,7 @@
  int mode, i;
  char *buf = iep->buf;
 
- if (len != CODE_LENGTH_ATI2) {
+ if (len != CODE_LENGTH) {
  dprintk(DRIVER_NAME
  "[%d]: Huh?  Abnormal length (%d) buffer recieved.\n",
  ir->devnum, len);
@@ -598,6 +616,37 @@
  return SUCCESS;
 }
 
+static int code_check_xbox(struct in_endpt *iep, int len)
+{
+ struct irctl *ir = iep->ir;
+ const int clen = CODE_LENGTH;
+
+ if (len != clen)
+ {
+ dprintk(DRIVER_NAME ": We got %d instead of %d bytes from xbox ir.. ?\n", len, clen);
+ return -1;
+ }
+
+ /* check for repeats */
+ if (memcmp(iep->old, iep->buf, len) == 0)
+ {
+ if (iep->old_jiffies + repeat_jiffies > jiffies)
+ {
+ return -1;
+ }
+ }
+ else
+ {
+ // the third byte of xbox ir packet seems to contain key info
+ // the last two bytes are.. some kind of clock?
+ iep->buf[0] = iep->buf[2];
+ memset(iep->buf + 1, 0, len - 1);
+ memcpy(iep->old, iep->buf, len);
+ }
+ iep->old_jiffies = jiffies;
+
+ return SUCCESS;
+}
 
 #ifdef KERNEL_2_5
 static void usb_remote_recv(struct urb *urb, struct pt_regs *regs)
@@ -606,7 +655,7 @@
 #endif
 {
  struct in_endpt *iep;
- int len, result;
+ int len, result = -1;
 
  if (!urb)
  return;
@@ -630,6 +679,9 @@
  case SUCCESS:
 
  switch (iep->ir->remote_type) {
+ case XBOX_COMPATIBLE:
+ result = code_check_xbox(iep, len);
+ break;
  case ATI2_COMPATIBLE:
  result = code_check_ati2(iep, len);
  break;
@@ -946,6 +998,10 @@
  case VENDOR_ATI2:
  type = ATI2_COMPATIBLE;
  break;
+ case VENDOR_MS1:
+ case VENDOR_MS2:
+ type = XBOX_COMPATIBLE;
+ break;
  default:
  dprintk(DRIVER_NAME "[%d]: unknown type\n", devnum);
  return NULL;
@@ -957,6 +1013,8 @@
  if ( !(ir = kmalloc(sizeof(*ir), GFP_KERNEL)) ) {
  mem_failure = 1;
  } else {
+        // at this stage we cannot use the macro [DE]CODE_LENGTH: ir is not yet setup
+        const int dclen = decode_length[type];
  memset(ir, 0, sizeof(*ir));
  /* add this infrared remote struct to remote_list, keeping track of
  * the number of drivers registered. */
@@ -968,13 +1026,13 @@
  mem_failure = 2;
  } else if (!(rbuf = kmalloc(sizeof(*rbuf), GFP_KERNEL))) {
  mem_failure = 3;
- } else if (lirc_buffer_init(rbuf, CODE_LENGTH, 1)) {
+ } else if (lirc_buffer_init(rbuf, dclen, 1)) {
  mem_failure = 4;
  } else {
  memset(plugin, 0, sizeof(*plugin));
  strcpy(plugin->name, DRIVER_NAME " ");
  plugin->minor = -1;
- plugin->code_length = CODE_LENGTH*8;
+ plugin->code_length = dclen * 8;
  plugin->features = LIRC_CAN_REC_LIRCCODE;
  plugin->data = ir;
  plugin->rbuf = rbuf;

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV

 « Return to Thread: Lirc won't compile with 2.6.20-rc4