LED字符设备驱动实例及测试代码
驱动代码如下:
#include <linux/kernel.h>//内核头文件
#include <linux/init.h>//__init等
#include <linux/module.h>//模块加载的头文件
#include <linux/fs.h>//file_operations
#include <linux/errno.h>//错误状态常数
#include <linux/types.h>//size_t,ssize_t等 //--------------cdev----------------
#include <linux/cdev.h> //-------------class_create,device_create------
#include <linux/device.h> //--------------GPIO-----------------
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>
#include <mach/regs-gpio.h> //-------CMD COMMAND----------------
#define LED1_ON 0x1
#define LED1_OFF 0x0 #define DEVICE_NAME "LED1" static int led1_gpios[]=
{
S5PV210_MP04(),
S5PV210_MP04(),
S5PV210_MP04(),
S5PV210_MP04()
}; #define LED1_NUM ARRAY_SIZE(led1_gpios) /*用udev机制自动添加设备节点*/
struct class *led1_class; /*设备结构体*/
struct led1_dev_t
{
struct cdev cdev;
}led1_dev; /*
// ------------------- READ ------------------------
ssize_t led1_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)
{
return count;
} // ------------------- WRITE -----------------------
ssize_t led1_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops)
{
return count;
}
// ------------------- OPEN ------------------------
ssize_t led1_open (struct inode * inode ,struct file * file)
{
return 0;
}
// ------------------- RELEASE/CLOSE ---------------
ssize_t led1_release (struct inode * inode ,struct file * file)
{
return 0;
}
// -------------------------------------------------
*/ // ------------------- IOCTL -----------------------
static int led1_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, unsigned long arg)
{
if(arg > LED1_NUM)
{
printk("arg is %u ,led num is %d\n",arg,LED1_NUM);
printk("num is err!!\n");
return - EINVAL;
}
switch (cmd)
{
case LED1_ON:
{
/*code*/
gpio_set_value(led1_gpios[arg],);
printk("led1 is on!!\n");
break;
}
case LED1_OFF:
{
/*code*/
gpio_set_value(led1_gpios[arg],);
printk("led1 is off!!\n");
break;
}
default :
{
printk ("CMD err!!\n");
return - EINVAL;
}
}
return ; } struct file_operations led1_fops ={ .owner = THIS_MODULE,
// .open = led1_open,
// .read = led1_read,
// .write = led1_write,
.ioctl = led1_ioctl,
// .release = led1_release,
}; // ------------------- INIT ------------------------
static int __init led1_init(void)
{
printk("led num is : %d\n",LED1_NUM);
int i,ret;
for (i = ; i < LED1_NUM; i++)
{ /*
ret=gpio_request(led1_gpios[i],"LED1");
if(ret)//注意,是ret
{
printk("%s:request GPIO %d for LED1 failed,ret= %d\n",DEVICE_NAME,led1_gpios[i],ret);
return ret;
}
*/
s3c_gpio_cfgpin(led1_gpios[i],S3C_GPIO_SFN());
gpio_set_value(led1_gpios[i],);
} /*init cdev*/
cdev_init(&led1_dev.cdev,&led1_fops);
led1_dev.cdev.owner=THIS_MODULE; /*向系统动态申请未被占用的设备号*/
ret = alloc_chrdev_region(&led1_dev.cdev.dev,,,DEVICE_NAME);//int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,const char *name) if (ret)
{
printk("register failed\n");
return ret;
} /*添加字符设备*/
ret = cdev_add(&led1_dev.cdev, led1_dev.cdev.dev, );
if (ret)
{
printk("cdev add failed\n");
goto fail1;
}
/*udev机制可以自动添加设备节点,只需要添加xxx_class这个类,以及device_create()*/
led1_class = class_create(THIS_MODULE, "led1_class");/*在sys目录下创建xx_class这个类,/sys/class/~*/
if (IS_ERR(led1_class))
{
printk("class create failed\n");
goto fail2;
}
device_create(led1_class, NULL, led1_dev.cdev.dev, DEVICE_NAME, DEVICE_NAME);/*自动创建设备/dev/$DEVICE_NAME*/
return ret; fail2:
cdev_del(&led1_dev.cdev);
fail1:
unregister_chrdev_region(led1_dev.cdev.dev, );
return ret;
} static void __exit led1_exit(void)
{
int i;
/*
for (i = 0; i < LED1_NUM; i++)
{ gpio_free(led1_gpios[i]);
}
*/
device_destroy(led1_class, led1_dev.cdev.dev);
class_destroy(led1_class);
cdev_del(&led1_dev.cdev);
unregister_chrdev_region(led1_dev.cdev.dev, );
} module_init(led1_init);
module_exit(led1_exit); MODULE_LICENSE("GPL");
MODULE_AUTHOR("mhb@seu");
测试代码如下:
#include <stdio.h>
//#include "sys/types.h"
#include <sys/ioctl.h>
#include <stdlib.h>
#include <unistd.h>
//#include "termios.h"
//#include "sys/stat.h"
#include <fcntl.h> #define LED1_ON 0x1
#define LED1_OFF 0x0 main(int argc,char *argv[])
{
int fd; if ((fd=open("/dev/LED1",O_RDWR /*| O_NDELAY | O_NOCTTY*/)) < )
{
printf("Open Device failed.\r\n");
exit();
}
else
{
printf("Open Device successed.\r\n");
}
if (argc<)
{
/* code */
printf("Usage: %s <on|off num>\n",argv[]);
exit();
}
if(!strcmp(argv[],"on"))
{
printf("led1 will on!!\n");
printf("argv[2]=%d\n",atoi(argv[]));
if(ioctl(fd,LED1_ON,atoi(argv[]))<)
{
printf("ioctl err!!\n");
} }
if(!strcmp(argv[],"off"))
{
printf("led1 will off!!\n");
if(ioctl(fd,LED1_OFF,atoi(argv[]))<)
{
printf("ioctl err!!\n");
}
}
close(fd);
}
LED字符设备驱动实例及测试代码的更多相关文章
- fl2440 platform总线led字符设备驱动
首先需要知道的是,设备跟驱动是分开的.设备通过struct device来定义,也可以自己将结构体封装到自己定义的device结构体中: 例如:struct platform_device: 在inc ...
- Tiny6410 LED字符设备驱动
1.查看用户手册 led1.led2.led3.led4 连接的分别是 GPK4.GPK5.GPK6.GPK7 2.查询6410芯片手册 下面还需要3个步骤: 1.设置GPIO为OUTPUT. 将GP ...
- Linux字符设备驱动实例—globalmem驱动
1.globalmem虚拟设备实例 globalmem为“全局内存”的意思,在globalmem字符设备中会分配一片大小为GLOBALMEM_SIZE(4KB)的内存空间,并在驱动中提供对这片内存的读 ...
- Linux_2.6字符设备驱动实例
第一步:my74hc595.c #include <linux/module.h> //模块所需的大量符号和函数定义#include <linux/init.h> //指定初始 ...
- Linux LED字符设备驱动
// 申请IO资源 int gpio_request(unsigned gpio, const char *label); // 释放IO资源 void gpio_free(unsigned gpio ...
- 【转】linux设备驱动程序之简单字符设备驱动
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/03/2272869.html 一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用 ...
- 【Linux驱动】字符设备驱动
一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面 ...
- arm-linux字符设备驱动开发之---简单字符设备驱动
一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面 ...
- 谈谈Linux字符设备驱动的实现
@ 目录 字符设备驱动基础 申请设备号 创建设备节点 在驱动中实现操作方法 文件IO调用驱动中的操作 应用程序与驱动的数据交互 内核驱动如何控制外设 控制LED的简单驱动实例 驱动程序的改进 框架复盘 ...
随机推荐
- sessionID和cookie
一.cookie机制和session机制的区别***************************************************************************** ...
- Python 将文本转换成html的简单示例
实例txt文件test_input.txt: Welcome to World Wide Spam. Inc. These are the corporate web pages of *World ...
- select option jquery javascript
jQuery获取Select选择的Text和Value: $('#myselect').find('option:selected').attr('ent_id'); $('#ent_id' ...
- Redis的安装、配置 --转载
原文地址:http://blog.sina.com.cn/s/blog_505bf9af0101ehhp.html redis的安装.配置 安装步骤如下:下载redis安装包:$ cd /opt/ap ...
- Asp.Net 之 未能加载文件或程序集 system.web.extensions 解决方法
最近做项目发现未能加载文件或程序集的错误,这是由于我的机器上没有安装Ajax的原因.问题解决后,整理如下:表现:1."System.Web.Extensions, Version=1.0.61025. ...
- sqlite数据下载链接地址
链接: http://pan.baidu.com/s/1pJN1abT 密码: yjg5
- linux语言环境设置
查看linux的支持的语言集合 执行locale命令 LANG=zh_CN.UTF-8 LANGUAGE=zh_CN:zh LC_CTYPE="zh_CN.UTF-8" LC_NU ...
- jQuery实现jsonp源码分析(京东2015面试)
// Bind script tag hack transportjQuery.ajaxTransport( "script", function(s) { // This tra ...
- JavaScript高级程序设计(第三版)学习笔记6、7章
第6章,面向对象的程序设计 对象: 1.数据属性 configurable,表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为true en ...
- (译文)12个简单(但强大)的JavaScript技巧(一)
原文连接: 12 Simple (Yet Powerful) JavaScript Tips 我将会介绍和解析12个简单但是强大的JavaScript技巧. 这些技巧所有的JavaScript程序员都 ...