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设备虚拟文件结点的创建【转】相关推荐
- 《Linux驱动:设备节点文件的创建过程》
文章目录 一.前言 二.uevent机制 2.1 Sysfs文件系统 2.2 Kobject的事件类型 三.mdev应用程序 3.1 mdev的配置文件 四.实例分析 4.1 uevent机制 4.2 ...
- [Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)热门干货
点击打开链接 温馨提示 建议你先了解一下上一篇博文([Android L]SEAndroid增强Androd安全性背景概要及带来的影响)所讲的内容,先对SEAndroid窥个全貌,然后再继续 ...
- linux内核创建节点,Linux内核驱动自动创建设备节点文件
Linux下生成驱动设备节点文件的方法有3个:1.手动mknod:2.利用devfs:3.利用udev 在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上L ...
- VirtualBox问题——无法在父文件夹中创建虚拟文件夹
创建新系统提示无法在父文件夹中创建虚拟文件夹 解决:以管理员的身份运行VirtualBox
- 怎么linux中创建虚拟路径,linux服务器创建虚拟路径解决文件上传路径隔离问题...
需求环境 图片上传最简单的就是上传web项目下,这样图片与项目不可分离会产生很多不必要的影响.例如:重新部署项目需要把所有上传的图片再copy一份等. 图片与项目分离有好几种方式: 方式一.在linu ...
- linux gpio设备驱动程序,嵌入式Linux设备驱动开发之:GPIO驱动程序实例-嵌入式系统-与非网...
11.3 GPIO驱动程序实例 11.3.1 GPIO工作原理 FS2410开发板的S3C2410处理器具有117个多功能通用I/O(GPIO)端口管脚,包括GPIO 8个端口组,分别为GPA(2 ...
- macos 虚拟镜像文件_如何在macOS中使用虚拟文件测试网络或硬盘速度
macos 虚拟镜像文件 File transfer speeds can vary greatly from device to device. The same holds true for ne ...
- 如何在Windows中使用虚拟文件测试网络或硬盘速度
If you want to see how fast your network really is, or test the speed between two hard drives, then ...
- windows在explorer中添加虚拟文件夹(Virtual Folder)
0x00 前言 今天安装软件,发现C盘空间竟然只有70多G,我也没装太多东西啊,怎么就250G的空间剩这么点了?! 想着直接用WinDirStat扫描分析下看看是什么文件占用了空间,使用WIN+ ...
- 【Linux】Linux常用命令--文件打开、创建、移动、用户管理权限等相关命令
目录 一.关于Linux文件目录 二.Linux常用命令 1.文件的打开显示命令 1.1 ls命令 1.2 cd命令 1.3 vim命令 2.文件夹的创建/删除/移动命令 2.1创建 2.2删除 2. ...
最新文章
- str.split() 与 str.split(‘ ‘)区别
- 花马云10亿无作为,被同事骂的当众落泪,后为阿里创造4500亿价值
- 组件化的css-module
- win7 安装apache2.2服务错误
- micropython固件源码_Micropython加速物联网开发7 - Micropython源码编译与固件更新
- apollo动态切换mysql数据源_log4j2从Apollo初始化配置并可动态变更
- 五一假期期间 全国快递包裹揽投量同比增长约四成
- 利用,ArrayList,HashMap,洗牌,发牌,看牌。
- C++编程笔记(QT)
- mac m1 解决fatal: unable to access ‘https://github.com/Homebrew/homebrew-core/‘ ;同时指定intel架构的brew 版本
- 机器学习常用的六种分类方法,Python代码详细都在这里!
- 为了研究而玩:游戏分析的方法
- 工程师笔记|UPS启动期间,VxRail的这招也许能救命
- 读取EXCEL表格数据到MATLAB成为矩阵
- 全球2018OpenStack用户调查报告亮点一览
- 【VS Code配置matlab】
- movie_recommendation_spark1
- (教程) 个人微信公众号做查券机器人怎么关联优惠券小程序?
- 【MYSQL】ERROR 1366 (HY000)
- [FAQ09717]如何去掉mtk自行开发的OOBE快速向导 功能中的某段操作引导视频的播放?
热门文章
- 计算机平均成绩等级公式,全国高校计算机等级考4.doc
- linux c语言math lm pow,C语言pow()函数实现求x的y次方的值
- php模拟邮箱登录2017,php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录(原创)...
- 微信缓存怎么解决,看这儿
- pr新建字幕样式(模板)
- 入行 AI,如何选个脚踏实地的岗位?
- 苹果电池显示维修_iFixit拆解苹果iPhone 12/Pro:显示屏和电池可互换
- Qt知识点梳理 —— 实现汉字转拼音全拼简拼及首字母
- linux主机如何安装杀毒软件,Linux 杀毒软件ClamAV安装部署
- matplotlib报错:Glyph 25151 (\N{CJK UNIFIED IDEOGRAPH-623F}) missing from current font. func(*args)