Aufgrund des starken Aufkommens von kleinen Einchiprechnern als Kopien oder Verbesserungen vom RaspberryPi bin ich auf der Suche nach einem Interessanten Gerät über den BananaPi gestolpert. Mit einem kleinen Allwinner Dualcore SoC, Gigabit Ethernet, Sata, sowie wie Energiemanagement IC mit Li* Akku Lötpads sowieso RTC fand ich ihn interessant genug um Ihn auszuprobieren und so kam er für 35€ zu mir nach Hause.
Die Gigabit Ethernet Verbindung konnte bei mir mit iperf und netcat maximal 841 Mbits/sec erziehlen, vielleicht kann man hier noch etwas optimieren aber soweit ist es ganz Ordentlich. Mit einer an Sata angeschlossenen SSD erziehlt er als NFS Server 42Mib/s, was die Verwendung als kleines NAS gar nicht so Uninteressant macht, allerdings die vorhandene Bandbreite nicht ausreizt.
Das aber nur Nebenbei, hier geht es um die Verwendung von einem BananaPi in Verbindung mit einem LVDS Display.
Ziel war es den LVDS Ausgang von dem BananaPi dazu benutzen das Display von meinem alten Notebook anzusteuern. Bei diesem ist die Grafikkarte unwiederbringlich zerstört, also benötigt es das Display auch nicht mehr.
Weiterhin ist diese Schnittstelle bei Displays und vor allem Notebooks relativ weit verbreitet, wird jetzt scheinbar langsam durch eDP verdrängt (bei neuen Notebooks bzw. Tablets).
Das einzige was man im Internet zu LVDS am BananaPi findet handelt von einem 7″ TFT welches direkt über ein 40pol FPC Kabel angesteckt werden kann, und das ist auch nur bedingt zutreffend auf meinen Fall. Hier also was ich gelernt habe.
Zuerst die Hardware:
Hierfür benötigen wir erst einmal das Datenblatt von unserem LCD, bei den meisten Modellen sollte eine Suchmaschine brauchbare Ergebnisse liefern, in meinem Fall ist es ein LCD von AUO (link zur .pdf). Zusammen mit den Angaben zu CON2 bei den Produktionformationen vom BananaPi können wir feststellen das es keine fertige Adapterlösung gibt bzw. geben wird. Aber was ist daran schon schwer, wir müssen doch nur 8 Drähte richtig anschließen ;).
In den Datenblättern müssen wir nun die für LVDS verantwortlichen Pins finden, LVDS ist ein differenzielles Signal, das heißt die Datenleitungen sind immer paarweise. Das Display benötigt 3 Paare Daten und ein Paar für das Taktsignal. Hier ist es ziemlich eindeutig – an CON2 von BPi benötigen wir die 8 Pins mit LVDS0 beschriftet sowie GND. Das Display benötigt zusätzlich die beiden 3,3V VDD für die interne logik, ausserdem kann EDID angeschlossen werden. (EDID ist ein EEPROM welchem im Display sitzt und via I²C Bus angebunden wird, hierrüber können theoretisch Informationen vom Display ausgelesen werden mithilfe derer man den Grafikausgang konfigurieren kann – ich weiß nicht einmal ob das hier überhaupt hilft. Wenn man es mit anschließen will, es schadet nicht – es muss beim BPi an TWI3-SCK / TWI3-SDA)
Da ich nun nichts mehr mit dem FPC Verbinder anfangen kann habe ich mit einem Lötkolben, viel Zinn und viel Leistung selbigen „gewaltsam“ entfernt. Idealerweise hätten wir eine kleine Adapterplatine auf welcher ein 40pol FPC Verbinder sitzt, dahinter für jeden Pin ein Lötauge im 1,25mm Raster, dazu noch einen DC/DC Wandler von 5V auf 3,3V, und ein paar Jumper – sozusagen als Universaladapter für Displays am BPi.
Da wir so etwas nicht haben, zurück zu meinem BPi – nun ohne FPC Verbinder. Beim Ablöten sind leider 4 Pins verloren gegangen, das ist zwar schade aber die brauch ich Glücklicherweise nicht. Anhand von unserem Verdrahtungsplan werden nun die Drähte von dem Displaykabel am BPi angelötet. Das betrifft 3 paare LVDS Signal, 1 paar LVDS Clock und GND, der wird sogut wie es geht von überall nach überall verbunden.
Bevor man nun wichtige Lötpads abreißt kommt ein großer klecks Heißkleber drauf und GND wird noch etwas Isoliert damit es keine anderen Potenziale berührt.
Nun sind noch 3 Drähte für die 3,3V Versorgung der Displayinternen Logik übrig. Da diese laut Datenblatt bis zu 450mA brauchen kann, ist es eine schlechte Idee die BPi 3,3V dafür zu verwenden. Ich habe hier einen seperaten Step-Down-Wandler genutzt, gespeist von der 5V Versorgungsspannung, der Enable Eingang wird mit GPIO6 verbunden, dazu später.
Nun muss noch die Hintergrundbeleuchtung angeschlossen werden. Diese benötigt 10V bis 18V Versorgungsspannung, ein Signal 0V bis 5V für 100% bis 0% Helligkeit und Enable zum Ein-/Ausschalten. Diese beiden Signale werden ebenfalls an jeweils einen freien GPIO Pin gehangen (pwm GPIO5, bl_enable GPIO4), später dazu mehr.
Nun noch eine Spannungsversorgung dazu, hier ist ein 12V 2A Netzteil ausreichend. Eine Kupplung für 6mm Hohlstecker führt die Spannung direkt an den CCFL Inverter und parallel dazu an einen 10-24V > 5V DC/DC Wandler. Dieser versorgt BananaPi und unseren separaten 3,3V Wandler fürs Display. Von nun an kann das ganze mit einem 12V Netzteil mit Spannung versorgt werden.
Nun also zur Software, ohne ist die beste Hardware Nutzlos:
Als Grundsystem dient hier ein unverändertes Bananian (http://www.bananapi.com/index.php/download).
Bevor wir irgendetwas kaputtmachen ist es eine gute Idee Netzwerk und SSH auf dem BananaPi einzurichten und zu testen, da das Display nicht gleich funktionieren wird können wir so mit BPi kommunizieren (man kann auch gerne uart benutzen). Wenn das soweit funktioniert kann es losgehen.
Die Konfiguration der Displayausgabe (und aller anderen Parameter des SoC) erfolgt über eine Binärdatei /boot/script.bin auf der Bootpartition. Diese wird aus einer Textkonfiguration erzeugt, hierfür benötigt man fex2bin aus sunxi-tools. In der Wiki unter https://linux-sunxi.org/Fex_Guide sind alle Parameter schön erläutert.
Für den Anfang und um herauszufinden was man eigentlich einstellen muss (dieser Schritt kann gerne übersprungen werden), habe ich mir eine solche Datei als Beispiel genommen -> https://github.com/LeMaker/fex_configuration. Da diese zumindest mit dem 7″ LCD zu funktionieren scheint kann es nicht so verkehrt sein. Die so betitelte „banana_pi_7lcd.bin“ auf die Bootpartition der SD-Karte kopiert und in „script.bin“ umbenannt.
Nachdem BananaPi gestartet war musste ich manuell die entsprechenden GPIOs einschalten damit die Displaylogik und der Inverter Spannung haben. Nun zeigt es zwar ziemlich viel Mist an aber Prinzipiell funktioniert es und ich kann mich daran machen es richtig zu konfigurieren.
Nun zu der richtigen Konfiguration: Interessant für uns ist der Abschnitt „disp init configuration“, hier wird die Videoausgabe konfiguriert. Unter [disp_init] sind die ersten 3 Parameter wichtig, vor allem screen0_output_type = 1, damit wird der abschnitt [lcd0_para] aktiv.
[disp_init]
disp_init_enable = 1
disp_mode = 0
screen0_output_type = 1
screen0_output_mode = 10
screen1_output_type = 2
screen1_output_mode = 11
fb0_framebuffer_num = 2
fb0_format = 10
fb0_pixel_sequence = 0
fb0_scaler_mode_enable = 1
fb1_framebuffer_num = 2
fb1_format = 10
fb1_pixel_sequence = 0
fb1_scaler_mode_enable = 0
lcd0_backlight = 197
lcd1_backlight = 197
lcd0_bright = 50
lcd0_contrast = 50
lcd0_saturation = 57
lcd0_hue = 50
lcd1_bright = 50
lcd1_contrast = 50
lcd1_saturation = 57
lcd1_hue = 50
Der Abschnitt lcd0_para konfiguriert unser LCD, hierfür benötigen wir ein paar Werte aus dem Datenblatt vom Display.
[lcd0_para]
lcd_used = 1
lcd_x = 1280 //active width
lcd_y = 800 //active height
lcd_dclk_freq = 68 //clock frequency
lcd_pwm_not_used = 0
lcd_pwm_ch = 0
lcd_pwm_freq = 22000
lcd_pwm_pol = 0
lcd_max_bright = 240
lcd_min_bright = 64
lcd_if = 3 /3 = lvds
lcd_hbp = 60 //hsync back porch
lcd_ht = 1408 //hsync total cycle
lcd_vbp = 8 //vsync back porch
lcd_vt = 1632 //vsync total cycle *2
lcd_vspw = 10 //vsync pulse width
lcd_hspw = 50 //hsync pulse width
lcd_hv_if = 0
lcd_hv_smode = 0
lcd_hv_s888_if = 0
lcd_hv_syuv_if = 0
lcd_lvds_ch = 0
lcd_lvds_mode = 0
lcd_lvds_bitwidth = 1 //0 for 24 bit; 1 for 18 bit
lcd_lvds_io_cross = 0
lcd_cpu_if = 0
lcd_frm = 0
lcd_io_cfg0 = 268435456
lcd_gamma_correction_en = 1
lcd_gamma_tbl_0 = 0x0
lcd_gamma_tbl_1 = 0x10101
lcd_gamma_tbl_255 = 0xffffff
Die Bildwiederholrate lässt sich ebenfalls ganz einfach ausrechnen, falls sich jemand wundert wie diese zustande kommt:
clock frequency / hsync total cycle / vsync total cycle = framerate
68 000 000 Hz / 1408 / 816 = 59,2 Hz
Wir haben 3 GPIO verwendet, diese können wir ebenfalls in die Konfig eintragen, dies ist notwendig damit das Display automatisch eingeschaltet wird. Die Zuordnung der GPIO-Nummer zu Pin-Nummer zu Port-Nummer ist auch auf der Website von bananapi zu finden. Wobei der von mir gewählte PWM Pin gar kein PWM kann, da müsste ich mal einen anderen suchen, hier bleibt trotzdem das Problem das selbst bei 3,3V das Display nur minimal gedimmt wird, hier muss also eine bessere Lösung her (oder man kann mit einer Helligkeit leben).
lcd_bl_en_used = 1
lcd_bl_en = port:PH20<1><0><default><1>
lcd_power_used = 1
lcd_power = port:PI16<1><0><default><1>
lcd_pwm_used = 1
lcd_pwm = port:PH21<1><0><default><1>
Damit ist der wichtige Teil der Konfiguration erledigt. Um nun aus unserer Textkonfiguration eine Binärdatei zu machen benötigen wir die sunxi-tools, diese bekommen wir mit einem
~$ git clone https://github.com/linux-sunxi/sunxi-tools
~$ cd sunxi-tools
~/sunxi-tools$ make
… und schon haben wir fex2bin und können unsere Textkonfig in diese Binärdatei umwandeln
~/sunxi-tools$ ./fex2bin ./fex/banana_pi_154lcd.fex ./fex/banana_pi_154lcd.bin
… diese kopieren wir nach /boot/script.bin auf die Bootpartition unserer SD-Karte, stecken die Karte in BananaPi und schalten die Spannung an. Im Idealfall geht nun das Display an und wir sehen Bananian booten.
Wenn das Display „normal“ aussieht hat alles funktioniert, sollte irgendetwas nicht passen ist wahrscheinlich die Konfiguration falsch. Bei mir hat es den Anschein das es sehr tolerant ist was die Konfiguration angeht – nur das es funktioniert heißt noch nicht das es richtig ist. Deswegen sollte man nochmal einen Blick in die Ausgabe von dmesg werfen, relativ weit am Anfang bekommen wir jede menge Fehlermeldungen sollte irgendetwas falsch eingestellt sein.
[ 5.271793] [DISP] *** Lcd in danger...
[ 5.278417] [DISP] *** Lcd in danger...
[ 5.285052] [DISP] *** Lcd in danger...
[ 5.291687] [DISP] *** Lcd in danger...
[ 5.302211] [DISP] *****************************************************************
[ 5.311283] [DISP] ***
[ 5.317209] [DISP] *** LCD Panel Parameter Check
[ 5.323152] [DISP] ***
[ 5.329079] [DISP] *** by dulianping
[ 5.335024] [DISP] ***
[ 5.344071] [DISP] *****************************************************************
[ 5.353143] [DISP] ***
[ 5.357596] [DISP] *** Interface:
[ 5.363534] [DISP] *** 18Bit LVDS Panel
[ 5.370258] [DISP] *** Lcd Frm Disable
[ 5.375330] [DISP] ***
[ 5.379696] [DISP] *** Timing:
[ 5.385549] [DISP] *** lcd_x: 1280
[ 5.392097] [DISP] *** lcd_y: 800
[ 5.398634] [DISP] *** lcd_ht: 1408
[ 5.405089] [DISP] *** lcd_hbp: 60
[ 5.411464] [DISP] *** lcd_vt: 816
[ 5.417740] [DISP] *** lcd_vbp: 8
[ 5.423853] [DISP] *** lcd_hspw: 0
[ 5.429955] [DISP] *** lcd_vspw: 0
[ 5.436762] [DISP] *** lcd_frame_frq: 118Hz
[ 5.442354] [DISP] ***
[ 5.450275] [DISP] *** Err04: Violate "(lcd_vt/2) >= (lcd_vbp+lcd_y+2)"
[ 5.460902] [DISP] *** WRN01: Recommend "lcd_frm = 1"
[ 5.470486] [DISP] *** WRN03: Recommend "lcd_dclk_frq = 34"
[ 5.477388] [DISP] ***
[ 7.493548] [DISP] *** Try new parameters, you can make it pass!
[ 7.503493] [DISP] *** LCD Panel Parameter Check End
[ 7.515145] [DISP] *****************************************************************
In diesem Fall hatte ich vergessen lcd_vt mit 2 zu multiplizieren, nach der Änderung auf 1632 funktionierte es Problemlos. Die Warnungen sind das Resultat aus diesem Fehler und sind mit der Änderung verschwunden.
Bilder von der Hardware gibt es nicht besonders viele, dafür gibt es hier noch die Konfiguration zum Download -> monitorpi_2.zip. Vielleicht freut sich irgendwann irgendjemand über das geschriebene, selbst wenn ich das selbst bin weil ich demnächst noch einen Monitor Umbau und vergessen hab wie ich das gemacht habe.
whoah this weblog is wonderful i love studying your posts. Stay up the great work! You know, many individuals are searching round for this info, you can aid them greatly. eabfdacegeeeecfe
Hi, super Sache. Danke für den tollen Blog.
Hast du das Backlight auch über den BPI angeschlossen und angesteuert?
Backlight enable ist angeschlossen und funktioniert auch (steht im Text). Die Helligkeit ist zwar angeschlossen aber der Inverter will 0-5V als Analogsignal haben und der BananaPi gibt nur maximal 3,3V aus. Damit kann ich die Helligkeit von ca. 70% bis 100% einstellen. Mit einen zusätzlichen Transistor könnte man das auch noch korrigieren.
Ahoi,
schöne anleitung!
hast du die kabel die an die con2 anschlüsse am bpi gehen, an diesen häckchen oder direk auf die platte gelötet??
hab das palstik da schon weg-gefrikkelt und bin erstaunt :D ich glaub ich brauch ein mikroskop & sehr ruhige hände!!? wahrscheinlich muss man auch schnell und gezielt arbeiten damit es nicht zu heiß wird?
wenn ich mich nicht irre wurden 3 extra-teile verwendet : ein CCFL Inverter (typ?) und halt die 3 entsprechende wandler?
Ja, die sind bei mir direkt auf die Platine gelötet, allerdings ist das eine weniger gute Idee. Dieses Konstrukt ist vor 2 Monaten ausgefallen, vermutlich ist eines genau dieser Drähtchen abgegangen. Beim lösen vom Heißkleber hab ich die verbliebenen gleich mit abgerissen … der BPi wird kein LVDS mehr sprechen. Bei dem nächsten Versuch hab ich es anders gemacht, siehe hier oder auch hier der FFC Adapter.
Wenn man es direkt auf die Platine lötet hat man das Problem (neben dem das es verdammt klein ist) das die Lötpads nicht dafür gedacht sind eine Leitung anzulöten. Bei der kleinsten Belastung sind die weg. Eine kleinere Lötspitze ist Hilfreich, eine Lupe vielleicht auch und ein wenig Polyamidklebeband um die Restlichen Lötpads abzukleben.
Der CCFL-Inverter ist der, der im Laptop war. Ansonsten gibt es die auch Überall zu kaufen, meistens als Ersatzteil für Laptops. Natürlich ist es Abhängig vom Typ LCD was für einen Inverter man braucht, also entweder Datenblatt lesen oder ausprobieren (auf die Gefahr hin das etwas kaputt geht). Der Rest sind die Spannungswandler um die BPi 5V und die LCD 3,3V zu bekommen.