support sony
authorNIIBE Yutaka <gniibe@fsij.org>
Thu, 27 Oct 2011 13:45:52 +0000 (22:45 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Thu, 27 Oct 2011 13:45:52 +0000 (22:45 +0900)
src/pin-cir.c

index d3fa51c..aa7888b 100644 (file)
@@ -396,9 +396,49 @@ cir_codetable_regza[] = {
 
 static const struct codetable
 cir_codetable_bravia[] = {
-
+  { 0x15, ' ' }, /* 電源 */
+  { 0x95, '0' }, /* d 0x4b */
+  { 0x00, '1' }, /* 1 */
+  { 0x01, '2' }, /* 2 */
+  { 0x02, '3' }, /* 3 */
+  { 0x03, '4' }, /* 4 */
+  { 0x04, '5' }, /* 5 */
+  { 0x05, '6' }, /* 6 */
+  { 0x06, '7' }, /* 7 */
+  { 0x07, '8' }, /* 8 */
+  { 0x08, '9' }, /* 9 */
+  { 0x09, 'a' }, /* 10 */
+  { 0x0a, 'b' }, /* 11 */
+  { 0x0b, 'c' }, /* 12 */
+  { 0x10, 'd' }, /* CH+ */
+  { 0x11, 'd' }, /* CH- */
+  { 0x12, 'f' }, /* Vol+ */
+  { 0x13, 'g' }, /* Vol- */
+  { 0x14, 'h' }, /* Mute */
+  { 0xa4, 'i' }, /* 青 0x4b */
+  { 0xa5, 'j' }, /* 赤 0x4b */
+  { 0xa6, 'k' }, /* 緑 0x4b */
+  { 0xa7, 'l' }, /* 黄 0x4b */
+  { 0x3a, 'm' }, /* 画面表示 */
+  { 0x3d, 'n' }, /* ワイド切換 */
+  { 0x74, 'o' }, /* 上 */
+  { 0x75, 'p' }, /* 下 */
+  { 0x33, 'q' }, /* 右 */
+  { 0x34, 'r' }, /* 左 */
   { 0x65, CH_RETURN }, /* 決定 */
-  { 0xa4, CH_BACKSPACE }, /* 戻る */
+  { 0xa3, CH_BACKSPACE }, /* 戻る 0x4b */
+  { 0xac, 's' }, /* BS 0x4b */
+  { 0xab, 't' }, /* CS 0x4b */
+  { 0x5b, 'u' }, /* 番組表 0x52 */
+  { 0x17, 'v' }, /* 音声切換 */
+  { 0xa8, 'w' }, /* 字幕 0x4b */
+  { 0x5c, 'x' }, /* メモ */
+  { 0xb6, 'y' }, /* ツール 0x4b */
+  { 0x8c, 'z' }, /* 10キー 0x4b */
+  { 0x60, '!' }, /* メニュー */
+  { 0xae, '@' }, /* アナログ 0x4b */
+  { 0xb2, '#' }, /* デジタル 0x4b */
+  { 0x25, '$' }, /* 入力切換 */
 
   {0, 0} /* <<END>>   */,
 };
@@ -479,7 +519,12 @@ cir_getchar (systime_t timeout)
 
   switch (cir_proto)
     {
+    case CIR_PROTO_RC5:
+      cir_data &= 0x003f;
+      goto err;
     case CIR_PROTO_RC6:
+      cir_addr = cir_data >> 8; /* in case of cir_seq == 16.  32??? */
+      cir_data &= 0x00ff;
       return find_char_codetable (cir_data, cir_codetable_dell_mr425);
     case CIR_PROTO_NEC:
       cir_addr = cir_data&0xffff;
@@ -500,9 +545,20 @@ cir_getchar (systime_t timeout)
       else
        goto err;
     case CIR_PROTO_SONY:
-#if 0
+      /* Remove ADDRESS bits and filter COMMAND bits */
+      if (cir_seq == 1 + 12)
+       {
+         cir_addr = cir_data >> 7;
+         cir_data = cir_data & 0x007f;
+         /* ADDRESS = 0x01 (5-bit) */
+       }
+      else
+       {
+         cir_addr = cir_data >> 8;
+         cir_data = cir_data & 0x00ff;
+         /* ADDRESS = 0x4b or 0x52 (7-bit) */
+       }
       return find_char_codetable (cir_data, cir_codetable_bravia);
-#endif
     err:
     default:
       /* encode debug information */
@@ -797,14 +853,9 @@ cir_timer_interrupt (void)
              cir_input_last = now;
              ignore_input = 1;
            }
-         /* Remove ADDRESS bits and filter COMMAND bits */
          else if (cir_proto == CIR_PROTO_SONY)
            {
-             if (cir_seq == 1 + 12)
-               cir_data = cir_data & 0x007f;
-             else if (cir_seq == 1 + 15)
-               cir_data = cir_data & 0x00ff;
-             else
+             if (cir_seq != 1 + 12 && cir_seq != 1 + 15)
                ignore_input = 1;
            }
          else if (cir_proto == CIR_PROTO_OTHER)
@@ -836,16 +887,12 @@ cir_timer_interrupt (void)
            }
          else if (cir_proto == CIR_PROTO_RC6)
            {
-             if (cir_seq == 16 || cir_seq == 32)
-               cir_data &= 0x00ff;
-             else
+             if (cir_seq != 16 && cir_seq != 32)
                ignore_input = 1;
            }
          else if (cir_proto == CIR_PROTO_RC5)
            {
-             if (cir_seq == 14)
-               cir_data &= 0x003f;
-             else
+             if (cir_seq != 14)
                ignore_input = 1;
            }
          else