Samsung SPF-87H i Raspberry Pi

Od jakiegoś czasu na półce leżała ramka cyfrowa firmy Samsung o symbolu SPF-87H. Ramkę kupiłem ponad pół roku temu na portalu aukcyjnym Allegro, ponieważ obsługiwała tryb mini-monitor (ale nie jest to urządzenie DisplayLink) w rozdzielczości 800×480 na wyświetlaczu 8″ a ja od jakiegoś czasu poszukiwałem czegoś na czym mógłbym wyświetlać informacje z Raspberry Pi lub BeagleBone.

Niestety jak się później okazało większość programów dostępnych w sieci po prostu nie działała. Jeżeli już działały lub wymagały tylko dodania deklaracji tego modelu, to po kilku sekundach komunikacja została przerwana i koniec z wyświetlaniem.  Znalazłem nawet na SVN rewizję 1200 LCD4Linux, który wydawać by się mogło będzie działać – sterownik SamsungSPF był już oprogramowany, ale niestety po skompilowaniu kodu i uruchomieniu po kilku sekundach działania obraz zanikał a na konsoli pojawiały się tylko komunikaty

Producent ramki niestety nie wspiera funkcji mini-monitor systemów innych niż Windows XP oraz Vista (32bit). Finalnie ramka wylądowała na półce.

W końcu zabrałem się ponownie do tematu. Przewertowałem istniejące zasoby pod kątem nowych informacji. Tak jak ostatnio pewne materiały były bardziej pomocne a pewne wcale. Praktycznie nie znalazłem działającego rozwiązania do momentu natknięcia się na skrypt napisany w Pythonie samsung-photo-frame-ctrl, który działał niemal tak jak należy. Najważniejsze było to, że ramka nie traciła komunikacji i jako tako dało się przesyłać do ramki obrazy. Po przeanalizowaniu kodu zabrałem się za pisanie kodu w C do obsługi SPF-87H w linuksie. Kluczowym elementem po przełączeniu ramki w tryb mini-monitora jest wydanie polecenia, które utrzymuje ten tryb na stałe:

W międzyczasie natknąłem się na stronę projektu Minimon, która traktuje o temacie, który mnie interesował ale w trochę odmiennym celu (nie sprawdzałem zresztą działania tego projektu), ale z mogłem z niego zaczerpnąć dość dużo linii kodu znacząco przyśpieszając osiągnięcie efektu finalnego. Dodatkowo podczas testów okazało się, że ramka radzi sobie równie dobrze bez zasilacza, korzystając wyłącznie z zasilania przez USB. Wracając do ramki i programu… w wyniku niedzielnej pracy napisałem prosty programik jpg2spf (link do pobrania na końcu artykułu) wysyłający w pętli plik .jpg podany jako parametr. Program do własnej kompilacji – załączam pełne źródła – wystarczy rozpakować i w katalogu do którego rozpakowane zostały źródła wydać polecenie

Program do kompilacji wymaga biblioteki libusb.

Program testowałem z modelem SPF-87H, ale zawiera także obsługę modeli: SPF-107H, SPF-75H, SPF-83H, SPF-85H jednak nie zostały one przetestowane.

Dodatkowo udało mi się zmusić do współpracy z ramką także LCD4Linux, poniżej krótki film z działania LCD4Linux na ramce SPF-87H.

Łatkę załączam poniżej. Łatka do pliku drv_SamsungSPF.c została przetestowana na rewizji 1200 z SVN LCD4Linux.

Pliki do pobrania:
jpg2spf-0.1.tar.gz (120 pobrań) MD5: E6BCA7175C52F22A4C2B6A286865479D
SPF-87H_LCD4Linux1200_Patch.7z (142 pobrania) MD5: A72601591D3E9061BD8E11C2C265D9BC

Niestety zauważyłem, że LCD4Linux na RaspberryPi generuje wysokie obciążenie CPU 🙁

UPDATE 2014-09-04

Do połączenia z ramką warto stosować możliwie krótki kabel mini-usb. Zauważyłem, że kiepskiej jakości kable powodują błędy w transmisji.

10 przemyśleń nt. „Samsung SPF-87H i Raspberry Pi

    1. Hi,
      First of all check out jpg2spf if you are able to send image to frame. In code you must put right mode (idProduct) I’m not able test this model and values I found it in some example. Just replace line before compilation:

      {0xffff, 0xffff, "SPF-83H", 800, 600},
      with
      {0x200c, 0x200d, "SPF-83H", 800, 600},

      Check README file. Image must be in right resolution.

  1. Próbowałem skompilować Twój programik ale zobacz sam:

    sudo nano Makefile
    pi@raspberrypi3 ~/pakiet/jpgtospf $ make
    gcc -lusb -c jpg2spf.c
    jpg2spf.c:1:21: warning: extra tokens at end of #include directive [enabled by default]
    jpg2spf.c:2:2: error: invalid preprocessing directive #<
    jpg2spf.c:12:3: error: expected identifier or ‘(’ before ‘{’ token
    jpg2spf.c:12:40: error: expected identifier or ‘(’ before ‘,’ token
    jpg2spf.c:13:42: error: expected identifier or ‘(’ before ‘,’ token
    jpg2spf.c:14:40: error: expected identifier or ‘(’ before ‘,’ token
    jpg2spf.c:15:40: error: expected identifier or ‘(’ before ‘,’ token
    jpg2spf.c:16:40: error: expected identifier or ‘(’ before ‘,’ token
    jpg2spf.c:17:40: error: expected identifier or ‘(’ before ‘,’ token
    jpg2spf.c:18:40: error: expected identifier or ‘(’ before ‘,’ token
    jpg2spf.c:19:42: error: expected identifier or ‘(’ before ‘,’ token
    jpg2spf.c:21:1: error: expected identifier or ‘(’ before ‘}’ token
    jpg2spf.c: In function ‘find_dev’:
    jpg2spf.c:47:14: error: ‘usb_busses’ undeclared (first use in this function)
    jpg2spf.c:47:14: note: each undeclared identifier is reported only once for each function it appears in
    jpg2spf.c:47:40: error: dereferencing pointer to incomplete type
    jpg2spf.c:48:19: error: dereferencing pointer to incomplete type
    jpg2spf.c:48:44: error: dereferencing pointer to incomplete type
    jpg2spf.c:49:14: error: dereferencing pointer to incomplete type
    jpg2spf.c:52:31: error: dereferencing pointer to incomplete type
    jpg2spf.c:52:55: error: ‘ids’ undeclared (first use in this function)
    jpg2spf.c: At top level:
    jpg2spf.c:61:1: error: unknown type name ‘usb_dev_handle’
    jpg2spf.c: In function ‘dev_open’:
    jpg2spf.c:63:5: error: unknown type name ‘usb_dev_handle’
    jpg2spf.c:65:10: warning: assignment makes pointer from integer without a cast [enabled by default]
    jpg2spf.c:67:2: warning: incompatible implicit declaration of built-in function ‘fprintf’ [enabled by default]
    jpg2spf.c:67:10: error: ‘stderr’ undeclared (first use in this function)
    jpg2spf.c:73:17: error: dereferencing pointer to incomplete type
    jpg2spf.c:75:2: warning: incompatible implicit declaration of built-in function ‘fprintf’ [enabled by default]
    jpg2spf.c: At top level:
    jpg2spf.c:91:22: error: unknown type name ‘FILE’
    jpg2spf.c:91:31: error: unknown type name ‘usb_dev_handle’
    jpg2spf.c: In function ‘main’:
    jpg2spf.c:122:2: warning: incompatible implicit declaration of built-in function ‘fprintf’ [enabled by default]
    jpg2spf.c:122:10: error: ‘stderr’ undeclared (first use in this function)
    jpg2spf.c:126:36: error: ‘index’ undeclared (first use in this function)
    jpg2spf.c:128:6: warning: incompatible implicit declaration of built-in function ‘fprintf’ [enabled by default]
    jpg2spf.c:128:22: warning: missing terminating " character [enabled by default]
    jpg2spf.c:128:6: error: missing terminating " character
    jpg2spf.c:129:1: error: ‘suspending’ undeclared (first use in this function)
    jpg2spf.c:129:20: error: expected ‘)’ before ‘to’
    jpg2spf.c:129:20: error: stray ‘\’ in program
    jpg2spf.c:129:42: warning: missing terminating " character [enabled by default]
    jpg2spf.c:129:20: error: missing terminating " character
    jpg2spf.c:132:2: error: expected ‘;’ before ‘}’ token
    jpg2spf.c:134:6: warning: incompatible implicit declaration of built-in function ‘fprintf’ [enabled by default]
    jpg2spf.c:134:22: warning: missing terminating " character [enabled by default]
    jpg2spf.c:134:6: error: missing terminating " character
    jpg2spf.c:135:1: error: ‘product’ undeclared (first use in this function)
    jpg2spf.c:135:9: error: expected ‘)’ before ‘mode’
    jpg2spf.c:135:9: error: stray ‘\’ in program
    jpg2spf.c:135:18: warning: missing terminating " character [enabled by default]
    jpg2spf.c:135:9: error: missing terminating " character
    jpg2spf.c:137:6: error: unknown type name ‘usb_dev_handle’
    jpg2spf.c:138:11: warning: assignment makes pointer from integer without a cast [enabled by default]
    jpg2spf.c:145:6: warning: incompatible implicit declaration of built-in function ‘memset’ [enabled by default]
    jpg2spf.c:146:38: error: ‘USB_TYPE_STANDARD’ undeclared (first use in this function)
    jpg2spf.c:147:1: error: ‘USB_ENDPOINT_IN’ undeclared (first use in this function)
    jpg2spf.c:155:6: warning: incompatible implicit declaration of built-in function ‘fprintf’ [enabled by default]
    jpg2spf.c:155:22: warning: missing terminating " character [enabled by default]
    jpg2spf.c:155:6: error: missing terminating " character
    jpg2spf.c:156:11: error: expected ‘)’ before ‘…’ token
    jpg2spf.c:156:11: error: stray ‘\’ in program
    jpg2spf.c:156:16: warning: missing terminating " character [enabled by default]
    jpg2spf.c:156:11: error: missing terminating " character
    jpg2spf.c:159:2: error: expected ‘;’ before ‘}’ token
    jpg2spf.c:161:18: error: ‘ids’ undeclared (first use in this function)
    jpg2spf.c:163:2: warning: incompatible implicit declaration of built-in function ‘fprintf’ [enabled by default]
    jpg2spf.c:165:2: error: unknown type name ‘usb_dev_handle’
    jpg2spf.c:170:38: error: ‘USB_TYPE_VENDOR’ undeclared (first use in this function)
    jpg2spf.c:181:3: error: unknown type name ‘FILE’
    jpg2spf.c:181:13: warning: initialization makes pointer from integer without a cast [enabled by default]
    Makefile:12: recipe for target 'jpg2spf.o' failed
    make: *** [jpg2spf.o] Error 1

    1. Cześć,
      Dopiero teraz znalazłem czas by zerknąć co jest jest nie tak. Sprawdziłem jeszcze raz, czy wszystko gra i program kompiluje się bez problemu. Jakiego distro używasz – spróbuję zreplikować Twój problem i zobaczyć co jest grane.

  2. Już wszystko gra kabel który był z ramka ma 2 końcówki usb z jednej strony i trzeba było tylko zamienić miejscami i wszystko gra super. Pozdrawiam.

  3. Witam. Mam pytanie apropos ramki samsunga spf87h I ramki kodak p720 chciałbym żeby służyły jako dodatkowe wyswietlacze do settopboxow vu plus. W dekoderach są po instalowane pluginy lcd4linux jak mam się do tego zabrać proszę o poradę.

    1. Cześć, w czasie kiedy szukałem metod na sterowanie ramką Samsunga znalazłem kilka wpisów na forum m.in. http://www.i-have-a-dreambox.com/wbb2/ w temacie tej właśnie ramki – myślę, że tam powinieneś zacząć swoje poszukiwania. Całość jest w języku niemieckim, są pliki (pobranie wymaga rejestracji). Tematyka STB jest mi obca, ale podejrzewam, że LCD4Linux (o ile nie jest jakoś maksymalnie zmodyfikowany przez producenta i nie ma źródeł) też można zmodyfikować w taki sposób aby obsłużył tą ramkę. Nie mam pojęcia jak ma się sprawa z Kodakiem

      1. No właśnie ten niemiecki.;) ja mam tylko pytanie czy z pod Windowsa można można zrobić hack a czy jakoś inaczej bo rozumiem ze właśnie potrzeba sflaszowac ramkę ? Natomiast w plugin ie lcd4linux zainstalowanym u mnie w boksie jest opcja wyboru właśnie tej ramki.

        1. Nie próbowałem i robić żadnych modyfikacji oprogramowania pod Win. Na szczęście w przypadku tej ramki jak i kilku innych SPF Samsunga nie trzeba modyfikować (flashować) firmware w samej ramce. Urządzenia działają z oryginalnym firmware. Cała tajemnica tkwi w trybie mini-monitor i obsłudze po stronie komputera.

  4. Na mnie Raspberry zrobiło pozytywne wrażenie – myślałem, że to będzie zwyczajny gadżet – pozytywne zaskoczenie, bo wcale tak nie jest. Dokupiłem sobie klawiaturkę, na ematador.pl mieli również dodatkową pamięć. Fajnie, że urządzenie jest rozwijane, pojawiają się nowe funkcjonalności.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *