📄 lcddrv.c
字号:
/**************************************************************** lcddrv.c* LCD液晶硬件驱动程序* LCD液晶型号:6963控制器* File Name: lcddrv.c* Description: LCD:DB0~DB7 <--> PB0~PB7 8路输入 LCD:WR <--> PB8 输出 LCD:RD <--> PB9 输出 LCD:CS <--> PB10 输出 LCD:RST <--> PB11 输出***************************************************************/#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 lcd_write(struct file *,const char *,int,loff_t *);static int lcd_read(struct file *,const char *,int,loff_t *);/***************************************************************************** 名称:lcd_read(struct file *lcd_file, const char *buf,int len,loff_t *loff)* 功能:读函数* 入口参数:* 出口参数:无* 硬件功能:PB0~PB7 8路输入****************************************************************************/static int lcd_read(struct file *lcd_file, const char *buf,int len,loff_t *loff){ //PB0~PB7 8路 int status,nread; AT91PS_SYS sys = (AT91PS_SYS) AT91C_VA_BASE_SYS; sys->PIOB_PER |= 0x000000ff; sys->PIOB_ODR |= 0x000000ff; sys->PIOB_IFER |= 0x00000000ff; sys->PMC_PCER = 0x1 << AT91C_ID_PIOB; //status = (unsigned char)(sys->PIOC_PDSR & 0x0000ffff); status = (unsigned short int)(sys->PIOB_PDSR & 0x000000ff); 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;}/***************************************************************************** 名称:lcd_write(struct file *lcd_file, const char *buf,int len,loff_t *loff)* 功能:写函数* 入口参数:* 出口参数:无* 硬件功能: LCD:WR <--> PB8 输出 LCD:RD <--> PB9 输出 LCD:CS <--> PB10 输出 LCD:RST <--> PB11 输出 LCD:DB0-DB7 <--> PB0-PB7 输出****************************************************************************/static int lcd_write(struct file *lcd_file, const char *buf,int len,loff_t *loff){ unsigned int iopdata; AT91PS_SYS sys = (AT91PS_SYS) AT91C_VA_BASE_SYS;//pb口 //==========================================================// //设定Pb0-PB11口为输出 //PIO Enable Register sys->PIOB_PER=(unsigned int)(1<<0)|(unsigned int)(1<<1)|(unsigned int)(1<<2)|(unsigned int)(1<<3)|(unsigned int)(1<<4)|(unsigned int)(1<<5)|(unsigned int)(1<<6)|(unsigned int)(1<<7)|(unsigned int)(1<<8)|(unsigned int)(1<<9)|(unsigned int)(1<<10)|(unsigned int)(1<<11); //PIO Output Enable Register sys->PIOB_OER=(unsigned int)(1<<0)|(unsigned int)(1<<1)|(unsigned int)(1<<2)|(unsigned int)(1<<3)|(unsigned int)(1<<4)|(unsigned int)(1<<5)|(unsigned int)(1<<6)|(unsigned int)(1<<7)|(unsigned int)(1<<8)|(unsigned int)(1<<9)|(unsigned int)(1<<10)|(unsigned int)(1<<11); //PIO Output Write Register sys->PIOB_OWER=(unsigned int)(1<<0)|(unsigned int)(1<<1)|(unsigned int)(1<<2)|(unsigned int)(1<<3)|(unsigned int)(1<<4)|(unsigned int)(1<<5)|(unsigned int)(1<<6)|(unsigned int)(1<<7)|(unsigned int)(1<<8)|(unsigned int)(1<<9)|(unsigned int)(1<<10)|(unsigned int)(1<<11); //从用户空间拷贝数据到内核空间 if(copy_from_user((char*)&iopdata,buf,len)) return -EFAULT; sys->PIOB_ODSR=iopdata; printk("iopdata = %x",iopdata); return len;}/***************************************************************************** 名称:file_operations* 功能:定义文件操作* 入口参数:* 出口参数:****************************************************************************/static struct file_operations lcd_fops={ write :(void(*))lcd_write, read :(void(*))lcd_read,};//定义模块名char lcd_name[]="lcd";//指定主设备号static int gmajor = 253;//注册函数static int __init lcddrv_init_module(void){ int retv; //注册模块 retv=register_chrdev(gmajor,lcd_name,&lcd_fops); if(retv<0) { printk("<1>Register Fail!\n"); return retv; } printk("<1>lcd device OK!\n"); return 0;}//注销函数static void __exit lcddrv_cleanup(void){ int retv; //注销模块 retv=unregister_chrdev(gmajor,lcd_name); if(retv<0) { printk("<1>UnRegister Fail!\n"); return; } printk("<1>lcdDRV:GOOD-bye!\n");}module_init(lcddrv_init_module);module_exit(lcddrv_cleanup);/*end of lcddrv.c*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -