at91 linux 4.1.0下dts驅動編程模型

来源:http://www.cnblogs.com/iot-yun/archive/2016/06/29/5627829.html
-Advertisement-
Play Games

下麵的這個驅動文件at91_keyled.c在Atmel提供的linux-at91-linux4sam_5.3下實現了按鍵控制LED的亮滅過程,通過這個簡單的驅動描述了基於DTS的驅動開發模型以及Linux內核里的GPIO相關的操作函數。 ...


下麵的這個驅動文件at91_keyled.c在Atmel提供的linux-at91-linux4sam_5.3下實現了按鍵控制LED的亮滅過程,通過這個簡單的驅動描述了基於DTS的驅動開發模型以及Linux內核里的GPIO相關的操作函數。

 

  1 /*********************************************************************************
  2  *      Copyright:  (C) 2016 Guo Wenxue<[email protected]>  
  3  *                  All rights reserved.
  4  *
  5  *       Filename:  at91_keyled.c
  6  *    Description:  This is a sample driver for GPIO operation with DTS linux on at91,
  7  *                  which willl turn led on when a button pressed.
  8  *                 
  9  *        Version:  1.0.0(2016-6-29~)
 10  *         Author:  Guo Wenxue <[email protected]>
 11  *      ChangeLog:  1, Release initial version on "Wed Jun 29 12:00:44 CST 2016"
 12  *
 13  *
 14  *    DTS Changes:
 15  *                 add keyleds support in arch/arm/boot/dts/at91sam9x5cm.dtsi
 16  *
 17  *                   keyleds{
 18  *                          compatible = "key-leds";
 19  *                          gpios = <&pioB 18 GPIO_ACTIVE_LOW     priv->pin_key=of_get_gpio(pdev->dev.of_node, 0);
 20  *                                   &pioB 16 GPIO_ACTIVE_LOW>;   priv->pin_key=of_get_gpio(pdev->dev.of_node, 1);
 21  *                          status = "okay";
 22  *                   }
 23  *
 24  *                   1wire_cm {
 25  *                      ... ...
 26  *                      ... ...
 27  *                   }
 28  *                 
 29  ********************************************************************************/
 30 
 31 #include <linux/module.h>
 32 #include <linux/moduleparam.h>
 33 #include <linux/platform_device.h>
 34 
 35 #include <linux/of.h>
 36 #include <linux/of_device.h>
 37 #include <linux/of_gpio.h>
 38 #include <linux/delay.h>
 39 #include <linux/gpio.h>
 40 #include <linux/interrupt.h>
 41 
 42 typedef struct keyled_priv_s 
 43 {
 44     int       pin_key;  
 45     int       pin_led; 
 46     int       led_status;
 47 } keyled_priv_t;  /*---  end of struct keyled_priv_s  ---*/
 48 
 49 
 50 static const struct of_device_id of_key_leds_match[] = {
 51         { .compatible = "key-leds", },
 52         {},
 53 };
 54 MODULE_DEVICE_TABLE(of, of_key_leds_match);
 55 
 56 
 57 static irqreturn_t key_detect_interrupt(int irq, void *dev_id)
 58 {
 59     keyled_priv_t    *priv = (keyled_priv_t *)dev_id;
 60 
 61     priv->led_status ^= 1;
 62     gpio_set_value(priv->pin_led, priv->led_status);
 63 
 64     return IRQ_HANDLED;
 65 }
 66 
 67 
 68 static int at91_keyled_probe(struct platform_device *pdev)
 69 {
 70     int              res;
 71     keyled_priv_t    *priv;
 72 
 73     printk(KERN_INFO "at91_keyled driver probe\n");
 74 
 75     if( 2 != of_gpio_count(pdev->dev.of_node) )
 76     {
 77         printk(KERN_ERR "keyled pins definition in dts invalid\n");
 78         return -EINVAL;
 79     }
 80 
 81     priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
 82     if(!priv)
 83         return -ENOMEM;
 84 
 85     platform_set_drvdata(pdev, priv);
 86 
 87     priv->pin_key=of_get_gpio(pdev->dev.of_node, 0);
 88     priv->pin_led=of_get_gpio(pdev->dev.of_node, 1);
 89 
 90     if( gpio_is_valid(priv->pin_key) )
 91     {
 92         if( (res=devm_gpio_request(&pdev->dev, priv->pin_key, "keyled_key")) < 0 )
 93         {
 94             dev_err(&pdev->dev, "can't request key gpio %d\n", priv->pin_key);
 95             return res;
 96         }
 97         dev_info(&pdev->dev, "request key gpio %d ok\n", priv->pin_key);
 98 
 99         if( (res=gpio_direction_input(priv->pin_key)) < 0 )
100         {
101             dev_err(&pdev->dev, "can't request input direction key gpio %d\n", priv->pin_key);
102             return res;
103         }
104         dev_info(&pdev->dev, "request input direction key gpio %d ok\n", priv->pin_key);
105 
106         printk(KERN_INFO "Key gpio current status: %d\n", gpio_get_value(priv->pin_key));
107 
108         res = request_irq( gpio_to_irq(priv->pin_key), key_detect_interrupt, IRQF_TRIGGER_FALLING, "keyled", priv);
109         if( res )
110         {
111             dev_err(&pdev->dev, "can't request IRQ<%d> for key gpio %d\n", gpio_to_irq(priv->pin_key), priv->pin_key);
112             return -EBUSY;
113         }
114         dev_info(&pdev->dev, "request IRQ<%d> for key gpio %d ok\n", gpio_to_irq(priv->pin_key), priv->pin_key);
115     }
116 
117     if( gpio_is_valid(priv->pin_led) )
118     {
119         if( (res=devm_gpio_request(&pdev->dev, priv->pin_led, "keyled_led")) < 0 )
120         {
121             dev_err(&pdev->dev, "can't request key gpio %d\n", priv->pin_led);
122             return res;
123         }
124 
125         if( (res=gpio_direction_output(priv->pin_led, 0)) < 0 )
126         {
127             dev_err(&pdev->dev, "can't request output direction key gpio %d\n", priv->pin_led);
128             return res;
129         }
130     }
131 
132     return 0;
133 }
134 
135 static int at91_keyled_remove(struct platform_device *pdev)
136 {
137     keyled_priv_t    *priv = platform_get_drvdata(pdev);
138 
139     printk(KERN_INFO "at91_keyled driver remove\n");
140 
141     devm_gpio_free(&pdev->dev, priv->pin_led);
142     devm_gpio_free(&pdev->dev, priv->pin_key);
143 
144     free_irq(gpio_to_irq(priv->pin_key), priv);
145 
146     devm_kfree(&pdev->dev, priv);
147 
148     return 0;
149 }
150 
151 static struct platform_driver at91_keyled_driver = {
152     .probe      = at91_keyled_probe,
153     .remove     = at91_keyled_remove,
154     .driver     = {
155         .name   = "key-leds",
156         .of_match_table = of_key_leds_match,
157     },
158 };
159 
160 module_platform_driver(at91_keyled_driver);
161 
162 MODULE_AUTHOR("guowenxue <[email protected]>");
163 MODULE_DESCRIPTION("AT91 Linux DTS GPIO driver for Key and LED");
164 MODULE_LICENSE("GPL");
165 MODULE_ALIAS("platform:key-leds");

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡介: 1、在 Keepalived 集群中,其實並沒有嚴格意思上的主、備節點,雖然可以在 keepalived.conf 中定義 state 選項為 MASTER 狀態,但是這並不意味著此節點就一直是 MASTER 角色。控制節點角色的是 keepalived.conf 中的 priority 值 ...
  • 簡介: Keepalived 是一個基於 VRRP 協議來實現 WEB 服務高可用的解決方案,用來避免單點故障。主伺服器會發送特定的消息給備份伺服器,當備份伺服器收不到這個消息時,即主伺服器宕機的時候,備份伺服器就會接管虛擬 IP ,繼續提供服務,從而保證高可用性。 下載地址:http://www. ...
  • 簡介: Grub 常見的兩種故障:Grub.conf 文件丟失、MBR 損壞 ( 不管恢復怎麼樣,還是先備份好吧 ) 一、Grub.conf 文件丟失 ## 故障現象如下: ## 就這個樣子,無法登陸系統,下麵是解決方法 ## 0, 1, 2 代表分區編號,上面顯示有文件系統,分區類型,像 83 就 ...
  • 簡介: Extundelete 數據恢復 救命的稻草!當你在運維過程中不小心誤刪除數據時,就會用到數據恢復工具,( 都是淚,不多說了 )。 常見的開源數據恢復工具有,debugfs、R-Linux、ext3grep、extundelete 等。 ext3grep 跟 extundelete 比較常用 ...
  • 一般來講,對非法地址的訪問會導致應用程式收到由系統發送的sigsegv信號,預設情況下,函數對於這個信號的處理是退出。 但是為了方便調試,我們可以自己設置處理函數,使用signal函數。 這裡比較重要的一點是,按照流程,cpu取完一條指令時,pc會指向下一條指令,那麼如果我們指定函數對sigsegv ...
  • 先把目標設低點,開機進入後,在屏幕上列印“Loading..."即可。由於要在 bochs 中運行,首先就是安裝 bochs。Oldlinux 中有相關資源,可自行下載。winxp 和 linux 的配置腳本如下: # for windows bochs config megs : 32 romim ...
  • ubuntu安裝visual-studio-code,通過使用umake,或deb方式安裝 ...
  • Configure Ocserv on CentOS 6 Table of Contents 1. Install ocserv 2. Configure ocserv 3. How to host ocserv and a web server on the same port ? 3.1. Me ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...