pinctrl子系統分析(三)

2021-10-21 19:20:21 字數 3573 閱讀 1352

pinctrl子系統分析(一)

pinctrl子系統分析(二)

pinctrl子系統分析(三)

這章講解配置節點的解析以及pinctrl_state的pinctrl_setting增添,先來個圖:

create_pinctrl:

static

struct pinctrl *

create_pinctrl

(struct device *dev)

mutex_unlock

(&pinctrl_maps_mutex);.

....

.return p;

}

重點pinctrl_dt_to_map函式:

int

pinctrl_dt_to_map

(struct pinctrl *p)

; */

//裝置可能有多種狀態如default、idle,所以來個for迴圈

for(state =0;

; state++).

....

.}return0;

......}

解析單個配置節點dt_to_map_one_config:

static

intdt_to_map_one_config

(struct pinctrl *p,

const

char

*statename,

struct device_node *np_config)

; pincontroller ;

//配置節點

state_1_node_a ;

//配置節點

state_1_node_b ;

}; */

np_pctldev =

of_node_get

(np_config)

;//通過配置節點找到pin控制器的device_node,這正是配置節點要位於pin控制器節點之下的原因

for(;;

)of_node_put

(np_pctldev)

; ops = pctldev->desc->pctlops;..

....

/* 呼叫pinctrl_dev->pinctrl_desc->pinctrl_ops裡的dt_node_to_map函式解析配置節點

解析得到得配置資訊儲存在pinctrl_map,乙個配置節點的資訊,對應乙個或多個pinctrl_map

*/ret = ops->

dt_node_to_map

(pctldev, np_config,

&map,

&num_maps);.

....

./* 這些pinctrl_map在增添pinctrl_setting的時候會用到,所以把這些pinctrl_map註冊進核心

以鍊錶的形式,插入到全域性鍊錶pinctrl_maps

*/return

dt_remember_or_free_map

(p, statename, pctldev, map, num_maps)

;}

來看看資料結構pinctrl_map:

enum pinctrl_map_type 

;struct pinctrl_map data;};

struct pinctrl_map_mux

;struct pinctrl_map_configs

;

註冊pinctrl_map:

static

intdt_remember_or_free_map

(struct pinctrl *p,

const

char

*statename,

struct pinctrl_dev *pctldev,

struct pinctrl_map *map,

unsigned num_maps)

/* 分配乙個pinctrl_dt_map,用於儲存多個pinctrl_map */

dt_map =

kzalloc

(sizeof

(*dt_map)

, gfp_kernel);.

....

.//初始化pinctrl_dt_map

dt_map->pctldev = pctldev;

dt_map->map = map;

dt_map->num_maps = num_maps;

//將pinctrl_dt_map插入到pinctrl的dt_maps鍊錶

list_add_tail

(&dt_map->node,

&p->dt_maps)

;//註冊pinctrl_map

return

pinctrl_register_map

(map, num_maps, false);}

intpinctrl_register_map

(struct pinctrl_map const

*maps,

unsigned num_maps,

bool dup)

}else

mutex_lock

(&pinctrl_maps_mutex)

;list_add_tail

(&maps_node->node,

&pinctrl_maps)

;//插入到pinctrl_maps鍊錶

mutex_unlock

(&pinctrl_maps_mutex)

;return0;

}

來個整體的流程圖:

回到create_pinctrl函式:

static

struct pinctrl *

create_pinctrl

(struct device *dev)

mutex_unlock

(&pinctrl_maps_mutex);.

....

.return p;

}

add_setting:

static

intadd_setting

(struct pinctrl *p,

struct pinctrl_map const

*map)..

....

//把pinctrl_setting插入到pinctrl_state的settings鍊錶

list_add_tail

(&setting->node,

&state->settings)

;return0;

}

pinctrl子系統分析(一)

pinctrl子系統分析 一 pinctrl子系統分析 二 pinctrl子系統分析 三 許多soc的內部都包含了pin控制器,通過pin控制器,我們可以匹配引腳的狀態和功能特性。在了解pinctrl子系統之前,我們先來了解一些基本的概念。soc的很多引腳都可以配置成不同的功能,如a1和a2兩個引腳...

pinctrl子系統分析(二)

pinctrl子系統分析 一 pinctrl子系統分析 二 pinctrl子系統分析 三 pin控制器驅動的主要工作是,列舉pin控制器的資訊,如控制器有多少個引腳,支援多少個function,每個function對應幾個group,支援多少個group等,建立table儲存這些資訊,最後呼叫pin...

framebuffer 子系統分析

fb info screen base dma alloc writecombine fbi dev,map size,map dma,gfp kernel fb info screen base 是framebuffer起始虛擬位址,也就是mmap後程式寫入fb的位址,該位址會直接寫入到fb in...