概要
CoreMP135のLCDバックライトの明るさはaxp2101のLDLO1から供給される電圧によって、設定することができます。
CoreMP135のLCDはややまぶしいため、LCDバックライトを調整できるプログラムを作成しました。
CoreMP135のLCDの明るさ調整
CoreMP135のLCDバックライトはaxp2101のLDLO1と接続されており、LDLO1に設定する電圧によって、バックライトの明るさを設定することができます。
AXP2101のLDLO1は、レジスタのアドレスが0x99であり、レジスタに値を書き込むことで、100mVずつ、0.5V~3.5Vの範囲で設定することができますが、FT6336Uの範囲を鑑みて0.5V~3.3Vで設定します
Cross Compile Enviroment
$ arm-linux-gnueabihf-g++ -o coremp135_i2c_backlight_ctrl 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
M5CoreMP135
https://docs.m5stack.com/en/core/M5CoreMP135
AXP2101
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/products/core/Core2%20v1.1/axp2101.pdf
Backport drivers from CoreMP135-Arch project, take 1 #4
https://github.com/m5stack/CoreMP135_buildroot-external-st/pull/4