- 论坛徽章:
- 1
|
本帖最后由 ymes9106 于 2015-03-14 16:29 编辑
大家好
現在在學習寫簡單的驅動並加入嵌入式系統 (linux kernal 3.3)
在開發版上接了一顆i2c device (OLED addr: 0x3c)
寫了一個i2c device driver掛上去,
但不知為何它就是無法跑到 probe 函式 (這樣子是不是代表掛載不成功?)
menuconfig也確認過, 有載入模組
從user space使用 i2c-tools查看
該裝置是有連線的, 也可以寫值到暫存器, 所以硬體方面的問題先排除
以下是此 device的driver code
第一步註冊board_info
第二步註冊device driver
小弟第一次寫driver, 實在不知道問題點出在哪, 能麻煩指導一下嗎..謝謝
//-----------------------------------------------------
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/i2c.h>
int i2c_oled_test1= 0;
int i2c_oled_test2= 0;
static struct i2c_board_info ssd1306_info[] = {
{
.type = "ssd1306_i2c",
.addr = 0x3c, // oled addr
},
};
static const struct i2c_device_id ssd1306_i2c_id[] = {
{"ssd1306_i2c", 0},
};
static int ssd1306_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
i2c_oled_test2 = 1; // 從其他地方呼叫此全域變數, 用來確認是否真的有跑進來此函式
return 0;
}
static int __devexit ssd1306_i2c_remove(struct i2c_client *client)
{
return 0;
}
static struct i2c_driver ssd1306_i2c_driver = {
.driver = {
.name = "ssd1306_i2c_driver",
.owner = THIS_MODULE,
},
.probe = ssd1306_i2c_probe,
.remove = __devexit_p(ssd1306_i2c_remove),
.id_table = ssd1306_i2c_id,
};
static int __init i2c_oled_init(void)
{
i2c_oled_test1 = 1; // 從其他地方呼叫此全域變數, 用來確認是否真的有跑進來此函式
i2c_register_board_info(1, ssd1306_info, ARRAY_SIZE(ssd1306_info)); // 註冊board info, 使用bus num=1的 i2c總線
return i2c_add_driver(&ssd1306_i2c_driver); // 註冊driver
}
static void __exit i2c_oled_exit(void)
{
i2c_del_driver(&ssd1306_i2c_driver);
}
module_init(i2c_oled_init);
module_exit(i2c_oled_exit);
MODULE_DESCRIPTION("OLED(ssd1306) i2c device driver");
MODULE_AUTHOR("Bruce");
MODULE_LICENSE("GPL");
//-----------------------------------------------
最後的結果為:
i2c_oled_test1 = 1, i2c_oled_test2 = 0 |
|