📄 leddrv.c
字号:
/**************************************************************** Institue of Automation,Chinese Academy of Sciences* File Name: leddrv.c* Description: Light leds on h9200 board* Author: Wei An***************************************************************/#ifdef MODULE#include <linux/module.h>//#include <linux/version.h>#else//#define MOD_INC_USE_COUNT//#define MOD_DEC_USE_COUNT#endif#define __KERNEL__#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/sched.h>#include <linux/fs.h>#include <linux/mm.h>#include <linux/poll.h>#include <linux/slab.h>#include <linux/ioport.h>#include <asm/uaccess.h>#include <asm/io.h>#include <linux/fcntl.h>#include <asm/arch/AT91RM9200_SYS.h>#define IOPMOD (*(volatile unsigned *)0x03FF5000) //IO port data register#define GET_DATA 0x4800static int led_write(struct file *,const char *,int,loff_t *);static int led_ioctl(struct inode *,struct file *,int,unsigned long);static void Delay(int);static unsigned int major =0;static struct file_operations led_fops={ write :(void(*))led_write, ioctl :(void(*))led_ioctl,};char led_name[]="leddrv"; static int __init leddrv_init_module(void){ int retv; retv=register_chrdev(major,led_name,&led_fops); if(retv<0) { printk("<1>Register Fail!\n"); return retv; } if(major==0) major=retv; printk("<1>Led device OK!\n"); return 0;}static void __exit leddrv_cleanup(void){ int retv; retv=unregister_chrdev(major,led_name); if(retv<0) { printk("<1>UnRegister Fail!\n"); return; } printk("<1>LEDDRV:GOOD-bye!\n");}static int led_write(struct file *led_file, const char *buf,int len,loff_t *loff){ unsigned int iopdata; AT91PS_SYS sys = (AT91PS_SYS) AT91C_VA_BASE_SYS; sys->PIOC_PER=(unsigned int)(1<<14)|(unsigned int)(1<<15); sys->PIOC_OER=(unsigned int)(1<<14)|(unsigned int)(1<<15); if(copy_from_user((char*)&iopdata,buf,len)) return -EFAULT; sys->PIOC_SODR=iopdata; Delay(100); AT91_SYS->PIOC_CODR=iopdata; return len;}static int led_ioctl(struct inode * s_node,struct file * s_file,int cmd,unsigned long arg){ int retv; switch(cmd) { case GET_DATA: retv=copy_to_user((void*)arg,(char*)&IOPMOD,sizeof(int)); if(retv<0) return -1; printk("<1>get timer0 flag ok\n"); break; default: break; } return 0;}static void Delay(int x){ int i,j,k; for(i=0;i<x;i++) for(j=0;j<0xff;j++) for(k=0;k<0xff;k++);}module_init(leddrv_init_module);module_exit(leddrv_cleanup);//MODULE_LICENSE("GPL");//MODULE_AUTHOR("Wei An");//MODULE_DESCRIPTION("Led driver for H9200 board");//MODULE_PARM(debug, "i");/*end of leddrv.c*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -