a5d2 mac 驱动分析
2.6內(nèi)核以后的多數(shù)驅(qū)動(dòng)都是基于平臺(tái)總線驅(qū)動(dòng)模型(platform),對(duì)于平臺(tái)總線來(lái)說(shuō),無(wú)非是兩塊組成
platform_driver和platform_device,在a5d2的bsp中,因?yàn)橐肓薲evice tree,因此,代碼里已經(jīng)看不到
platform_device了,下面以mac驅(qū)動(dòng)為實(shí)例來(lái)分析device tree
1. 下面兩段代碼實(shí)現(xiàn)了macb平臺(tái)驅(qū)動(dòng)的注冊(cè)
driver/net/ethernet/cadence/macb.c
include/linux.h
2. macb平臺(tái)設(shè)備的創(chuàng)建是由設(shè)備樹(shù)實(shí)現(xiàn)
3. 當(dāng)注冊(cè)驅(qū)動(dòng)的時(shí)候,回調(diào)用platform_match這個(gè)函數(shù)進(jìn)行driver和device的匹配,
? ? ?static int platform_match(struct device *dev, struct device_driver *drv)
? ? ?static inline int of_driver_match_device(struct device *dev,?const struct device_driver *drv)
? ? ?const struct of_device_id *of_match_device(const struct of_device_id *matches,?const struct device *dev)
? ? ?const struct of_device_id *of_match_node(const struct of_device_id *matches,?const struct device_node *node)
? ? ?static?const struct of_device_id *__of_match_node(const struct of_device_id *matches,?const struct device_node *node)
? ? ?static int __of_device_is_compatible(const struct device_node *device,const char *compat, const char *type, const char *name)
? ? ?通過(guò)上面的調(diào)用流程,最終會(huì)匹配設(shè)備樹(shù)的compatible與platform_driver的of_match_table(下圖)
? ??
從上圖可以看到,最終回匹配到sama5d2-gen,匹配成功后,便會(huì)調(diào)用macb_probe函數(shù)
在macb_probe函數(shù)中進(jìn)行mdiobus的注冊(cè),mdiobus的實(shí)現(xiàn)在mdio_bus.c
接下來(lái)就是從設(shè)備樹(shù)中讀取管腳配置,并配置管腳復(fù)用
int pinctrl_bind_pins(struct device *dev)
struct pinctrl *devm_pinctrl_get(struct device *dev)
struct pinctrl *pinctrl_get(struct device *dev)
static struct pinctrl *create_pinctrl(struct device *dev)
int pinctrl_dt_to_map(struct pinctrl *p)
static int dt_to_map_one_config(struct pinctrl *p, const char *statename,?struct device_node *np_config)
static int dt_remember_or_free_map(struct pinctrl *p, const char *statename,?struct pinctrl_dev *pctldev,
? ? ? ?struct pinctrl_map *map, unsigned num_maps)
最終在這個(gè)函數(shù)的for循環(huán)里,可以打印出解析好的管腳配置
map[i].data.mux.group ? 為管腳的名字,如PB14
map[i].data.mux.function 為管腳的功能,為GPIO,A,B,C,D,E,F對(duì)應(yīng)sama5d2-pinfunc.h中0,1,2,3,4,5,6
map[i].dev_name 為設(shè)備節(jié)點(diǎn)名稱,如?f8008000.ethernet
map[i].name 為?pinctrl-names 的值
map[i].ctrl_dev_name 管腳復(fù)用節(jié)點(diǎn)父節(jié)點(diǎn)的名稱,如fc038000.pinctrl
上面的函數(shù)調(diào)用完成了設(shè)備樹(shù)管腳配置的解析,解析完成后,調(diào)用
static int atmel_pmx_set_mux(struct pinctrl_dev *pctldev,?unsigned function,?unsigned group)
來(lái)實(shí)現(xiàn)真正的管腳配置寄存器的寫入
總結(jié)
以上是生活随笔為你收集整理的a5d2 mac 驱动分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 银行大额存单怎么买?每天都可以买吗
- 下一篇: 使用Preference保存设置