1 (edytowany przez cyniu88 2015-06-21 19:59:05)

Temat: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

Cześć

nigdy nie byłem przekonany do ustawienia linii GPIO  ( np. LED)  operacjami na pliku. szukając informacji jak ustawiać linie przez operacje na rejestrze w openwrt natrafiłem  na tą stronę  Link  (od razu dodam że jest tam babol  jeśli chodzi o operacje na bitach ).

Posiadam TP-Link 3600   z procesorem AR9344   do którego znalazłem DS  http://cykey.ca/~cykey/airport/AR9344.pdf

naprawiłem funkcje  z poradnika,  sprawdziłem że dla mojego procesora adresy się zgadzają  ale block size jest większy

po zmianie powstały  funkcje które działają dobrze i bardzo szybko operują na liniach GPIO, niestety ten przykład  nie jest uniwersalny  lecz raczej tylko  dla procesora AR9344

#define GPIO_ADDR 0x18040000 // base address
#define GPIO_BLOCK 108 // memory block size

//#define LED_qos 15
#define OUT_PUT 1
#define IN_PUT  0
#define HIGH    1
#define LOW     0

volatile unsigned long *gpioAddress;

 

int gpioSetup()
{
    int  m_mfd;
    if ((m_mfd = open("/dev/mem", O_RDWR)) < 0)
    {
        return -1;
    }
    gpioAddress = (unsigned long*)mmap(NULL, GPIO_BLOCK, PROT_READ|PROT_WRITE, MAP_SHARED, m_mfd, GPIO_ADDR);
    close(m_mfd);

    if (gpioAddress == MAP_FAILED)
    {
        return -2;
    }

    return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////

void gpioDirection(int gpio, int direction)
{
    unsigned long value =   *(gpioAddress + 0); // obtain current settings

    if (direction == 1)
    {
        value &= ~(1 << gpio); // clear bit
    }
    else
    {
       value |= 1 << gpio; // set bit to 1
    }

    cout << " w value " << value <<endl;
    binary(value);
    cout << " po binrary " << endl;

    *(gpioAddress + 0) = value;
}
//////////////////////////////////////////////////////////////////////////////////////////////
inline  void gpioSet(int gpio, int value)
{
    if (value == 0)
    {
        *(gpioAddress + 3) |= (1 << gpio);
    }
    else
    {
        *(gpioAddress + 4) |= (1 << gpio);
    }
}

///////////////////////////////////////////////////


 inline int gpioRead(int gpio)
{
     unsigned long value = *(gpioAddress + 1);
     return ((value >> gpio) % 2);
}

jest kilka projektów na tej stronie do których można to wykorzystać,

domyślam się,  że jest jeszcze kilka innych sposobów jak to zrobić pod openWRT  bardziej uniwersalnych  więc gdyby ktoś chciał się  tym podzielić  to na pewno parę osób byłoby zainteresowanych.

Dodatkowo  gdyby ktoś miał datasheet do procesora  Atheros AR9132@400MHz   z TP-Link TL-WR1043ND to byłbym wdzięczny za udostępnienie.


PS  co w ogóle sądzicie o tym sposobie pracowania na  GPIO ?

2

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

Ja ostatnio myślę nad tym, by takie zadanie wykonywał moduł na jakimś tanim AVR i potem gadało to po I2C przykładowo, po pierwsze jak coś pójdzie nie tak, to spali się proc za grosze, a nie od razu SoC, po drugie starczy znaleźć 2 linie...

Tylko na razie nie mam weny, żeby nad tym siąść (ojj płytka stykowa z m328 już się należała długo).

Coś w tym stylu, tylko dogadać to z OpenWRT http://john.crouchley.com/blog/archives/612

3

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

esp8266 i gada z po wifi z openwrt smile

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

4 (edytowany przez admin2 2015-06-22 19:25:19)

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

Do takiego chociażby odtwarzacza sieciowego chyba lepsze moje rozwiązanie, przyciski + HD44780 + odbiornik IR i brakłoby pinów ESP...

5

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

Ew + zwykły ekspander gpio.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

6

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

admin2 napisał/a:

Do takiego chociażby odtwarzacza sieciowego chyba lepsze moje rozwiązanie, przyciski + HD44780 + odbiornik IR i brakłoby pinów ESP...

Mało to LCD z I2C i adapterów HD44780 na I2C?

7

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

Są i kosztują niewiele jak na gotowe rozwiązanie, ale to co podlinkowałem daje jeszcze obsługę przycisków.

8

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

Jeszcze jedno, da się z poziomu C sterować nad modułem kernela od I2C, czy raczej pozostaje gadanie poprzez system()?


I tak co do postępów, walczyłem dość trochę nad tym rozwiązaniem z 2313 i albo mam jakieś dziwne attiny, albo biblioteka do I2C jest tam do kitu, nie wiem może kwestia tego, że attiny mają jakąś okrojoną wersję I2C, bo OpenWRT nawet tego nie wykrył, na m328 skleiłem na szybko bibliotekę do slave I2C z HD44780, gadam z opcją c w i2cset i już coś tam wyświetla.

9

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

admin2 napisał/a:

Jeszcze jedno, da się z poziomu C sterować nad modułem kernela od I2C, czy raczej pozostaje gadanie poprzez system()?

Właśnie nad tym się zastanawiam,

wiem że z poziomu c można pisać do rejestru   z liniami GPIO  i ustawiać  je  w stan HIGH  lub LOW  oraz czytać ich stan ,    czyli da się komunikować przez I2C   SPI , 1-Wire  pytanie  tylko jak   i czy to będzie przeszkadzać  jak nasz wątek odpowiedzialny  za transmisje np I2C  zostanie w połowie ramki  przerwany przez planistę a czas procesora przyznany  innemu wątkowi

10 (edytowany przez admin2 2015-06-24 19:00:09)

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

Raczej nie myślałem o pisaniu obsługi w C od nowa, tylko o jakimś rozwiązaniu umożliwiającym z C wykorzystać gotowy kmod.
Teraz robię to mega topornie:

void LCD_WriteData(unsigned char dataToWrite)
{

    strcpy(command, "");
    strcat(command,"i2cset -y 0 0x15 0x");
    strcat(command, itoa(dataToWrite, 16));
    system( command );

}

I nie ma się co dziwić, że potem wysłanie linijki 16 znaków zajmuje 190ms (to jest sama funkcja do wysłania pojedynczego).

11

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

Napisz moduł który przyjmie tekst a sam wyśle to na i2c?

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

12

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

Gdzie w źródłach jest kod od komend i2c, np i2cset?

Bym tam zajrzał, to może uda mi się wykombinować coś do bezpośredniego wystawiania znaków.

13

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

i2cset nie jest częścią kernelową, to program w userlandzie. W kernelu masz tylko niskopoziomowe sterowniki do magistrali.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

14

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

a pamiętasz gdzie dokładnie gdzie  są ?  oszczędziło by mi to szukania

15

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

W kernelu? W drivers/i2c

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

16

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

cyniu88 napisał/a:

a pamiętasz gdzie dokładnie gdzie  są ?  oszczędziło by mi to szukania

Ale co Ty chcesz zrobić, napisać kolejny driver czy jakiś prosty program, który będzie korzystał z magistrali I2C?
Wydaje mi się, że chcesz tego drugiego... przykład pierwszy z brzegu - masz i czytaj: http://elinux.org/Interfacing_with_I2C_Devices

cyniu88 napisał/a:

wiem że z poziomu c można pisać do rejestru   z liniami GPIO  i ustawiać  je  w stan HIGH  lub LOW  oraz czytać ich stan ,    czyli da się komunikować przez I2C   SPI , 1-Wire  pytanie  tylko jak   i czy to będzie przeszkadzać  jak nasz wątek odpowiedzialny  za transmisje np I2C  zostanie w połowie ramki  przerwany przez planistę a czas procesora przyznany  innemu wątkowi

To jakaś bzdura... od tego jest kernel (system operacyjny w ogóle) i odpowiednie sterowniki, żeby to działało prawidłowo, a użytkownik końcowy nie musiał się zastanawiać nad takimi "bzdetami" niskopoziomowymi. Masz obsługę błędów, wyjątków itd., więc jak driver jest dobrze napisany i coś pójdzie nie tak, to sobie to w swoim programie obsłużysz (może bardziej prawidłowo powinno być: powinieneś obsłużyć). I2C, w porównaniu do prędkości CPU, jest bardzo wolną magistralą i większość driverów jest napisana tak, że mogą być "usypiane", a sprzętowy kontrole dba o to, żeby wysłać/odebrać dane na/z magistrali. Bez tego nie miałoby to zupełnie sensu... jak to sobie wyobrażasz - na czas komunikacji po I2C (milisekundy) CPU ma nic innego nie robić i czekać?

17

Odp: Sterowanie liniami GPIO - ustawiając rejestr -procesory Atheros

Już ciekawa opcja, jak znajdę trochę chęci, to spróbuję przerobić tą funkcję do LCD i może w końcu się okaże czy jest jakiś zysk czasowy.