yb_arm/driver/ioreg/ioreg.c
2023-07-12 14:14:31 +08:00

183 lines
2.9 KiB
C

#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/device.h>
#include <linux/mm.h>
#include <linux/mod_devicetable.h>
#include <linux/of_address.h>
#include <asm/io.h>
#include <linux/async_tx.h>
#include <linux/dmaengine.h>
#include <linux/gfp.h>
#include <linux/dma-mapping.h>
#include <linux/list.h>
#include <linux/delay.h>
#include <linux/mailbox_client.h>
#include <asm/div64.h>
#include <linux/of_irq.h>
#include <linux/io.h>
#include <linux/semaphore.h>
#include <linux/interrupt.h>
#include <linux/clk.h>
#include <linux/timex.h>
#define IOCTL_MMAPREG _IO('k',0x20)
#define DEVICE_NAME "ioreg"
void __iomem * addr;
/*file open function*/
int ioreg_open(struct inode *inode, struct file *filp)
{
/* device structure pointer assgined to file private data pointer */
return 0;
}
/*file release function*/
int ioreg_release(struct inode *inode, struct file *filp)
{
return 0;
}
/* ioctl device control function */
static long ioreg_ioctl(struct file *filp, u32 cmd, unsigned long arg)
{
u32 val;
switch ((int)cmd)
{
case IOCTL_MMAPREG:
get_user(val, (unsigned long *)arg);
addr = ioremap(val, 4096);
break;
default:
return - EINVAL;
}
return 0;
}
ssize_t ioreg_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
{
if (copy_to_user(buf, (void *)(addr), size))
{
return -EFAULT;
}
iounmap(addr);
return 0;
}
ssize_t ioreg_write(struct file *filp,const char __user *buf, size_t size, loff_t *ppos)
{
if(copy_from_user((void *)(addr), buf, size))
{
return -EFAULT;
}
iounmap(addr);
return 0;
}
/*file operation structure*/
static const struct file_operations ioreg_fops =
{
.owner = THIS_MODULE,
.open = ioreg_open,
.read = ioreg_read,
.write = ioreg_write,
.unlocked_ioctl = ioreg_ioctl,
.release = ioreg_release,
};
static struct miscdevice ioreg_miscdev = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &ioreg_fops,
};
static int __init ioreg_module_init(void)
{
struct device_node *np;
int ret;
ret = misc_register(&ioreg_miscdev);
if(ret)
{
return -1;
}
printk(KERN_EMERG "ioreg_module_init ok ");
return 0;
}
/* module unload function*/
static void __exit ioreg_module_exit(void)
{
misc_deregister(&ioreg_miscdev);
}
/*
* a simple char device driver: ExtInt without mutex
*
* Copyright (C) 2014 Barry Song (baohua@kernel.org)
*
* Licensed under GPLv2 or later.
*/
MODULE_AUTHOR ("lte team");
MODULE_DESCRIPTION ("FRAME_SYNC driver module" );
MODULE_LICENSE ("GPL");
module_init(ioreg_module_init);
module_exit(ioreg_module_exit);