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

📄 eatpcpld.c

📁 UCLINUX字符驱动程序,用ARM7多功能口实现跑马灯.
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -