📄 eatpcpld.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 + -