2010-06-10 29 views
6

Tôi là người mới viết trình điều khiển thiết bị linux, tha thứ cho tôi nếu có bất cứ điều gì ngu ngốc và tiếng Anh kém của tôi ^^
Tôi đang cố viết trình điều khiển cho một bảng điều khiển cảm ứng với CPU qua I2C.
Tôi đã cố gắng thêm trình điều khiển thiết bị vào nền tảng Linux và đăng ký thành công, ý tôi là trình điều khiển đã được tải, nhưng chức năng dò tìm đã không kích hoạt !!Thắc mắc thăm dò khi viết trình điều khiển thiết bị I2C

Phía trên là mã một phần của trình điều khiển tôi đã viết.

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); 

Trên đây là mã một phần trong nền tảng (/kernel/arch/arm/mach-pxa/saarb.c) được sử dụng để đăng ký thiết bị 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)); 
    ... 
} 

bất cứ đề nghị và bình luận sẽ được chào đón, thanks ^^

+1

là i2c_ts_id có đúng không? –

Trả lời

7

Vì vậy mà mô hình linux thiết bị/lái xe có thể thăm dò lái xe của bạn, thì phải có một thiết bị yêu cầu nó: đây được thực hiện bằng cách so sánh tên của trình điều khiển ("i2c_ts") và loại thiết bị trong cấu trúc i2c_board_info. Trong trường hợp của bạn, tôi đoán loại không bằng "i2c_ts".

Vì vậy, tôi khuyên bạn nên sử dụng macro I2C_BOARD_INFO để khởi tạo thiết bị của mình, như được ghi trong Tài liệu/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)); 
    ... 
} 

Bạn cũng chưa đưa ra địa chỉ cho thiết bị của mình và I2C_BOARD_INFO cần nó. Đọc biểu dữ liệu của màn hình cảm ứng để biết địa chỉ đó là gì.

Cuối cùng, như được đề xuất ở trên, hãy đảm bảo rằng i2c_ts_id là chính xác. Tôi không chắc chắn nó đóng một vai trò trong cơ chế liên kết thiết bị/mô-đun trong hạt nhân, nhưng tôi sẽ nói rằng nó ít khó hiểu hơn tất cả họ đều có cùng tên.

1

Phương pháp thăm dò sẽ chỉ được gọi khi thiết bị khớp với tên trình điều khiển. Bạn đã đề cập tên trình điều khiển là 'i2c_ts', hãy kiểm tra cây thiết bị của bạn để biết tên thiết bị.Bên phải giống nhau.

Các vấn đề liên quan