2014-07-07 5 views
6

pandaboard OMAP4 में GPIO_39 पर प्रत्येक 10ms पर एक बाधा उत्पन्न हो रही है। मैंने लिनक्स ड्राइवर कोड में इसके लिए एक हैंडलर पंजीकृत किया है, लेकिन हस्तक्षेप का पता नहीं चलने के बाद से हैंडलर को नहीं बुलाया जा रहा है।एंबेडेड लिनक्स में जीपीआईओ लाइन पर बाधा का पता लगाने के लिए कैसे?

मैंने हार्डवेयर स्तर पर (जीपीओ पिन की जांच करके) सुनिश्चित किया कि वास्तव में बाधा उत्पन्न हो रही है। यह केवल इतना है कि सॉफ्टवेयर इसे पहचानने में सक्षम नहीं है।

मेरे पास मेरे ड्राइवर कोड में निम्न है।

#define GPIO_NO  39 

    iowrite16(0x3, gpio_39_address + 2); /* Configured the pin 22 to be used as gpio. */ 

    ret = gpio_request(GPIO_NO, "Claiming GPIO"); 
    if(ret < 0) 
    { 
    printk(KERN_ALERT "%s: Claiming GPIO_%d failed\n", __func__, GPIO_NO); 
    return -1; 
    } 
    else 
    { 
    printk(KERN_INFO "%s: Claiming GPIO_%d successful\n", __func__, GPIO_NO); 
    } 

    ret = gpio_direction_input(GPIO_NO); 
    if(ret < 0) 
    { 
    printk(KERN_INFO "%s: Setting GPIO direction to input failed\n", __func__); 
    return -1; 
    } 
    else 
    { 
    printk(KERN_INFO "%s: Direction of GPIO_%d set to input\n", __func__, GPIO_NO); 
    } 

    GPIO_IRQ = gpio_to_irq(GPIO_NO); 

    if(GPIO_IRQ < 0) 
    { 
    printk(KERN_INFO "%s: Mapping GPIO_%d to IRQ failed\n", __func__, GPIO_NO); 
    return -1; 
    } 
    else 
    { 
    printk(KERN_INFO "%s: Mapping GPIO_%d to IRQ_%d successful\n", __func__, GPIO_NO, GPIO_IRQ); 
    } 

    if((request_irq(GPIO_IRQ, ten_ms_int, IRQF_TRIGGER_FALLING, DEVICE_NAME, NULL))) 
    { 
    printk(KERN_ALERT "%s: requeseting GPIO_IRQ %d failed\n", __func__, GPIO_IRQ); 
    return -1; 
    } 
    else 
    { 
    printk(KERN_INFO "%s: requesting GPIO_IRQ %d successful\n", __func__, GPIO_IRQ); 
    } 

irqreturn_t ten_ms_int(int irq, void *dev_id) 
{ 
    T_UINT32 l; 
    /* Enable spi channel */ 
    l = ioread32(spi_base + SPI_CHCONF0); 
    l |= SPI_CHCONF0_FORCE; 
    iowrite32(l, (spi_base + SPI_CHCONF0)); 

    l = ioread32(spi_base + SPI_CHCTRL0); 
    l |= SPI_CHCTRL_EN; 
    iowrite32(l, (spi_base + SPI_CHCTRL0)); 

    /* Enable dma channel 0 */ 
    l = ioread32(sdma_base + SDMA_CCR(CHANNEL0)); 
    l |= SDMA_CCR_ENABLE; 
    iowrite32(l, sdma_base + SDMA_CCR(CHANNEL0)); 

    /* Enable dma channel 1 */ 
    l = ioread32(sdma_base + SDMA_CCR(CHANNEL1)); 
    l |= SDMA_CCR_ENABLE; 
    iowrite32(l, sdma_base + SDMA_CCR(CHANNEL1)); 
    //printk(KERN_INFO "%s: 10ms interrupt detected %d\n", __func__, irq); /* I know that I've to remove this printk statement */ 
    return IRQ_HANDLED; 
} 

GPIO_39 बैंक GPIO2 के अंतर्गत आता है और इसी बाधा संख्या 32. है लेकिन, gpio_to_irq() की वापसी मूल्य 199 है यह चिंता का एक अन्य कारण है।

कृपया मुझे बताएं कि कोड में कुछ गलत है या अगर मुझे कुछ याद आया है।

+1

आपका कोड अधिकतर ठीक दिखता है। मुझे लगता है कि आपका पहला Iowrite शायद सबसे अनावश्यक है, यह क्या करना चाहिए? क्या आपने अपनी पिन मल्टीप्लेक्स सेटिंग्स की जांच की है और सत्यापित किया है कि आप इंटरप्ट सिग्नल को एक मान के रूप में पढ़ सकते हैं (उदाहरण के लिए, उपयोगकर्ता स्पेस इंटरफ़ेस के साथ)। – slobobaby

+0

पहला Iowrite पिन muxing हिस्सा है। –

+0

यदि आप उपयोगकर्ता स्पेस इंटरफ़ेस का उपयोग करते हैं तो क्या आप बाहरी सिग्नल स्तर को सही ढंग से पढ़ सकते हैं? – slobobaby

उत्तर

1

गिरते किनारे का पता लगाने के लिए जीपीआईओ पिन को स्पष्ट रूप से बनाएं।

जीपीओ मॉड्यूल स्तर पर जीपीओ के FALLING_DETECT को सक्षम करना आवश्यक है।

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