eatpcpld.c

来自「UCLINUX字符驱动程序,用ARM7多功能口实现跑马灯.」· C语言 代码 · 共 132 行

C
132
字号
#ifndef __KERNEL__        #define __KERNEL__#endif#ifndef MODULE        #define MODULE#endif
#include <linux/config.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/kernel.h>     // printk()
#include <linux/slab.h>     // kmalloc()
#include <linux/errno.h>   // error codes
#include <linux/types.h>   // size_t
#include <linux/interrupt.h>   // mark_bh
#include <linux/i2c.h>       
#include <linux/skbuff.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <linux/wait.h>
#include <asm/arch/hardware.h>#include "eatpcpld.h"static int       eatpcpld_open(struct inode * inode, struct file * flip);static int       eatpcpld_release(struct inode * inode, struct file * flip);static int       eatpcpld_ioctl(struct inode * inode, struct file * flip, unsigned int cmd, unsigned long param);int eatpcpld_init(void);void eatpcpld_cleanup(void);#define MAJOR_NR 240#define DEVICE_NAME "eatpcpld"module_init(eatpcpld_init);module_exit(eatpcpld_cleanup);static struct file_operations eatpcpld_fops = {	owner:		THIS_MODULE,	ioctl:		eatpcpld_ioctl,	open:		  eatpcpld_open,	release:	eatpcpld_release,};static int eatpcpld_open(struct inode * inode,struct file * flip){	MOD_INC_USE_COUNT;	printk(KERN_ERR "Hello from eatpcpld_open()..\n");	return 0;}static int eatpcpld_release(struct inode * inode,struct file * flip){	MOD_DEC_USE_COUNT;	printk(KERN_ERR "Hello form eatpcpld_release()\n");	return 0;}static int eatpcpld_ioctl(struct inode * inode,struct file * flip,unsigned int cmd,unsigned long arg){	long int *REGCON;long int *REGDATA;if(_IOC_TYPE(cmd)!=EATPCPLD_IOC_MAGIC)	{		return -ENOTTY;	}if(_IOC_NR(cmd)>=EATPCPLD_MAXNR)	{		return -ENOTTY;	}	REGCON=0x01d20040;REGDATA=0x01d20044;switch(cmd){case EATPCPLD_SET_PIN_OUT:		 {			*REGCON|=(0x0001<<(arg*2));			*REGCON&=~(0x0002<<(arg*2));	   }	  break;case EATPCPLD_SET_DATA:		{			*REGDATA|=(0x0001<<arg);	  }	  break;case EATPCPLD_CLR_DATA:		{			*REGDATA&=~(0x0001<<arg);	  }	  break;default:	return -ENOTTY;	break;	}		return 0;}int eatpcpld_init(void){	int result;		result = register_chrdev(MAJOR_NR, DEVICE_NAME, &eatpcpld_fops);	if(result < 0)	{		printk(KERN_ERR DEVICE_NAME ": Unable to get major %d\n",MAJOR_NR);		return result;	}	printk(KERN_ERR DEVICE_NAME ": init OK\n");	return 0;}void eatpcpld_cleanup(void){	unregister_chrdev(MAJOR_NR, DEVICE_NAME);
	printk("bye!\n");}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?