测试环境:  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相关的操作函数。

 /*********************************************************************************
* Copyright: (C) 2016 Guo Wenxue<guowenxue@gmail.com>
* All rights reserved.
*
* Filename: at91_keyled.c
* Description: This is a sample driver for GPIO operation with DTS linux on at91,
* which willl turn led on when a button pressed.
*
* Version: 1.0.0(2016-6-29~)
* Author: Guo Wenxue <guowenxue@gmail.com>
* ChangeLog: 1, Release initial version on "Wed Jun 29 12:00:44 CST 2016"
*
*
* DTS Changes:
* add keyleds support in arch/arm/boot/dts/at91sam9x5cm.dtsi
*
* keyleds{
* compatible = "key-leds";
* gpios = <&pioB 18 GPIO_ACTIVE_LOW priv->pin_key=of_get_gpio(pdev->dev.of_node, 0);
* &pioB 16 GPIO_ACTIVE_LOW>; priv->pin_key=of_get_gpio(pdev->dev.of_node, 1);
* status = "okay";
* }
*
* 1wire_cm {
* ... ...
* ... ...
* }
*
********************************************************************************/ #include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/platform_device.h> #include <linux/of.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/interrupt.h> typedef struct keyled_priv_s
{
int pin_key;
int pin_led;
int led_status;
} keyled_priv_t; /*--- end of struct keyled_priv_s ---*/ static const struct of_device_id of_key_leds_match[] = {
{ .compatible = "key-leds", },
{},
};
MODULE_DEVICE_TABLE(of, of_key_leds_match); static irqreturn_t key_detect_interrupt(int irq, void *dev_id)
{
keyled_priv_t *priv = (keyled_priv_t *)dev_id; priv->led_status ^= ;
gpio_set_value(priv->pin_led, priv->led_status); return IRQ_HANDLED;
} static int at91_keyled_probe(struct platform_device *pdev)
{
int res;
keyled_priv_t *priv; printk(KERN_INFO "at91_keyled driver probe\n"); if( != of_gpio_count(pdev->dev.of_node) )
{
printk(KERN_ERR "keyled pins definition in dts invalid\n");
return -EINVAL;
} priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
if(!priv)
return -ENOMEM; platform_set_drvdata(pdev, priv); priv->pin_key=of_get_gpio(pdev->dev.of_node, );
priv->pin_led=of_get_gpio(pdev->dev.of_node, ); if( gpio_is_valid(priv->pin_key) )
{
if( (res=devm_gpio_request(&pdev->dev, priv->pin_key, "keyled_key")) < )
{
dev_err(&pdev->dev, "can't request key gpio %d\n", priv->pin_key);
return res;
}
dev_info(&pdev->dev, "request key gpio %d ok\n", priv->pin_key); if( (res=gpio_direction_input(priv->pin_key)) < )
{
dev_err(&pdev->dev, "can't request input direction key gpio %d\n", priv->pin_key);
return res;
}
dev_info(&pdev->dev, "request input direction key gpio %d ok\n", priv->pin_key); printk(KERN_INFO "Key gpio current status: %d\n", gpio_get_value(priv->pin_key)); res = request_irq( gpio_to_irq(priv->pin_key), key_detect_interrupt, IRQF_TRIGGER_FALLING, "keyled", priv);
if( res )
{
dev_err(&pdev->dev, "can't request IRQ<%d> for key gpio %d\n", gpio_to_irq(priv->pin_key), priv->pin_key);
return -EBUSY;
}
dev_info(&pdev->dev, "request IRQ<%d> for key gpio %d ok\n", gpio_to_irq(priv->pin_key), priv->pin_key);
} if( gpio_is_valid(priv->pin_led) )
{
if( (res=devm_gpio_request(&pdev->dev, priv->pin_led, "keyled_led")) < )
{
dev_err(&pdev->dev, "can't request key gpio %d\n", priv->pin_led);
return res;
} if( (res=gpio_direction_output(priv->pin_led, )) < )
{
dev_err(&pdev->dev, "can't request output direction key gpio %d\n", priv->pin_led);
return res;
}
} return ;
} static int at91_keyled_remove(struct platform_device *pdev)
{
keyled_priv_t *priv = platform_get_drvdata(pdev); printk(KERN_INFO "at91_keyled driver remove\n"); devm_gpio_free(&pdev->dev, priv->pin_led);
devm_gpio_free(&pdev->dev, priv->pin_key); free_irq(gpio_to_irq(priv->pin_key), priv); devm_kfree(&pdev->dev, priv); return ;
} static struct platform_driver at91_keyled_driver = {
.probe = at91_keyled_probe,
.remove = at91_keyled_remove,
.driver = {
.name = "key-leds",
.of_match_table = of_key_leds_match,
},
}; module_platform_driver(at91_keyled_driver); MODULE_AUTHOR("guowenxue <guowenxue@gmail.com>");
MODULE_DESCRIPTION("AT91 Linux DTS GPIO driver for Key and LED");
MODULE_LICENSE("GPL");
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. 任正非:华为三十年大限快到了 想不死就得新生(建立战略预备队)cool

    华为心声社区官方微信今日发布了任正非8月15日在华为公司内部做的关于战略预备队建设汇报的讲话.讲话内容中提到,华为公司需要组织.结构.人才等所有一切都变化,通过变化使新的东西成长起来.   任正非表示 ...

  2. Cursor的moveToFirst和moveToNext

    参考: http://blog.csdn.net/kerlw/article/details/6126448 总结: 查询得到的cursor是指向第一条记录之前的,因此查询得到cursor后第一次调用 ...

  3. Android textAppearance的属性设置及TextView属性详解

    textAppearance的属性设置 android:textAppearance="?android:attr/textAppearanceSmall" android:tex ...

  4. XP中IIS“HTTP 500 - 内部服务器错误”解决方法

    我先把主要过程叙述一下,叙述完有每个问题的具体操作方法. 今天我在XP上安装IIS,运行网站出现"HTTP 500 - 内部服务器错误". 打开HTML没有问题,打开ASP文件时就 ...

  5. oracle查询转换_inlist转换

    oracle的optimizer会对一些sql语句进行查询转换,比如: 合并视图 子查询非嵌套化 inlist转换 下面讲讲遇到的in list转化优化的案例: create table test( ...

  6. spoolsv.exe 报错,无法打印

    在使用打印机过程中突然出现spoolsv.exe应用程序错误,内存不能written•••,检查打印驱动,打印机设置选项无法打开.怀疑是病毒所致,升级杀毒软件后安全模式下杀毒后没有发现病毒,重启后还是 ...

  7. sql server 2008中id如何设为自增

    通过 IDENTITY 来设置 参数有2个,一个是“初始值” 一个是“增量”.默认情况下 INSERT 语句中,不能对 IDENTITY 的字段进行赋值. create table web_produ ...

  8. HDU 5936 Difference 【中途相遇法】(2016年中国大学生程序设计竞赛(杭州))

    Difference Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  9. Bzoj 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 二分

    1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1272  Solve ...

  10. Web开发,如何从小工到专家

    最近在研读关于“整体性学习”的一些东西,收获颇丰. 整体性学习强调的东西有三样:结构.模型.与高速通道.特别是关于结构的篇章: 理解是什么?理解就是结构高度发达完善的结果. 是不是有些学科你可以轻松“ ...