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

📄 leddrv.c

📁 基于ARM9200
💻 C
字号:
/**************************************************************** leddrv8.c* IO口硬件驱动程序** File Name: leddrv8.c* Description: 开关量输入测试  PB0~PB11 12路输入               开关量输出测试  PB12~PB15 4路LED输出                               PB16~PB19 4路继电器输出***************************************************************/#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 int led_read(struct file *,const char *,int,loff_t *);/***************************************************************************** 名称:led_read(struct file *led_file, const char *buf,int len,loff_t *loff)* 功能:读函数* 入口参数:* 出口参数:无* 硬件功能:对PB0~PB11操作(12路开关量输入)****************************************************************************/static int led_read(struct file *led_file, const char *buf,int len,loff_t *loff){        //PB0~PB11  12路        int status,nread;        AT91PS_SYS sys = (AT91PS_SYS) AT91C_VA_BASE_SYS;        sys->PIOB_PER |= 0x00000fff;        sys->PIOB_ODR |= 0x00000fff;        sys->PIOB_IFER |= 0x0000000fff;        sys->PMC_PCER = 0x1 << AT91C_ID_PIOB;        //status = (unsigned char)(sys->PIOC_PDSR & 0x0000ffff);        status = (unsigned short int)(sys->PIOB_PDSR & 0x00000fff);        printk("<1>Stat is :%ld \n",status);        //if(nread = copy_to_user((void *)buf,(char*)&status,sizeof(int)))        if(nread = copy_to_user((void *)buf,(char*)&status,sizeof(unsigned short int)))        	{                printk("EFAULT \n");                return -EFAULT;          }        return nread;}/***************************************************************************** 名称:led_write(struct file *led_file, const char *buf,int len,loff_t *loff)* 功能:写函数* 入口参数:* 出口参数:无* 硬件功能:对PB12 PB13 PB14 PB15操作(4个指示灯)            对PB16 PB17 PB18 PB19操作(4个继电器)            对PB22 PB23 PB24 PB25 PB26 PB27 PB28 操作(7个led指示灯)****************************************************************************/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;//pc口       	//==========================================================//       	//设定Pb12、PB13口为输出       	//PIO Enable Register       	sys->PIOB_PER=(unsigned int)(1<<12)|(unsigned int)(1<<13);       	//PIO Output Enable Register       	sys->PIOB_OER=(unsigned int)(1<<12)|(unsigned int)(1<<13);       	//PIO Output Write Register       	sys->PIOB_OWER=(unsigned int)(1<<12)|(unsigned int)(1<<13);       	//==========================================================//       	//设定Pb14、PB15口为输出       	//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);        //==========================================================//       	//设定Pb16、PB17口为输出       	//PIO Enable Register       	sys->PIOB_PER=(unsigned int)(1<<16)|(unsigned int)(1<<17);       	//PIO Output Enable Register       	sys->PIOB_OER=(unsigned int)(1<<16)|(unsigned int)(1<<17);       	//PIO Output Write Register       	sys->PIOB_OWER=(unsigned int)(1<<16)|(unsigned int)(1<<17);        //==========================================================//       	//设定PB18、PB19口为输出       	//PIO Enable Register       	sys->PIOB_PER=(unsigned int)(1<<18)|(unsigned int)(1<<19);       	//PIO Output Enable Register       	sys->PIOB_OER=(unsigned int)(1<<18)|(unsigned int)(1<<19);       	//PIO Output Write Register       	sys->PIOB_OWER=(unsigned int)(1<<18)|(unsigned int)(1<<19);        //==========================================================//       	//设定PB22~PB23口为输出       	//PIO Enable Register       	sys->PIOB_PER=(unsigned int)(1<<22)|(unsigned int)(1<<23)|(unsigned int)(1<<24)|(unsigned int)(1<<25);       	//PIO Output Enable Register       	sys->PIOB_OER=(unsigned int)(1<<22)|(unsigned int)(1<<23)|(unsigned int)(1<<24)|(unsigned int)(1<<25);       	//PIO Output Write Register       	sys->PIOB_OWER=(unsigned int)(1<<22)|(unsigned int)(1<<23)|(unsigned int)(1<<24)|(unsigned int)(1<<25);        //==========================================================//       	//设定PB26~PB28口为输出       	//PIO Enable Register       	sys->PIOB_PER=(unsigned int)(1<<26)|(unsigned int)(1<<27)|(unsigned int)(1<<28);       	//PIO Output Enable Register       	sys->PIOB_OER=(unsigned int)(1<<26)|(unsigned int)(1<<27)|(unsigned int)(1<<28);       	//PIO Output Write Register       	sys->PIOB_OWER=(unsigned int)(1<<26)|(unsigned int)(1<<27)|(unsigned int)(1<<28);        //==========================================================//       	//从用户空间拷贝数据到内核空间       	if(copy_from_user((char*)&iopdata,buf,len))        	return -EFAULT;       //************************新增加********************************************//       	//PIO Output Data Register      //  if((iopdata==((unsigned int)(1<<16)))||(iopdata==((unsigned int)(1<<17))))       	sys->PIOB_ODSR=iopdata;      // 	else if((iopdata==((unsigned int)(1<<18)))||(iopdata==((unsigned int)(1<<19))))      // 	sys->PIOB_ODSR=iopdata;        //************************新增加********************************************//       	return len;}/***************************************************************************** 名称:file_operations* 功能:定义文件操作* 入口参数:* 出口参数:****************************************************************************/static struct file_operations led_fops={      write	:(void(*))led_write,      read :(void(*))led_read,};//定义模块名char led_name[]="leddrv2";//指定主设备号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");}module_init(leddrv_init_module);module_exit(leddrv_cleanup);/*end of leddrv.c*/

⌨️ 快捷键说明

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