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 ?