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