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

📄 vfddriver.c

📁 此代码是ARM嵌入式系统下的一个VFD的驱动程序
💻 C
字号:

#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/hardware.h>
#include <asm/mach-types.h>
#include <linux/version.h>
#include <asm-arm/arch-s3c2410/S3C2410.h>
unsigned char *epvirbase;   
unsigned char *epvirbase1; 

#define vfd_NAME "vfd_driver"
#define vfd_MAJOR 127#define VFD_SIZE 264
typedef struct{
	int openflag;
	char buf[VFD_SIZE];
}vfd_dev;static vfd_dev df_dev;/********************************************************************************** 
time delay 
**********************************************************************************/
static void delay_us(unsigned int num)
{
	int volatile i;
	for(i=0;i<num;i++);
}

static int
vfd_open(struct inode *inode,struct file *filp);  
static int
vfd_release(struct inode *inode,struct file *filp);  
static ssize_t
vfd_read(struct file *filp,char *buf,size_t count,loff_t *f_pos);  
static ssize_t
vfd_write(struct file *filp,char *buf,size_t count,loff_t *f_pos); 
static int
vfd_init(void);  
static void
vfd_exit(void);  

struct file_operations vfd_fops = {
	owner:   THIS_MODULE,
	read:	 vfd_read,
	write:   vfd_write,
	open:	 vfd_open,
	release: vfd_release,
};

static ssize_t
vfd_read(struct file *filp,char *buf,size_t count,loff_t *f_pos)
{
	vfd_dev *dev=(vfd_dev *)filp->private_data; 
	
	if(count ==0)
		return 0;
	if(copy_to_user(buf,dev->buf,count)) 
	{
		printk(KERN_ALERT"READ: copy to user error!\n");
		return -EFAULT;
	}
	*f_pos += count;   
	return count;
}


static ssize_t
vfd_write(struct file *filp,char *buf,size_t count,loff_t *f_pos)
{
	vfd_dev *dev=(vfd_dev *)filp->private_data;  
     int dot,counter;         dot=0;                                
	if(count==0)
	return 0;		    if(copy_from_user(dev->buf,buf,count))          {         printk(KERN_ALERT"copy from user erro!!\n");         return -EFAULT;      }	delay_us(100000);
	for(counter=count-1;counter>=0;counter--)  
	{		if (dev->buf[counter]==0){ continue;}  	   else if ((dot==0)&&(dev->buf[counter]==48))  dev->buf[counter]=0x3f;      	   else if ((dot==0)&&(dev->buf[counter]==49))  dev->buf[counter]=0x06;           else if ((dot==0)&&(dev->buf[counter]==50))  dev->buf[counter]=0x5b;	   else if ((dot==0)&&(dev->buf[counter]==51))  dev->buf[counter]=0x4f;	   else if ((dot==0)&&(dev->buf[counter]==52))  dev->buf[counter]=0x66;	   else if ((dot==0)&&(dev->buf[counter]==53))  dev->buf[counter]=0x6d;	   else if ((dot==0)&&(dev->buf[counter]==54))  dev->buf[counter]=0x7d;	   else if ((dot==0)&&(dev->buf[counter]==55))  dev->buf[counter]=0x27;	   else if ((dot==0)&&(dev->buf[counter]==56))  dev->buf[counter]=0x7f;	   else if ((dot==0)&&(dev->buf[counter]==57))  dev->buf[counter]=0x6f;                 	  else if((dot==1)&&(dev->buf[counter]==48))  {dev->buf[counter]=0xbf;dot=0;} 
	  else if((dot==1)&&(dev->buf[counter]==49))  {dev->buf[counter]=0x86;dot=0;} 
	  else if((dot==1)&&(dev->buf[counter]==50))  {dev->buf[counter]=0xdb;dot=0;}
	  else if((dot==1)&&(dev->buf[counter]==51))  {dev->buf[counter]=0xcf;dot=0;}
	  else if((dot==1)&&(dev->buf[counter]==52))  {dev->buf[counter]=0xe6;dot=0;}
	  else if((dot==1)&&(dev->buf[counter]==53))  {dev->buf[counter]=0xed;dot=0;}
	  else if((dot==1)&&(dev->buf[counter]==54))  {dev->buf[counter]=0xfd;dot=0;}
	  else if((dot==1)&&(dev->buf[counter]==55))  {dev->buf[counter]=0xa7;dot=0;}
	  else if((dot==1)&&(dev->buf[counter]==56))  {dev->buf[counter]=0xff;dot=0;}
	  else if((dot==1)&&(dev->buf[counter]==57))  {dev->buf[counter]=0xef;dot=0;}  
      else if (dev->buf[counter]==46)             {dot=1; continue;}               
	  else  continue;      outb(dev->buf[counter],epvirbase);          	  printk(KERN_ALERT"shu chu shu ju is dev->buf[counter]= %x \n",dev->buf[counter]);
	  epvirbase=(epvirbase+16);             
	}        delay_us(10000);         outb(0x00,epvirbase1);                        printk(KERN_ALERT"epvirbase1 is %x \n",epvirbase1);	   *f_pos+=count;	    return count;	}static int 
vfd_release(struct inode *inode,struct file *filp) 
{
	vfd_dev	*dev=(vfd_dev *)filp->private_data;
	MOD_DEC_USE_COUNT;
	dev->openflag = 0;	return 0;	}
static int 
vfd_open(struct inode *inode,struct file *filp) 
{
	vfd_dev	*dev;	
	dev=&df_dev;	
	if(dev->openflag !=0)
	{	
	return -EBUSY;
	}
	epvirbase=ioremap(0x08000020,10);      epvirbase1=ioremap(0x08000010,1);
	dev->openflag =1;
	filp->private_data =dev;
	MOD_INC_USE_COUNT;
	return 0;
}

static int __init
vfd_init(void)
{

	int result = register_chrdev(vfd_MAJOR,vfd_NAME,&vfd_fops);
	if(result<0)
	{
	  printk(KERN_ALERT"vfd: can't get major %d\n",vfd_MAJOR);
	  return result;
	}
	
          GPHCON|=0x080000;          GPHCON&=0x3bffff;          MISCCR|=0x000040;          MISCCR&=0x3fffcf;   	      GPACON|=0x201000;   
	      BWSCON = (BWSCON & ~(BWSCON_ST1 | BWSCON_WS1 | BWSCON_DW1)) |
          (BWSCON_ST1 | BWSCON_WS1 | BWSCON_DW(1, BWSCON_DW_16));
          BANKCON1= BANKCON_Tacs4 | BANKCON_Tcos4 | BANKCON_Tacc14 |
          BANKCON_Toch2 | BANKCON_Tcah4 | BANKCON_Tacp6 | BANKCON_PMC1;

	return 0;
}

static void __exit
vfd_exit(void)
{
	/*add exit function*/
	unregister_chrdev(vfd_MAJOR,vfd_NAME);
	iounmap((void *)epvirbase);  
    iounmap((void *)epvirbase1);  }

module_init(vfd_init);
module_exit(vfd_exit);

⌨️ 快捷键说明

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