linux中创建gpio节点
转自:http://blog.chinaunix.net/uid-29165999-id-4296162.html
#define GPIO_MAJOR 230 // major device NO.
#define GPIO_MINOR 0 // minor device NO.
#define DEVICE_NAME "gpios"
#define SET_OUTPUT_LOW 0
#define SET_OUTPUT_HIGH 1
#define GET_VALUE 2
#define SET_INPUT 3
static struct class *gpio_class;
static struct gpio gpio_array[] =
{
{ GPIO_TO_PIN(0, 0), GPIOF_OUT_INIT_LOW, "RTU_WDI_SIGNAL" },
{ GPIO_TO_PIN(0, 1), GPIOF_OUT_INIT_HIGH, "RTU_PLC_BAK_IO1"},
};
static int gpio_open(struct inode *inode,struct file *file)
{
printk(KERN_WARNING"gpio open success!\n");
return 0;
}
static int gpio_release(struct inode *inode, struct file *filp)
{
printk (KERN_ALERT "Device gpio released\n");
return 0;
}
static long gpio_ioctl(struct file *file,unsigned int cmd,unsigned long gpio)
{
int i;
unsigned long gpio_num = (gpio/100)*16+gpio%100;
for (i = 0; i < ARRAY_SIZE(gpio_array); i++) {
if(gpio_array[i].gpio == gpio_num)
goto valid_gpio;
}
return -1;
valid_gpio:
switch(cmd)//cmd表示应用程序传入的 GPIO 动作
{
case SET_OUTPUT_LOW://0
{
gpio_direction_output(gpio_num, 0);
break;
}
case SET_OUTPUT_HIGH://1
{
gpio_direction_output(gpio_num, 1);
break;
}
case GET_VALUE://2
{
return gpio_get_value(gpio_num);
}
case SET_INPUT://3
{
gpio_direction_input(gpio_num);
break;
}
default:
{
printk(KERN_EMERG "GPIO command mistake!!!\n");
break;
}
}
return 0;
}
static const struct file_operations gpio_fops =
{
.owner = THIS_MODULE,
.open = gpio_open,
.release = gpio_release,
.unlocked_ioctl = gpio_ioctl,
};
//驱动加载函数
static int __init gpio_init(void)
{
int ret;
//注册一些列GPIO
ret = gpio_request_array(gpio_array, ARRAY_SIZE(gpio_array));
if (ret < 0)
{
printk(KERN_EMERG "GPIO request failed\n");
goto request_failed;
}
const char *name = DEVICE_NAME;
dev_t my_dev_no;
struct cdev *gpio_cdev;
//分配cdev结构体
gpio_cdev = cdev_alloc();
if(gpio_cdev == NULL)
{
printk(KERN_EMERG "Cannot alloc cdev\n");
goto request_failed;
}
//初始化cdev结构体
cdev_init(gpio_cdev,&gpio_fops);
gpio_cdev->owner=THIS_MODULE;
int result=alloc_chrdev_region(&my_dev_no,0,1,DEVICE_NAME); //动态分配设备号
if(result < 0)
{
printk(KERN_EMERG "alloc_chrdev_region failed\n");
goto request_failed;
}
kobject_set_name(&cdev->kobj, "%s", name);
ret=cdev_add(gpio_cdev,my_dev_no,1);
if(ret < 0)
{
printk(KERN_EMERG "GPIO register failed\n");
goto request_failed;
}
//在sysfs文件系统下创建一个类
gpio_class = class_create(THIS_MODULE, DEVICE_NAME);
//在/dev中创建设备节点
device_create(gpio_class, NULL, my_dev_no, NULL, DEVICE_NAME);
return ret;
request_failed:
gpio_free_array(gpio_array, ARRAY_SIZE(gpio_array));
return ret;
}
static void __exit gpio_exit(void)
{
device_destroy(gpio_class, MKDEV(GPIO_MAJOR, GPIO_MINOR));
class_unregister(gpio_class);
unregister_chrdev(GPIO_MAJOR, DEVICE_NAME);
}
module_init(gpio_init);
module_exit(gpio_exit);
MODULE_LICENSE("GPL");
转载于:https://www.cnblogs.com/dirt2/p/5893756.html
linux中创建gpio节点相关推荐
- 在Linux中创建静态库和动态库 (转)
我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态 库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而 ...
- 在Linux中创建静态库.a和动态库.so
转自:http://www.cnblogs.com/laojie4321/archive/2012/03/28/2421056.html 在Linux中创建静态库.a和动态库.so 我们通常把一些公用 ...
- 如何在终端窗口中在Linux中创建文件?
本文翻译自:How to create a file in Linux from terminal window? 在Linux终端中创建文件最简单的方法是什么? #1楼 参考:https://sta ...
- linux创建分区_在Linux中创建分区-分步指南
linux创建分区 In this tutorial, we'll be covering the steps to create a partition in Linux. This can hel ...
- linux创建磁盘的命令,linux中创建磁盘分区的命令是什么
linux中创建磁盘分区的命令是fdisk.具体方法是:1.进入root,查看所有磁盘的分区情况:2.执行命令[fdisk /dev/sdc],对sdc磁盘进行分区:3.依次输入n.p创建主分区即可. ...
- linux中磁盘分区命令是什么,linux中创建磁盘分区的命令是什么
linux中创建磁盘分区的命令是fdisk.具体方法是:1.进入root,查看所有磁盘的分区情况:2.执行命令[fdisk /dev/sdc],对sdc磁盘进行分区:3.依次输入n.p创建主分区即可. ...
- Linux中创建python项目的虚拟环境virtual enviroment
Linux中创建python项目的虚拟环境virtual enviroment Linux环境下创建Python项目的虚拟环境: 进入python的项目文件下 cd 你的项目路径 使用virtuale ...
- Linux中创建Daemon进程的三种方法
Linux中创建Daemon进程的三种方法 什么是daemon进程? Unix/Linux中的daemon进程类似于Windows中的后台服务进程,一直在后台运行运行,例如http服务进程nginx, ...
- linux建立文件的符号链接,如何在Linux中创建符号链接[完整指南]
Linux中的符号链接是什么,为什么使用它? 符号链接(也称为符号链接或软链接)是一种特殊类型的文件,它只是指向另一个文件或目录,就像Windows中的快捷方式一样,创建符号链接就像为实际文件创建别名 ...
最新文章
- python编写通讯录管理系统_一个简单的python程序实例(通讯录)
- 在window平台运行Dubbo的一个小demo
- 机器学习降维算法一:PCA(主成分分析算法)
- 基于块的纹理合成 matlab程序,基于块的纹理合成方法和装置制造方法
- css颜色渐变 移动,CSS颜色渐变
- 计算机机考试卷分析,考试试卷分析与反思
- 五大常用算法(一) - 分治算法
- 网吧如何修改dns服务器地址,网吧更改dns服务器地址
- 直播svga礼物特效怎样制作流程
- 在vc++如何响应键盘和鼠标事件-visual c++
- 中国抗生素产业运行状况与需求前景规模预测报告2022版
- 【已解决】Object of type ’int64‘ is not JSON serializable python
- 万万没想到,低功耗也会烧毁元器件?
- 《庄子·杂篇·庚桑楚第二十三》
- 老男孩网络安全第八期
- pythoneducoder苹果梨子煮水的功效_荸荠和梨子一起煮的好处
- 计算机用固态硬盘无法启动不了,windows10系统安装固态硬盘开启AHCI后开不了机怎么办...
- 用数学规划的方式求解优化问题
- OpenCV学习十:blur、GaussianBlur、medianBlur 、bilateralFilter 图片的模糊、高斯模糊、中值模糊、二值滤波(课程里将模糊与滤波认定为一样) 以及 锐化算子
- python------帮助小学生练习10以内的加法
热门文章
- Understand Tasks and Back Stack--Defining launch modes
- 解决Unable to create group (name already exists)
- Flutter混合开发:Android中如何启动Flutter
- js冒泡法和数组转换成字符串
- 《人月神话》---1
- [py][mx]django form验证-给db减压
- 大数据实时计算工程师/Hadoop工程师/数据分析师职业路线图
- CSS 锦囊[收藏]
- P4213 【模板】杜教筛
- Azure VNet介绍