www.pudn.com > pc1415.rar > leddrv.c
/*************************************************************** * Institue of Automation,Chinese Academy of Sciences * Beijing Hyesco Embedded System Co.,Ltd. * www.hyesco.com * File Name: leddrv.c * Description: PC14、PC15 Control * Author: ***************************************************************/ #include#include #include #include #include #include #include #include #include #include #include #include #include #include static int led_write(struct file *,const char *,int,loff_t *); //定义文件操作 static struct file_operations led_fops= { write :(void(*))led_write, }; //定义模块名 char led_name[]="leddrv"; //指定主设备号 static int gmajor = 254; //注册函数 static int __init leddrv_init_module(void) { int retv; //注册模块 retv=register_chrdev(gmajor,led_name,&led_fops); if(retv<0) { printk("<1>Register Fail!\n"); return retv; } printk("<1>Led device OK!\n"); return 0; } //注销函数 static void __exit leddrv_cleanup(void) { int retv; //注销模块 retv=unregister_chrdev(gmajor,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; //设定PC14、PC15口为输出 //PIO Enable Register sys->PIOC_PER=(unsigned int)(1<<14)|(unsigned int)(1<<15); //PIO Output Enable Register sys->PIOC_OER=(unsigned int)(1<<14)|(unsigned int)(1<<15); //PIO Output Write Register sys->PIOC_OWER=(unsigned int)(1<<14)|(unsigned int)(1<<15); //从用户空间拷贝数据到内核空间 if(copy_from_user((char*)&iopdata,buf,len)) return -EFAULT; //PIO Output Data Register sys->PIOC_ODSR=iopdata; return len; } module_init(leddrv_init_module); module_exit(leddrv_cleanup); /*end of leddrv.c*/