📄 leddrv.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 + -