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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

pinctrl虚拟spi的linux驱动,linux内核pinctrl驱动的理解和总结

發布時間:2024/9/19 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pinctrl虚拟spi的linux驱动,linux内核pinctrl驱动的理解和总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 前言

本站之前的三篇文章[1][2][3]介紹了pin controller(對應的pin controller

subsystem)、gpio controller(對應的GPIO subsystem)有關的基本概念,包括pin

multiplexing、pin configuration等等。本文將基于這些文章,單純地從pin controller

driver的角度(屏蔽掉pinctrl core的實現細節),理解pinctrl

subsystem的設計思想,并掌握pinctrl驅動的移植和實現方法。

2. pin controller的概念和軟件抽象

相信每一個嵌入式從業人員,都知道“pin(管腳)”是什么東西(就不贅述了)。由于SoC系統越來越復雜、集成度越來越高,SoC中pin的數量也越來越多、功能也越來越復雜,這就對如何管理、使用這些pins提出了挑戰。因此,用于管理這些pins的硬件模塊(pin

controller)就出現了。相應地,linux kernel也出現了對應的驅動(pin controller

driver)。

Kernel pinctrl core使用struct pinctrl_desc抽象一個pin

controller,該結構的定義如下(先貼在這里,后面會圍繞這個抽象一步步展開):

struct pinctrl_desc {?const char *name;?const struct pinctrl_pin_desc *pins;?unsigned int npins;?const struct pinctrl_ops *pctlops;?const struct pinmux_ops *pmxops;?const struct pinconf_ops *confops;?struct module *owner;?#ifdef CONFIG_GENERIC_PINCONF?unsigned int num_custom_params;?const struct pinconf_generic_params

*custom_params;?const struct pin_config_item

*custom_conf_items;?#endif?};

注1:本文后續的描述基于本站“X Project”所使用的kernel版本[4]。?注2:本文很多的表述(特別是例子),都是引用kernel的document[5](寫的很好,可以耐心看看)。

2.1 Pin

kernel的pin

controller子系統要想管理好系統的pin資源,第一個要搞明白的問題就是:系統中到底有多少個pin?用軟件語言來表述就是:要把系統中所有的pin描述出來,并建立索引。這由上面struct

pinctrl_desc結構中pins和npins來完成。

對pinctrl

core來說,它只關心系統中有多少個pin,并使用自然數為這些pin編號,后續的操作,都是以這些編號為操作對象。至于編號怎樣和具體的pin對應上,完全是pinctrl

driver自己的事情。

因此,pinctrl driver需要根據實際情況,將系統中所有的pin組織成一個struct

pinctrl_pin_desc類型的數組,該類型的定義為:

struct pinctrl_pin_desc {?unsigned number;?const char *name;?void *drv_data;?};

number和name完全由driver自己決定,不過要遵循有利于代碼編寫、有利于理解等原則。另外,為了便于driver的編寫,可以在drv_data中保存driver的私有數據結構(可以包含相關的寄存器偏移等信息)。

注3:[5]中有個例子,大家可以參考理解。

2.2 Pin groups

在SoC系統中,有時需要將很多pin組合在一起,以實現特定的功能,例如SPI接口、I2C接口等。因此pin

controller需要以group為單位,訪問、控制多個pin,這就是pin groups。相應地,pin controller

subsystem需要提供一些機制,來獲取系統中到底有多少groups、每個groups包含哪些pins、等等。

因此,pinctrl core在struct pinctrl_ops中抽象出三個回調函數,用來獲取pin

groups相關信息,如下:

struct pinctrl_ops {?int (*get_groups_count) (struct pinctrl_dev

*pctldev);?const char *(*get_group_name) (struct pinctrl_dev

*pctldev,?unsigned selector);?int (*get_group_pins) (struct pinctrl_dev

*pctldev,?unsigned selector,?const unsigned **pins,?unsigned *num_pins);?void (*pin_dbg_show) (struct pinctrl_dev *pctldev, struct seq_file

*s,?unsigned offset);?int (*dt_node_to_map) (struct pinctrl_dev

*pctldev,?struct device_node *np_config,

總結

以上是生活随笔為你收集整理的pinctrl虚拟spi的linux驱动,linux内核pinctrl驱动的理解和总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。