2011年7月10日日曜日

[KERNEL] Galaxy S2 BLN support kernel *TEST* version part-3

手元ではUSB接続下ではBLNは動作してますが。。もうちょっとkernel見ないと完全じゃないです。というわけで、今回はlightsの修正ポイントについて。基本方針のところで述べたように、neldarさんのAPPがそのまま使えるように、ソースを修正してみます。

そのまえに、初回に懸念していた、TEMPERATURE_READ関連ですが、SGS2のシステム側がどのようなコールバック関数を登録しようとしているか、debug-logを出すことで確認してみたところ、特に必要なさそうことがわかりました。lightsは初期化時に、システム側から、LEDやバックライトなどの調節をするための関数の登録を求められますが、システムがどのような関数の登録を求めているか実際にログに出し、確認しただけです。以下、そのときのDDMSの画面キャプチャ。



これによると、TEMPERATURE_READは必要なさそうです。さて、前回取得したfroyoのソースディレクトリに移動します。
cd ./froyo/hardware/msm7k/liblights
バックアップは取っときましょう。
cp lights.c lights.c.org
で、今回のコード
creams@nexus:~/android/froyo/hardware/msm7k/liblights$ diff -cNr lights.c.orig lights.c
*** lights.c.orig 2011-07-09 19:15:56.496289937 +0900
--- lights.c 2011-07-10 21:19:07.012133668 +0900
***************
*** 61,67 ****
          = "/sys/class/leds/amber/brightness";
 
  char const*const LCD_FILE
!         = "/sys/class/leds/lcd-backlight/brightness";
 
  char const*const RED_FREQ_FILE
          = "/sys/class/leds/red/device/grpfreq";
--- 61,67 ----
          = "/sys/class/leds/amber/brightness";
 
  char const*const LCD_FILE
!         = "/sys/class/backlight/pwm-backlight/brightness";
 
  char const*const RED_FREQ_FILE
          = "/sys/class/leds/red/device/grpfreq";
***************
*** 79,85 ****
          = "/sys/class/leds/keyboard-backlight/brightness";
 
  char const*const BUTTON_FILE
!         = "/sys/class/leds/button-backlight/brightness";
 
  /**
   * device methods
--- 79,89 ----
          = "/sys/class/leds/keyboard-backlight/brightness";
 
  char const*const BUTTON_FILE
!         = "/sys/devices/virtual/misc/melfas_touchkey/brightness";
!
! // sysfs file for BLN
! char const*const NOTIFICATION_FILE
!         = "/sys/class/misc/backlightnotification/notification_led";
 
  /**
   * device methods
***************
*** 108,113 ****
--- 112,118 ----
      if (fd >= 0) {
          char buffer[20];
          int bytes = sprintf(buffer, "%d\n", value);
+         LOGE("write_int : %s %d\n", path, value);
          int amt = write(fd, buffer, bytes);
          close(fd);
          return amt == -1 ? -errno : 0;
***************
*** 190,196 ****
      int on = is_lit(state);
      pthread_mutex_lock(&g_lock);
      g_buttons = on;
!     err = write_int(BUTTON_FILE, on?255:0);
      pthread_mutex_unlock(&g_lock);
      return err;
  }
--- 195,202 ----
      int on = is_lit(state);
      pthread_mutex_lock(&g_lock);
      g_buttons = on;
!     /* for BLN 1(on) or 2(off) */
!     err = write_int(BUTTON_FILE, on?1:2);
      pthread_mutex_unlock(&g_lock);
      return err;
  }
***************
*** 313,323 ****
      g_notification = *state;
      LOGV("set_light_notifications g_trackball=%d color=0x%08x",
              g_trackball, state->color);
!     if (g_haveTrackballLight) {
!         handle_trackball_light_locked(dev);
!     }
!     handle_speaker_battery_locked(dev);
      pthread_mutex_unlock(&g_lock);
      return 0;
  }
 
--- 319,331 ----
      g_notification = *state;
      LOGV("set_light_notifications g_trackball=%d color=0x%08x",
              g_trackball, state->color);
!
!     /* for BLN */
!     int on = is_lit(state);
!     int err = write_int( NOTIFICATION_FILE, on?1:0 );
!
      pthread_mutex_unlock(&g_lock);
+
      return 0;
  }
 
***************
*** 365,388 ****
      int (*set_light)(struct light_device_t* dev,
              struct light_state_t const* state);
 
      if (0 == strcmp(LIGHT_ID_BACKLIGHT, name)) {
          set_light = set_light_backlight;
      }
-     else if (0 == strcmp(LIGHT_ID_KEYBOARD, name)) {
-         set_light = set_light_keyboard;
-     }
      else if (0 == strcmp(LIGHT_ID_BUTTONS, name)) {
          set_light = set_light_buttons;
      }
-     else if (0 == strcmp(LIGHT_ID_BATTERY, name)) {
-         set_light = set_light_battery;
-     }
      else if (0 == strcmp(LIGHT_ID_NOTIFICATIONS, name)) {
          set_light = set_light_notifications;
      }
-     else if (0 == strcmp(LIGHT_ID_ATTENTION, name)) {
-         set_light = set_light_attention;
-     }
      else {
          return -EINVAL;
      }
--- 373,390 ----
      int (*set_light)(struct light_device_t* dev,
              struct light_state_t const* state);
 
+     /* for BLN test */
+     LOGE("CMD name =>%s\n", name);
+
      if (0 == strcmp(LIGHT_ID_BACKLIGHT, name)) {
          set_light = set_light_backlight;
      }
      else if (0 == strcmp(LIGHT_ID_BUTTONS, name)) {
          set_light = set_light_buttons;
      }
      else if (0 == strcmp(LIGHT_ID_NOTIFICATIONS, name)) {
          set_light = set_light_notifications;
      }
      else {
          return -EINVAL;
      }
***************
*** 415,421 ****
      .version_major = 1,
      .version_minor = 0,
      .id = LIGHTS_HARDWARE_MODULE_ID,
!     .name = "QCT MSM7K lights Module",
!     .author = "Google, Inc.",
      .methods = &lights_module_methods,
  };
--- 417,423 ----
      .version_major = 1,
      .version_minor = 0,
      .id = LIGHTS_HARDWARE_MODULE_ID,
!     .name = "Modified QCT MSM7K lights Module",
!     .author = "creams@nexus",
      .methods = &lights_module_methods,
  };
今回はあっても必要なさそうな、処理はさっくりはぶいて、必要な部分だけに絞ってみました。基本的にはLCD_FILE,BUTTON_FILE,を変更してNOTIFICATION_FILEを加えただけですね。あとはこれを適用してみます。lights.msm7k.soをlights.SC-02C.so にリネームしてから入れ替えます。バックアップも忘れずに。
バックアップ
adb pull /system/lib/hw/lights.SC-02C.so .
..
.

入れ替え
cp lights.msm7k.so lights.SC-02C.so
adb remount
adb push lights.SC-02C.so /system/lib/hw/
adb reboot
そのうちgithubあたりにソースとバイナリアップしておきます。以下はMarktにあるneldarさん作のBLN Test Appでの結果です、ちゃんと認識してますね。



次回kernel話かけたらいいなぁ。。(安定せず。。)

0 コメント:

コメントを投稿