カテゴリ:ソフト開発日誌
(2) なぜ 2 つも充電回路が?の続き。簡単に読めそうな所から進める。おおよそ初期設定だったり、毎回同じ値を設定している所だ。drivers/battery_v2/da9155_charger.c:da9155_charger_initialize() (以降リンク先では drivers/battery_v2 の方を見て欲しい) に VBAT_OV (VBAT overvoltage. VBAT_OV=3.6+(N×0.025) V.) の設定がある。
/* VBAT_OV: MAX(5V) */ da9155_update_reg(charger->i2c, DA9155_CONTROL_C, 0x38, DA9155_VBAT_OV_MASK); ※ 関数などのリンクは CGI と ポート 8082 のへの接続なので proxy や ファイアウオールが運用されているところではアクセスできないかもしれない。 探すとこれ以外の場所で DA9155_CONTROL_C.VBAT_OV を設定している箇所は無い。0x38==56 だ。計算すると 3.6+56*0.025=5.0 となる。電池電圧上限が 5.0V に設定されている。先の調査で充電電圧は 4.4V だと分かっている。 保護機能の一つを実質的に無効にしている。慎重さに欠けていると思う。これだけで危険と判断できない。他のアルゴリズム(回路)で保護されている可能性も有る。 もしかして何かの拍子に reset されて 強い保護が掛かる? DA9155M のデータシートを読んでも Reset 値が分からない。Reset したらどのような設定になるのか分からないデバイスで電池充電するのだろうか? SAMSUNG 向けに Reset 値をカスタマイズしてある? da9155_charger_initialize() がどこから呼び出されるか、辿ってみる。da9155_set_charger_state(), da9155_irq_handler(), da9155_chg_set_property() だ。 da9155_set_charger_state() は呼び出し元を辿っていくと /sys/class/power_supply/SupplyDevice/ 以下の property ノード読み書きに繋がる。root 権限を持つアプリなら電池充電制御ができてしまう。他の property 実装もついでに読むとアプリが主導して電池制御を行っている(あるいは行える)ように読める。アプリが強制終了したら電池の制御はどうなるのだろう? da9155_set_charger_state() を読んでいこう。保護がない。enable != 0 で呼び出すと、電池が満充電になった(充電終止電圧に達した)後でも構わず DA9155M の充電加速(BUCK_EN)を始めてしまう。STATUS_A に異常が示されている場合は何もせず戻るから大丈夫と思っている節がある。TJUNC_WARN=1 (ジャンクション温度 70℃ DA9155_CONTROL_E)でも強行だ。忘れてはいけない。VBAT_OV=5.0V なのだ。 if (enable){ da9155_irq_handler() を読んでみよう。外部電源供給状態で EVENT_B.E_RDY == 1 になったら(充電加速できない事象が発生したら)、充電を再開するように書かれている。え?再開できない状況かもしれないのに?da9155_charger_initialize(charger); da9155_read_reg(charger->i2c, DA9155_STATUS_A, &status); if (status & 0x7E ){ pr_info("%s: STATUS_A(0x%X)\n", __func__, status); return; } current_setting = da9155_get_charge_current(charger); da9155_set_charge_current(charger, 500); da9155_update_reg(charger->i2c, DA9155_BUCK_CONT, DA9155_BUCK_EN_MASK, DA9155_BUCK_EN_MASK); msleep(10); if (current_setting > 500) da9155_set_charge_current(charger, current_setting); } if (!da9155_read_reg(charger->i2c, DA9155_EVENT_A, &event_a) && da9155_chg_set_property()を読んでみる。ここも、da9155_set_charger_state() で気づいたこととほぼ同様の流れになっている。!da9155_read_reg(charger->i2c, DA9155_EVENT_B, &event_b)) { if ((event_b & 0x1) && (charger->cable_type != POWER_SUPPLY_TYPE_BATTERY)) { dev_info(charger->dev, "%s: E_RDY Event occured", __func__); da9155_mode_change(charger, da9155_check_cable_type(charger->cable_type)); da9155_charger_initialize(charger); da9155_set_vindrop_vbatov(charger); } case POWER_SUPPLY_PROP_ONLINE: 充電加速を指示されたら、どんな状況でも充電加速を始める。アプリ(Userland) のコードは .zip の中に入っているのかな... もう少し driver code を読んでみるか。charger->cable_type = val->intval; if (val->intval != POWER_SUPPLY_TYPE_BATTERY) { da9155_mode_change(charger, da9155_check_cable_type(charger->cable_type)); charger->prev_cable_type = charger->cable_type; da9155_charger_initialize(charger); da9155_set_vindrop_vbatov(charger); } else { da9155_mode_change(charger, DISABLE); charger->prev_cable_type = POWER_SUPPLY_TYPE_BATTERY; } break; 2016.10.22 追記 (4) MAX77854 の設定をアプリから変更して解決しようとした? お気に入りの記事を「いいね!」で応援しよう
[ソフト開発日誌] カテゴリの最新記事
面白いです。DA9155MはGalaxy S7には使われてないんですね。
(2017.02.15 16:00:04)
あおもん さん こんにちは、
読んで頂きうれしく思います。そうなんですよね、Galaxy S7 のソースコードもチラ見していたのですが DA9155M を使っていない様子でした。大きな差だと思っています。 SAMSUNG の説明では殆どソフトに触れず、もっと調べても良かったのではと思いました。部品は多くの人に注目されるし、分りやすい(分ったつもりにさせる)説明が出来ます。充電ドライバ屋をしていた立場からすると、ソフトの重要性も高く製品の善し悪しや安全性に対して影響が大きい要素だと思っています。 高品質なソフトを作れなければ(そしてそれを評価出来なければ)、何時までも日本も部品屋のままだと危惧しています。 (2017.02.16 18:20:03) |
|