logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

USB Framework w CrossWorks na AT91SAM7S jak uruchomić?

Sowa 03 Wrz 2007 10:53 2049 8
REKLAMA
  • #1 4245403
    Sowa
    Poziom 12  
    Posty: 40
    Pomógł: 3
    Mam mały problem od jakiegoś czasu. Próbuje uruchomić USB Framework pod CrossWorks. Czy komuś się już to udało? Doszedłem już do paru rzeczy, mianowicie zamiana:

    __packed typedef struct {
    
    ...
    
    } jakas_nazwa;


    na:

    typedef struct {
    
    ...
    
    } __attribute__((packed)) jakas_nazwa;


    , ale nadal projekt nie chce działać. Wyrzuca mi błędy podczas linkowania typu:
    Release/serial_example.o: In function `CBK_Init':
    serial_example.c:(.text+0x1bc0): undefined reference to `BRD_ConfigureVBus'

    rozumiem ze nie widzi tej funkcji, ale jak może nie widzieć skoro plik z nią jest includowany? :/

    Czy komuś udało sie to uruchomić?

    Pozdrawiam
    Sowa
  • REKLAMA
  • #2 4250443
    Sowa
    Poziom 12  
    Posty: 40
    Pomógł: 3
    Tak sie czasem zastanawiam, czy ja za trudne pytania zadaje na forum, czy nikt sie nie chce dzielić wiedza tajemną?

    Projekt już sie kompiluje, ale niestety nie działa :( Działa chyba tylko D+ pull up i dzięki temu komputer na chwile zauważa obecność urządzenia. Jak mi sie uda coś uruchomić to napisze.

    Tomek
  • REKLAMA
  • #3 4251295
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Cytat:
    czy nikt sie nie chce dzielić wiedza tajemną

    A co Ty taki niecierpliwy? :wink: Wybacz ale Twój problem wymaga raczej fachowej wiedzy a ludzi którzy ją posiadają na tym forum to można na palcach policzyć i nie zawsze są online 24godz/dobę.
    Cytat:
    Jak mi sie uda coś uruchomić to napisze

    I tu mi sie podoba to "samozaparcie" :wink:.
    Niedługo pewnie tez stanę przed podobnym problemem więc będę temeat obserwował.
    Z pozdr.MK
  • #4 4251869
    GrzesGrz71
    Poziom 19  
    Posty: 197
    Pomógł: 32
    Ocena: 4
    Cześć

    Jakieś 3 miesiące temu skończyłem projekt bazujący na płytce SAM7-P64 z OLIMEX-u wykorzystując USB Framework jako urządzenie CDC. Kompilowałem to pod WINARM-em ale o ile się nie mylę Crossworks też korzysta z GCC. Przystosowanie biblioteki zajęło mi trochę czasu zanim zaczęło to działać. Trochę mało mam ostatnio czasu ale postaram się udostępnić przystosowany do GCC kod.
    Wykorzystujesz jakiś konkretny zestaw ewaluacyjny - czy może zrobiłeś własną płytkę?
  • REKLAMA
  • #5 4252257
    Sowa
    Poziom 12  
    Posty: 40
    Pomógł: 3
    Mam płyte Propoxa EVBsam7S z AT91SAM7S256 na pokładzie. Wyprowadzenia podłączyłem tak, żeby były zgodne z płyta AT91SAM7SEK USB Frameworka. Płyta generalnie jest OK, ale czekałem na nią jakieś 3-4 miesiące zanim dostałem paczkę. Także Propoxu nie polecam i z tego co pamiętam nie jestem jedyny, który sie na nich tak przejechał. Teraz zamówiłem parę elementów do projektu w TME i jestem bardzo zadowolony. Szybka przesyłka, wszystko ładnie zapakowane i opisane i do tego tanio - polecam :)

    Tak, CrossWorks też korzysta z gcc, ale tu trochę inaczej zdefiniowany jest plik startowy, mapa pamięci itp. Musze sie w to zagłębić. Zabieram sie do pracy. Mam nadzieje ze dziś coś w końcu ruszy.

    Pzdr
    Sowa
  • #6 4257937
    Sowa
    Poziom 12  
    Posty: 40
    Pomógł: 3
    Jest mały postęp. Komputer już widzi urządzenie. Nie tylko przez chwile, ale cały czas gdy jest podpięte. Ale niestety to wszystko, żadne deskryptor nie przechodzą i enumeracja nie zachodzi, jak sadze ;) Coś czuję ze diabeł tkwi w przerwaniach do obsługi USB. Ktoś jeszcze próbuje uruchomić USB Framework pod CrossWorksem? Może ktoś podpowie na co jeszcze zwrócić uwagę?

    Pozdrawiam
    Tomek
  • REKLAMA
  • #7 4265736
    Sowa
    Poziom 12  
    Posty: 40
    Pomógł: 3
    OK :) Enumeracja działa. Przechodzą deskryptory, wiec podstawa do budowy urządzeń już jest :D Pierwsze co trzeba było zmienić to podczas konfigurowania przerwań dodać na końcu linijkę:
        __ARMLIB_enableIRQ();

    Oprócz tego zmiany w pliku startowym, aby możliwa była obsługa przerwań zagnieżdżonych. Czyli:
    irq_handler:
    //---- Adjust and save return address on the stack
        sub     lr, lr, #4
        stmfd   sp!, {lr}
    //---- Save r0 and SPSR on the stack
        mrs     r14, SPSR
        stmfd   sp!, {r0, r14}
    //---- Write in the IVR to support Protect mode
    //---- No effect in Normal Mode
    //---- De-assert NIRQ and clear the source in Protect mode
    //////    ldr     r14, =AIC_BASE
        ldr r14, =AIC_BASE  //jdc, AIC_IVR
    //////    ldr     r0, [r14, #AIC_IVR]
        ldr r0, [r14, #AIC_IVR_OFFSET]  // Read of AIC_IVR
    //////    str     r14, [r14, #AIC_IVR]
        str r14, [r14, #AIC_IVR_OFFSET] // AIC_ Interrupt Service Vector Address
    
    //---- Enable nested interrupts and switch to Supervisor mode
    //////    msr     CPSR_c, #ARM_MODE_SVC
        msr     CPSR_c, #0x13  //jdc  ARM_MODE_SVC is 0xd13, Ibit is 0x80.  Interrupts actually enabled
    //---- Save scratch/used registers and LR on the stack
        stmfd   sp!, {r1-r3, r12, r14}
    //---- Branch to the routine pointed by AIC_IVR
        mov     r14, pc
        bx      r0
    //---- Restore scratch/used registers and LR from the stack
        ldmia   sp!, {r1-r3, r12, r14}
    //---- Disable nested interrupts and switch back to IRQ mode
    ///////msr     CPSR_c, #I_BIT | ARM_MODE_IRQ
        msr     CPSR_c, #0x92  //jdc   I_BIT 0x80 or'd with ARM_MODE_IRQ 0x12, interrupts disabled
    //---- Acknowledge interrupt by writing AIC_EOICR
    //////    ldr     r14, =AT91C_BASE_AIC
        ldr r14, =AIC_BASE  //jdc
    //////    str     r14, [r14, #AIC_EOICR]
        str r14, [r14, #AIC_EOICR_OFFSET]  //jdc
    //---- Restore SPSR and r0 from the stack
        ldmia   sp!, {r0, r14}
        msr     SPSR_cxsf, r14
    //---- Return from interrupt handler
        ldmia   sp!, {pc}^
      b .  /* Endless loop */


    Powiększenie stosu IRQ, no i odpowiednie skonfigurowanie zegara dla USB. A na mojej płycie miałem inaczej skonfigurowane załączanie rezystora PullUp dla USB D+. Załącza sie go wysokim poziomem a nie niskim, zanim do tego doszedłem tez trochę zeszło. To chyba wszystko. Biorę sie za uruchomienie jakiegoś urządzenie ;).

    Pozdrawiam
    Tomek
  • #8 4944412
    Bigsiu
    Poziom 10  
    Posty: 35
    Ocena: 3
    Witam, widzę, ze doszedłeś co trzeba zrobić linkerowli, żeby widział funkcje z innych plików - możesz podzielić sie tą wiedzą?
  • #9 4946223
    Sowa
    Poziom 12  
    Posty: 40
    Pomógł: 3
    No trzeba je includowac. Poza tym w Additional Linker Options wpisałem: --allow-multiple-definition żeby się linker nie burzył że jest wiele definicji funkcji. To by było chyba wszystko. A co konkretnie nie chce Ci działać? Może coś źle zrozumiałem ;)

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z uruchomieniem USB Framework na platformie CrossWorks dla mikrokontrolera AT91SAM7S. Użytkownik napotkał błędy linkera związane z niezdefiniowaną funkcją BRD_ConfigureVBus pomimo dołączenia odpowiednich plików. W trakcie prac zmieniono sposób definiowania struktur z użyciem atrybutu __attribute__((packed)) zamiast __packed typedef struct. Projekt kompiluje się, jednak początkowo urządzenie było wykrywane tylko chwilowo przez komputer. Po dalszych modyfikacjach, w tym dodaniu wywołania __ARMLIB_enableIRQ() podczas konfiguracji przerwań oraz zmianach w pliku startowym umożliwiających obsługę przerwań zagnieżdżonych, enumeracja USB zaczęła działać poprawnie i deskryptory są przesyłane. Wskazano, że CrossWorks korzysta z GCC, ale wymaga specyficznej konfiguracji pliku startowego i mapy pamięci. Użytkownik korzysta z płyty Propoxa EVBsam7S z AT91SAM7S256, dostosowanej do wyprowadzeń płyty AT91SAM7SEK. W dyskusji pojawiła się także informacja o problemach z dostawą płyty Propoxa oraz pozytywne doświadczenia z dystrybutorem TME. W kwestii linkowania, aby uniknąć błędów wielokrotnych definicji, zastosowano opcję linker --allow-multiple-definition. Całość wskazuje na konieczność dokładnej konfiguracji przerwań i środowiska linkera, aby USB Framework działał poprawnie pod CrossWorks na platformie AT91SAM7S.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA