📄 generic.c
字号:
#include <linux/module.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/version.h>#include <linux/wait.h>#include <linux/irq.h>#include <linux/delay.h>#include <linux/sched.h>#include <linux/mm.h>#include <linux/slab.h>#include <linux/completion.h>#include <linux/platform_device.h>#include <linux/videodev.h>#include <linux/clk.h>#include <linux/interrupt.h>#include <linux/dma-mapping.h>#include <linux/miscdevice.h>#include <asm/io.h>#include <asm/hardware.h>#include <asm/semaphore.h>#include <asm/uaccess.h>#include <asm/arch/gpio.h>#include <asm/arch/regs-gpioj.h>#include <asm/dma.h>#include <asm-arm/poll.h>#include <linux/poll.h>#include <linux/string.h>MODULE_LICENSE("Dual BSD/GPL");#define DEVICE_NAME "PORTJ"#define DEBUG#ifdef DEBUG#define DPRINTK(x...) printk(x)#else#define DPRINTK(x...) /* !!!! */#endif#define res_size(_r) (((_r)->end - (_r)->start) + 1)#define GPJBASE 0x560000d0#define GPJCON 0x00#define GPJDAT 0x04#define GPJUP 0x08struct generic_data_t{ int valoare; void __iomem* addr;};struct generic_data_cfg_t{ struct generic_data_t* dev;};static struct generic_data_cfg_t generic_data_cfg;static void __iomem* base_addr;static int valoare;static int generic_open(struct inode *inode, struct file *file){ file->private_data = generic_data_cfg.dev; return 0;}static int generic_close(struct inode *inode, struct file *file){ return 0;}static ssize_t generic_read(struct file *file, char __user *buf, size_t count, loff_t *ppos){ struct generic_data_t *dev = (struct generic_data_t *)(file->private_data); DPRINTK("READ 1 \n"); valoare = readl(base_addr + GPJDAT); //valoare = readb(base_addr + GPJDAT); if(copy_to_user(buf, (void *)&valoare, count)) //can copy 0 byte return -EFAULT; return 1; }static unsigned int generic_poll(struct file *file, struct poll_table_struct *wait){ return POLLIN | POLLOUT;}static struct file_operations generic_fops = { .owner = THIS_MODULE, .open = generic_open, .release = generic_close, .read = generic_read, .poll = generic_poll, //.ioctl = /*v4l_cam_ioctl,*/video_ioctl2, /* V4L2 ioctl handler */ //.mmap = v4l_cam_mmap, //.llseek = no_llseek,};//------------------------------------------------------------------------------static struct miscdevice generic_miscdev = { 20, DEVICE_NAME, &generic_fops};//------------------------------------------------------------------------------int __init generic_init(void){ int ret=0; struct generic_data_t* dev; dev= (struct generic_data_t*)kmalloc(sizeof(struct generic_data_t),GFP_KERNEL); base_addr = ioremap(GPJBASE, 0x20); if(base_addr == NULL) { printk(KERN_ERR "failed to ioremap address reg\n"); ret = -EINVAL; goto release; } generic_data_cfg.dev=dev; misc_register(&generic_miscdev); return 0;release: if (dev) kfree(dev); return ret;}void __exit generic_cleanup(void){ struct device_data_t* dev=generic_data_cfg.dev; if (dev) kfree(dev); misc_deregister(&generic_miscdev);}module_init(generic_init);module_exit(generic_cleanup);MODULE_LICENSE("GPL");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -