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

📄 leddrv.c

📁 华颐公司的以AT91RM9200为CPU的9200F 开发板在linux开发环境下的(不是基于ADS) LED,和DA驱动和测试程序的源代码
💻 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 <linux/module.h>
#include <linux/config.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/hardware.h>

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->PIOB_PER=(unsigned int)(1<<14)|(unsigned int)(1<<15); 
       	//PIO Output Enable Register
       	sys->PIOB_OER=(unsigned int)(1<<14)|(unsigned int)(1<<15); 	
       	//PIO Output Write Register
       	sys->PIOB_OWER=(unsigned int)(1<<14)|(unsigned int)(1<<15);	       
       
       	//从用户空间拷贝数据到内核空间
       	if(copy_from_user((char*)&iopdata,buf,len))
        	return -EFAULT;
       
       	//PIO Output Data Register	
       	sys->PIOB_ODSR=iopdata; 
       
       	return len;

}


module_init(leddrv_init_module);
module_exit(leddrv_cleanup);

/*end of leddrv.c*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -