demo.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/io.h>
#include <linux/cdev.h>
#include <linux/ioctl.h>
#include <linux/device.h>
#include <linux/uaccess.h>
#include<linux/slab.h>
#include"myled.h"
#define CNAME "myled"
int minor=0;//次设备号从0开始
#if 0
unsigned int major = 0;//动态申请
#else
unsigned int major = 500;//静态指定设备号
#endif
char kbuf[128]={};//定义数组用于存放和用户之间拷贝的数据
gpio_t *vir_led1;
gpio_t *vir_led2;
gpio_t *vir_led3;
unsigned int * vir_rcc;
struct cdev *cdev;
struct class *cls;
struct device *dev;
const int count=3;//指定设备节点的个数为3
//对应的是open()
int mycdev_open(struct inode *inode, struct file *file)
{
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
return 0;
}
//read()
ssize_t mycdev_read(struct file *file, char __user *ubuf, size_t size, loff_t *loff)
{
//size参数是用户期待读到的字节长度
int ret;
if(size>sizeof(kbuf))
size=sizeof(kbuf);
ret=copy_to_user(ubuf,kbuf,size);
if(ret)
{
printk("数据从内核向用户拷贝失败\n");
return -EIO;
}
return size;
}
//write()
ssize_t mycdev_write(struct file *file, const char __user *ubuf, size_t size, loff_t *loff)
{
int ret;
if(size>sizeof(kbuf))
size=sizeof(kbuf);
ret=copy_from_user(kbuf,ubuf,size);
if(ret)
{
printk("数据从内核向用户拷贝失败\n");
return -EIO;
}
return size;
}
//close()
long ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
int ret,which;
switch(cmd)
{
case LedON:
ret=copy_from_user(&which,(void *)arg,sizeof(int));
if(ret)
{
printk("用户向内核拷贝数据失败\n");
return -EIO;
}
switch(which)
{
case LED1:
v