转自: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节点相关推荐

  1. 在Linux中创建静态库和动态库 (转)

    我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态 库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而 ...

  2. 在Linux中创建静态库.a和动态库.so

    转自:http://www.cnblogs.com/laojie4321/archive/2012/03/28/2421056.html 在Linux中创建静态库.a和动态库.so 我们通常把一些公用 ...

  3. 如何在终端窗口中在Linux中创建文件?

    本文翻译自:How to create a file in Linux from terminal window? 在Linux终端中创建文件最简单的方法是什么? #1楼 参考:https://sta ...

  4. linux创建分区_在Linux中创建分区-分步指南

    linux创建分区 In this tutorial, we'll be covering the steps to create a partition in Linux. This can hel ...

  5. linux创建磁盘的命令,linux中创建磁盘分区的命令是什么

    linux中创建磁盘分区的命令是fdisk.具体方法是:1.进入root,查看所有磁盘的分区情况:2.执行命令[fdisk /dev/sdc],对sdc磁盘进行分区:3.依次输入n.p创建主分区即可. ...

  6. linux中磁盘分区命令是什么,linux中创建磁盘分区的命令是什么

    linux中创建磁盘分区的命令是fdisk.具体方法是:1.进入root,查看所有磁盘的分区情况:2.执行命令[fdisk /dev/sdc],对sdc磁盘进行分区:3.依次输入n.p创建主分区即可. ...

  7. Linux中创建python项目的虚拟环境virtual enviroment

    Linux中创建python项目的虚拟环境virtual enviroment Linux环境下创建Python项目的虚拟环境: 进入python的项目文件下 cd 你的项目路径 使用virtuale ...

  8. Linux中创建Daemon进程的三种方法

    Linux中创建Daemon进程的三种方法 什么是daemon进程? Unix/Linux中的daemon进程类似于Windows中的后台服务进程,一直在后台运行运行,例如http服务进程nginx, ...

  9. linux建立文件的符号链接,如何在Linux中创建符号链接[完整指南]

    Linux中的符号链接是什么,为什么使用它? 符号链接(也称为符号链接或软链接)是一种特殊类型的文件,它只是指向另一个文件或目录,就像Windows中的快捷方式一样,创建符号链接就像为实际文件创建别名 ...

最新文章

  1. python编写通讯录管理系统_一个简单的python程序实例(通讯录)
  2. 在window平台运行Dubbo的一个小demo
  3. 机器学习降维算法一:PCA(主成分分析算法)
  4. 基于块的纹理合成 matlab程序,基于块的纹理合成方法和装置制造方法
  5. css颜色渐变 移动,CSS颜色渐变
  6. 计算机机考试卷分析,考试试卷分析与反思
  7. 五大常用算法(一) - 分治算法
  8. 网吧如何修改dns服务器地址,网吧更改dns服务器地址
  9. 直播svga礼物特效怎样制作流程
  10. 在vc++如何响应键盘和鼠标事件-visual c++
  11. 中国抗生素产业运行状况与需求前景规模预测报告2022版
  12. 【已解决】Object of type ’int64‘ is not JSON serializable python
  13. 万万没想到,低功耗也会烧毁元器件?
  14. 《庄子·杂篇·庚桑楚第二十三》
  15. 老男孩网络安全第八期
  16. pythoneducoder苹果梨子煮水的功效_荸荠和梨子一起煮的好处
  17. 计算机用固态硬盘无法启动不了,windows10系统安装固态硬盘开启AHCI后开不了机怎么办...
  18. 用数学规划的方式求解优化问题
  19. OpenCV学习十:blur、GaussianBlur、medianBlur 、bilateralFilter 图片的模糊、高斯模糊、中值模糊、二值滤波(课程里将模糊与滤波认定为一样) 以及 锐化算子
  20. python------帮助小学生练习10以内的加法

热门文章

  1. Understand Tasks and Back Stack--Defining launch modes
  2. 解决Unable to create group (name already exists)
  3. Flutter混合开发:Android中如何启动Flutter
  4. js冒泡法和数组转换成字符串
  5. 《人月神话》---1
  6. [py][mx]django form验证-给db减压
  7. 大数据实时计算工程师/Hadoop工程师/数据分析师职业路线图
  8. CSS 锦囊[收藏]
  9. P4213 【模板】杜教筛
  10. Azure VNet介绍