2014-09-21 6 views
7

पर जीपीआईओ के पिन परिवर्तन का पता लगाने के लिए कैसे मैं एआरएम आधारित लिनक्स बोर्ड (आईएमएक्स 233 सीपीयू) पर 3.12 कर्नेल का उपयोग कर रहा हूं। मेरा उद्देश्य जीपीआईओ (1 से 0) के पिन परिवर्तन का पता लगाना है।लिनक्स बोर्ड

मैं लगातार नीचे समारोह (थोड़ी देर के (1) पाश में) कॉल पिन मूल्य

int GPIO_read_value(int pin){ 
    int gpio_value = 0; 
    char path[35] = {'\0'}; 
    FILE *fp; 
    sprintf(path, "/sys/class/gpio/gpio%d/value", pin); 
    if ((fp = fopen(path,"rb+")) == NULL){ //echo in > direction 
     //error 
    } 

    fscanf(fp, "%d", &gpio_value); 
    fclose(fp); 
    return gpio_value; 
} 

पढ़ सकते हैं लेकिन यह सीपीयू के लिए बहुत अधिक भार का कारण बनता है। मैं usleep या nanosleep का उपयोग नहीं करता, क्योंकि पिन परिवर्तन एक बहुत ही कम समय के लिए होता है जो मुझे घटना को याद करने का कारण बनता है।

जहां तक ​​मुझे पता चलता है, poll() का उपयोग करना संभव नहीं है। क्या कोई poll() फ़ंक्शन जैसा है जिसका उपयोग मैं जीपीआईओ के पिन परिवर्तन का पता लगाने के लिए कर सकता हूं?

संपादित करें: बस के मामले में, अगर मैं कुछ गलत कर रहा हूँ, यहाँ मेरी poll() उपयोग कि पिन परिवर्तन

struct pollfd pollfds; 
    int fd; 
    int nread, result; 
    pollfds.fd = open("/sys/class/gpio/gpio51/value", O_RDWR); 
    int timeout = 20000;   /* Timeout in msec. */ 
    char buffer[128]; 

    if(pollfds.fd < 0){ 
     printf(" failed to open gpio \n"); 
     exit (1); 
    } 

    pollfds.events = POLLIN; 
    printf("fd opens..\n"); 
    while (1) 
    { 
      result = poll (&pollfds, 0, timeout); 
      switch (result) 
      { 
        case 0: 
        printf ("timeout\n"); 
        break; 
        case -1: 
        printf ("poll error \n"); 
        exit (1); 

        default: 
       printf("something is happening..\n"); 
        if (pollfds.revents & POLLIN) 
        { 
         nread = read (pollfds.fd, buffer, 8); 
         if (nread == 0) { 
          printf ("result:%d\n", nread); 
          exit (0); 
         } else { 
          buffer[nread] = 0; 
          printf ("read %d from gpio: %s", nread, buffer); 
         } 
        } 
       } 
    } 
    close(fd); 

EDIT2 पता नहीं लगा पाया है: https://developer.ridgerun.com/wiki/index.php/Gpio-int-test.c पर कोड poll() साथ ठीक काम करता है मैं परिभाषित करने की जरूरत बाधा के लिए बढ़ते/गिरते किनारे और परिभाषा पर थोड़ा सा फिक्स। यह मेरी समस्या हल करता है, हालांकि, मेरे और कुछ अन्य लोगों के लिए वैकल्पिक तरीकों को सुनना/जानना अच्छा हो सकता है।

+0

inotify API के बारे में क्या? –

+1

जब आप कहते हैं कि पिन केवल "बहुत ही कम समय" के लिए सक्रिय है, तो आप किस प्रकार के समय के बारे में बात कर रहे हैं? क्योंकि आपके जैसे सक्रिय मतदान भी करते हैं, इसे उपयोगकर्ता स्पेस से करने से विलंबताएं शुरू हो सकती हैं जो आपको वैसे भी याद कर सकती हैं। –

+0

मैं एसपीआई डेटा पढ़ने के लिए एक चिपचिपाहट के रूप में एक जीपीआईओ का उपयोग करना चाहता हूं। निष्क्रिय राज्य पर यह तर्क उच्च है। ट्रांसमिशन शुरू होने पर यह तर्क कम हो जाता है। इसलिए, तेजी से प्रतिक्रिया बेहतर है। जब मुझे उपयुक्त विधि मिलती है, तो मैं धीमी गति से इसका परीक्षण करूंगा – Angs

उत्तर

1

मैंने कभी इस बोर्ड को कभी नहीं देखा है, हालांकि मुझे लगता है कि पीआईसी इस बोर्ड के लिए पूरी तरह कार्यान्वित है (आमतौर पर ऐसा ही है) लेकिन आपको जीपीआईओ नियंत्रक (आमतौर पर ऐसा ही है) में बाधा को कॉन्फ़िगर करना होगा। कुछ भाग कर्नेल मॉड्यूल के रूप में किया जाना चाहिए, तो आपको अपने आवेदन में बाधा डालने के बारे में जानकारी पास करनी होगी।

उदाहरण तरीका यह है एक कर्नेल मॉड्यूल के रूप में निम्नलिखित बात को लागू करना है:

  • सेटअप GPIO विशेष बंदरगाह और स्तर पर बाधा सक्षम करने के लिए नियंत्रक (ऐसा करने के तरीके आप यहाँ पा सकते हैं: http://cache.freescale.com/files/dsp/doc/ref_manual/IMX23RM.pdf 37.2 .3.3 इनपुट इंटरप्ट ऑपरेशन)

  • सक्षम GPIO पीआईसी में बीच में (यह करने के लिए कैसे: http://lwn.net/images/pdf/LDD3/ch10.pdf Chapter10)

  • बाधा दिनचर्या प्रबंधन लागू (मैं लूंगा घ नीचे थोड़ा सा लिखें)
  • आपके मॉड्यूल के लिए ioctl इंटरफेस को लागू करें।

और अपने आवेदन में एक आराम:

  • एक समारोह है कि बाधा के साथ coosomeoneperate कर सकते हैं।

कर्नेल से ऐप में बाधा के बारे में जानकारी पास करने का सबसे आसान तरीका कर्नेल पक्ष पर सेमफोर द्वारा है। मॉड्यूल में आप एक ioctl को कार्यान्वित कर सकते हैं जो बाधा होने तक सोएगा। तो एप्लिकेशन इस ioctl को कॉल करेगा और इसके धागे को अवरुद्ध होने तक अवरुद्ध कर दिया जाएगा।

मॉड्यूल के अंदर, नियमित अंतराल को जांचना चाहिए कि क्या एप्लिकेशन थ्रेड अब अवरुद्ध है, और यदि ऐसा है() सेमफोर।

संपादित *****

यह सीपीयू एसएसपी कि एसपीआई के लिए मोड काम कर गया है। इसका उपयोग क्यों न करें ??

संबंधित मुद्दे