娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

gpiolib庫詳解

發布者:Serene123最新更新時間:2025-01-07 來源: cnblogs關鍵字:S5PV210 手機看文章 掃描二維碼
隨時隨地手機看文章

1. gpiolib庫簡介

linux中從2.6.35以后就開始有gpiolib庫了,gpiolib的作用是對所有的gpio實行統一管理,因為驅動在工作的時候,會出現好幾個驅動共同使用同一個gpio的情況;這會造成混亂。所以內核提供了一些方法來管理gpio資源。


2. gpiolib庫的建立

gpiolib庫建立的目標函數:


//所在文件:/kernel/arch/arm/mach-s5pv210/mach-smdkc110.c

static void __init smdkc110_map_io(void)

{

    ......

    s5pv210_gpiolib_init();

    ......

}



//所在文件:/kernel/arch/arm/mach-s5pv210/gpiolib.c

__init int s5pv210_gpiolib_init(void)

{

    struct s3c_gpio_chip *chip = s5pv210_gpio_4bit;

    int nr_chips = ARRAY_SIZE(s5pv210_gpio_4bit);

    int i = 0;

        

    for (i = 0; i < nr_chips; i++, chip++) 

    {

        if (chip->config == NULL)

            chip->config = &gpio_cfg;

        if (chip->base == NULL)

            chip->base = S5PV210_BANK_BASE(i);

    }


    samsung_gpiolib_add_4bit_chips(s5pv210_gpio_4bit, nr_chips);


    return 0;

}


 s5pv210_gpiolib_init()函數分析:


(1)gpiolib庫的初始化實質就是對s3c_gpio_chip結構體數組進行賦值;struct s3c_gpio_chip用以描述一個GPIO端口。


struct s3c_gpio_chip 

{

    struct gpio_chip    chip;  

    struct s3c_gpio_cfg *config;

    struct s3c_gpio_pm  *pm;

    void __iomem        *base;  //存放GPIO的虛擬地址

    int            eint_offset;

    spinlock_t         lock;

#ifdef CONFIG_PM

    u32            pm_save[7];

#endif

};


struct gpio_chip 

{

  ......

  const char  *label; //GPIO端口名稱

  int  base;         //GPIO端口號

  ......

}


(2)內核中建立了static struct s3c_gpio_chip s5pv210_gpio_4bit[] 這個數組,將所有的gpio的.chip結構體中的一些元素初始化,這個數組的所有元素是與數據手冊中的所有gpio是一一對應的。


static struct s3c_gpio_chip s5pv210_gpio_4bit[] = {

    {

        .chip    = {

            .base    = S5PV210_GPA0(0),

            .ngpio    = S5PV210_GPIO_A0_NR,

            .label    = 'GPA0',

            .to_irq = s5p_gpiolib_gpioint_to_irq,

        },

    }, {

        .chip    = {

            .base    = S5PV210_GPA1(0),

            .ngpio    = S5PV210_GPIO_A1_NR,

            .label    = 'GPA1',

            .to_irq = s5p_gpiolib_gpioint_to_irq,

        },

    }, {

        .chip    = {

            .base    = S5PV210_GPB(0),

            .ngpio    = S5PV210_GPIO_B_NR,

            .label    = 'GPB',

            .to_irq = s5p_gpiolib_gpioint_to_irq,

        },

    }, 

       ......

}


.chip.base是GPIO的編號,用宏定義表示。S5PV210_GPA0(0)宏解析如下,即S5PV210_GPA0(0) = 0,S5PV210_GPA0(1) = 1。


#define S5PV210_GPA0(_nr) (S5PV210_GPIO_A0_START + (_nr))

#define S5PV210_GPA1(_nr) (S5PV210_GPIO_A1_START + (_nr)) 


S5PV210_GPIO_A0_START = 0,

S5PV210_GPIO_A1_START = S5PV210_GPIO_NEXT(S5PV210_GPIO_A0),


#define S5PV210_GPIO_NEXT(__gpio)

((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 1) 


#define S5PV210_GPIO_A0_NR (8)

#define S5PV210_GPIO_A1_NR (4)

#define S5PV210_GPIO_B_NR  (8)

#define S5PV210_GPIO_C0_NR (5)


(3)chip->base = S5PV210_BANK_BASE(i),將GPIO的虛擬地址寫入。


 //每個gpio的地址差0x20

#define S5PV210_BANK_BASE(bank_nr) (S5P_VA_GPIO + ((bank_nr) * 0x20)

(4)samsung_gpiolib_add_4bit_chips()函數的作用是將所有GPIO向內核注冊。注冊的實質是:在linux內核中有一個gpio_desc結構體數組,注冊就是把我們封裝的gpio的所有信息的結構體放到數組的格子中。


void __init samsung_gpiolib_add_4bit_chips(struct s3c_gpio_chip *chip, int nr_chips)

{

    for (; nr_chips > 0; nr_chips--, chip++) 

    {

        samsung_gpiolib_add_4bit(chip);

        s3c_gpiolib_add(chip);

    }

}


回到頂部

3. gpiolib庫的使用

(1)申請GPIO


/*

*參數:

*        unsigned gpio:GPIO編號

*        const char *label:GPIO名稱

*返回值:

*        返回值為0,GPIO申請成功;否則,GPIO申請失敗

*/

int gpio_request(unsigned gpio, const char *label); 


(2)設置GPIO方向


1)設置為輸入


/*

*參數:

*        unsigned gpio:GPIO編號

*返回值:

*        返回值為<0,設置失敗

*/

int gpio_direction_input(unsigned gpio);


2)設置為輸出


/*

*參數:

*        unsigned gpio:GPIO編號

*        int value:GPIO輸出值

*返回值:

*        返回值為<0,設置失敗

*/

int gpio_direction_output(unsigned gpio, int value);


(3)獲取/設置GPIO的值


a. 可睡眠


對于有些掛載在I2C,SPI總線上的擴展GPIO,讀寫操作可能會導致睡眠,因此不能在中斷函數中使用可睡眠操作。使用下面的函數以區別于正常的GPIO:


1)獲取GPIO的值


/*

*參數:

*        unsigned gpio:GPIO編號

*返回值:

*        返回GPIO的值,0或1

*/

int gpio_get_value_cansleep(unsigned gpio);


2)設置GPIO的值


/*

*參數:

*        unsigned gpio:GPIO編號

*        int value:GPIO設置值

*返回值:

*        無

*/

void gpio_set_value_cansleep(unsigned gpio, int value);


b. 不可睡眠


1)獲取GPIO的值


/*

*參數:

*        unsigned gpio:GPIO編號

*返回值:

*        返回GPIO的值,0或1

*/

int gpio_get_value(unsigned gpio);


2)設置GPIO的值


/*

*參數:

*        unsigned gpio:GPIO編號

*        int value:GPIO設置值

*返回值:

*        無

*/

void gpio_set_value(unsigned gpio, int value);


(4)釋放GPIO


/*

*參數:

*        unsigned gpio:GPIO編號

*返回值:

*        無

*/

void gpio_free(unsigned gpio);


(5)批量初始化/釋放GPIO


1)批量初始化GPIO


/*

*參數:

*        unsigned gpio  *array:GPIO數組(多個GPIO編號)

*        size_t num:GPIO數組大小,GPIO即的個數

*返回值:

*        返回0,初始化成功;否則,初始化失敗

*/

int gpio_request_array(struct gpio *array, size_t num);


2)批量釋放GPIO


/*

*參數:

*        unsigned gpio  *array:GPIO數組(多個GPIO編號)

*        size_t num:GPIO數組大小,GPIO即的個數

*返回值:

*        無

*/

void gpio_free_array(struct gpio *array, size_t num);


回到頂部

 4. S3C平臺的GPIO操作接口

kernel/arch/arm/plat-s3c/include/plat/gpio-cfg.h文件中提供了S3C平臺的GPIO操作接口,以下列舉一些常用的GPIO操作接口。


(1)GPIO的工作模式設置


Linux內核中GPIO的工作模式的定義。


/*

*GPIO的工作模式定義

*/

#define S3C_GPIO_INPUT    (S3C_GPIO_SPECIAL(0))   //輸出模式

#define S3C_GPIO_OUTPUT   (S3C_GPIO_SPECIAL(1))   //輸入模式

#define S3C_GPIO_SFN(x)   (S3C_GPIO_SPECIAL(x))   //其他模式,根據參數x決定


S3C_GPIO_SFN(x)中x的值對應的功能可通過數據手冊來查閱。譬如,根據D5PV210的數據手冊可知:


/*

*x = 0,GPH0_0為輸入模式

*x = 1,GPH0_0為輸出模式

*x = 0x0f,GPH0_0為外部中斷模式

*/


S3C_GPIO_SFN(0)   //輸入模式 

S3C_GPIO_SFN(1)   //輸出模式 

S3C_GPIO_SFN(0x0f)//外部中斷模式 


1)s3c_gpio_cfgpin()設置指定引腳的工作模式


/*

*功能:設置指定引腳的工作模式

*參數:

*        unsigned int pin:需要設置的引腳號

*        unsigned int to:需要設置的工作模式

*/

int s3c_gpio_cfgpin(unsigned int pin, unsigned int to);


s3c_gpio_cfgpin(S5PV210_GPA0(0), S3C_GPIO_SFN(0));   //設置GPH0_0為輸入模式 

s3c_gpio_cfgpin(S5PV210_GPA0(0), S3C_GPIO_SFN(1));   //設置GPH0_0為輸出模式 

s3c_gpio_cfgpin(S5PV210_GPA0(0), S3C_GPIO_SFN(0x0f));//設置GPH0_0為外部中斷模式


2)s3c_gpio_getcfg()讀取指定引腳的設置值


/*

*功能:讀取指定引腳的設置值

*參數:

*        unsigned int pin:需要獲取的引腳號

*返回值:獲取G引腳工作模式的值

*/

unsigned s3c_gpio_getcfg(unsigned int pin);


 3)s3c_gpio_cfgin_range()批量設置多個引腳的工作模式


/*

*功能:批量設置多個引腳的工作模式

*參數:

*        unsigned int start:起始引腳號

*        unsigned int nr:   需要設置的引腳個數

*        unsigned int cfg:  需要設置的工作模式

*/

int s3c_gpio_cfgpin_range(unsigned int start, unsigned int nr, unsigned int cfg);


 (2)GPIO的上下拉設置


 Linux內核中,上下拉的狀態值的定義。


#define S3C_GPIO_PULL_NONE  ((__force s3c_gpio_pull_t)0x00)  //關閉,上拉下拉都關閉

#define S3C_GPIO_PULL_DOWN  ((__force s3c_gpio_pull_t)0x01)  //下拉

#define S3C_GPIO_PULL_UP    ((__force s3c_gpio_pull_t)0x02)  //上拉

 1)s3c_gpio_setpull()設置GPIO引腳的上下拉使能


/*

*功能:設置單個引腳的上下拉模式

*參數:

*        unsigned int pin:需要設置的引腳

*        s3c_gpio_pull_t pull:上下拉的狀態值

*/

int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull);


 2)s3c_gpio_getpull()讀取指定引腳的上下拉狀態


/*

*功能:讀取指定引腳的上下拉狀態

*參數:

*        unsigned int pin:需要讀取的引腳

*返回值:        

*        s3c_gpio_pull_t :上下拉的狀態值

*/

s3c_gpio_pull_t s3c_gpio_getpull(unsigned int pin);


3) s3c_gpio_cfgall()批量設置多個引腳的工作模式和上下拉狀態


/*

*功能:批量設置多個引腳的工作模式和上下拉狀態

*參數:

*       unsigned int start:  起始引腳號

*       unsigned int nr:     需要設置的引腳個數

*       unsigned int cfg:    需要設置的引腳工作模式

*       s3c_gpio_pull_t pull:需要設置的引腳的上下拉狀態

*/

int s3c_gpio_cfgall_range(unsigned int start, unsigned int nr, unsigned int cfg, s3c_gpio_pull_t pull);


關鍵字:S5PV210 引用地址:gpiolib庫詳解

上一篇:make: Warning: File `led.c' has modification time 15 s in the future
下一篇:喜羊羊系列【設備 - 驅動器 編譯進內核】

推薦閱讀最新更新時間:2025-04-16 02:19

【ARM裸機s5pv210】Makefile
Linux命令行中輸入 make 命令: 1、make 會在當前目錄下找名字叫“Makefile”或“makefile”的文件。 2、如果找到,它會找文件中的第一個目標文件(target),并把這個文件作為最終的目標文件。 3、如果 目標文件不存在,或是 目標文件所依賴的后面的 .o 文件的文件修改時間要比 目標文件 這個文件新,那么,他就會執行后面所定義的命令來生成 edit 這個文件。 4、如果 目標文件所依賴的.o 文件也存在,那么 make 會在當前文件中找目標為.o 文件的依 賴性,如果找到則再根據那一個規則生成.o 文件。(這有點像一個堆棧的過程) 5、當然,你的 C 文件和 H 文件是存在的啦,于是 make
[單片機]
tiny210(s5pv210)移植u-boot(基于 2014.4 版本號)——NAND 8位硬件ECC
這節我們實現nand的ecc,保存環境變量到nand flash 中。然后把我們之前的led燈燒寫到nand flash 中。開機啟動。在 tiny210.h 中定義宏 CONFIG_S5PV210_NAND_HWECC、CONFIG_SYS_NAND_ECCSIZE、CONFIG_SYS_NAND_ECCBYTES CONFIG_SYS_NAND_ECCSIZE 定義了消息長度。即每多少字節進行 1 次 ECC 校驗 CONFIG_SYS_NAND_ECCBYTES 定義為 13Byte,將 drivers/mtd/nand/s5pv210_nand.c 中的 CONFIG_S3C2410_NAND_HWECC 替換為CON
[單片機]
tiny210(<font color='red'>s5pv210</font>)移植u-boot(基于 2014.4 版本號)——NAND 8位硬件ECC
S5PV210中斷處理的主要寄存器
1、VICnINTENABLE(負責打開中斷工作的)和VICnINTENEAR(負責關閉中斷工作的)n代表的是0123456等常數 (1)VICnINTENABLE 對應interrupt endble (使能,即開),VICnINTENCLEAR對應interroup enable clear (全能清除,即關) (2)INTENABLE寄存器負責相應的中斷的使能,INTENCLEAR寄存器負責相應的中斷禁止。 (2)當我們想使能(意思就是啟用這個中斷,就是當硬件產生中斷時CPU能接收的到)某個中斷時,只要這個中斷編號對應的VICnINTENABLE的相應bit寫1即可(注意這個位寫1其它位寫0對其它位沒有影響,這個
[單片機]
stm32固件之讀取按鍵
//按鍵接下拉4.7k 上升沿中斷.按鍵上并聯104電容抗抖動 //引腳定義 /*******************************************************/ define KEY1_PIN GPIO_Pin_0 define KEY1_GPIO_PORT GPIOA define KEY1_GPIO_CLK RCC_AHB1Periph_GPIOA define KEY2_PIN GPIO_Pin_13 define KEY2_GPIO_PORT GPIOC define KEY2_GPIO_CLK RCC_AHB1Pe
[單片機]
STM32使用HAL實現ADC單通道轉換
  STM32的ADC轉換還是很強大的,它具有多個通道選擇,這里我就不細說,不了解的可以自行百度,這里只是選取單通道,實現ADC轉換。在文章開始之前,我說一下數據左對齊跟右對齊的差別,以前一直糊里糊涂的,記錄下來以免以后自己忘記。12位二進制最大值為 0x0FFF 左對齊操作后的結果是 0xFFF0,右對齊后還是0x0FFF。反過來看 ,若寄存器里左對齊的數據值X (相當于實際數據*16,所以左對齊轉換的值要/16才是實際的值),則X 4才是實際的數據。而右對齊,則是數據保持不變,采集到多少就多少。至于是按左對齊保存到寄存器還是按照右對齊,就看你的配置里如何選了。   好了,下面就開始說明怎么用STM32CUBEMX實現ADC單通
[單片機]
STM32使用HAL<font color='red'>庫</font>實現ADC單通道轉換
基于STM32調用固件實現點燈
相信學過單片機的同學,對于調庫這個操作都不陌生,大多數人都是從調別人的庫階段過來的。 今天看到一個評論說,如果只會調庫,到了公司后會發現自己啥都不是。其實這話說的一點也不假,如果只會調庫的話,你的單片機水平還停留在C語言階段,并不能稱為真正的單片機開發。 但我們要有這么一個概念:調庫是自己編寫的開始,如果上來就給你講寄存器這些,我相信很多初學者都接收不了、理解不了這寫寄存器到底在干啥。可是,如果從調別人庫開始學習單片機,我們就會對單片機有個初始概念,對于后面的學習非常有幫助。 所以,今天我們就來看一下如何從調庫工程師成為真正的開發工程師。 1. 什么是調庫? 如果你通過機構的培訓視頻,比如野火的STM32單片機開
[單片機]
基于STM32調用固件<font color='red'>庫</font>實現點燈
SPL2LL轉換器實現標準代碼遷移為LL的方法與內容
早期開發STM32,大部分工程師都是基于標準庫進行開發,如果要換成LL庫,且需要復用以前代碼,該怎么辦呢? 下面就來給大家分享一下使用【SPL2LL轉換器】實現標準庫代碼遷移為LL庫的方法,以及相關內容。 1關于LL庫 LL庫,即STM32Cube Low-Layer,也叫Cube LL、Cube底層庫等。 開發STM32通常有四種“庫”,可以閱讀之前分享的文章進一步了解。 早在2014年,ST推出了STM32CubeMX這款工具,同步推出了對應的STM32Cube HAL庫。 但是,HAL存在一些問題:代碼量大、執行效率低等缺點。 因此,在2017年,ST推出了STM32Cube LL庫,目的就是為了解決的HAL庫的缺點,讓
[單片機]
SPL2LL轉換器實現標準<font color='red'>庫</font>代碼遷移為LL<font color='red'>庫</font>的方法與內容
卡機器人參評“維科杯·OFweek 2022年度機器人行業中國市場卓越表現獎”
? ? ? ?維科杯·OFweek 2022中國 機器人 行業年度評選(簡稱OFweek Robot Awards 2022),是由中國高科技行業門戶OFweek維科網及旗下權威的機器人專業媒體-OFweek維科網·機器人共同舉辦。該評選設立至今已有十余年,是中國機器人行業內的一大品牌盛會,亦是高科技行業具有專業性、影響力的評選之一。 ? ? ? ?此次活動旨在為機器人行業的產品、技術和企業搭建品牌傳播展示平臺,并借助OFweek維科網平臺資源及影響力,向行業用戶和市場推介創新產品與方案,鼓勵更多企業投入技術創新;同時為行業輸送更多創新產品、前沿技術,一同暢想機器人行業的未來。 ? ? ? ?今年,OFweek Robot Awa
[機器人]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

隨便看看

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 绥棱县| 桂林市| 吕梁市| 岗巴县| 丹东市| 大庆市| 泸州市| 八宿县| 恩平市| 宿州市| 土默特左旗| 理塘县| 永顺县| 太和县| 曲麻莱县| 铜川市| 察隅县| 蕲春县| 临澧县| 绥阳县| 萝北县| 丰城市| 青川县| 哈密市| 额尔古纳市| 海阳市| 萨迦县| 潜山县| 桓台县| 湖南省| 永兴县| 礼泉县| 新平| 枞阳县| 安福县| 咸丰县| 旌德县| 秦皇岛市| 宁都县| 绍兴市| 敦化市|