(一)iic讀時序
iic讀時序分為4大步,第一步時傳送裝置位址,第二步時傳送要讀取的暫存器位址,第三步重新傳送裝置位址,最後一步是iic器件輸出要讀取的暫存器值。時序如下圖:
(二)結構體i2c_client和i2c_drvier
i2c裝置驅動重點關注兩個資料結構體:i2c_client和i2c_drvier。
i2c_client:描述了裝置資訊,在include/linux/i2c.h中。
i2c_drvier:描述了驅動資訊,類似於platform_driver。
(三)i2c_driver註冊驅動示例**
extern int i2c_add_adapter(struct i2c_adapter *);iic驅動框架 示例**如下:extern void i2c_del_adapter(struct i2c_adapter *);
extern int i2c_add_numbered_adapter(struct i2c_adapter *);
extern int i2c_register_driver(struct module *, struct i2c_driver *);
extern void i2c_del_driver(struct i2c_driver *);
/*i2c驅動的probe函式*/
static int ***_probe(struct i2c_client *client, const struct i2c_device_id *id)
/*i2c驅動的remove函式*/
static int ***_remove(struct i2c_client *client)
/* 傳統匹配方式id列表 (無裝置樹時的匹配id表)*/
static const struct i2c_device_id ***_id = ,
{}};
/* 裝置樹匹配列表 (裝置樹所使用的匹配表)*/
static const struct of_device_id ***_of_match = , };
/*i2c驅動結構體 */
static struct i2c_driver ***_driver = ,
.id_table = ***_id,
};
/*驅動入口函式*/
static int __init ***_init(void)
/*驅動出口函式*/
static void __exit ***_exit(void)
}module_init(***_init);
module_exit(***_exit);
module_license("gpl");
module_author("zuozhongkai");
在.dts檔案中建立相應的裝置節點
status = "okay";
tmp1075@48 ;};
直接上**,詳細解釋看備註。
#include /*包含file_operation結構體*/
#include /* 包含module_init module_exit */
#include /* 包含license的巨集 */
#include /*包含miscdevice結構體*/
#include /*包含printk等操作函式*/
#include /*包含copy_to_user操作函式*/
#include /*包含request_irq操作函式*/
#include /*裝置樹操作相關的函式*/
#include /*of_get_named_gpio等函式*/
#include /*i2c驅動相關函式*/
void *private_data; /* 私有資料 */
static int tmp1075_read_regs(struct i2c_client *client, u8 reg, void *val, int len)
else
return ret;
}static int tmp1075_open(struct inode *inode, struct file *file)
/* 定義乙個開啟裝置的,read函式 */
ssize_t tmp1075_read(struct file *file, char __user *array, size_t size, loff_t *ppos)
/*字元裝置驅動程式就是為具體硬體的file_operations結構編寫各個函式*/
static const struct file_operations tmp1075_ctl=;
/*雜項裝置,主裝置號為10的字元裝置,相對普通字元裝置,使用更簡單*/
static struct miscdevice tmp1075_miscdev = ;
/*i2c驅動的probe函式,當驅動與裝置匹配以後此函式就會執行*/
static int tmp1075_probe(struct i2c_client *client, const struct i2c_device_id *id)
/*i2c驅動的remove函式,移除i2c驅動的時候此函式會執行*/
static int tmp1075_remove(struct i2c_client *client)
/* 傳統匹配方式id列表 */
static const struct i2c_device_id tmp1075_id = ,
{}};
/* 裝置樹匹配列表 */
static const struct of_device_id tmp1075_of_match = , };
/* i2c驅動結構體 */
static struct i2c_driver tmp1075_driver = ,
.id_table = tmp1075_id,
};static int __init tmp1075_init(void)
static void __exit tmp1075_exit(void)
/*驅動模組的載入和解除安裝入口*/
module_init(tmp1075_init);
module_exit(tmp1075_exit);
module_license("gpl");
module_author("boyee");
module_description("tmp1075 temperature read");
int main(int argc, char * const ar**)
while(1)
printf("temp register data = 0x%02x%02x\r\n",data[0],data[1]);
}
return 0;}
利用linux中iic子系統做IIC驅動
利用linux中iic裝置子系統移植iic裝置驅動 背景描述 iic匯流排在嵌入式系統中應用十分廣泛,常見的有eeprom,rtc。一般的處理器會包含iic的控制器,用來完成iic時序的控制 另外一方面,由於iic的時序簡單,使用gpio口來模擬時序也是常見的做法。面對不同的iic控制器,各種各樣的...
linux下IIC驅動開發分析(3)
在系統開機時,首先裝載的是 i2c匯流排驅動。乙個匯流排驅動用於支援一條特定的 i2c匯流排的讀寫。乙個匯流排驅動通常需要兩個模組,乙個 struct i2c adapter 和乙個struct i2c algorithm 來描述 static struct i2c adapter pb1550 b...
linux驅動入門實驗
帥得不敢出門 c 愛好者灌水天堂 3503799 由於沒有開發板,只好做pc機下linux的模組載入了.原理與開發板的是一樣的.編寫dri arh.c源 然後編譯,我就不寫makefile了 直接命令編譯它 root localhost 0430 gcc d kernel dmodule wall ...