驱动
#include <linux/init.h>
#include <linux/module.h>
#include<linux/fs.h>
#include<linux/uaccess.h>
#include<linux/io.h>
#include<linux/device.h>
#include"head.h"
int major;
struct class *cls;
struct device *dev;
//定义一些变量接收映射后的虚拟地址
rcc_t *vir_rcc;
gpio_t *vir_gpiob;
tim2_3_4_5_t *vir_tim4;
unsigned int *virz_rcc;
gpio_t *vir_led1;
gpio_t *vir_led2;
gpio_t *vir_led3;
//主板上的三个灯
gpio_t *vir_led4;
gpio_t *vir_led5;
gpio_t *vir_led6;
char kbuf[128]={0};
int mycdev_open(struct inode *inode, struct file *file)
{
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
return 0;
}
ssize_t mycdev_read(struct file *file, char *ubuf, size_t size, loff_t *off)
{
int ret;
//判断kbuf的大小,如果<size,把size的数值修改为kbuf的大小
if(size>sizeof(kbuf))
size=sizeof(kbuf);
ret=copy_to_user(ubuf,kbuf,size);
if(ret)
{
printk("copy_to_user filed\n");
return -EIO;//拷贝失败返回错误码
}
printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
return 0;
}
ssize_t mycdev_write(struct file *file, const char *ubuf, size_t size, loff_t *off)
{
int ret;
if(size>sizeof(kbuf))
size=sizeof(kbuf);
ret=copy_from_user(kbuf,ubuf,size);
if(ret)
{
printk("copy_from_user filed\n");
return -EIO;//拷贝失败返回错误码
}
return 0;
}
//ioctl
long mycdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
int temp,ret;
ret=copy_from_user(&temp,(void *)arg,sizeof(int));
if(ret)
{
printk("copy_from_user err1 \n");
return -ENOMEM;
}
switch(cmd)
{
case LED_ON:
switch(temp)
{
case 1://led1
vir_led1->ODR |=1<<10;
break;
case 2:
vir_led2->ODR |=1<<10;
break;
case 3:
vir_led3->ODR |=1<<8;
break;
case 4:
vir_led4->ODR |=1<<5;
break;
case 5:
vir_led5->ODR