测试环境:  CPU: AT91SAM9X35      Linux: Atmel提供的linux-at91-linux4sam_5.3 (Linux-4.1.0)

转载请注明: 凌云物网智科嵌入式实验室: http://iot-yun.com/     郭文学<guowenxue@gmail.com>

下面的这个驱动文件at91_keyled.c在Atmel提供的linux-at91-linux4sam_5.3下实现了按键控制LED的亮灭过程,通过这个简单的驱动描述了基于DTS的驱动开发模型以及Linux内核里的GPIO相关的操作函数。

  1. /*********************************************************************************
  2. * Copyright: (C) 2016 Guo Wenxue<guowenxue@gmail.com>
  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 <guowenxue@gmail.com>
  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. static const struct of_device_id of_key_leds_match[] = {
  50. { .compatible = "key-leds", },
  51. {},
  52. };
  53. MODULE_DEVICE_TABLE(of, of_key_leds_match);
  54.  
  55. static irqreturn_t key_detect_interrupt(int irq, void *dev_id)
  56. {
  57. keyled_priv_t *priv = (keyled_priv_t *)dev_id;
  58.  
  59. priv->led_status ^= ;
  60. gpio_set_value(priv->pin_led, priv->led_status);
  61.  
  62. return IRQ_HANDLED;
  63. }
  64.  
  65. static int at91_keyled_probe(struct platform_device *pdev)
  66. {
  67. int res;
  68. keyled_priv_t *priv;
  69.  
  70. printk(KERN_INFO "at91_keyled driver probe\n");
  71.  
  72. if( != of_gpio_count(pdev->dev.of_node) )
  73. {
  74. printk(KERN_ERR "keyled pins definition in dts invalid\n");
  75. return -EINVAL;
  76. }
  77.  
  78. priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
  79. if(!priv)
  80. return -ENOMEM;
  81.  
  82. platform_set_drvdata(pdev, priv);
  83.  
  84. priv->pin_key=of_get_gpio(pdev->dev.of_node, );
  85. priv->pin_led=of_get_gpio(pdev->dev.of_node, );
  86.  
  87. if( gpio_is_valid(priv->pin_key) )
  88. {
  89. if( (res=devm_gpio_request(&pdev->dev, priv->pin_key, "keyled_key")) < )
  90. {
  91. dev_err(&pdev->dev, "can't request key gpio %d\n", priv->pin_key);
  92. return res;
  93. }
  94. dev_info(&pdev->dev, "request key gpio %d ok\n", priv->pin_key);
  95.  
  96. if( (res=gpio_direction_input(priv->pin_key)) < )
  97. {
  98. dev_err(&pdev->dev, "can't request input direction key gpio %d\n", priv->pin_key);
  99. return res;
  100. }
  101. dev_info(&pdev->dev, "request input direction key gpio %d ok\n", priv->pin_key);
  102.  
  103. printk(KERN_INFO "Key gpio current status: %d\n", gpio_get_value(priv->pin_key));
  104.  
  105. res = request_irq( gpio_to_irq(priv->pin_key), key_detect_interrupt, IRQF_TRIGGER_FALLING, "keyled", priv);
  106. if( res )
  107. {
  108. dev_err(&pdev->dev, "can't request IRQ<%d> for key gpio %d\n", gpio_to_irq(priv->pin_key), priv->pin_key);
  109. return -EBUSY;
  110. }
  111. dev_info(&pdev->dev, "request IRQ<%d> for key gpio %d ok\n", gpio_to_irq(priv->pin_key), priv->pin_key);
  112. }
  113.  
  114. if( gpio_is_valid(priv->pin_led) )
  115. {
  116. if( (res=devm_gpio_request(&pdev->dev, priv->pin_led, "keyled_led")) < )
  117. {
  118. dev_err(&pdev->dev, "can't request key gpio %d\n", priv->pin_led);
  119. return res;
  120. }
  121.  
  122. if( (res=gpio_direction_output(priv->pin_led, )) < )
  123. {
  124. dev_err(&pdev->dev, "can't request output direction key gpio %d\n", priv->pin_led);
  125. return res;
  126. }
  127. }
  128.  
  129. return ;
  130. }
  131.  
  132. static int at91_keyled_remove(struct platform_device *pdev)
  133. {
  134. keyled_priv_t *priv = platform_get_drvdata(pdev);
  135.  
  136. printk(KERN_INFO "at91_keyled driver remove\n");
  137.  
  138. devm_gpio_free(&pdev->dev, priv->pin_led);
  139. devm_gpio_free(&pdev->dev, priv->pin_key);
  140.  
  141. free_irq(gpio_to_irq(priv->pin_key), priv);
  142.  
  143. devm_kfree(&pdev->dev, priv);
  144.  
  145. return ;
  146. }
  147.  
  148. static struct platform_driver at91_keyled_driver = {
  149. .probe = at91_keyled_probe,
  150. .remove = at91_keyled_remove,
  151. .driver = {
  152. .name = "key-leds",
  153. .of_match_table = of_key_leds_match,
  154. },
  155. };
  156.  
  157. module_platform_driver(at91_keyled_driver);
  158.  
  159. MODULE_AUTHOR("guowenxue <guowenxue@gmail.com>");
  160. MODULE_DESCRIPTION("AT91 Linux DTS GPIO driver for Key and LED");
  161. MODULE_LICENSE("GPL");
  162. MODULE_ALIAS("platform:key-leds");

at91sam9x5 linux 4.1.0下dts驱动编程模型的更多相关文章

  1. at91sam9x5 linux 4.1.0下使能蜂鸣器驱动

    测试环境:  CPU: AT91SAM9X35      Linux: Atmel提供的linux-at91-linux4sam_5.3 (Linux-4.1.0) 转载请注明: 凌云物网智科嵌入式实 ...

  2. 【Linux】CentOS7.0下安装JDK环境

    写在前面:此次试验是在CentOS7上面安装的,亲测成功. 所需工具:JDK1.8安装包,xftp 具体步骤: 1,首先使用xftp连接到自己的虚拟机,然后查看是否有"/usr/java/j ...

  3. Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件

    最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自 ...

  4. SpringCloud的应用发布(二)vmvare+linux,Centos7.0下发布应用

    一.运行环境 1.jdk下载安装 地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 检查是否有老版本jdk 如 ...

  5. 【Tomcat】CentOS7.0下安装多个Tomcat及其配置

    安装前所需环境 在开始安装Tomcat之前,需要安装环境JDK,并配置JAVA环境.如果不知道如何配置,可参考这篇博客:[Linux]CentOS7.0下安装JDK环境 Tomcat安装 Tomcat ...

  6. 梦织未来Windows驱动编程 第03课 驱动的编程规范

    最近根据梦织未来论坛的驱动教程学习了一下Windows下的驱动编程,做个笔记备忘.这是第03课<驱动的编程规范>. 驱动部分包括基本的驱动卸载函数.驱动打开关闭读取写入操作最简单的分发例程 ...

  7. linux下无线鼠标驱动执行流程

    操作系统: debian 7.4(linux 3.2.54) 硬件: 一个无线鼠标.一个有线鼠标.usb集线器. 从淘宝上花了15块钱买了个无线鼠标,很好奇它的驱动程序是如何执行的. 首先将usb集线 ...

  8. 很好的linux下GPIO驱动详解文章

    原文地址  http://blog.csdn.net/llxmedici/article/details/6282372 打算跟着友善之臂的<mini2440 linux移植开发指南>来做 ...

  9. linux下I2C驱动架构全面分析【转】

    本文转载自:http://blog.csdn.net/wangpengqi/article/details/17711165 I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一 ...

随机推荐

  1. poj crane

    #include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #de ...

  2. 裸眼3D立体显示技术原理详解

    众所周知,现实世界是一个三维空间,除去时间这一维度,现实世界是由长度.宽度和高度三个维度组成,我们每天就生活在这个三维世界中,而现有的显示设备大多数都只能显示二维信息,并不能带给人真实的三维感觉.为了 ...

  3. m2e使用问题——发布web项目时lib目录下的jar包未发布

    解决过程如下: 在项目上点右键查看properties—>Deployment Assembly,看Deploy Path这项上是否缺少WEB-INF/lib这一项. 相关操作截图如下:

  4. 关于.ToList(): LINQ to Entities does not recognize the method ‘xxx’ method, and this method cannot be translated into a store expression.

    LINQ to Entities works by translating LINQ queries to SQL queries, then executing the resulting quer ...

  5. LoadRunner_Analysis(z) 分析

    LoadRunner_Analysis(z) 分析 lr_Analysis(z) Analysis Summary Page Analysis Summary(分析总结页面) 分为三个部分: Stat ...

  6. Axure原型用pmdaniu在线托管尝试

    这次把原型中语音模块的坑填了一部分,实现了拖拽按钮控制的界面效果 http://www.pmdaniu.com/prototype/view?id=WXpVNwNhUmYMPFN3AkA

  7. IIS发布站点错误

    发布站点的时候出现以下错误:解决方法: 1.  设置c:windows\temp 目录访问权限 temp--> 属性-->安全-- > 添加network service --> ...

  8. Maven使用第三方jar文件的两种方法 转

    在Maven中,使用第三方库一般是通过pom.xml文件中定义的dependency从远程repository中下载该库.但是如果库文件是公司内部的库,或者在本地而不能通过远程repository下载 ...

  9. SQLite 入门教程(四)增删改查,有讲究 (转)

    转于: SQLite 入门教程(四)增删改查,有讲究 一.插入数据 INSERT INTO 表(列...) VALUES(值...) 根据前面几篇的内容,我们可以很轻送的创建一个数据表,并向其中插入一 ...

  10. ASP.NET MVC提交到服务器的几种方法

    多年不搞WEB开发了,最近有个小活干干,记录一下学习的心得. 以下为几种脚本向服务器提交的方法: 1. $.ajax({ type: "GET", url: "/Test ...