CoreMP135のLCDの明るさ調整する

## 概要

CoreMP135のLCDバックライトの明るさはaxp2101のLDLO1から供給される電圧によって、設定することができます。
CoreMP135のLCDはややまぶしいため、LCDバックライトを調整できるプログラムを作成しました。<br>

![image](https://github.com/nnn112358/CoreMP135_LCD_backlight_setting/assets/27625496/310ec974-7242-4b90-bce0-5e204651ae7a)

## CoreMP135のLCDの明るさ調整

<img width="640" alt="image1" src="https://github.com/nnn112358/CoreMP135_LCD_backlight_setting/assets/27625496/777dfd4b-1087-4614-b609-0d0b7097ca45"><br>
CoreMP135のLCDバックライトはaxp2101のLDLO1と接続されており、LDLO1に設定する電圧によって、バックライトの明るさを設定することができます。<br>

<img width="640" alt="image2" src="https://github.com/nnn112358/CoreMP135_LCD_backlight_setting/assets/27625496/a386b683-f3ab-48c8-bf3c-dae81d94dece"><br>
AXP2101のLDLO1は、レジスタのアドレスが0x99であり、レジスタに値を書き込むことで、100mVずつ、0.5V～3.5Vの範囲で設定することができますが、FT6336Uの範囲を鑑みて0.5V～3.3Vで設定します<br>

Cross Compile Enviroment
``` 
$ arm-linux-gnueabihf-g++ -o coremp135_i2c_backlight_ctrl coremp135_i2c_backlight_ctrl.cpp 
```

```coremp135_i2c_backlight_ctrl.cpp 
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <unistd.h>

#include <bitset>
#include <iostream>

// I2C通信のための定数定義
#define AXP2101_ADDR 0x34  // AXP2101のアドレス
#define AXP2101_REG_DLDO1_CFG 0x99  // 書き込むレジスタのアドレス
#define AXP2101_MAX_BACKLIGHT_REG 28  // バックライトの最大レジスタ値 (3.3V)

// メイン関数
int main() {
  int file;  // I2Cバスのファイルディスクリプタ
  const char *filename = "/dev/i2c-0";  // I2Cバスデバイスファイル
  int deviceAddress = AXP2101_ADDR;  // I2Cデバイスアドレス
  __u8 regAddress = AXP2101_REG_DLDO1_CFG;  // 書き込むレジスタのアドレス
  unsigned int number;  // 入力される整数を保持する変数

  // I2Cバスを開く
  if ((file = open(filename, O_RDWR)) < 0) {
    std::cerr << "I2Cバスのオープンに失敗しました" << std::endl;
    return 1;
  }

  // I2Cデバイスアドレスを設定する
  if (ioctl(file, I2C_SLAVE, deviceAddress) < 0) {
    std::cerr << "バスアクセスの取得またはスレーブとの通信に失敗しました。"
              << std::endl;
    close(file);
    return 1;
  }

  // 標準入力から符号なし整数を読み取る
  std::cout << "AXP2101 DLDO1 設定値を入力してください: ";
  std::cin >> number;

  // 数値がバックライトの最大レジスタ値を超えないようにする
  if (number > AXP2101_MAX_BACKLIGHT_REG) {
    number = AXP2101_MAX_BACKLIGHT_REG;
  }

  // 数値を10進数、16進数、2進数で表示
  std::cout << "---------------------------" << std::endl;
  std::cout << "AXP2101 DLDO1 電圧: " << number * 0.1 + 0.5 << "[V]" << std::endl;
  std::cout << "Dec: " << number << std::endl;
  std::cout << std::hex << "Hex: " << number << std::endl;
  std::cout << std::dec << "Bi: " << std::bitset<8>(number) << std::endl;
  std::cout << "---------------------------" << std::endl;

  // レジスタにデータを書き込む
  __u8 buffer[2] = {regAddress, static_cast<__u8>(number)};
  if (write(file, buffer, 2) != 2) {
    std::cerr << "I2Cバスへの書き込みに失敗しました。" << std::endl;
    close(file);
    return 1;
  }

  // I2Cバスを閉じる
  close(file);
  std::cout << "データの書き込みが成功しました。" << std::endl;

  return 0;
}
```

Run with CoreMP135
```
$ sudo ./coremp135_i2c_backlight_ctrl
Enter AXP2101 DLDO1 Setting integer: 22
AXP2101 DLDO1 Valtage: 2.7[V]
Dec: 22
Hex: 16
Bi: 00000000000000000000000000010110
Data written successfully.
```
22のあたりが良さそうです。


# 補足

CoreMP135_buildroot-external-stのcommit d621106(24/6/27)以降から、
バックライトへアクセスして明るさ調節できるドライバーが導入されました。(0~100の範囲で指定する)

```
 echo 0 > /sys/class/backlight/axp2101_m5stack_bl/brightness
 echo 80 > /sys/class/backlight/axp2101_m5stack_bl/brightness
 echo 100 > /sys/class/backlight/axp2101_m5stack_bl/brightness
```

# Reference
M5Stack CoreMP135のI2C/SPI内部配線まとめ (上級開発者向け)
https://qiita.com/memetan/items/2c1ca1e34b06a2eaaeb8<br>
M5CoreMP135
https://docs.m5stack.com/en/core/M5CoreMP135<br>
AXP2101
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/products/core/Core2%20v1.1/axp2101.pdf<br>
Backport drivers from CoreMP135-Arch project, take 1 #4
https://github.com/m5stack/CoreMP135_buildroot-external-st/pull/4