Linux驅動之I2C裝置驅動

2021-10-05 16:23:51 字數 2956 閱讀 3302

核心:4.20

晶元:hym8563 rtc

下面的**分析主要都在注釋中,會按照驅動中函式的執行順序分析。

static

const

struct i2c_device_id hym8563_id=

,,};

module_device_table

(i2c, hym8563_id)

;static

const

struct of_device_id hym8563_dt_idtable=

,,};

module_device_table

(of, hym8563_dt_idtable)

;static

struct i2c_driver hym8563_driver =

,.probe = hym8563_probe,

.id_table = hym8563_id,

// id表};

// 封住了module_init()和module_exit()

// 裡面會呼叫i2c_register_driver(hym8563_driver)

// 和i2c_del_driver(hym8563_driver)

module_i2c_driver

(hym8563_driver)

;

static

inthym8563_probe

(struct i2c_client *client,

const

struct i2c_device_id *id)

//檢查一下模組是否正常執行

ret =

i2c_smbus_read_byte_data

(client, hym8563_sec);if

(ret <0)

return ret;

//vl位用來標識模組是否正常工作

hym8563->valid =

!(ret & hym8563_sec_vl)

;dev_dbg

(&client->dev,

"rtc information is %s\n"

, hym8563->valid ?

"valid"

:"invalid");

//註冊rtc裝置

hym8563->rtc =

devm_rtc_device_register

(&client->dev, client->name,

&hym8563_rtc_ops, this_module)

;/* the hym8563 alarm only supports a minute accuracy */

hym8563->rtc->uie_unsupported =1;

#ifdef config_common_clk

//hym8563可以作為時鐘源

hym8563_clkout_register_clk

(hym8563)

;#endif

return0;

}

上面刪掉了一些判斷和log資訊。

//檢視datasheet對8563進行初始化,對暫存器進行設定

static

inthym8563_init_device

(struct i2c_client *client)

static

inthym8563_rtc_read_time

(struct device *dev,

struct rtc_time *tm)

//讀取暫存器值, 連續讀取7個暫存器

ret =

i2c_smbus_read_i2c_block_data

(client, hym8563_sec,

7, buf)

;//bcd數轉成2進製

tm->tm_sec =

bcd2bin

(buf[0]

& hym8563_sec_mask)

; tm->tm_min =

bcd2bin

(buf[1]

& hym8563_min_mask)

; tm->tm_hour =

bcd2bin

(buf[2]

& hym8563_hour_mask)

; tm->tm_mday =

bcd2bin

(buf[3]

& hym8563_day_mask)

; tm->tm_wday =

bcd2bin

(buf[4]

& hym8563_weekday_mask)

;/* 0 = sun */

tm->tm_mon =

bcd2bin

(buf[5]

& hym8563_month_mask)-1

;/* 0 = jan */

tm->tm_year =

bcd2bin

(buf[6]

)+100;

return0;

}static

const

struct rtc_class_ops hym8563_rtc_ops =

;

其他的讀寫函式都是去通過i2c去讀取暫存器的值。

上面的呼叫關係圖顯示了裝置與控制器之間的關係。

linux驅動之i2c控制器驅動

linux驅動之i2c驅動架構

linux裝置驅動之I2C

裝置結構體i2c client中addr的低8位表示裝置位址。裝置位址由讀寫位 器件型別和自定義位址組成,第7位是r w位,0表示寫,1表示讀,所以i2c裝置通常有兩個位址,即讀位址和寫位址型別器件由中間4位組成,這是由半導體公司生產的時候就已經固化了。自定義型別由低3位組成。由使用者自己設定,通常...

linux裝置驅動之I2C

裝置結構體i2c client中addr的低8位表示裝置位址。裝置位址由讀寫位 器件型別和自定義位址組成,第7位是r w位,0表示寫,1表示讀,所以i2c裝置通常有兩個位址,即讀位址和寫位址型別器件由中間4位組成,這是由半導體公司生產的時候就已經固化了。自定義型別由低3位組成。由使用者自己設定,通常...

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