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