a5d2 mac 驱动分析
2.6內(nèi)核以后的多數(shù)驅(qū)動都是基于平臺總線驅(qū)動模型(platform),對于平臺總線來說,無非是兩塊組成
platform_driver和platform_device,在a5d2的bsp中,因為引入了device tree,因此,代碼里已經(jīng)看不到
platform_device了,下面以mac驅(qū)動為實例來分析device tree
1. 下面兩段代碼實現(xiàn)了macb平臺驅(qū)動的注冊
driver/net/ethernet/cadence/macb.c
include/linux.h
2. macb平臺設(shè)備的創(chuàng)建是由設(shè)備樹實現(xiàn)
3. 當(dāng)注冊驅(qū)動的時候,回調(diào)用platform_match這個函數(shù)進行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)
? ? ?通過上面的調(diào)用流程,最終會匹配設(shè)備樹的compatible與platform_driver的of_match_table(下圖)
? ??
從上圖可以看到,最終回匹配到sama5d2-gen,匹配成功后,便會調(diào)用macb_probe函數(shù)
在macb_probe函數(shù)中進行mdiobus的注冊,mdiobus的實現(xiàn)在mdio_bus.c
接下來就是從設(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)
最終在這個函數(shù)的for循環(huán)里,可以打印出解析好的管腳配置
map[i].data.mux.group ? 為管腳的名字,如PB14
map[i].data.mux.function 為管腳的功能,為GPIO,A,B,C,D,E,F對應(yīng)sama5d2-pinfunc.h中0,1,2,3,4,5,6
map[i].dev_name 為設(shè)備節(jié)點名稱,如?f8008000.ethernet
map[i].name 為?pinctrl-names 的值
map[i].ctrl_dev_name 管腳復(fù)用節(jié)點父節(jié)點的名稱,如fc038000.pinctrl
上面的函數(shù)調(diào)用完成了設(shè)備樹管腳配置的解析,解析完成后,調(diào)用
static int atmel_pmx_set_mux(struct pinctrl_dev *pctldev,?unsigned function,?unsigned group)
來實現(xiàn)真正的管腳配置寄存器的寫入
總結(jié)
以上是生活随笔為你收集整理的a5d2 mac 驱动分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 银行大额存单怎么买?每天都可以买吗
- 下一篇: 广发diy信用卡免息期有多长