Skocz do zawartości

Wyświetlacz ILI9341 na współczesnym Raspbianie


atlantis86

Pomocna odpowiedź

Postanowiłem ostatnio wrócić do starego, niedokończonego projektu na Raspberry Pi Zero. Po wyjęciu go z pudełka, podłączeniu do zasilania i zalogowaniu się przez SSH okazało się, że siedzi tam ciągle stary Raspbian Jessie. Podniosłem go najpierw do Stretcha, a następnie do Bustera.

Niestety po tej drugiej aktualizacji przestał działać wyświetlacz na ILI934, podłączony do magistrali SPI. Jego konfiguracja była zawarta w pliku /etc/modprobe/fbtft.conf:

options fbtft_device custom name=fb_ili9341 rotate=90 speed=16000000 fps=50 bgr=1 buswidth=8 cs=1 gpios=reset:23,dc:24,led:25

Niestety, próba wywołania modprobe z tymi parametrami bezpośrednio z wiersza poleceń także nie przynosi efektu:

sudo modprobe fbtft_device custom name=fb_ili9341 rotate=90 speed=16000000 fps=50 bgr=1 buswidth=8 cs=1 gpios=reset:23,dc:24,led:25
modprobe: FATAL: Module fbtft_device not found in directory /lib/modules/5.10.63+

Rozumiem, że w nowej wersji systemu coś się zmieniło i ten sterownik nie jest już dostępny w formie modułu jądra. Czy mogę go w jakiś sposób uruchomić na współczesnym systemie?

Edytowano przez atlantis86
Link do komentarza
Share on other sites

Ok, odpowiem samemu sobie na wypadek, gdyby komuś podobna informacja była potrzebna w przyszłości.

Okazuje się, że uruchomienie wyświetlacza przez wpis |dtoverlay=" w /boot/config.txt wymaga obecności odpowiedniego pliky *.dtso w katalogu /boot/overlays. W moim przypadku potrzebny był plik rpi-display, do którego odwoływała się większość tutoriali. Niestety plik ten został przygotowany z myślą o konkretnym modelu nakładki na RasPi, która wykorzystywała konkretne piny oraz dodatkowo uruchamiała panel dotykowy, co u mnie prowadziło do konfliktów z innymi peryferiami.

Na szczęście jak się okazuje plik dtso możemy sobie skompilować z pliku źródłowego dts, za pomocą kompilatora dtc.

U mnie taki plik źródłowy po modyfikacjach wygląda następująco"

/*
 * Device Tree overlay for the SparkFun Electronics Top Phat
 * 
 * Adapted from the dts file from watterott: https://github.com/watterott/RPi-Display
 *
 *  dtc -@ -I dts -O dtb -o rpi-display.dtbo sfe-topphat-overlay.dts
 *
 *  To Deploy:
 *      - Compile as noted above
 *      - Copy the dtbo overlay file into /boot/overlays 
 *      - Add this to /boot/config.txt
 *           dtoverlay=rpi-display,speed=32000000,rotate=270
 */

/dts-v1/;
/plugin/;

/ {
	compatible = "brcm,bcm2835";

	fragment@0 {
		target = <&spi0>;
		__overlay__ {
			status = "okay";
		};
	};

	fragment@1 {
		target = <&spidev0>;
		__overlay__ {
			status = "disabled";
		};
	};

	fragment@2 {
		target = <&spidev1>;
		__overlay__ {
			status = "disabled";
		};
	};

	fragment@3 {
		target = <&gpio>;
		__overlay__ {
			rpi_display_pins: rpi_display_pins {
				brcm,pins = <23 24 25>; /* RESET, DC, LED */
				brcm,function = <1 1 1>; /* out out out */
				brcm,pull = <0 0 0>; /* - - - */
			};
		};
	};

	fragment@4 {
		target = <&spi0>;
		__overlay__ {
			/* needed to avoid dtc warning */
			#address-cells = <1>;
			#size-cells = <0>;

			rpidisplay: rpi-display@0{
				compatible = "ilitek,ili9341";
				reg = <1>;
				pinctrl-names = "default";
				pinctrl-1 = <&rpi_display_pins>;

				spi-max-frequency = <16000000>;
				rotate = <270>;
				bgr;
				fps = <50>;
				buswidth = <8>;
				reset-gpios = <&gpio 23 1>;
				dc-gpios = <&gpio 24 0>;
				led-gpios = <&gpio 25 1>;
				debug = <0>;
			};

		};
	};
	__overrides__ {
		speed =     <&rpidisplay>,"spi-max-frequency:0";
		rotate =    <&rpidisplay>,"rotate:0";
		fps =       <&rpidisplay>,"fps:0";
		debug =     <&rpidisplay>,"debug:0";
		backlight = <&rpidisplay>,"led-gpios:4",
		            <&rpi_display_pins>,"brcm,pins:0";
	};
};

Kluczowe zmiany w moim przypadku polegały na:

  1. Skonfigurowaniu pinów pomocniczych w częściach "fragment@3" oraz "fragment@4" - oryginalnie były tam użyte inne piny, był także dodany jeden dodatkowy, skonfigurowany jako wejście dla przycisku, którego u mnie nie ma.
  2. Dodatkowo musiałem zmienić używany pin CS - parametr "reg" w części "rpidisplay: rpi-display@0"
  3. Dodatkowo musiałem zamienić "led-gpios = <&gpio 25 0>" na "led-gpios = <&gpio 25 1>", aby podświetlanie wyświetlacza włączało się odpowiednim poziomem logicznym.

Potem już tylko trzeba było go skompilować:

dtc -@ -I dts -O dtb -o rpi-display.dtbo sfe-topphat-overlay.dts

Następnie powstały plik wrzuciłem do /boot/overlays, dodałem korespondujący wpis do /boot/config.txt i zresetowałem system. Ekran ruszył. 🙂

 

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.