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

📄 lcddrv.c

📁 基于嵌入式LINUX的6963LCD控制器驱动及应用程序源码。
💻 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 + -