LINUX.ORG.RU

SSD1306, device tree

 ,


1

2

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

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

Ответ на: комментарий от anonymous

В документации, это в https://elixir.bootlin.com/linux/v5.10.60/source/Documentation/devicetree/bin... или где-то в другом месте?

Потому что тут вроде написано:

``` - compatible: Should be «solomon,<chip>fb-<bus>». The only supported bus for now is i2c, and the supported chips are ssd1305, ssd1306, ssd1307 and ssd1309. ```

У меня именно ssd1306 чип, поэтому я использовал «solomon,ssd1306fb-i2c».

Ivan_sam ()
Ответ на: комментарий от Ivan_sam

В документации

https://elixir.bootlin.com/linux/v5.10.60/source/Documentation/devicetree/bindings/display/ssd1307fb.txt#L52

описаны биндинги для драйвера

https://elixir.bootlin.com/linux/v5.10.60/source/drivers/video/fbdev/ssd1307fb.c#L565

смотри строку

compatible = "solomon,ssd1306fb-i2c",

в staging другая реализация драйвера для ssd1306. В твоей сборке видимо не собран старый драйвер который описан в документации а собран только из staging - он написан для управления через spi и естественно на i2c работать не будет.

anonymous ()
Ответ на: комментарий от anonymous

В твоей сборке видимо не собран старый драйвер который описан в документации

если собран то лежит в модулях тут

/lib/modules/x.x.x/kernel/drivers/video/fbdev/ssd1307fb.ko

anonymous ()
Ответ на: комментарий от anonymous

Благодарю, заработало. Модуля ssd1307 не было. Пересобрал ядро с этим модулем и все завелось.

Ivan_sam ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей