2010-06-10 14 views
6

मैं लिनक्स डिवाइस ड्राइवर लिखने में नौसिखिया हूं, अगर मुझे कुछ बेवकूफ पूछा गया है और मेरी खराब अंग्रेजी ^^
मैं एक टच पैनल के लिए ड्राइवर लिखने की कोशिश कर रहा हूं, जो संवाद करता है सीपीयू के साथ I2C के माध्यम से।
मैंने लिनक्स प्लेटफार्म में एक डिवाइस ड्राइवर जोड़ने की कोशिश की, और रजिस्टर सफल रहा, मेरा मतलब है कि चालक लोड हो गया था, लेकिन जांच समारोह को निकाल दिया नहीं गया !!I2C डिवाइस ड्राइवर लिखते समय जांच समस्या

ऊपर लिखा गया ड्राइवर का आंशिक कोड है।

static int i2c_ts_probe(struct i2c_client *client, const struct i2c_device_id * id) { 
    /* ... */ 
} 

static int i2c_ts_remove(struct i2c_client *client) { 
    /* ... */ 
} 

static const struct i2c_device_id i2c_ts_id[] = { 
    {"Capacitive TS", 0}, 
    { } 
}; 
MODULE_DEVICE_TABLE(i2c, i2c_ts_id); 

static struct i2c_driver i2c_ts = { 
    .id_table = i2c_ts_id, 
    .probe = i2c_ts_probe, 
    .remove = i1c_ts_remobe, 
    .driver = { 
     .name = "i2c_ts", 
    }, 
}; 

static int __init i2c_ts_init(void) { 
    return i2c_add_driver(&i2c_ts); 
} 

static int __init i2c_ts_exit(void) { 
    return i2c_del_driver(&i2c_ts); 
} 

module_init(i2c_ts_init); 
module_exit(i2c_ts_exit); 

से ऊपर मंच (/kernel/arch/arm/mach-pxa/saarb.c) में आंशिक कोड I2C डिवाइस का पंजीकरण के लिए इस्तेमाल किया है।

static struct i2c_board_info i2c_board_info_ts[] = { 
    { 
     .type = i2c_ts, 
     .irq = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO0)), 
    }, 
}; 

static void __init saarb_init(void) { 
    ... 
    i2c_register_board_info(0, ARRAY_AND_SIZE(i2c_board_info_ts)); 
    ... 
} 

कोई सुझाव और टिप्पणी का स्वागत किया जाएगा, धन्यवाद ^^

+1

i2c_ts_id सही है? –

उत्तर

7

ताकि linux उपकरण/ड्राइवर मॉडल अपने ड्राइवर की जांच कर सकते हैं, वहाँ एक उपकरण का अनुरोध किया जाना चाहिए: इस नाम की तुलना द्वारा हासिल की है ड्राइवर ("i2c_ts") और i2c_board_info संरचना में डिवाइस का प्रकार। आपके मामले में मुझे लगता है कि यह प्रकार "i2c_ts" के बराबर नहीं है।

तो मैं आपको सुझाव दूंगा कि आप I2C_BOARD_INFO मैक्रो का उपयोग अपने डिवाइस को तत्काल करने के लिए करें, जैसा दस्तावेज़ीकरण/i2c/instantiating_devices में प्रलेखित है।

static struct i2c_board_info i2c_board_info_ts[] = { 
    { 
     I2C_BOARD_INFO("i2c_ts", 0x12), 
     .irq = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO0)), 
    }, 
}; 

static void __init saarb_init(void) { 
    ... 
    i2c_register_board_info(0, ARRAY_AND_SIZE(i2c_board_info_ts)); 
    ... 
} 

आपने अपने डिवाइस को कोई पता नहीं दिया था, और I2C_BOARD_INFO को इसकी आवश्यकता है। यह पता लगाने के लिए कि वह पता क्या है, अपनी टचस्क्रीन के डेटाशीट को पढ़ें।

अंत में, जैसा ऊपर बताया गया है, सुनिश्चित करें कि i2c_ts_id सही है। मुझे यकीन नहीं है कि यह कर्नेल में डिवाइस/मॉड्यूल एसोसिएशन तंत्र में एक भूमिका निभाता है, लेकिन मैं कहूंगा कि यह बहुत कम भ्रमित है कि वे सभी एक ही नाम साझा करते हैं।

1

प्रोब विधि केवल तब ही बुलाया जाएगा जब डिवाइस ड्राइवर नाम से मेल खाता है। जैसा कि आपने अपने ड्राइवर नाम को 'i2c_ts' के रूप में वर्णित किया है, कृपया डिवाइस के नाम के लिए अपने डिवाइस का पेड़ देखें। दोनों समान होना चाहिए।