1. 程式人生 > >linux核心中GPIO的使用(二)--標準介面函式

linux核心中GPIO的使用(二)--標準介面函式

在linux核心中,有一些基本模組可以使用標準的介面函式來操作,比如GPIO、interrupt、clock,所謂的標準介面函式是指一些與硬體平臺無關的、linux下做驅動通用的函式,
常用的有:
gpio_request();gpio_free();gpio_direction_output();gpio_direction_input();gpio_set_value();gpio_get_value()等;

函式分析:

1)GPIO申請:

        int gpio_request(unsigned gpio, const char *label)
引數分析:
    unsigned gpio:gpio埠號;
    const char *label:給該gpio埠起的名字;
返回值:
    成功返回0;失敗返回負數的錯誤碼;

不同平臺的gpio埠號是不同的,比如在s5pv210平臺上,在核心原始碼的arch/arm/mach-s5pv210/include/mach下有一個gpio.h的標頭檔案,其中有:

/* S5PV210 GPIO number definitions */
#define S5PV210_GPA0(_nr)       (S5PV210_GPIO_A0_START + (_nr))
#define S5PV210_GPA1(_nr)       (S5PV210_GPIO_A1_START + (_nr))
#define S5PV210_GPB(_nr)        (S5PV210_GPIO_B_START + (_nr))
#define S5PV210_GPC0(_nr) (S5PV210_GPIO_C0_START + (_nr)) #define S5PV210_GPC1(_nr) (S5PV210_GPIO_C1_START + (_nr)) #define S5PV210_GPD0(_nr) (S5PV210_GPIO_D0_START + (_nr)) #define S5PV210_GPD1(_nr) (S5PV210_GPIO_D1_START + (_nr)) …..

例如埠GPJD0_1就對應巨集定義的S5PV210_GPD0(1)。

2)GPIO的初始化

        初始化為輸出,並設定輸出電平:
        int gpio_direction_output(unsigned gpio, int value);
        初始化為輸入:
        int gpio_direction_input(unsigned gpio);

3)GPIO的輸出電平設定:

        void gpio_set_value(unsigned gpio, int value);

4)得到GPIO的電平

        int gpio_get_value(unsigned gpio);

5)釋放GPIO

        void gpio_free(unsigned gpio);

下面做一個簡單的led驅動,實現對基於S5PV210平臺的4盞LED燈控制,對應的GPIO口為GPJ2_0、GPJ2_0、GPJ2_0、GPJ2_0。

static int __init leddev_init(void)
{   
    int ret;
/*************led gpio request and initial**************/
    int i;
    for( i = 0; i < 4; i++)
    {
        ret = gpio_request(S5PV210_GPJ2(i), "led_gpio");
        if(ret < 0)
        {
            printk("S5PV210_GPJ2(%d)_request error!\n", i);
            goto err_gpio_request;
        }
        gpio_direction_output(S5PV210_GPJ2(i), 1);
    }
    printk("led initial success!\n");   

    if(cdev_Major)  //初始值不為0,則手動分配裝置號
    {
        cdev_num = MKDEV(cdev_Major, cdev_Minor);  
        ret= register_chrdev_region(cdev_num, 1, cdev_name);
    }
    else
    {
        ret = alloc_chrdev_region(&cdev_num, cdev_Minor, 1, cdev_name);  //動態分配裝置號
        cdev_Major = MAJOR(cdev_num);
    }
    if(ret < 0)
    {
        printk(KERN_WARNING"can not get major %d\n", cdev_Major);
        goto err_leddev_region;
    }
    cdev_init(&leddev, &leddev_fops);//建立字元裝置與檔案操作集的聯絡
    gpiodev.owner = THIS_MODULE;        
    ret = cdev_add(&leddev, cdev_num, 1);
    if(ret)
    {
        printk("error while register device!\n");
        goto err_gpiodev_add;
    }

/******************auto create device file****************/
    class_ret = class_create(THIS_MODULE, "ledclass");
    if(class_ret == NULL)
    {
        printk("class_create error!\n");
        goto err_class_creat;
    }

    device_ret = device_create(class_ret, NULL, cdev_num, NULL, "leddev");
    if(device_ret == NULL)
    {
        printk("device_create error!\n");
        goto err_device_create;
    }

    return 0;

err_device_create:
    class_destroy(class_ret);
err_class_creat:        
err_leddev_add:
    unregister_chrdev_region(MKDEV(cdev_Major, cdev_Minor), 1);
err_leddev_region:
err_gpio_request:
for( ; i > 0; i--)                              
    {
        gpio_free(S5PV210_GPJ2(i - 1));
    }
    return ret;
}

static void __exit leddev_exit(void)
{
    int  i;
    printk("exit from leddev!\n");
    for(i = 0 ; i < 4; i++)                              
    {
        gpio_free(S5PV210_GPJ2(i));
    }
    class_destroy(class_ret);
    device_destroy(class_ret, cdev_num);
    unregister_chrdev_region(MKDEV(cdev_Major, cdev_Minor), 1);
    cdev_del(&leddev);
}

module_init(leddev_init);
module_exit(leddev_exit);

MODULE_AUTHOR("Mr.Huang");
MODULE_DESCRIPTION("This is a leddev for testing!");
MODULE_LICENSE("GPL");

相關推薦

linux心中GPIO的使用--標準介面函式

在linux核心中,有一些基本模組可以使用標準的介面函式來操作,比如GPIO、interrupt、clock,所謂的標準介面函式是指一些與硬體平臺無關的、linux下做驅動通用的函式, 常用的有: gpio_request();gpio_free()

Linux訊號程式設計實踐 訊號傳送函式和可重入函式

    在早期的UNIX中訊號是不可靠的,不可靠在這裡指的是:訊號可能丟失,一個訊號發生了,但程序卻可能一直不知道這一點。 現在Linux 在SIGRTMIN實時訊號之前的都叫不可靠訊號,這裡的不可靠主要是不支援訊號佇列,就是當多個訊號發生在程序中的時候(收到訊號的

Linux 系統目錄結構

執行文件 icm sel 系統管理員 修改 tmp win 開始 通用 Linux 系統目錄結構 登錄系統後,在當前命令窗口下輸入命令: ls / 你會看到如下圖所示: 樹狀目錄結構: 以下是對這些目錄的解釋: /bin:bin是Binary的縮寫, 這個目錄存

Linux命令匯總

text user 但是 font pda space ech update spa 登錄用戶設置 新創建了一個用戶,用useradd指令,但是發現通過終端無法登陸; echo password | passwd --stdin username 或者 passwd

Linux用戶管理Linux系統安裝

linux安裝 1、RedHatLinux安裝前準備硬件要求CPU:Intel、ADM、VIA兼營內存:SDRAM、EDO和DDR,建議容量在128MB以上,最大4GB硬盤:接口類型(IDE、SCSI、USB)、自由空間(最小:500MB、完全安裝:4.5G)網卡:一塊或多塊顯卡:VGAhttp://hard

小白的linux學習之旅

探索linux一、linux系統結構linux是一個倒樹結構linux中所有的東西都是文件這些文件都在系統頂級目錄“/” /就是根目錄/目錄以下為二級目錄這些目錄都是系統裝機時系統自動建立的二級目錄的作用/bin 二進制可執行文件也就是系統命令/sbin

linux下安裝vsftp

restart put pass con system 關閉 set acc cannot 安裝vsftpd 1、以管理員(root)身份執行以下命令 yum install vsftpd 2、設置開機啟動vsftpd ftp服務 chkconfig vsftpd

linux系統程序安裝yum工具2-yum源管理

內容 centos 備份 hang clean 原生 yum 聯網 系統 繼續我們的yum工具應用之旅,yum工具之所以方便就是因為有方便的在線雲庫,實際工作中我們可能沒辦法鏈接互聯網,或者我們想安裝的程序原生源那麽我們能不能用其他方式應用方便的yum源呢? 一、使用光盤

Linux系統 shell基礎

很多 sts ctrl+ 技術 liunx 名稱 而是 進程 全局變量 一、管道符 管道符:管道符號用於把前一個命令的結果傳遞給另一條命令示例:1、統計一個文件的行數命令:cat /etc/passwd | wc -l2、統計當前文件夾下文件個數命令: ls | wc -l

Linux命令學習記錄

配置 相關 分享圖片 ati 記錄 str gem 技術分享 padding Linux中一切都是文件;目錄說明:bin:binary的縮寫,表示“二進制文件”,包含所有用戶使用的執行程序boot:“啟動”,包含與Linux啟動密切相關的文件dev:device,“設備”包

Linux系統管理初步io、free、ps、netstat命令 編輯中

sha 系統 工具 可能 工作 ued uri per str 10.6 監控io性能10.7 free命令10.8 ps命令10.9 查看網絡狀態10.10 linux下抓包 一、iostat與iotop命令 iostat命令與iotop,命令能夠看出系統磁盤的工作情況,

Linux進程管理進程的調度與資源限制

失敗 實用程序 代碼 協同 latin 中斷控制 可用 數值 無限 1 進程調度就緒進程最重要的特征是該進程是非阻塞的。進行用戶交互、大量讀寫文件、響應I/O和網絡事件的進程會花費大量時間來等待資源可用,在相當長的時間內無法轉為就緒狀態(長是相對於指令運行時間而言),因此就

Linux/Unix基本命令

distrib *** ... 空間 arch time spool 但是 報錯 基本命令-2壓縮和歸檔打包:即歸檔,類似於旅遊之前收拾行李壓縮:為了減少占用的磁盤空間,可以做備份,在網絡上傳輸時節省網絡帶寬。打包壓縮軟件windows:winrar 360壓縮 好壓 7z

Linux操作系統基礎

Linux文件管理 文件系統和目錄結構 文件和目錄被組成成一個單根倒置樹結構。根文件系統rootfs root filesystem rootfs:/etc/,/usr,/var,/root,/home,/dev 文件系統分層結構

linux web服務器 基於域名,ip,端口的web虛擬主機

田峰 IT linux linux web服務器(二) 1 :搭建基於域名的虛擬主機 首先為兩個網站搭建dns服務器,並新建區域,分別為:www.goole.co

Linux命令初接觸

less 不同 後綴 .gz shell編程 查看 顯示 末尾 bsp FILE:   查看文件的類型 DIFF:   比較兩個文件內容的不同   diff 文件1 文件2 FIND:   查找文件   find 路徑 -name “文件名” GREP:   根據

RabbitMQ Linux(Redhat6.5)安裝

html -i 運行環境 版權 force openss onf mini 命令行 一、安裝erlang   由於RabbitMq的linux運行環境需要erlang環境,所以需要先安裝erlang;   1、erlang下載:      http://erlang.org

linux基本命令總結

mef 進行 天前 ota naconda username n+1 ever flat 3、基本命令-2基本命令-2壓縮和歸檔打包:即歸檔,類似於旅遊之前收拾行李壓縮:為了減少占用的磁盤空間,可以做備份,在網絡上傳輸時節省網絡帶寬。打包壓縮軟件windows:winrar

Linux的學習筆記

所有 獨立 -m 免密碼 情況 修改權限 沒有權限 當前 網絡 1.網卡是一個專門負責網絡通訊的硬件設備,IP地址是設置在網卡上的地址信息(是保證電腦之間正常通訊的重要設置),每臺電腦的IP地址不能相同,否則將會出現IP地址沖突無法正常通信。ifconfig 可以查看和配置

Linux磁盤管理

查找 因此 div image fdisk proc 默認 kernel 掛載 上一篇介紹了磁盤結構和分區結構,這一篇來介紹管理分區和管理文件系統 管理分區 1. 創建分區 (1)fdisk:創建MBR分區 fdisk -l [-u] [device...] 查看