日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

a5d2 mac 驱动分析

發(fā)布時(shí)間:2023/12/10 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 a5d2 mac 驱动分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。