#include <linux/module.h>
#include <linux/config.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/proc_fs.h>
#include <linux/synclink.h>
#include <asm/uaccess.h>
#include <linux/miscdevice.h>
#include <linux/slab.h>
#include <asm/io.h>
#include <linux/timer.h>
#include <linux/delay.h>
#include "led.h"
MODULE_AUTHOR("zcy");
MODULE_LICENSE("GPL");
#define MAJOR_NUM 254 //主设备号
#define GPIOB_ADDR 0x99700000
#define ADDR_MFPSR5 0x98100000+0x114
struct gm_data{
unsigned long dataout;
unsigned long datain;
unsigned long pindir;
};
struct gm_data *gm;
void *ptr_ADDR_MFPSR5;
struct timer_list my_timer;
unsigned long parameter = 0;
static int led_open(struct inode *, struct file *);
static int led_release(struct inode *, struct file *);
static int led_ioctl(struct inode *, struct file *, unsigned int, const int __user * );
static ssize_t led_write(struct file *,const int __user *,size_t ,loff_t *);
struct file_operations led_fops =
{
.write=led_write,
.open=led_open,
.release=led_release,
.ioctl=led_ioctl,
};
static int led_open(struct inode *inode, struct file *filp)
{
return 0;
}
static int led_release(struct inode *inode, struct file *filp)
{
return 0;
}
static void my_function(unsigned long arg)
{
unsigned long temp;
temp = gm->dataout;
gm->dataout = temp & (~parameter);
printk("my_function:gm->dataout=%lx\n",gm->dataout);
}
static void timer_func(void)
{
printk("entry timer\n");
init_timer(&my_timer);// 初始化定时器
my_timer.expires = get_jiffies_64() + HZ*1; //
my_timer.data = 0; //
my_timer.function = my_function; //
add_timer(&my_timer);
}
static ssize_t led_write(struct file *filp,const int __user *buf,size_t len,loff_t *off)
{
int i;
copy_from_user (&i, buf, sizeof(int));
switch(i)
{
case 0:
parameter = 1;
printk("parameter=%lx\n",parameter);
break; //...................................
case 1:
parameter = 2;
printk("parameter=%lx\n",parameter);
break;
case 2:
parameter = 4;
printk("parameter=%lx\n",parameter);
break;
case 3:
parameter = 8;
printk("parameter=%lx\n",parameter);
break;
}
return 0;
}
static int led_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, const int __user *arg)
{
unsigned long temp;
int i;
copy_from_user (&i, arg, sizeof(int));
printk("i=%lx\n",i);
printk("arg=%lx\n",*arg);
switch(i)
{
case 0:
parameter = 1;
printk("parameter=%lx\n",parameter);
break; //...................................
case 1:
parameter = 2;
printk("parameter=%lx\n",parameter);
break;
case 2:
parameter = 4;
printk("parameter=%lx\n",parameter);
break;
case 3:
parameter = 8;
printk("parameter=%lx\n",parameter);
break;
}
switch(cmd)
{
case led_on:
temp = gm->dataout;
gm->dataout = temp & (~parameter);
break;
case led_off:
temp = gm->dataout;
gm->dataout = temp | parameter;//................................................................
break;
case led_blink:
while(1)
{
temp = gm->dataout;
gm->dataout = temp | parameter;
printk("led_blink:gm->dataout=%lx\n",gm->dataout);
timer_func();
}
break;
}
return 0;
}
static int __init led_init(void)
{
int ret;
unsigned long temp;
//注册设备驱动
ret = register_chrdev(MAJOR_NUM, "led", &led_fops);
if (ret) printk("led register failure");
else printk("led register success\n");
//将GPIOB[0]--[3]设置为输出状态
gm=(struct gm_data*)ioremap(GPIOB_ADDR, 3*8*sizeof(unsigned long));
temp = gm->pindir;
gm->pindir = temp | 0xf;
printk("led_init:gm->pindir=%lx\n",gm->pindir);
//将管脚设置成GPIO(gpio2[0]--[3])
ptr_ADDR_MFPSR5 = ioremap(ADDR_MFPSR5, 8*sizeof(unsigned long));
temp = ioread32(ptr_ADDR_MFPSR5);
temp = temp | 0x1540;
iowrite32(temp, ptr_ADDR_MFPSR5);
printk("led_init:ptr_ADDR_MFPSR5=%lx\n",temp);
gm->dataout = 0xf;
printk("led_init:gm->dataout=%lx\n",gm->dataout);
printk("led_init:gm->datain=%lx\n",gm->datain);
return ret;
}
static void __exit led_exit(void)
{
int ret;
del_timer(&my_timer);
iounmap(gm);
iounmap(ptr_ADDR_MFPSR5);
//注销设备驱动
ret = unregister_chrdev(MAJOR_NUM, "led");
if (ret) printk("3Gvar unregister failure");
else printk("3Gvar unregister success\n");
}
module_init(led_init);
module_exit(led_exit);
led.zip_GM8180
版权申诉
42 浏览量
2022-09-22
21:26:20
上传
评论
收藏 3KB ZIP 举报
我虽横行却不霸道
- 粉丝: 73
- 资源: 1万+