Linux驅動程式設計 基於I2C子系統的I2C驅動

2022-03-17 09:50:18 字數 3338 閱讀 3802

**中,我新增了很多注釋,應該不難理解,有錯誤大家可以指出來,我再改正

#include #include 

#include

#include

#include

#include

#include

#define i2c_major 365 //

主裝置號

#define i2c_minor 0 //

從裝置號

#define i2c_count 1 //

裝置數量

module_license(

"dual bsd/gpl");

/*函式宣告

*/int s5pc100_i2c_probe(struct i2c_client *, const

struct i2c_device_id *);

int s5pc100_i2c_remove(struct i2c_client *);

int s5pc100_i2c_open(struct inode *, struct file *);

int s5pc100_i2c_release(struct inode *, struct file *);

ssize_t s5pc100_i2c_read(

struct file *, char __user *, size_t, loff_t *);

/*定義裝置結構體

*/typedef

struct

s5pc100_i2c s5pc100_i2c;

/*使用裝置結構體

*/s5pc100_i2c *i2c;

/*裝置資訊struct i2c_device_id結構體,儲存i2c裝置的裝置資訊,由於可能

* 存在多個i2c裝置所以將它定義為乙個結構體陣列,方便新增新增裝置

struct i2c_device_id */

struct i2c_device_id i2c_id =,

};/*

構建i2c子系統的裝置驅動結構體i2c_driver

* .driver.name 表示驅動程式的名字,這個名字可以由自己任意取

* .id_table 是乙個struct i2c_device_id的結構體,儲存著i2c的裝置資訊

struct i2c_device_id

* .probe 表示匹配成功後要執行的函式

* .remove 表示移除裝置的時候要執行的函式

*/struct i2c_driver i2c_driver =;

/*方法繫結結構體

*/struct file_operations i2c_fops =;

int s5pc100_i2c_open(struct inode * inode, struct file *filp)

int s5pc100_i2c_release(struct inode * inode, struct file *filp)

/*讀取裝置資料,涉及到struct i2c_msg訊息結構體的實現和使用

*/ssize_t s5pc100_i2c_read(

struct file *filp, char __user *buf, size_t count, loff_t *loff)

;

char rxbuf[2] = ;

/*i2c裝置通訊是通過系統定義的訊息結構體實現的,這樣可以簡化驅動人員的工作,實現驅動的良好移植性.

struct i2c_msg ;

*/struct i2c_msg msg[2] =,,};

if (sizeof(rxbuf) !=count)

count = sizeof

(rxbuf);

ret = i2c_transfer(i2c->client.adapter, msg, array_size(msg));

if (ret < 0

)

if(copy_to_user(buf, rxbuf, count))

return -efault;

return

count;}/*

匹配函式,裝置成功配對並取得裝置資訊struct i2c_client結構體後執行的函式

*/int s5pc100_i2c_probe(struct i2c_client *client, const

struct i2c_device_id *i2c_id)

/*申請空間

* 使用函式void *kmalloc(size_t size, gfp_t flags)

size 代表申請的記憶體大小

flags 表示該函式的操作型別,使用系統提供的巨集實現,用到的主要有下面這些:

gfp_atomic 能申請到記憶體則申請,不能申請到記憶體則立即返回錯誤碼

gfp_kernel 能申請則申請,不能申請則睡眠,直到申請到為止

*/i2c = (s5pc100_i2c *)kmalloc(sizeof(*i2c), gfp_kernel);

if (null ==i2c)

/*裝置初始化,將cdev和file_operations繫結,將裝置資訊和實現方法進行繫結

*/cdev_init(&i2c->cdev, &i2c_fops);

i2c->cdev.owner =this_module;

/*新增裝置

*/ret = cdev_add(&i2c->cdev, devno, i2c_count);

if (ret < 0

)

/*匯出client,獲取系統提供的具體的i2c的裝置資訊,這樣就實現了裝置和驅動的關聯

*/i2c->client = *client;

return0;

err1:

kfree(i2c);

unregister_chrdev_region(devno, i2c_count);

return

ret;}/*

remove處理函式

*/int s5pc100_i2c_remove(struct i2c_client *client)

/*載入函式

*/static

int __init s5pc100_i2c_init(void)/*

解除安裝函式

*/static

void __exit s5pc100_i2c_cleanup(void

)module_init(s5pc100_i2c_init);

module_exit(s5pc100_i2c_cleanup);

Linux驅動 I2C匯流排

這裡以rk3288為例子,使用的是linux4.14,根據裝置樹節點i2c 與rk3x i2c driver,match之後,就會呼叫對應的probe rk3x i2c probe 這裡主要就是註冊乙個adapt i2c add adapter 也就是i2c控制器,或者說是i2c主裝置,既然是主裝置...

Linux驅動之I2C裝置驅動

核心 4.20 晶元 hym8563 rtc 下面的 分析主要都在注釋中,會按照驅動中函式的執行順序分析。static const struct i2c device id hym8563 id module device table i2c,hym8563 id static const stru...

i2c裝置驅動

1,i2c 裝置註冊 static struct i2c board info i2c2 devices i2c裝置一般在板級 中註冊 static void msm8916 add i2c deivces void 2,i2c驅動註冊 include static const struct i2c...