183 lines
2.9 KiB
C
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);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|