代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C
】
简单的GPIO驱动
作者:
简单的GPIO驱动模板
/ 发布于
2011/6/7
/
726
#include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/mm.h> #include <linux/sched.h> #include <linux/init.h> #include <linux/cdev.h> #include <linux/slab.h> #include <asm/io.h> #include <asm/system.h> #include <asm/uaccess.h></div> <div>define DEVICE_NAME "GPIODEVICE"//定义设备名 #define GPIO_MAJOR 231//定义主设备号 #defineGPIO_MAGIC 0xBB //定义幻数</div> <div>//定义操作 #defineCMD_SOME _IO(GPIO_MAGIC, 0)</div> <div>//设置主设备号 static int gpio_major = GPIO_MAJOR; //static dev_t devno = MKDEV(GPIO_MAJOR, 0);</div> <div>//定义设备结构体 struct gpio_dev { struct cdev cdev; struct semaphore sem;//定义信号量 };</div> <div>struct gpio_dev *gpio_devp;</div> <div>///////////////////////////////////////////////////// //open函数 static int gpio_open(struct inode *inode, struct file *filp) { struct gpio_dev *dev; dev = container_of(inode->i_cdev, struct gpio_dev, cdev);//通过结构体成员指针找到对应结构体的指针 filp->private_data = dev;//将设备结构体指针赋给文件私有数据指针 printk("gpio device opened\n"); //TODO return 0; } <div>//release函数 int gpio_release(struct inode *inode, struct file *filp) { printk("gpio device released\n"); //TODO return 0; } <div>//read函数 static ssize_t gpio_read(struct file *filp, char __user *buf, size_t count, loff_t *offp) { struct gpio_dev *dev = filp->private_data; down(&dev->sem);//获得信号量 printk("gpio device readed\n"); //TODO up(&dev->sem);//释放信号量 return 0; } <div>//write函数 static ssize_t gpio_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos) { struct gpio_dev *dev = filp->private_data; down(&dev->sem); printk("led write\n"); //TODO up(&dev->sem); return 0; } <div>//ioctl函数 static int gpio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { switch (cmd) { case CMD_SOME: //TODO return 0; default: return -EINVAL; } } <div>//file_operations static struct file_operations gpio_fops = { .owner = THIS_MODULE, .open = gpio_open, .release = gpio_release, .read = gpio_read, .write = gpio_write, .ioctl = gpio_ioctl, };</div> <div>//初始化并注册cdev static void gpio_setup_cdev(struct gpio_dev *dev, int index) { int err; int devno = MKDEV(gpio_major, index);</div> <div>//初始化cdev,建立与fops的连接 cdev_init(&dev->cdev, &gpio_fops); dev->cdev.owner = THIS_MODULE; dev->cdev.ops = &gpio_fops;</div> <div>//向系统增加一个cdev err = cdev_add(&dev->cdev, devno, 1); if (err) printk("Error %d adding gpio device", err); } <div>static int gpio_init(void) { int result; dev_t devno = MKDEV(gpio_major, 0); //创建设备号</div> <div>//如果定义了设备号,就静态注册,如果没定义就动态注册设备号 if (gpio_major) { result = register_chrdev_region(devno, 1, DEVICE_NAME); } else { result = alloc_chrdev_region(&devno, 0, 1, DEVICE_NAME); gpio_major = MAJOR(devno); } if (result < 0) { printk("Can't register\n"); return result; } <div>//分配内存 gpio_devp = kmalloc(sizeof(struct gpio_dev), GFP_KERNEL);</div> if (!gpio_devp) { result = -ENOMEM; unregister_chrdev_region(devno, 1); return result; } <div>memset(gpio_devp, 0, sizeof(struct gpio_dev)); gpio_setup_cdev(gpio_devp, 0);</div> <div>//初始化信号量 init_MUTEX(&gpio_devp->sem); printk("gpio device init\n"); return 0; } <div>//exit函数 static void gpio_exit(void) { cdev_del(&gpio_devp->cdev); kfree(gpio_devp); unregister_chrdev_region(MKDEV(gpio_major, 0), 1); printk("gpio device exit\n"); } <div>module_init(gpio_init); module_exit(gpio_exit);</div> <div>MODULE_AUTHOR("yisen"); MODULE_DESCRIPTION("GPIO Driver"); // 一些描述信息 MODULE_LICENSE("GPL");</div>
试试其它关键字
GPIO驱动
同语言下
.
获取手机通讯录 iOS去除数字以外的所有字符
.
异步加载音乐等资源
.
交通罚单管理系统
.
freemark实现,简单的替换
.
计算斐波那契数列
.
base64解码 包括解码长度
.
图像显示
.
冒泡排序
.
输入十进制数,输出指定进制
.
链式栈
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
简单的GPIO驱动模板
贡献的其它代码
(
2
)
.
获取系统当前所有物理端口列表(包括串口)及其所有者
.
简单的GPIO驱动
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3