文档详情

远程控制LCD程序

daj****de2
实名认证
店铺
DOCX
15.91KB
约7页
文档ID:177516965
远程控制LCD程序_第1页
1/7

include vlinux/module.h>#include vlinux/types.h>#include vlinux/fs.h>#include vlinux/errno.h>#include vlinux/mm.h>#include vlinux/sched.h>#include vlinux/init.h>#include vlinux/cdev.h>#include #include #include #include #include vlinux/kernel.h> /* printk() */#include vasm/arch-s3c2410/regs-gpio.h>#include vasm/arch-s3c2410/regs-mem.h>〃#include vasm/plat-s3c/regs-timer.h>#include "bmp.h"#undef DEBUG#ifdef DEBUGLINE__);printk(##x);}#define DPRINTK(x...) {printk(_FUNCTION_"(%d): ",#else#define DPRINTK(x...) (void)(0)#endif#define LCM_BASE (Ox18OOOOOOUL)#define LCM_WriteCMD LCM_BASE //RS=0 RW=0#define LCM_WriteData LCM_BASE+4//RS=1 RW=0 #define LCM_ReadFlag LCM_BASE+8 //RS=0 RW=1#define LCM_ReadData LCM_BASE+12 //RS=1 RW=1_IOW('p', 0xa1,char)_IO('p', 0xa2)_IOW('p', 0xa3,char)_IO('p', 0xa4)#define LCM_WRITE_CMD#define LCM_READ_BUSY#define LCM_WRITE_DATA#define LCM_READ_DATA #define LCM_MAJOR 201 static volatile unsigned *vPort_WriteCMD; static volatile unsigned *vPort_WriteData; static volatile unsigned *vPort_ReadFlag;static volatile unsigned *vPort_ReadData;//static volatile unsigned vLCM_BASE; static int lcm_major = LCM_MAJOR;//〃//####################### 以下为点阵液晶屏驱动 ############################// ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx函数名称:LCD_B_Ready 函数功能:LCD读忙 入口参数:无出口参数:无 备 注:执行时间:0阴void LCD_B_Ready(void){while ((*vPort_ReadFlag )&0 x80);}// ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx函数名称:LCD_B_W_Command 函数功能:向LCD发送指令 入口参数:unsigned char Command 出口参数:无备 注:执行时间:72ysvoid LCD_B_W_Command(unsigned char Command) {int i;LCD_B_Ready(); //LCD 读忙〃*vPort_WriteCMD = Command; for(i=0; ivOxffff; i++);}// ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx函数名称:LCD_B_W_Data 函数功能:向LCD发送数据 入口参数:unsigned char Data 出口参数:无备 注:执行时间:72gsvoid LCD_B_W_Data(unsigned char Data) {int i;LCD_B_Ready(); //LCD 读忙〃*vPort_WriteData = Data; for(i=0; ivOxffff; i++);} void PutBMP(unsigned char *puts) {unsigned int x=0; unsigned char i,j;LCD_B_W_Command( 0x34 );〃8Bit扩充指令集LCD_B_W_Command( 0x36 );〃绘图ON//12864 实际为 256x32Init_LCDLCD初始化 无无注:无for(i=0;iv32;i++){LCD_B_W_Command(0x80li); 〃行位置LCD_B_W_Command(0x80); 〃列位置for(j=0;jv32;j++) //256/8=32 byte{ 〃列位置每行自动增加LCD_B_W_Data(puts[x]);x++;}//printk("1\n");}void ShowLCMWelcome(void);//函数名称: 函数功能: 入口参数: 出口参数: 备/^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx ^Tx /void Init_LCD(void){〃复位LCDLCD_B_W_Command( 0x30 ); 〃设置为8位控制界面,不设置扩充指令LCD_B_W_Command( 0x30 );LCD_B_W_Command( 0x0c ); 〃开整体显示,不显示光标LCD_B_W_Command( 0x01 ); 〃清显示程序 的 定义//把液晶屏的物理地址转LCD_B_W_Command( 0x02 ); 〃初始化原点// ShowLCMWelcome(); 〃显示欢迎屏}//######################### 以 下 为 驱 动#####################################struct lcm_dev{struct cdev cdev; /*cdev 结构体*/wait_queue_head_t wait;}*lcm_devp;static ssize_t lcm_open(struct inode *inode, struct file *filp){// printk("device open sucess!\n"); filp->private_data = lcm_devp;// vLCM_BASE = (unsigned long)ioremap( pLCM_BASE, 16); 成CPU用的虚拟地址__raw_writel((__raw_readl(S3C2410_BWSCON)&0 xffff0fff)l0x2000,S3C2410_BWSC0N);//l0x2000 〃_raw_writel(0x2212d010,S3C2410_BWSC0N);_raw_writel(0x2e50,S3C2410_BANKC0N3); 〃printk("BWSCON:%x\n",_raw_readl(S3C2410_BWSCON));Init_LCD();return 0;}void ShowLCMWelcome(void){unsigned char i;char string0[] = {"上海双实科技"};char string1[] = {" WEB 远程控制系统"};char string2[] = {"谢谢你的使用"};PutBMP(bmp1);sleep_on_timeout (&lcm_devp->wait, 2*HZ); LCD_B_W_Command( 0x34 );LCD_B_W_Command( 0x30 );for (i=0; i<12; i++) LCD_B_W_Data(stringO[i]);LCD_B_W_Command( 0x90 ); 〃第二行显示for (i=0; i<16; i++) LCD_B_W_Data(string1[i]);LCD_B_W_Command( 0x88 ); 〃第三行显示for (i=0; i<12; i++) LCD_B_W_Data(string2[i]);sleep_on_timeout (&lcm_devp->wait, HZ);LCD_B_W_Command(0x01); 〃LCM_CLEARLCD_B_W_Command(0x02); 〃LCM_H0ME}static ssize_t lcm_ioctl(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg) {switch(cmd){case LCM_WRITE_CMD:DPRINTK("Try writing command %d to lcm.\n",(unsigned char)arg);LCD_B_W_Command( (unsigned char)arg );break;/* case LCM_READ_BUSY:DPRINTK("Try read busy flag and AC from lcm.\n");return *vPort_ReadFlag;break;*/case LCM_WRITE_DATA:DPRINTK("Try writing data %d to lcm.\n",(unsigned char)arg);LCD_B_W_Data( (unsigned char )arg );break;/* case LCM_READ_DATA:DPRINTK("Try read data from lcm.\n");return *vPort_ReadData;break; */default:DPRINTK("error cmd number\n");return -EINVAL;break;}return 0;} static ssize_t lcm_release(struct inode *inode, struct file *filp) {return 0;static struct file_operations lcm_fops ={.owner = THIS_MODULE,.ioctl = lcm_ioctl,.open = lcm_open,.release = lcm_release,};static void lcm_setup_cdev(struct lcm_dev *dev, int index){int err, devnol = MKDEV(lcm_major, index);cdev_init (&dev->cdev, & lcm_fops);dev->cdev.owner = THIS_MODULE;dev->cdev.ops = & lcm_fops;err = cdev_add (&dev->cdev, devno1, 1);if (err)printk(KERN_NOTICE "Error %d adding lcm%d", err, index);}int lcm_init(void){int result;dev_t lcm_devno = MKDEV(LCM_MAJOR, 0);/*申请设备号*/if(lcm_major) result = register_chrdev_region(lcm_devno, 1, "1cm");else /*动态申请设备号*/{result = alloc_chrdev_regio n(&lcm_devno, 0, 1, "lcm");lcm_major = MAJOR(lcm_devno);}if (result < 0) return result;lcm_devp = kmalloc(sizeof(struct lcm_dev), GFP_KERNEL);if (!lcm_devp) /* 申请失败*/{result = - ENOMEM;unregister_chrdev_region(lcm_devno, 1);return result;}memset(lcm_devp, 0, sizeof(struct lcm_dev));init_waitqueue_head (&lcm_devp->wait);lcm_setup_cdev(lcm_devp, 0);vPort_WriteCMD = (volatile unsigned *)ioremap(LCM_WriteCMD,0x4); vPort_WriteData = (volatile unsigned *)ioremap(LCM_WriteData ,0x4); vPort_ReadFlag = (volatile unsigned *)ioremap(LCM_ReadFlag,0x4); vPort_ReadData = (volatile unsigned *)ioremap(LCM_ReadData,0x4);〃printk("LCM initialized*");return 0;}void lcm_exit(void){〃iounmap( (void *)vLCM_BASE );cdev_del(&lcm_devp->cdev); /*注销 cdev*/kfree(lcm_devp); /*释放设备结构体内存*/unregister_chrdev_region(MKDEV(lcm_major, 0), 1); /*释放设备号 */// printk("LCM exit\n");}module_init(lcm_init); module_exit(lcm_exit);MODULE_AUTHOR("hdz"); MODULE_DESCRIPTION("LCM driver");MODULE_LICENSE("Dual BSD/GPL");module_param(lcm_major, int, S_IRUGO);。

下载提示
相关文档
正为您匹配相似的精品文档