Elektroda.pl
Elektroda.pl
X
PCBwayPCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ARM9][Linux]System embedded - problemy.

16 Lis 2010 10:02 6779 54
  • Poziom 23  
    Witam,

    Próbuje uruchomić zestaw TMPA900CPU (ARM9 toshiby + LCD). Jądro pochodzi ze strony mucross.com. Niestety pomoc i pakiet linuxa mucross z firmy kernelkoncept jest płatny. Na początku chciałbym zaznaczyć że linuxa znam słabo.
    Celem są aplikacje na DirectFB i obsługą przez touchscreen. Przykłady na FB mniej więcej działają, walczę aktualnie z kalibracją touchscreena.

    System plików stworzyłem za pomocą narzędzia Buildroot i nagrałem na kartę SD. Opcje kernela w uboot ustawione na uruchomienie /bin/bash i tak też się dzieje. Po kernelu uruchamiana jest powłoka.

    Stworzyłem skrypt który ma ustawiać zmienne środowiskowe dla touchscreena i przy okazji montować proc.
    Code:

    #!/bin/sh

    /bin/mount -v -n -t proc none /proc
    /bin/mount -v -n -t sysfs none /sys

    export TSLIB_TSEVENTTYPE=INPUT
    export TSLIB_CONSOLEDEVICE=none
    export TSLIB_FBDEVICE=/dev/fb0
    export TSLIB_TSDEVICE=/dev/input/event0
    export TSLIB_CALIBFILE=/etc/pointercal
    export TSLIB_CONFFILE=/etc/ts.conf
    export TSLIB_PLUGINDIR=/usr/lib/ts
    export HOME=/home/root


    Raz udało mi się zamontować proc jednak coś przekombinowałem i musiałem jeszcze raz przygotować kartę SD.

    Problem w tym że przy uruchamianiu mount otrzymuje:
    mount: you must be root

    Co zrobić żeby pracować na takim systemie jako root ? Po uruchomieniu jądra startuje powłoka i tyle. Nie ma żadnego logowania itp..., polecenia sudo nie ma w systemie przygotowanym przez buildroot.

    Pozdrawiam
  • PCBwayPCBway
  • Pomocny post
    Poziom 31  
    Powinienes miec komendy whoami i su. Sprobuj zamiast init=/bin/bash wywolac init=/bin/login ale najpierw ustaw jakies haslo root-owi za pomoca passwd chociaz jak nie masz root-a to moze sie nie udac. Dziwne to jest bo jesli w init jest uruchamiana powloka to powinna byc w root-cie (chyba). Ewentualnie co mi przychodzi na mysl to fakt ze rootfs nie byl przygotowany z prawami root-a, nie wiem nie probowalem.
  • Poziom 23  
    Według debian refs uruchomienie przez
    init=/bin/sh
    wymusza prawa administratora.
    U mnie whoami zwraca usera "default".
    su cały czas "Operation not permitted" ale możliwe że źle go używam.
    Ustawienie hasła roota skutkuje:
    Code:

    bash-4.1# passwd
    passwd: no record of root in /etc/shadow, using /etc/passwd: Permission denied
    Changing password for root
    New password:
    Retype password:
    Password for root changed by root
    bash-4.1# login
    192.168.0.215 login: root
    Login incorrect
    192.168.0.215 login: root
    Login incorrect
    192.168.0.215 login: default
    Password:
    Login incorrect
    bash-4.1#


    Przestawienie init=/bin/login
    Code:

    [    6.010000] devtmpfs: mounted
    [    6.020000] Freeing init memory: 136K
    192.168.0.215 login: root
    Login incorrect
    192.168.0.215 login: root
    Login incorrect
    192.168.0.215 login: default
    [   20.560000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 48291
    [   20.840000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 48291
    [   20.900000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 48291
    [   20.960000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 48291
    [   21.190000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 48291
    -sh: can't access tty; job control turned off
    [   22.570000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 72435
    $ su
    [   31.170000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 72435
    su: must be suid to work properly
    $ su root
    [   36.290000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 72435
    su: must be suid to work properly
    $ sudo
    [   41.460000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 72435
    -sh: sudo: not found
    $


    Pliki:
    Code:

    /etc/passwd
    root:x:0:0:root:/root:/bin/sh
    daemon:x:1:1:daemon:/usr/sbin:/bin/sh
    bin:x:2:2:bin:/bin:/bin/sh
    sys:x:3:3:sys:/dev:/bin/sh
    sync:x:4:100:sync:/bin:/bin/sync
    mail:x:8:8:mail:/var/spool/mail:/bin/sh
    proxy:x:13:13:proxy:/bin:/bin/sh
    www-data:x:33:33:www-data:/var/www:/bin/sh
    backup:x:34:34:backup:/var/backups:/bin/sh
    operator:x:37:37:Operator:/var:/bin/sh
    haldaemon:x:68:68:hald:/:/bin/sh
    dbus:x:81:81:dbus:/var/run/dbus:/bin/sh
    nobody:x:99:99:nobody:/home:/bin/sh
    sshd:x:103:99:Operator:/var:/bin/sh
    default:x:1000:1000:Default non-root user:/home/default:/bin/sh

    Code:

    /etc/shadow
    root::10933:0:99999:7:::
    bin:*:10933:0:99999:7:::
    daemon:*:10933:0:99999:7:::
    adm:*:10933:0:99999:7:::
    lp:*:10933:0:99999:7:::
    sync:*:10933:0:99999:7:::
    shutdown:*:10933:0:99999:7:::
    halt:*:10933:0:99999:7:::
    uucp:*:10933:0:99999:7:::
    operator:*:10933:0:99999:7:::
    nobody:*:10933:0:99999:7:::
    default::10933:0:99999:7:::


    Czy rootfs tworzyłem jako root? nie pamiętam...
    Moge spróbować jeszcze raz uruchomić Buildroot jako root.
  • Poziom 31  
    OK to jestesmy troche w domu. Chyba masz ten sam problem co ja kiedys mianowicie w jakims pliku w /etc (tylko kurcze nie pamietam w ktorym) ustawia sie czasem konsole z ktorych mozna sie logowac do systemu. Ja nie mialem tam wpisu umozliwiajacego zalogowanie sie z konsoli portu szeregowego. Wylistuj mi /etc.
  • Poziom 23  
    Proszę:
    Code:

    bash-4.1# ls /etc/
    TZ            hosts         ld.so.conf    pointercal    securetty
    br-version    init.d/       ld.so.conf.d/ profile       services
    fstab         inittab       mtab          protocols     shadow
    group         inputrc       network/      random-seed   shadow-
    hostname      issue         passwd        resolv.conf   ts.conf
  • Poziom 31  
    piti___ napisał:

    securetty


    To jest to.:D
  • Poziom 23  
    Code:

    bootargs 'console=ttyS0,115200n8 noinitrd root=/dev/mmcblk0p1 init=/bin/bash ip=dhcp rootwait=2'


    Code:

    tty1
    tty2
    tty3
    tty4
    tty5
    tty6
    tty7
    tty8
    ttyS0
    ttyS1
    ttyS2
    ttyS3
    ttyAMA0
    ttyAMA1
    ttyAMA2
    ttyAMA3
    ttySAC0
    ttySAC1
    ttySAC2
    ttySAC3
    ttyUL0
    ttyUL1
    ttyUL2
    ttyUL3
    ttyPSC0
    ttyPSC1
    ttyPSC2
    ttyPSC3
    ttyCPM0
    ttyCPM1
    ttyCPM2
    ttyCPM3
    ttymxc0
    ttymxc1
    ttymxc2


    Wpisów jest dużo...

    Pytanie dodatkowe, jak wyłączać system startowany z karty SD. Wydaje mi się że resetowanie procesora uszkadza system plików na karcie.
  • PCBwayPCBway
  • Poziom 31  
    No to dziwne troche. A co sie dzieje jak dasz init=/bin/init ? Co masz w /etc/init.d ? A sprobuj jeszcze w tym pliku securetty zostawic tylko ttyS0 albo zmienic na /dev/ttyS0.
  • Poziom 23  
    Code:

    [    5.920000] VFS: Mounted root (ext2 filesystem) on device 179:1.
    [    6.010000] devtmpfs: mounted
    [    6.020000] Freeing init memory: 136K
    [   17.330000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 48291
    Initializing random number generator... [   17.560000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 64404
    [   17.840000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 64404
    read-only file system detected...done
    Starting network...
    [   18.060000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 48292
    ip: RTNETLINK answers: Operation not permitted
    [   18.260000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 48292
    [   18.330000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 48292
    ifup: can't open '/var/run/ifstate': Input/output error
    Starting tinyhttpd: done
    [   19.270000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 48291
    bind: Permission denied
    [   19.530000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 48291

    CIACH !

    [   72.780000] EXT2-fs (mmcblk0p1): error: ext2_lookup: deleted inode referenced: 48293


    Code:

    ls /etc/init.d
    S20urandom    S40network    S85tinyhttpd  rcS



    Sprobuje sformatować jeszcze raz karte bo chyba jakieś błędy ma...
  • Poziom 31  
    Co jest w /etc/inittab ? Co do bezpiecznego resetu to komenda reboot tak na przyszlosc zeby ci sie nie dekompletowal system plikow.
  • Poziom 23  
    Code:

    null::sysinit:/bin/mount -o remount,rw /
    null::sysinit:/bin/mount -t proc proc /proc
    null::sysinit:/bin/mkdir -p /dev/pts
    null::sysinit:/bin/mount -a
    null::sysinit:/bin/hostname -F /etc/hostname
    # now run any rc scripts
    ::sysinit:/etc/init.d/rcS

    # Set up a couple of getty's
    tty1::respawn:/sbin/getty 38400 tty1
    tty2::respawn:/sbin/getty 38400 tty2

    # Put a getty on the serial port
    #ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 # GENERIC_SERIAL

    # Logging junk
    null::sysinit:/bin/touch /var/log/messages
    null::respawn:/sbin/syslogd -n -m 0
    null::respawn:/sbin/klogd -n
    tty3::respawn:/usr/bin/tail -f /var/log/messages

    # Stuff to do for the 3-finger salute
    ::ctrlaltdel:/sbin/reboot

    # Stuff to do before rebooting
    null::shutdown:/usr/bin/killall klogd
    null::shutdown:/usr/bin/killall syslogd
    null::shutdown:/bin/umount -a -r
    null::shutdown:/sbin/swapoff -a


    Sformatowałem karte nagrałem jeszcze raz rootfs błędy zniknęły.

    Dopiero teraz zauważyłem... przy /sbin/init przekierowało mi konsole na LCD...
    Na ekranie mam:
    Code:

    Welcome to Buildroot
    ARM_BOARD login:


    Jak zrobić to logowanie na konsoli szeregowej ?
  • Pomocny post
    Poziom 31  
    piti___ napisał:

    Jak zrobić to logowanie na konsoli szeregowej ?


    Odkomentuj te linijke.

    Code:

    #ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 # GENERIC_SERIAL
  • Poziom 23  
    Działa!

    Dzięki wielkie!

    Teraz posypie się reszta pytań :) jak pisać aplikacje na takim systemie? Czy pozostaje tylko cross-kompilacja, przenoszenie pliku na układ docelowy i dopiero uruchomienie?

    Wolałbym pisać chociażby w mc i kompilować już na układzie docelowym. Przy niewielkich programach wydaje mi się że będzie to szybsza droga niż przenoszenie pliku między systemami.

    Czy proces kompilacji i instalacji gcc pod arm'a jest bardzo skomplikowany ?
  • Poziom 31  
    piti___ napisał:
    Działa!

    Dzięki wielkie!


    Ciesze sie. Zapomnialem ze getty musi byc odpalone na porcie szeregowym zeby utworzyl odpowiednia konsole dlatego prosilem o listing inittab.

    piti___ napisał:

    Teraz posypie się reszta pytań :) jak pisać aplikacje na takim systemie? Czy pozostaje tylko cross-kompilacja, przenoszenie pliku na układ docelowy i dopiero uruchomienie?

    Wolałbym pisać chociażby w mc i kompilować już na układzie docelowym. Przy niewielkich programach wydaje mi się że będzie to szybsza droga niż przenoszenie pliku między systemami.

    Czy proces kompilacji i instalacji gcc pod arm'a jest bardzo skomplikowany ?


    Mozna i tak i tak. Osobiscie polecalbym raczej kompilacje skrosna dla kazdego programu (przenoszenie programow to zaden problem bo mozna to zrobic za pomoca pendrive lub przez siec uzywajac SCP) ale oczywiscie mozna skompilowac gcc i binutils na ARM-a jednak dla kogos niedoswiadczonego w Linuxie i kompilacji moze to byc zadanie trudne. Ostateczenie mozna znalezc gotowe binarki na ARM-a. Napewno warto miec gdb na ARM-a coby moc debuggowac, czasem przydaje sie tez aplikacja strace. Co do pisania aplikacji to mozliwosci jest wiele dla kazdego cos milego. Do grafiki GTK lub QT (QT udostepnia tez wiele rzeczy okolosystemowych jak obsluga watkow itp).

    A co z ta kalibracja touchscreen-a ? Tez spedzilem troche czasu nad tym zagadnieniem wiec moze pomoge.
  • Poziom 23  
    Ok, zrobię sobie TFTP i jakiś skrypt to ściągania i uruchamiania programów.

    Procesor chodzi na 150MHz wolałbym nie używać QT czy GTK. Oglądałem przykłady z płatnej dystrybucji mucross i aplikacja okienkowa QT czy GTK była zbyt wolna (szef już mówił że tak wolno nie może być). Całą grafikę chciałem robić na DirectFB.

    TS skalibrowałem (ts_calibrate).
    Musze gdzieś dać skrypt ustawiający:
    Code:

    export TSLIB_TSEVENTTYPE=INPUT
    export TSLIB_CONSOLEDEVICE=none
    export TSLIB_FBDEVICE=/dev/fb0
    export TSLIB_TSDEVICE=/dev/input/event0
    export TSLIB_CALIBFILE=/etc/pointercal
    export TSLIB_CONFFILE=/etc/ts.conf
    export TSLIB_PLUGINDIR=/usr/lib/ts


    Ale takie pytanie: gdzie TS trzyma kalibracje? W jakimś pliku ?
  • Poziom 31  
    piti___ napisał:
    Ok, zrobię sobie TFTP i jakiś skrypt to ściągania i uruchamiania programów.

    Procesor chodzi na 150MHz wolałbym nie używać QT czy GTK. Oglądałem przykłady z płatnej dystrybucji mucross i aplikacja okienkowa QT czy GTK była zbyt wolna (szef już mówił że tak wolno nie może być). Całą grafikę chciałem robić na DirectFB.


    Nie znam ale wyglada ciekawie. Do niezbyt zaawansowanej grafiki mozna sprobowac uzywac jeszcze ncurses.

    piti___ napisał:

    TS skalibrowałem (ts_calibrate).
    Musze gdzieś dać skrypt ustawiający:
    Code:

    export TSLIB_TSEVENTTYPE=INPUT
    export TSLIB_CONSOLEDEVICE=none
    export TSLIB_FBDEVICE=/dev/fb0
    export TSLIB_TSDEVICE=/dev/input/event0
    export TSLIB_CALIBFILE=/etc/pointercal
    export TSLIB_CONFFILE=/etc/ts.conf
    export TSLIB_PLUGINDIR=/usr/lib/ts



    Mozesz to dodac w /etc/init.d/rcS albo stworzyc wlasny skrypt w /etc/init.d.

    piti___ napisał:

    Ale takie pytanie: gdzie TS trzyma kalibracje? W jakimś pliku ?


    Tam gdzie mu kazales w /etc/pointercal :D
  • Poziom 23  
    Teraz potrzebuje pewnych wyjaśnień, docelowy system będzie trzymany na NAND flashu z jffs2. Czy taki system może zapisywać pliki w tej pamięci? Czy będę potrzebował np. dodatkowej kości eepromu i przed konkretną aplikacją odczytywał jakoś te kalibracje?
  • Pomocny post
    Poziom 31  
    piti___ napisał:
    Teraz potrzebuje pewnych wyjaśnień, docelowy system będzie trzymany na NAND flashu z jffs2. Czy taki system może zapisywać pliki w tej pamięci?


    Oczywiscie, chyba ze bedzie zamontowany jako read-only. Dlaczego mialby nie zapisywac ?
  • Poziom 23  
    Nie wiem :) ta pamięć może kasować jedynie jakieś duże bloki..
  • Poziom 31  
    piti___ napisał:
    Nie wiem :) ta pamięć może kasować jedynie jakieś duże bloki..


    Ale moze kasowac wiec problemu nie ma :D a te duze bloki to raptem 128 KB wiec nie takie duze. Mozesz rozwazyc uzycie YAFFS2 ktory wydaje sie byc troche wydajniejszym systemem (uzywa go miedzy innymi Android).
  • Poziom 23  
    Jeśli na karcie SD tak często pada mi system plików to jak ma działać urządzenie docelowe? Ma to być sterownik przemysłowy i na 100% nie będzie miał łatwych warunków pracy. Nie ma mowy o wywoływaniu polecenia "reboot". Ale jakoś to jest robione bo jest masa urządzeń opartych na linuxie. Chociażby telefony.
  • Poziom 31  
    piti___ napisał:
    Jeśli na karcie SD tak często pada mi system plików to jak ma działać urządzenie docelowe? Ma to być sterownik przemysłowy i na 100% nie będzie miał łatwych warunków pracy. Nie ma mowy o wywoływaniu polecenia "reboot". Ale jakoś to jest robione bo jest masa urządzeń opartych na linuxie. Chociażby telefony.


    Nie wiem dokladnie jak to jest robione w tych systemach ale moge sie domyslic ze istnieje jakis program demon ktory sprawdza naprzyklad stan przycisku czy wylacznika i w przypadku nacisniecia wywoluje odpowiednia sekcje w programie init (wysyla do programu init jakies zdarzenie). Ten analizuje plik inittab co ma robic w takiej sytuacji (ta sekcja z shutdown). Nie znam dokladnie mechanizmu ale moge pogrzebac i sie dowiedziec jesli cie to interesuje. Przy okazji sam sie dowiem bo moze mi sie to kiedys przydac.
  • Poziom 23  
    Z wyłączaniem nie ma problemu w takich urządzeniach jak telefony. Jednak maszyny w których działają nasze sterowniki (na 8051, AVR i ARM7) są wyłączane przez wyłącznik główny. W takiej sytuacji trzeba inaczej to rozwiązać.
  • Pomocny post
    Poziom 31  
    piti___ napisał:
    Z wyłączaniem nie ma problemu w takich urządzeniach jak telefony. Jednak maszyny w których działają nasze sterowniki (na 8051, AVR i ARM7) są wyłączane przez wyłącznik główny. W takiej sytuacji trzeba inaczej to rozwiązać.


    Zasada jest ta sama (lub podobna). Urzadzenie musi miec zasilanie bateryjne ktore da mu czas na zamkniecie systemu gdy padnie (zostanie wylaczone) glowne zasilanie. Pierwsze lektury wskazuja ze odpowiada za to power manager w systemie oraz system HAL ktory wysyla odpowiednie zdarzenia do systemu a nastepnie system przesyla to do programu init ktory wykonuje polecenia ze swojej konfiguracji.
  • Poziom 23  
    Witam,

    Zaczęły się problemy typowo linuxowe. Skrypt umieszczony w /etc/init.d/SXXnazwa nie ustawia zmiennych środowiskowych. Zmienne umieszczone w /etc/init.d/rcS również nie są exportowane do powłoki.

    Jak uruchomię skrypt /etc/init.d/SXXnazwa
    Code:

    #!/bin/sh
    export TSLIB_TSEVENTTYPE=INPUT
    export TSLIB_CONSOLEDEVICE=none
    export TSLIB_FBDEVICE=/dev/fb0
    export TSLIB_TSDEVICE=/dev/input/event0
    export TSLIB_CALIBFILE=/etc/pointercal
    export TSLIB_CONFFILE=/etc/ts.conf
    export TSLIB_PLUGINDIR=/usr/lib/ts


    dalej zmienne nie są ustawiane.
  • Pomocny post
    Poziom 11  
    Miałem ostatnio ten sam problem. Pomogło umieszczenie ustawiania zmiennych w /etc/profile.
  • Poziom 23  
    Działa dzięki.

    Co do umieszczenia GCC na targecie to zrobi to za mnie buildroot :) kompiluje teraz nowe środowisko z zaznaczoną opcją umieszczenia kompilatora i nagłówków na systemie docelowym. Dam znać jak target skompiluje program i czy jest ma to sens.
  • Poziom 31  
    piti___ napisał:
    Witam,

    Zaczęły się problemy typowo linuxowe. Skrypt umieszczony w /etc/init.d/SXXnazwa nie ustawia zmiennych środowiskowych. Zmienne umieszczone w /etc/init.d/rcS również nie są exportowane do powłoki.

    Jak uruchomię skrypt /etc/init.d/SXXnazwa
    Code:

    #!/bin/sh
    export TSLIB_TSEVENTTYPE=INPUT
    export TSLIB_CONSOLEDEVICE=none
    export TSLIB_FBDEVICE=/dev/fb0
    export TSLIB_TSDEVICE=/dev/input/event0
    export TSLIB_CALIBFILE=/etc/pointercal
    export TSLIB_CONFFILE=/etc/ts.conf
    export TSLIB_PLUGINDIR=/usr/lib/ts


    dalej zmienne nie są ustawiane.


    Tak zapomnialem o tym problemie. Skrypt z ustawianiem zmiennych trzeba wywolac jako
    Code:

    . /etc/init.d/SXXnazwa


    albo dodac te wpisy w pliku
    $HOME/.bashrc lub $HOME/.bash_profile

    gdzie $HOME to oczywiscie sciezka domowa dla danego uzytkownika
  • Poziom 23  
    Skompilowałem pierwszy program (hello world) na targecie. Wygląda to tak że za pierwszym razem (po starcie systemu) kompilacja trwa z 10s ale kolejne wywołania już trwają poniżej sekundy. Oczywiście program jest banalny. Teraz muszę skompilować mc na targecie żeby dało się "lepiej" pisać programy niż przez edytor nano :)

    Nie wiem jak sprawdzić jak obsługiwana jest karta SD przez system.
    W top wyświetla mi cały czas proces tmpa910-spi.0, podejrzewam że karta jest obsługiwana przez SPI zamiast przez dedykowany interface SD co też może wpływać na szybkość systemu.


    Pozdrawiam
    Piotrek
  • Poziom 34  
    Jest mało prawdopodobne, że jest obsługiwana przez specyficzny interfejs SD. Brak jest otwartej specyfikacji tego interfejsu, więc z tego co wiem, nie ma do niego driverów w Linuksie.