2013-09-28 30 views
11

Mamy system oparty na karcie Atom Z510/Intel SCH US15W Q7 (z systemem Debian Linux). Musimy przesłać bloki danych z urządzenia na niskim poziomie. Pin Count Bus. O ile wiem, ten mikroukład nie zapewnia urządzeń DMA, co oznacza, że ​​procesor musi odczytywać dane po bajcie w pętli oprogramowania. (Sterownik urządzenia faktycznie wykonuje to za pomocą instrukcji "rep insb" x86, więc pętla jest faktycznie zaimplementowana przez CPU, jeśli dobrze rozumiem.)Rejestry konfiguracyjne dla magistrali LPC w Poulsbo System Controller Hub (US15W)

Jest to daleki od optymalnego, ale powinno być możliwe uzyskanie szybkości transferu 14 Mb/s. Zamiast tego możemy ledwo zarządzać 4 Mb/s przy transakcjach na magistrali nie bliżej niż 2 us od siebie, nawet jeśli każdy odczyt do urządzenia slave jest wykonywany w 560ns. Nie wierzę, że winę ponosi inny ruch w autobusie, ale nadal prowadzę dochodzenie.

Moje pytanie brzmi:

Czy ktoś wie, czy są jakieś rejestry konfiguracyjne na SCH które mogłyby wpłynąć na taktowanie magistrali LPC?

Nie mogę znaleźć żadnych przydatnych informacji na temat urządzenia na stronie internetowej Intela, ani też nie zauważyłem niczego w kodzie jądra Linuksa, który wydaje się manipulować przy takich rejestrach (ale jestem noob, gdy dojdzie do Linuksa Kernel rzeczy.)

Nie jestem ekspertem x86, więc dobrze byłoby wiedzieć o innych czynnikach, które mogą wejść w grę lub o innych "historiach wojennych" związanych z tym urządzeniem.

Edytuj: Znalazłem datasheet. Nie widziałem w tym niczego, co wyjaśniałoby to zachowanie, ale badam możliwość mapowania naszego urządzenia jako oprogramowania układowego, ponieważ cykle magistrali oprogramowania układowego nie mają takich samych opóźnień.

+0

Może być również konieczne rozważenie ograniczeń sprzętowych urządzenia podrzędnego, np. Szybkości dostarczania danych podczas odpytywania bajt po bajcie. Może wystąpić pewne opóźnienie związane z "szukaniem". Ponieważ NIE wykonujemy żadnych operacji wejścia/wyjścia, to "opóźnienie wyszukiwania" zostaje dodane do każdego przeczytanego bajtu. [** Sekcja 12.2 specyfikacji interfejsu LPC firmy Intel **] (http://www.intel.com/design/chipsets/industry/25128901.pdf#page=53&zoom=auto.0,528) zawiera typowe profile wydajności we/wy różnych urządzeń peryferyjnych na magistrali LPC. Czy możesz podzielić się szczegółami urządzenia peryferyjnego, z którym komunikujesz się za pośrednictwem szyny LPC? ... – TheCodeArtist

+0

Urządzenie to Spartan 3 FPGA działające jako mostek dla układu kontrolera ARCNET. Sprawdziliśmy cykl odczytu na analizatorze logicznym, a oprogramowanie układowe wstrzykuje jedno "krótkie oczekiwanie" podczas synchronizacji części cyklu - przedłużając cykl o jeden zegar - 40us w tym przypadku. Cały cykl odbywa się w 14 okresach zegarowych - 560us. Nic FPGA nie może zrobić, aby utrzymać następny cykl. – sheddenizen

Odpowiedz

1

W celu zapisania, rozwiązaniem było zmodyfikowanie oprogramowania układowego FPGA, tak aby rejestr danych wejściowych/wyjściowych układu scalonego był odwzorowany na cztery sąsiednie adresy, a sterownik zmodyfikowany w celu wykonania 32-bitowych instrukcji inb/outb. Chociaż SCH nie implementuje 32-bitowych operacji odczytu/zapisu LPC, wynikiem są 4 operacje back-to-back 8-bitowe, po których następuje taki sam czas martwy, jak poprzednio, z pojedynczym bajtem, co oznacza, że ​​średnia wynosi 1us na bajt. Nie idealne, ale wciąż podwojenie przepustowości.

Okazuje cykle oprogramowania było szybsze, ponieważ przenosi SCH 64 bajtów w czasie od oprogramowania układowego - po 64 bajtów nie jest taki sam odstęp 1.4us, wskazujący to opóźnienie za transakcję urządzenia. Wykorzystanie tego może być nieco szybsze niż powyższe rozwiązanie, jednak kompromis jest ograniczony do 64 bajtów, a każdy bajt zajmuje więcej czasu (680ns IIRC) z powodu dodatkowych cykli wymaganych do odczytu oprogramowania układowego.