Перейти к содержанию
    

ILI9341 framebuffer. Странное на экране

Делаю девайс на основе SOC MediaTek MT7628AN.

ОС - OpenWrt

И захотелось приделать к нему дисплей. 

Выбор пал на ILI9341, как имеющий интерфейс SPI и богатую поддержку (как я тогда думал).

Повесил его на SPI0, на которой висит флешка (на CS1).

В DT описал так:

&spi0 {
    status = "okay";

    pinctrl-names = "default";
    pinctrl-0 = <&spi_pins>, <&spi_cs1_pins>;

    m25p80@0 {
...... // тут описание флешки
      }
display@0{
        compatible = "ilitek,ili9341";
        reg = <1>;
        spi-max-frequency = <16000000>;
        dc-gpios = <&gpio1 6 GPIO_ACTIVE_LOW>;
        reset-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
        buswidth = <8>;
        rotate = <270>;
        fps = <25>;
        bgr;
        debug = <1>;
//      status = "okay";
	};
  };
  

Драйвер фреймбуфера: fb_ili9341.c

Но на экране только то, что на картинке. Видно, что вместо изображения - только малелькая "строчка из пикселей" (справа внизу).

Параметром rotate игрался - ничено не дало. Только та самая "строчка из пикселей" перемещается в другой угол экрана.

Дополнение: другой дисплей пробовал. Результат тот же. Этот же дисплей пробовал на RaspberryPi - работает ОК.

 

IMG_20210527_124005.jpg

Изменено пользователем shworker

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какой у вас видео режим? Он соответствует дисплею. Размер дисплея, формат упаковки пикселей, частота смены кадров.

fbset -i что показывает?

Надеюсь у вас fbset установлена.

Или.

Найдите такой файл:
cat /sys/devices/platform/display-engine/graphics/fb0/modes


В нем список определенных в ядре размеров экрана для fb0. Есть ли определение вашего размера в нем?

Надо описать нужный вам режим работы дисплея. Разрешение, формат пикселя и т.д.
У вас, вижу, только 25 кадров в секунду определено.
 


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

fbset -i не показывает ничего.

root@OpenWrt:/# cat /sys/devices/platform/display-engine/graphics/fb0/modes
cat: can't open '/sys/devices/platform/display-engine/graphics/fb0/modes': No such file or directory

 

Нашелся вот такой файл: 

root@OpenWrt:/# cat /sys/class/graphics/fb0/modes 
U:320x240p-0

 

Изменено пользователем shworker

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, shworker сказал:

fbset -i не показывает ничего.

Нашелся вот такой файл: 


root@OpenWrt:/# cat /sys/class/graphics/fb0/modes 
U:320x240p-0

 

 

странно, что fbset ничего не выводит, должно быть подобно:

fbset -i

mode "320x240"
    geometry 320 240 320 240 16
    timings 0 0 0 0 0 0 0
    rgba 5/11,6/5,5/0,0/0
endmode

линк на драйвер покажите и до кучи вывод команды dmesg в файл, куда-нить на pastebin.com и линк сюда

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

root@OpenWrt:/# uname -a
Linux OpenWrt 4.14.63 #0 Thu Aug 16 07:51:15 2018 mips GNU/Linux

Драйвер: https://www.dropbox.com/s/gqq9blkkcj7dcp9/fb_ili9341.c?dl=0

Dmesg: https://www.dropbox.com/s/jor3tzrufc2sa14/dmesg.txt?dl=0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, shworker сказал:

root@OpenWrt:/# uname -a
Linux OpenWrt 4.14.63 #0 Thu Aug 16 07:51:15 2018 mips GNU/Linux

Драйвер: https://www.dropbox.com/s/gqq9blkkcj7dcp9/fb_ili9341.c?dl=0

Dmesg: https://www.dropbox.com/s/jor3tzrufc2sa14/dmesg.txt?dl=0

видно, что драйвер загружается

[ 0.957001] fb_ili9341 spi0.1: fbtft_request_one_gpio: 'reset-gpios' = GPIO36

[ 0.971206] fb_ili9341 spi0.1: fbtft_request_one_gpio: 'dc-gpios' = GPIO38

[ 1.252525] graphics fb0: fb_ili9341 frame buffer, 320x240, 150 KiB video memory, 16 KiB buffer memory, fps=25, spi0.1 at 16 MHz

до контроллера экрана что-то долетает, раз он показывает цветной мусор

есть ли в системе устройство /dev/fb0

и если есть, то попробуйте команду 

dd if=/dev/urandom of=/dev/fb0 bs=1 count=153600

это вывод рандома в память фреймбуфера - экран должен заполниться цветными точками

ЗЫ байты в процедуре инита экрана на Малине и тут одинаковые?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 hours ago, Jury093 said:

есть ли в системе устройство /dev/fb0

Да.

21 hours ago, Jury093 said:

и если есть, то попробуйте команду 


dd if=/dev/urandom of=/dev/fb0 bs=1 count=153600

Те же яйца, только в профиль. Полоска из пикселей  в углу, только содержимое отличается.

21 hours ago, Jury093 said:

ЗЫ байты в процедуре инита экрана на Малине и тут одинаковые?

Посмотрел в исходниках драйвера у себя и в RaspiOS. Одинаковые.

К соалению, мой  логический анализатор не хватает более 5MHz. Бюджетный Китай.

И еще, если подключаю ЛА на пины дисплея (для этого и припаял вторую гребенку) - сыпяться ошибки файловой системы. 

Надо как-то буферизовать SPI, но вот как ?

Странно, может, конечно, из-за этого и мусор на экране, но почему всегда один и тот же, в одном и том же месте ? Ведь если бы туда залетал random из-за помех на линиях SPI - то и был бы random на экране.

 

Изменено пользователем shworker

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

49 минут назад, shworker сказал:

Да.

Те же яйца, только в профиль. Полоска из пикселей  в углу, только содержимое отличается.

Посмотрел в исходниках драйвера у себя и в RaspiOS. Одинаковые.

К соалению, мой  логический анализатор не хватает более 5MHz. Бюджетный Китай.

И еще, если подключаю ЛА на пины дисплея (для этого и припаял вторую гребенку) - сыпяться ошибки файловой системы. 

Надо как-то буферизовать SPI, но вот как ?

Странно, может, конечно, из-за этого и мусор на экране, но почему всегда один и тот же, в одном и том же месте ? Ведь если бы туда залетал random из-за помех на линиях SPI - то и был бы random на экране.

 

 

ну хорошо, по логике вроде все правильно - устройство есть, модуль грузится. видимо проблема где-то в транспорте SPI

есть смысл снизить частоту, например в этой строке:

spi-max-frequency = <16000000>;

сойдет вплоть до 1 МГц, также уже можно будет пробовать анализатор

по подключению не понятны пара моментов - длина проводов от платы до экрана (чем короче, тем лучше)

и есть ли возможность отсадить экран на отдельный SPI, особенно если на SPI0.0 сидит флешка с рутовой

чисто для проверки можно прописать SPI-GPIO и подключить экран на любые подходящие io контакты платы

также проверьте в конфиге ядра, что включена поддержка консоли:

CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y

в логе должна появиться строка

[   45.945460] Console: switching to colour frame buffer device 40x30

ЗЫ как буфера можно использовать из 74 серии проходные неинвертирующие ЛЭ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, Jury093 said:

есть ли возможность отсадить экран на отдельный SPI, особенно если на SPI0.0 сидит флешка с рутовой

На nfs вынести, или вообще в RAM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 минуту назад, aaarrr сказал:

На nfs вынести, или вообще в RAM.

здравая идея, согласен. или на любой подходящий накопитель..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 hours ago, Jury093 said:

ну хорошо, по логике вроде все правильно - устройство есть, модуль грузится. видимо проблема где-то в транспорте SPI

Есть разные форматы пикселя.
https://www.programmersought.com/article/94511583062/

Надо знать какой формат принимает дисплей и дать в точности.
Какой colorspace? YUV, RGB? Сколько бит на пиксель? 8, 15, 16, 18, 24 или 32?
Надо знать ответы на эти вопросы и в соответствии с ними задать параметры устройства. Заодно посмотреть если драйвер поддерживает этот формат.
Проблема точно в этом.

 

On 5/31/2021 at 5:06 AM, shworker said:

Нашелся вот такой файл: 


root@OpenWrt:/# cat /sys/class/graphics/fb0/modes 
U:320x240p-0

 

Это как раз он и есть. Я потомиу и сказал поискать, что он будет в другом месте.

У вас дисплей 320 на 240 пикселей?
 

Вот по теме:
https://www.digi.com/resources/documentation/digidocs/90001945-13/reference/yocto/r_an_adding_custom_display.htm

 

Вот пример формата пикселя. color space RGB 24 бита на пиксель. 

        interface_pix_fmt = "RGB24";

     

 

что такое

&ldb {
    status = "okay";
 
    lvds-channel@0 {
        fsl,data-mapping = "spwg";
        fsl,data-width = <18>;
        display-timings {
            native-mode = <&timing0>;
            timing0: hsd101pfw2 {
                clock-frequency = <45000000>;
                hactive = <1024>;
                vactive = <600>;
                hfront-porch = <0>;
                hback-porch = <0>;
                hsync-len = <176>;
                vback-porch = <0>;
                vfront-porch = <0>;
                vsync-len = <25>;
            };
        };
    };
};

вы узнаете из этой ссылки:
https://www.kernel.org/doc/html/latest/fb/framebuffer.html

Там в конце картинка с активным окном на фоне большего окна, где синхроимппульсы front porch back porch показаны.


Что будет непонятно спросите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...