Linux reset子系統(tǒng)
reset子系統(tǒng)非常簡單,與clock子系統(tǒng)非常類似,但在驅(qū)動實現(xiàn)上,reset驅(qū)動更簡單。
因為clock驅(qū)動主要是時鐘的實現(xiàn),涉及到固定時鐘、分頻、門控等一些時鐘的分級關(guān)系,需要弄清楚時鐘樹里每個時鐘的關(guān)系。
而reset驅(qū)動有點相當(dāng)于clock驅(qū)動的門控,它只有復(fù)位和解復(fù)位兩個功能。
類似于clock子系統(tǒng),reset子系統(tǒng)也分為了consumer
和provider
,結(jié)構(gòu)體關(guān)系如下:
consumer :
reset API接口的使用者,內(nèi)核提供了統(tǒng)一的reset接口:
devm_reset_control_get(struct device *dev, const char *id)//獲取reset句柄
reset_control_deassert(struct reset_control *rstc)//解復(fù)位
reset_control_assert(struct reset_control *rstc)//復(fù)位
reset_control_reset(struct reset_control *rstc)//先復(fù)位,延遲一會,然后解復(fù)位
struct reset_control結(jié)構(gòu)體表示一個reset句柄,驅(qū)動中使用reset API,需要先獲取reset句柄
provider :
reset提供者,即reset驅(qū)動。struct reset_controller_dev
結(jié)構(gòu)體代表一個reset
控制器,內(nèi)部包含了reset操作函數(shù)集合struct reset_control_ops
,注冊reset驅(qū)動時,需要分配一個struct reset_controller_dev結(jié)構(gòu)體,然后填充成員,最后將該結(jié)構(gòu)體注冊。
struct reset_controller_dev{
const struct reset_control_ops *ops;//復(fù)位控制操作函數(shù)
struct list_head list;//全局鏈表,復(fù)位控制器注冊后掛載到全局鏈表
struct list_head reset_control_head;//各個模塊復(fù)位的鏈表頭
struct device *dev;
int of_reset_n_cells;//dts中引用時,需要幾個參數(shù)
//通過dts引用的參數(shù),解析復(fù)位控制器中相應(yīng)的參數(shù)
int (*of_xlate)(struct reset_controller_dev *rcdev, const struct of_phandle_args *reset_spec);
unsigned int nr_resets;//復(fù)位設(shè)備個數(shù)
}
struct reset_control_ops{
int (*reset)(struct reset_controller_dev *rcdev, unsigned long id);//復(fù)位+解復(fù)位
int (*assert)(struct reset_controller_dev *rcdev, unsigned long id);//復(fù)位
int (*deassert)(struct reset_controller_dev *rcdev, unsigned long id);//解復(fù)位
int (*status)(struct reset_controller_dev *rcdev, unsigned long id);//復(fù)位狀態(tài)查詢
}
-
驅(qū)動
+關(guān)注
關(guān)注
12文章
1838瀏覽量
85262 -
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209323 -
子系統(tǒng)
+關(guān)注
關(guān)注
0文章
109瀏覽量
12392
發(fā)布評論請先 登錄
相關(guān)推薦
評論