GPIO设备虚拟文件结点的创建【转】
本文转载自: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设备虚拟文件结点的创建【转】的更多相关文章
- class_create(),device_create自动创建设备文件结点
class_create(),device_create自动创建设备文件结点 从linux 内核2.6的某个版本之后,devfs不复存在,udev成为devfs的替代.相比devfs,udev有很多优 ...
- GPIO硬件资源的申请,内核空间和用户空间的数据交换,ioctl(.....),设备文件的自动创建
1.通过GPIO库函数控制LED open("/dev/myleds",...) close(fd) ----------------------------- ...
- [Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)
温馨提示 建议你先了解一下上一篇博文([Android L]SEAndroid增强Androd安全性背景概要及带来的影响)所讲的内容,先对SEAndroid窥个全貌,然后再继续本节内容. ...
- 【RT-Thread笔记】IO设备模型及GPIO设备
RTT内核对象--设备 RT-Thread有多种内核对象,其中设备device就是其中一种. 内核继承关系图如下: 设备继承关系图如下: device对象对应的结构体如下: 其中,设备类型type有如 ...
- Visual Studio(VS2012) Project&(Solution) 虚拟文件夹 & 物理文件夹
今天发生个怪事:在 Solution Explorer 中,x project 内建立文件夹(folder)时,同时在磁盘目录下也创建了同名的文件夹. 1, 原本:应该只是创建一个“虚拟文件夹”用来“ ...
- Ubuntu升级后apache所有的失败,以解决虚拟文件夹的设置
问题描述: 将Ubuntu离12.04升级到14.04后,出现apache配置的虚拟文件夹所有失效.所有站点域名所有定向到根文件夹.无法分别訪问! 尝试方法: 開始以为是升级后Apache的问题.已经 ...
- 【Android Developers Training】 41. 向另一台设备发送文件
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- RK3399/NanoPC-T4开发板使用/sys/class/gpio操作外接GPIO设备-【申嵌视频-RK3399篇】
实验2:RK3399/NanoPC-T4开发板使用/sys/class/gpio操作外接GPIO设备,比如外接一个LED模块,通过GPIO1_A0管脚 1 介绍 LED模块 Matrix-LE ...
- Confluence 6 虚拟文件和文件夹
在取消点赞事件中,你可能会遇到 WebDAV 客户端的问题或者不稳定的情况,你可以启用访问自动创建(虚拟)文件和文件夹. 备注: 在默认情况下,这个选项隐藏在 'WebDAV Configurati ...
随机推荐
- 修改Centos默认源
原文:http://mirrors.aliyun.com/help/centos?spm=5176.bbsr150321.0.0.d6ykiD 1.备份 mv /etc/yum.repos.d/Cen ...
- 对国外某hotel的内网域简单渗透
Penetration Testing不单单是一个博客,更热衷于技术分享的平台. 本文将讲述对国外某一hotel的渗透测试,让更多的人安全意识得到提高,有攻才有防,防得在好,也有疏忽的地方,这就是为啥 ...
- kohana nginx的配置
kohana nginx的配置 location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php? kohana_uri=/$1 ...
- Maven自动生成web.xml配置文件
没有这个文件会报错误的: 1. 2.在Maven下面设置这个: src/main/webapp OK生成了
- Pentaho Work with Big Data(五)—— 格式化原始web日志
本演示样例说明怎样使用Pentaho MapReduce把原始web日志解析成格式化的记录. 一.向HDFS导入演示样例数据文件 将weblogs_rebuild.txt文件放到HDFS的/user/ ...
- 关于cocos2d-x 和安卓之间的相互调用
近期在研究cocos2d游戏移植安卓须要调用非常多方法.所以在研究之中写下它们之间相互调用 首先,cocos2d调用安卓 在一个.h文件里加入头文件 #include <jni.h> #i ...
- Chrome自带恐龙小游戏的源码研究(三)
在上一篇<Chrome自带恐龙小游戏的源码研究(二)>中实现了云朵的绘制和移动,这一篇主要研究如何让游戏实现昼夜交替. 昼夜交替的效果主要是通过样式来完成,但改变样式的时机则由脚本控制. ...
- js获取和设置属性的方法
function square(num){ var total = num*num;//局部变量 return total;}var total = 50;//全局变量var number ...
- PHPExcel简易使用教程
在企业里使用PHP进行开发,不可避免总会遇到读/写Excel的需求,遇到这种需求,一般使用PHPExcel类库进行开发. PHPExcel现在最新版本是1.8.0,最低需要PHP5.2版本,支持读取x ...
- Python学习总结之三 -- 优雅的字符串
优雅的字符串 前言 记得我在Python学习总结第一篇中有提到字符串,那个可以算是先打个招呼吧,因为没有提到任何关于字符串的处理方法.今天,给大家详细讲解一下Python中字符串的使用方法,如有不当或 ...