⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 generic.c

📁 generic driver for s3c2440 under linux
💻 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 + -