Linux驅動之IIC實驗 基於裝置樹程式設計

2021-09-29 18:44:57 字數 3589 閱讀 7937

(一)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 *);

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

iic驅動框架 示例**如下:

/*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 ...