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的简单驱动实例 驱动程序的改进 框架复盘 ...
随机推荐
- python抓取伯乐在线的全部文章,对标题分词后存入mongodb中
依赖包: 1.pymongo 2.jieba # -*- coding: utf-8 -*- """ @author: jiangfuqiang "" ...
- 返回类型和return语句
return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方.return语句有两种形式: return; return expression; 无返回值函数 没有返回值的return语句只 ...
- 《RESTful Web Services》第一章 使用统一接口
序言 HTTP是一种应用层协议.SOAP和一些Ajax Web框架都将HTTP作为一种传输信息的协议,难以充分利用HTTP层的基础设施. 1.2 如何保持交互的可见性 可见性是HTTP的一个核 ...
- 【运维】使用FC命令辅助查杀DLL木马
使用FC命令辅助查杀DLL木马 在windows系统中,system32目录下是木马隐身的好地方,查找起来非常困难,许多木马都削尖了脑袋往那里钻,DLL木马也不例外.针对这一点用户可以在安装好系统和必 ...
- win7 X64可用的单文件IE6
由于日常调试需要用到老版本的ie,没有办法!用ietest老师感觉不好使,动不动就死了.就找到了ie的单文件版,有博主 小明爱切糕制作,IE6.7.8单文件版本 http://www.cnblogs. ...
- 你hack那么多啊,该怎么办
当我们通过javascript来操作css样式的时候,假如我们停留在css2的阶段,会发现操作起来并不是很困难.虽然存在一些浏览器兼容的问题,但我们通过封装自己的函数,不仅可以设置样式还能够获取样式. ...
- 仿百度自动补全jquery
新建index.html文件,直接复制下面代码到新建的文件index.html里面,用浏览器访问,仅用于参考: <!doctype html><html><meta ch ...
- Python(2.7.6) 迭代器
除了对列表.集合和字典等进行迭代,还能对其他对象进行迭代:实现 __iter__ 方法的对象.例如, 文件对象就是可迭代的: >>> dir(file) ['__class__', ...
- Android的自动对焦
1,什么是自动对焦? ---安卓的自动对焦的概念是指能够在指定的位置计算出准确的焦点位置. 这个就好像是传统意义上的手动对焦.但是google是这个意思. 2.什么是追焦? ----安卓的追焦是指FO ...
- linux shell if参数
shell 编程中使用到得if语句内判断参数 –b 当file存在并且是块文件时返回真 -c 当file存在并且是字符文件时返回真 -d 当pathname存在并且是一个目录时返回真 -e 当path ...