本文转载自:http://blog.csdn.net/dwyane_zhang/article/details/6742066

所谓GPIO设备虚拟文件结点,就是方便用户在应用程序直接操纵GPIO的值。

1.首先必须了解static DEVICE_ATTR(GPS_nRST, 0644, gps_reset_show, gps_reset_store); 这个函数的意思。

“GPS_nRST“是要操纵的引脚,“0644”创建文件结点的权限,“gps_reset_show”结点的读状态,“gps_reset_store”结点的写状态。

通过这个函数既是填充文件结点。

2.最终注册是通过 device_create_file(&pdev->dev, &dev_attr_GPS_nRST); 注册上的。注意参数pdev->dev必须是在板载信息里要初始化的。

参数&dev_attr_GPS_nRST即是引脚GPS_nRST,只不过前面加一个dev_attr_是格式上的要求。

下面贴上自己写的代码以供参考。

#include <Linux/module.h>
#include <linux/mman.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/spinlock.h>
#include <linux/delay.h>
#include <linux/sysdev.h>
#include <linux/errno.h>
#include <linux/io.h>
#include <linux/device.h>
#include <mach/gpio.h>
#include <linux/platform_device.h>
#include "gpio_gps.h"

#include <asm/uaccess.h>
#include <mach/hardware.h>
#include <linux/device.h>

#define nRST  85 
#define PWON  87

static ssize_t gps_standby_show(struct device *dev,
  struct device_attribute *attr, char *buf)
{
 int len = 0;
 struct gps_gpio_platform_data *pdata = dev->platform_data;

len += sprintf(buf + len, "%u\n", pdata->standby_state);
 printk("======== %s len = %d\n",__func__,len);
 return len;
}

static ssize_t gps_standby_store(struct device *dev,
  struct device_attribute *attr, const char *buf, size_t size)
{

unsigned long state = simple_strtoul(buf, NULL, 10);
 struct gps_gpio_platform_data *pdata = dev->platform_data;

pdata->standby_state = (int)state;
 printk("\n ****** standby_state = %d \n",pdata->standby_state);

if(state)         //如果读的到数据,就拉高电平
  gpio_direction_output(PWON, 1); //standby on
 else
  gpio_direction_output(PWON, 0); //standby off

return size;
}

static ssize_t gps_reset_show(struct device *dev,
  struct device_attribute *attr, char *buf)
{
 int len = 0;
 struct gps_gpio_platform_data *pdata = dev->platform_data;

len += sprintf(buf + len, "%u\n", pdata->reset_state);
 printk("======== %s len = %d\n",__func__,len);

return len;
}

static ssize_t gps_reset_store(struct device *dev,
  struct device_attribute *attr, const char *buf, size_t size)
{

unsigned long state = simple_strtoul(buf, NULL, 10);
 struct gps_gpio_platform_data *pdata = dev->platform_data;
 printk("\n ******%s  %s  line = %d \n",__func__,__FILE__,__LINE__);

pdata->reset_state = (int)state;
 printk("\n ****** reset_state = %d \n",pdata->reset_state);

if(state)
  gpio_direction_output(nRST, 1); //reset on
 else
  gpio_direction_output(nRST, 0); //reset off

return size;
}

static DEVICE_ATTR(GPS_nRST, 0644, gps_reset_show, gps_reset_store);
static DEVICE_ATTR(GPS_PWR_EN, 0644, gps_standby_show, gps_standby_store);

#if 0
static struct device_attribute GPS_nRST = {
 .attr = {
  .name = "gps_reset",
  .mode = 0644,
 },
 .show = gps_reset_show,
 .store = gps_reset_store,
};

static struct device_attribute GPS_PWR_EN = {
 .attr = {
  .name = "gps_poweron",
  .mode = 0644,
 },
 .show = gps_standby_show,
 .store = gps_standby_store,
};
#endif
#if 0
static struct msm_gpio msm_gps_cfg_data[] = {
 {GPIO_CFG(85, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "gps_reset"},
 {GPIO_CFG(87, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), "gps_poweron"},
};
#endif
static int gps_gpio_probe(struct platform_device *pdev)
{
    int ret;
    struct gps_gpio_platform_data *pdata = pdev->dev.platform_data;

   // 这里的gps_gpio_platform_data *pdata要注意,其中struct gps_gpio_platform_data 结构体在板载信息board-msm7630.c中也要声明,并与此函数保持一致,

    // 而pdata也要填充。
#if 0
    msm_gpios_request_enable(msm_gps_cfg_data,
                         ARRAY_SIZE(msm_gps_cfg_data));
#endif
    gpio_request(PWON, "gps_poweron");  //standby
    gpio_request(nRST, "gps_reset");  //reset

pdata->standby_state = 0;       // 初始化的状态
    pdata->reset_state = 1;
    //    mv_gpio_set_out_data(2, 1);//32kHz clk_en
#if 0
    gpio_direction_output(nRST, 0); //reset off
    mdelay(200);
    gpio_direction_output(nRST, 1); //reset on
    mdelay(200);
    gpio_direction_output(PWON, 1); //standby on
#endif
    ret = device_create_file(&pdev->dev, &dev_attr_GPS_nRST);
//    ret = device_create_file(&pdev->dev, &GPS_PWR_EN);
    printk("//////   ret  = %d \n",ret);
    if(ret)
        return ret;
    else
        return device_create_file(&pdev->dev, &dev_attr_GPS_PWR_EN);
        //return device_create_file(&pdev->dev, &GPS_nRST);
}

static int gps_gpio_remove(struct platform_device *pdev)
{
//    struct gps_gpio_platform_data *pdata = pdev->dev.platform_data;
    gpio_direction_output(PWON, 0);
    gpio_direction_output(nRST, 0);
    return 0;
}

struct platform_driver gps_gpio_driver = {
    .probe = gps_gpio_probe,
    .remove = gps_gpio_remove,
    .driver = {
        .name   = "gps_gpio",
        .owner  = THIS_MODULE,
    },
};

static int __init gps_gpio_init(void)
{
    return platform_driver_register(&gps_gpio_driver);
}

static void __exit  gps_gpio_exit(void)
{
    platform_driver_unregister(&gps_gpio_driver);
}

late_initcall(gps_gpio_init);
module_exit(gps_gpio_exit);

MODULE_AUTHOR("zhangmin");
MODULE_LICENSE("GPL v2");

红色的部分是另外一种注册GPIO结点的写法。

上面就是我加设备结点的全过程,建立完后会在/sys/devices/platform/gps-gpio.0/GPS_nRST、/sys/devices/platform/gps-gpio.0/GPS_PWR_EN 会有两个结点。

我们可以在adb shell中自由的控制电平的引脚。如 echo 1 > /sys/devices/platform/gps-gpio.0/GPS_nRST 即是把GPS_nRST 引脚拉高 ,

echo 0 > /sys/devices/platform/gps-gpio.0/GPS_nRST 即是把GPS_nRST 引脚拉低。

在应用程序用这个结点的时候要注意是否操作权限一致的问题,比如都要是root权限即可操作了。

GPIO设备虚拟文件结点的创建【转】的更多相关文章

  1. class_create(),device_create自动创建设备文件结点

    class_create(),device_create自动创建设备文件结点 从linux 内核2.6的某个版本之后,devfs不复存在,udev成为devfs的替代.相比devfs,udev有很多优 ...

  2. GPIO硬件资源的申请,内核空间和用户空间的数据交换,ioctl(.....),设备文件的自动创建

    1.通过GPIO库函数控制LED   open("/dev/myleds",...)       close(fd)   ----------------------------- ...

  3. [Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)

    温馨提示      建议你先了解一下上一篇博文([Android L]SEAndroid增强Androd安全性背景概要及带来的影响)所讲的内容,先对SEAndroid窥个全貌,然后再继续本节内容.   ...

  4. 【RT-Thread笔记】IO设备模型及GPIO设备

    RTT内核对象--设备 RT-Thread有多种内核对象,其中设备device就是其中一种. 内核继承关系图如下: 设备继承关系图如下: device对象对应的结构体如下: 其中,设备类型type有如 ...

  5. Visual Studio(VS2012) Project&(Solution) 虚拟文件夹 & 物理文件夹

    今天发生个怪事:在 Solution Explorer 中,x project 内建立文件夹(folder)时,同时在磁盘目录下也创建了同名的文件夹. 1, 原本:应该只是创建一个“虚拟文件夹”用来“ ...

  6. Ubuntu升级后apache所有的失败,以解决虚拟文件夹的设置

    问题描述: 将Ubuntu离12.04升级到14.04后,出现apache配置的虚拟文件夹所有失效.所有站点域名所有定向到根文件夹.无法分别訪问! 尝试方法: 開始以为是升级后Apache的问题.已经 ...

  7. 【Android Developers Training】 41. 向另一台设备发送文件

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. RK3399/NanoPC-T4开发板使用/sys/class/gpio操作外接GPIO设备-【申嵌视频-RK3399篇】

    实验2:RK3399/NanoPC-T4开发板使用/sys/class/gpio操作外接GPIO设备,比如外接一个LED模块,通过GPIO1_A0管脚 1 介绍   LED模块   Matrix-LE ...

  9. Confluence 6 虚拟文件和文件夹

    在取消点赞事件中,你可能会遇到 WebDAV  客户端的问题或者不稳定的情况,你可以启用访问自动创建(虚拟)文件和文件夹. 备注: 在默认情况下,这个选项隐藏在 'WebDAV Configurati ...

随机推荐

  1. ElasticSearch查询max_result_window问题处理

    需要出一份印地语文章的表,导出规则为: 1.所有印地语(包含各种颜色,各种状态)的文章 2.阅读数大于300 3.按照阅读推荐比进行排序,取前3000篇文章 说明: 1.文章信息,和阅读推荐数量在两个 ...

  2. CentOS---网络配置具体解释

    一.配置文件具体解释 在RHEL或者CentOS等Redhat系的Linux系统里.跟网络有关的主要设置文件例如以下: /etc/host.conf         配置域名服务client的控制文件 ...

  3. 数据结构基础-Hash Table详解(转)

    理解Hash 哈希表(hash table)是从一个集合A到另一个集合B的映射(mapping). 映射是一种对应关系,而且集合A的某个元素只能对应集合B中的一个元素.但反过来,集合B中的一个元素可能 ...

  4. struts2获取文件真实路径

      CreateTime--2017年8月25日15:59:33 Author:Marydon struts2获取文件真实路径 需要导入: import java.io.FileNotFoundExc ...

  5. MySQL常用经典语句

    http://www.cnblogs.com/see7di/archive/2010/04/27/2239909.html MySQL常用经典语句 .重命名表ALTER TABLE tbl1 RENA ...

  6. win10系统架构调用

    操作系统模型 操作系统有两种模式: 用户模式 内核模式 当用户模式调用系统服务时,CPU执行一个特殊的指令以切换到内核模式(Ring0),当系统服务调用完成时,操作系统切换回用户模式(Ring3).  ...

  7. Oracle:创建存储过程

    1.无参存储过程 create or replace procedure test_procasv_total number(10);begin  select count(*) into v_tot ...

  8. 【转】安卓apk反编译、修改、重新打包、签名全过程

    首先明确,反编译别人apk是一件不厚道的事情.代码是程序员辛苦工作的成果,想通过这种手段不劳而获,是不对的.这也说明,代码混淆是非常重要的.本文抱着学习的态度,研究在一些特殊的情况下如果有需要,该怎么 ...

  9. Emgu安装配置及使用

    前言:项目需要,需使用图像处理来完成机械臂从运动的皮带上抓取物体的功能,所以又重拾视觉与图像处理内容. 内容:Emgu是OpenCV的一个跨平台的.NET封装,结构如下图所示: 下载地址:http:/ ...

  10. ms人物上线

    在看MS人物上线 else if(gs2ms_add_player == pkt.cmd) { PlayerChannel* pPC = new PlayerChannel(this); //加到地图 ...