LINUX.ORG.RU

Сообщения Ivan_sam

 

SSD1306, device tree

Форум — Linux-hardware

Добрый день. Пытаюсь подключить экран на контроллере 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");

Собственно вопрос, что делать и почему не работает?

 ,

Ivan_sam
()

RSS подписка на новые темы