SSD1306, device tree
Добрый день. Пытаюсь подключить экран на контроллере ssd1306 по i2c. В качестве хоста - nanopi с armbian, ядро 5.10.60-sunxi.
Для начала, проверил работу из userspace - включил overlay для i2c0, посмотрел адрес устройства в i2cdetect. Для теста, что экран рабочий, использовал проект SSD1306 Экран работает, все рисует.
Теперь хочу подключить его как framebuffer. В ядре есть для него драйвер:
root@nanopiair:~# find /lib/modules/$(uname -r)/kernel/drivers/ -iname "*ssd1306*"
/lib/modules/5.10.60-sunxi/kernel/drivers/staging/fbtft/fb_ssd1306.ko
Пример dts взял из описания Описание правда немного странное. В начале указаны «Required properties:», а в примерах их нет.
В итоге добавил вот такой dts:
/dts-v1/;
/plugin/;
/ {
compatible = "allwinner,sun8i-h3";
fragment@0 {
target = <&i2c0>;
__overlay__ {
pinctrl-names = "default";
pinctrl-0 = <&i2c0_pins>;
status = "okay";
ssd1306: oled@3c {
compatible = "solomon,ssd1306fb-i2c";
reg = <0x3c>;
solomon,height = <128>;
solomon,width = <64>;
solomon,page-offset = <0>;
};
};
};
};
Добавил overlay в настройки, но после перезагрузки в выводе dmesg ничего нет про ssd1306 и /dev/fb? не появляется.
Чтобы проверить, что overlay применился, после загрузки смотрю итоговое дерево:
dtc --sort -I fs -O dts /sys/firmware/devicetree/base > device_tree.out
i2c@1c2ac00 {
#address-cells = <0x01>;
#size-cells = <0x00>;
clocks = <0x03 0x3b>;
compatible = "allwinner,sun6i-a31-i2c";
interrupts = <0x00 0x06 0x04>;
phandle = <0x6e>;
pinctrl-0 = <0x1c>;
pinctrl-names = "default";
reg = <0x1c2ac00 0x400>;
resets = <0x03 0x2e>;
status = "okay";
oled@3c {
compatible = "solomon,ssd1306fb-i2c";
phandle = <0x86>;
reg = <0x3c>;
solomon,height = <0x80>;
solomon,page-offset = <0x00>;
solomon,width = <0x40>;
};
power-sensor@40 {
compatible = "ti,ina226";
reg = <0x40>;
shunt-resistor = <0x3e8>;
};
};
В i2c0 вижу мой overlay, т.е. все применилось. power-sensor - это ina226 еще подключен и работает.
Модуль ядра тоже есть, его можно подгрузить руками modprobe fb_ssd1306
, но кроме сообщения в dmesg о том, что модуль этот staging, ничего больше нет. /dev/fb не появляется.
В описании ssd1307 указано, что на данный момент поддерживается только шина I2C. Но в коде самого драйвера ssd1306.c почему-то указана SPI:
MODULE_ALIAS("spi:" DRVNAME);
MODULE_ALIAS("platform:" DRVNAME);
MODULE_ALIAS("spi:ssd1306");
MODULE_ALIAS("platform:ssd1306");
MODULE_DESCRIPTION("SSD1306 OLED Driver");
MODULE_AUTHOR("Noralf Tronnes");
MODULE_LICENSE("GPL");
Собственно вопрос, что делать и почему не работает?