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*/