在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

迅為RK3568開發板驅動指南GPIO子系統GPIO子系統API函數的引入

北京迅為電子 ? 2025-05-29 14:05 ? 次閱讀

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工藝,搭載一顆四核Cortex-A55處理器和Mali G52 2EE圖形處理器。RK3568支持4K解碼和1080P編碼,支持SATA/PCIE/USB3.0外圍接口。RK3568內置獨立NPU,可用于輕量級人工智能應用。RK3568支持安卓11和linux系統,主要面向物聯網網關、NVR存儲、工控平板、工業檢測、工控盒、卡拉OK、云終端、車載中控等行業。

?

迅為RK3568開發板瑞芯微Linux安卓鴻蒙ARM核心板人工智能AI主板

wKgZO2gwC5aAKVRCAAHgt_IIj5U256.png

第131章GPIO子系統API函數的引入

事實上,在前面中斷課程中,已經簡單接觸到了GPIO子系統中的API函數,其中用來獲取gpio中斷編號的gpio_to_irq函數就屬于GPIO子系統中的API函數,在本章節中將對GPIO子系統進行簡單的介紹。

在目前的Linux內核主線中,GPIO(通用輸入/輸出)子系統存在兩個版本,這里將兩個版本區分為新版本和舊版本。新版本GPIO子系統接口是基于描述符(descriptor-based)來實現的,而舊版本的GPIO子系統接口是基于整數(integer-based)來實現的,在Linux內核中為了保持向下的兼容性,舊版本的接口在最新的內核版本中仍然得到支持,而隨著時間的推移,新版本的GPIO子系統接口會越來越完善,最終完全取代舊版本,所以在本課程中主要講解新版本的GPIO子系統接口。

新的GPIO子系統接口需要與與設備樹(Device Tree)結合使用。使用設備樹和新的GPIO接口可以更加靈活地配置和管理系統中的GPIO資源,提供了更好的可擴展性和可移植性。所以如果沒有設備樹,就無法使用新的GPIO接口。

那要如何對新舊GPIO子系統接口進行區分呢,一個明顯的區別是新的GPIO子系統接口使用了以"gpiod_"作為前綴的函數命名約定,而舊的GPIO子系統接口使用了以"gpio_"作為前綴的函數命名約定。

一些區分新舊 GPIO子系統接口的示例如下所示:

新的 GPIO子系統接口示例如下所示:

gpiod_set_value()

gpiod_direction_input()

gpiod_direction_output()

gpiod_get_value()

gpiod_request()

AI寫代碼

cpp

舊的 GPIO子系統接口示例:

gpio_set_value()

gpio_direction_input()

gpio_direction_output()

gpio_get_value()

gpio_request()

AI寫代碼

cpp

上面也提到了新的 GPIO子系統接口是基于描述符(descriptor-based)來實現的,由struct gpio_desc結構體來表示,該結構體定義在內核源碼的“drivers/gpio/gpiolib.h”目錄下。具體內容如下所示:

struct gpio_desc {

struct gpio_device gdev; // GPIO設備結構體

unsigned long flags; //標志位,用于表示不同的屬性

/*標志位符號對應的位號*/

#define FLAG_REQUESTED 0 // GPIO已請求

#define FLAG_IS_OUT 1 // GPIO用作輸出

#define FLAG_EXPORT 2 //受sysfs_lock保護的導出標志

#define FLAG_SYSFS 3 //通過/sys/class/gpio/control導出的標志

#define FLAG_ACTIVE_LOW 6 // GPIO值為低電平時激活

#define FLAG_OPEN_DRAIN 7 // GPIO為開漏類型

#define FLAG_OPEN_SOURCE 8 // GPIO為開源類型

#define FLAG_USED_AS_IRQ 9 // GPIO連接到中斷請求(IRQ)

#define FLAG_IS_HOGGED 11 // GPIO被獨占占用

#define FLAG_TRANSITORY 12 // GPIO在休眠或復位時可能失去值

/*連接標簽*/

const char *label; // GPIO的名稱

const char *name; // GPIO的名稱

};

AI寫代碼

cpp

(1)struct gpio_device gdev是一個struct gpio_device類型的字段,用于表示GPIO設備的相關信息。struct gpio_device結構體通常包含設備的底層硬件控制器等信息。

(2)unsigned long flags:用于表示GPIO的標志位,以表示不同的屬性。通過使用位操作,每個標志位可以單獨設置或清除。

(3)第5-14行用于表示不同標志位的符號常量,與flags字段中的位號相對應。例如,在flags字段中的第0位表示FLAG_REQUESTED,第1位表示FLAG_IS_OUT,以此類推

(4)const char *label:這是一個指向字符串的指針,表示GPIO的標簽或名稱。

(5)const char *name:這是一個指向字符串的指針,表示GPIO的名稱。

上面需要重點關注的是然后struct gpio_device結構體,該結構體同樣定義在內核源碼的“drivers/gpio/gpiolib.h”目錄下,具體內容如下所示:

struct gpio_device {

int id; // GPIO設備ID

struct device *dev; //對應的設備結構體指針

struct cdev chrdev; //字符設備結構體

struct device *mockdev; //模擬設備結構體指針

struct module *owner; //擁有該GPIO設備的內核模塊指針

struct gpio_chip *chip; //對應的GPIO芯片結構體指針

struct gpio_desc *descs; // GPIO描述符數組指針

int base; // GPIO編號的起始值

u16 ngpio; // GPIO的數量

const char *label; // GPIO設備的標簽

void *data; //與GPIO設備相關的數據指針

struct list_head list; //用于將GPIO設備結構體連接到鏈表中

#ifdef CONFIG_PINCTRL

/*

*如果啟用了CONFIG_PINCTRL選項,GPIO控制器可以選擇描述它們在SoC中服務的實際引腳范圍。

*此信息將由pinctrl子系統用于配置相應的GPIO引腳。

*/

struct list_head pin_ranges; //描述GPIO控制器引腳范圍的鏈表

#endif

};

AI寫代碼

cpp

該結構體是用來描述GPIO設備的數據結構,關于該結構體的參數介紹如下所示:

(1)int id:整型字段,表示GPIO設備的ID。每個GPIO設備可以有一個唯一的ID。

(2)struct device *dev:指向struct device的指針,表示與GPIO設備相關聯的設備結構體。

(3)struct cdev chrdev:字符設備結構體,用于實現GPIO設備的字符設備接口。

(4)struct device *mockdev:指向struct device的指針,用于表示GPIO設備的模擬設備結構體。

(5)struct module *owner:指向擁有該GPIO設備的內核模塊的指針。

(6)struct gpio_chip *chip:指向struct gpio_chip的指針,表示與GPIO設備關聯的GPIO芯片(GPIO控制器)結構體。

(7)struct gpio_desc *descs:指向struct gpio_desc數組的指針,表示與GPIO設備關聯的GPIO描述符。每個GPIO描述符用于描述GPIO的屬性和狀態。

(8)int base:表示GPIO編號的起始值。

(9)u16 ngpio: 16位無符號整型字段,表示GPIO的數量。

(10)const char *label:指向字符串的指針,表示GPIO設備的標簽或名稱。

(11)void *data:指向與GPIO設備相關的數據的指針,用于存儲和訪問與GPIO設備相關的自定義數據。

(12)struct list_head list:將GPIO設備結構體連接到鏈表中的字段,用于管理多個GPIO設備的列表。

(13)struct list_head pin_ranges (僅在啟用CONFIG_PINCTRL選項時存在):用于描述GPIO控制器引腳范圍的鏈表。如果配置了GPIO控制器的引腳范圍,該鏈表將包含描述每個范圍的元素。

在上面一系列的參數中,要重點關注的是struct gpio_chip *chip這一結構體,表示與GPIO設備關聯的GPIO芯片(GPIO控制器)結構體,該結構體定義在內核源碼目錄下的“include/linux/gpio/driver.h”文件中,具體內容如下所示

struct gpio_chip {

const char *label; // GPIO芯片標簽

struct gpio_device gpiodev; // GPIO設備

struct device *parent; //父設備指針

struct module *owner; //擁有者模塊指針

int (*request)(struct gpio_chip *chip, unsigned offset);//請求GPIO

void (*free)(struct gpio_chip *chip, unsigned offset); //釋放GPIO

int (*get_direction)(struct gpio_chip *chip, unsigned offset); //獲取GPIO方向

int (*direction_input)(struct gpio_chip *chip, unsigned offset); //設置GPIO為輸入

int (*direction_output)(struct gpio_chip *chip, unsigned offset, int value); //設置GPIO為輸出

int (*get)(struct gpio_chip chip, unsigned offset); //獲取GPIO值

int (*get_multiple)(struct gpio_chip chip, unsigned long *mask, unsigned long *bits); //獲取多個GPIO的值

void (*set)(struct gpio_chip chip, unsigned offset, int value); //設置GPIO值

void (*set_multiple)(struct gpio_chip chip, unsigned long mask, unsigned long *bits); //設置多個GPIO的值

int (*set_config)(struct gpio_chip *chip, unsigned offset, unsigned long config); //設置GPIO配置

int (*to_irq)(struct gpio_chip chip, unsigned offset); //將GPIO轉換為中斷

void (*dbg_show)(struct seq_file *s, struct gpio_chip chip); //在調試信息中顯示GPIO

int base; // GPIO編號的基準值

u16 ngpio; // GPIO的數量

const char *const *names; // GPIO的名稱數組

..........

};

AI寫代碼

cpp

struct gpio_chip *chip這一結構體用于描述GPIO芯片的屬性和操作函數,可以通過函數指針調用相應的函數來請求、釋放、設置、獲取GPIO的狀態和數值等操作,從而實現對GPIO的控制和管理,需要注意的是這個結構體中的一系列函數都不需要我們來填充,這些工作都是由芯片原廠工程師來完成的,我們只需要學會新gpio子系統相應API函數的使用即可。

在接下來的章節中將對常用的新gpio子系統API函數進行講解。

————————————————

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接和本聲明。

原文鏈接:https://blog.csdn.net/BeiJingXunWei/article/details/135569658

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 開發板
    +關注

    關注

    25

    文章

    5499

    瀏覽量

    102081
  • GPIO
    +關注

    關注

    16

    文章

    1270

    瀏覽量

    53538
  • RK3568
    +關注

    關注

    5

    文章

    575

    瀏覽量

    6052
  • 迅為電子
    +關注

    關注

    0

    文章

    55

    瀏覽量

    140
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    RK3568開發板驅動指南Linux中通用SPI設備驅動

    RK3568開發板驅動指南Linux中通用SPI設備驅動
    的頭像 發表于 01-23 11:02 ?2481次閱讀
    <b class='flag-5'>迅</b><b class='flag-5'>為</b><b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b><b class='flag-5'>驅動</b><b class='flag-5'>指南</b>Linux中通用SPI設備<b class='flag-5'>驅動</b>

    北京RK3568開發板OpenHarmony系統南向驅動開發內核HDF驅動框架架構

    北京RK3568開發板OpenHarmony系統南向驅動
    的頭像 發表于 03-11 14:13 ?976次閱讀
    北京<b class='flag-5'>迅</b><b class='flag-5'>為</b><b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>OpenHarmony<b class='flag-5'>系統</b>南向<b class='flag-5'>驅動</b><b class='flag-5'>開發</b>內核HDF<b class='flag-5'>驅動</b>框架架構

    RK3568驅動指南GPIO子系統實戰:實現動態切換引腳復用功能

    RK3568驅動指南GPIO子系統實戰:實現動態
    的頭像 發表于 05-22 14:27 ?465次閱讀
    <b class='flag-5'>迅</b><b class='flag-5'>為</b><b class='flag-5'>RK3568</b><b class='flag-5'>驅動</b><b class='flag-5'>指南</b><b class='flag-5'>GPIO</b><b class='flag-5'>子系統</b>實戰:實現動態切換引腳復用功能

    RK3568開發板驅動指南GPIO子系統三級節點操作函數實驗

    RK3568開發板驅動指南GPIO
    的頭像 發表于 05-26 15:39 ?438次閱讀
    <b class='flag-5'>迅</b><b class='flag-5'>為</b><b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b><b class='flag-5'>驅動</b><b class='flag-5'>指南</b><b class='flag-5'>GPIO</b><b class='flag-5'>子系統</b>三級節點操作<b class='flag-5'>函數</b>實驗

    更新 | 持續開源 RK3568驅動指南第十一篇-pinctrl子系統

    《iTOP-RK3568開發板驅動開發指南》更新,本次更新內容對應的是驅動(第十一期_pinctrl子系
    發表于 10-18 11:12

    RK3568pinctrl 和 gpio 子系統詳解

    如果 pinctrl 子系統將 PIN 復用為 GPIO,那么接下來就要配置 gpio 子系統,且 gpio
    的頭像 發表于 12-20 10:22 ?3113次閱讀
    <b class='flag-5'>RK3568</b>pinctrl 和 <b class='flag-5'>gpio</b> <b class='flag-5'>子系統</b>詳解

    基于RK3568開發板的嵌入式學習之Linux驅動視頻

    基于RK3568開發板的嵌入式學習之Linux驅動視頻
    的頭像 發表于 05-19 16:30 ?1254次閱讀
    <b class='flag-5'>迅</b><b class='flag-5'>為</b>基于<b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>的嵌入式學習之Linux<b class='flag-5'>驅動</b>視頻

    RK3568開發板系統編程手冊全新升級

    RK3568開發板系統編程手冊全新升級
    的頭像 發表于 06-25 15:50 ?1446次閱讀
    <b class='flag-5'>迅</b><b class='flag-5'>為</b><b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b><b class='flag-5'>系統</b>編程手冊全新升級

    RK3568開發板GPIO之外接模塊

    RK3568開發板GPIO之外接模塊
    的頭像 發表于 08-24 17:41 ?1724次閱讀
    <b class='flag-5'>迅</b><b class='flag-5'>為</b><b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b><b class='flag-5'>GPIO</b>之外接模塊

    RK3568開發板Debian系統使用python 進行攝像頭開發

    RK3568開發板Debian系統使用python 進行攝像頭開發
    的頭像 發表于 09-14 16:58 ?2056次閱讀
    <b class='flag-5'>迅</b><b class='flag-5'>為</b><b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>Debian<b class='flag-5'>系統</b>使用python 進行攝像頭<b class='flag-5'>開發</b>

    RK3568開發板驅動開發指南-輸入子系統

    RK3568開發板驅動開發指南-輸入子系統
    的頭像 發表于 02-23 15:11 ?1465次閱讀
    <b class='flag-5'>迅</b><b class='flag-5'>為</b><b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b><b class='flag-5'>驅動</b><b class='flag-5'>開發指南</b>-輸入<b class='flag-5'>子系統</b>

    RK3568開發板SPI驅動指南-mcp2515驅動編寫:讀寄存器函數

    RK3568開發板SPI驅動指南-mcp2515驅動
    的頭像 發表于 01-20 14:43 ?899次閱讀
    <b class='flag-5'>迅</b><b class='flag-5'>為</b><b class='flag-5'>RK3568</b><b class='flag-5'>開發板</b>SPI<b class='flag-5'>驅動</b><b class='flag-5'>指南</b>-mcp2515<b class='flag-5'>驅動</b>編寫:讀寄存器<b class='flag-5'>函數</b>

    【北京】iTOP-RK3568OpenHarmony系統南向驅動開發GPIO基礎知識

    【北京】iTOP-RK3568OpenHarmony系統南向驅動開發
    的頭像 發表于 03-06 11:23 ?506次閱讀
    【北京<b class='flag-5'>迅</b><b class='flag-5'>為</b>】iTOP-<b class='flag-5'>RK3568</b>OpenHarmony<b class='flag-5'>系統</b>南向<b class='flag-5'>驅動</b><b class='flag-5'>開發</b><b class='flag-5'>GPIO</b>基礎知識

    RK3568驅動指南|第十二篇 GPIO子系統-第135章 GPIO子系統與pinctrl子系統相結合實驗

    RK3568驅動指南|第十二篇 GPIO子系統-第135章 GPIO
    的頭像 發表于 05-23 13:47 ?196次閱讀
    <b class='flag-5'>RK3568</b><b class='flag-5'>驅動</b><b class='flag-5'>指南</b>|第十二篇 <b class='flag-5'>GPIO</b><b class='flag-5'>子系統</b>-第135章 <b class='flag-5'>GPIO</b><b class='flag-5'>子系統</b>與pinctrl<b class='flag-5'>子系統</b>相結合實驗

    RK3568驅動指南GPIO子系統 GPIO操作函數實驗

    電子RK3568開發板驅動指南GPIO
    的頭像 發表于 05-28 15:24 ?168次閱讀
    <b class='flag-5'>迅</b><b class='flag-5'>為</b><b class='flag-5'>RK3568</b><b class='flag-5'>驅動</b><b class='flag-5'>指南</b><b class='flag-5'>GPIO</b><b class='flag-5'>子系統</b> <b class='flag-5'>GPIO</b>操作<b class='flag-5'>函數</b>實驗
    主站蜘蛛池模板: 色多多视频在线观看免费大全 | 久久国产免费观看精品 | 天天干夜夜爱 | 国产免费爽爽视频免费可以看 | 国产中出视频 | 怡红院网址 | 欧美精品1| 亚洲国产影视 | bt天堂网www连接 | 天天爽天天爽 | 老色批在线播放视频网站免费 | 久久精品人人爽人人爽 | 午夜观看 | 老司机亚洲精品影院在线观看 | 天堂资源在线播放 | 热久久最新地址 | 成人午夜免费视频毛片 | 老师下面好紧 | 国产精品久久久亚洲456 | 天天射天天草 | 在线观看免费av网站 | 78m-78模成视频在线 | 深夜动态福利gif动态进 | 99精品国产高清自在线看超 | 五月四房婷婷 | 美女一级牲交毛片视频 | 亚洲xx网站 | 欧美精品综合一区二区三区 | 国产精品嫩草影院一二三区 | 伊人成年综合网 | 天堂bt在线种子网 | 91精品国产91久久久久青草 | 中文字幕精品一区二区2021年 | 亚洲2020天天堂在线观看 | 国产成人精品午夜二三区 | 人人干在线 | 久久精品综合 | 搡女人视频免费 | 五月天婷婷丁香中文在线观看 | 色播丁香| 天天摸天天躁天天添天天爽 |