核心: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...