Jump to content

    
shworker

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

Recommended Posts

Делаю девайс на основе 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

Edited by shworker

Share this post


Link to post
Share on other sites

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

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

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

Или.

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


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

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


 

Share this post


Link to post
Share on other sites

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

 

Edited by shworker

Share this post


Link to post
Share on other sites
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 и линк сюда

Share this post


Link to post
Share on other sites
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

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

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

Share this post


Link to post
Share on other sites
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 на экране.

 

Edited by shworker

Share this post


Link to post
Share on other sites
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 серии проходные неинвертирующие ЛЭ

Share this post


Link to post
Share on other sites
5 minutes ago, Jury093 said:

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

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

Share this post


Link to post
Share on other sites
21 минуту назад, aaarrr сказал:

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

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

Share this post


Link to post
Share on other sites
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 показаны.


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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.