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

📄 lm6063.c

📁 (绝对原创
💻 C
📖 第 1 页 / 共 2 页
字号:
		index = 0; 		for (i=0; i < y_cnt && y < ROW_NUM; i++,y++){ 			set_line(y); 			set_address(x0); 			for (x=0; x<x_cnt; x++){ 				send_data(bmp[index++]);				//test++; 			} 			//printf("i = %d.\n",i);	 		} 	}else{ 		//normal never run to here. 		//printf("can't support this font now.\n"); 	}	//printk("\ntest = %d.\n",test); }                                                                                         /* *  this bitmap data only use for debug.*//* index = 0 */const unsigned char bmp_zhong[32] = {0x00,0x00,0x00,0x00,0x0F,0xE0,0x0F,0xE0,				0x08,0xC0,0x08,0xC0,0x08,0xC0,0xFF,0xFE,				0xFF,0xFE,0x08,0xC0,0x08,0xC0,0x08,0xC0,				0x0F,0xE0,0x0F,0xE0,0x00,0x00,0x00,0x00};/* index = 1 */const unsigned char bmp_hua[32] = {0x00,0x00,0x04,0x30,0x0C,0x30,0x3F,0xB0,				0x7F,0xF0,0x40,0x30,0x06,0x30,0x04,0x7E,				0xFF,0x7E,0x7F,0xB0,0x19,0xB0,0x11,0xB0,				0x31,0xB0,0x23,0xB0,0x03,0x30,0x00,0x00};/* index = 2 */const unsigned char bmp_ren[32] = {0x00,0x00,0x00,0x04,0x00,0x06,0x00,0x0C,				0x00,0x1C,0x00,0x38,0x01,0xE0,0x7F,0x80,				0x7F,0x80,0x00,0xE0,0x00,0x70,0x00,0x18,				0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x00};/* index = 3 */const unsigned char bmp_min[32] = {0x00,0x00,0x00,0x00,0x7F,0xFE,0x7F,0xFE,				0x64,0x8C,0x64,0x8C,0x64,0x98,0x66,0x80,				0x67,0xE0,0x64,0xF8,0x64,0x9C,0x64,0x86,				0x7C,0x86,0x04,0x86,0x00,0x0E,0x00,0x00};/* index = 4 */const unsigned char bmp_gong[32] = {0x00,0x00,0x00,0x40,0x0C,0x47,0x0C,0x46,				0x0C,0x4C,0x7F,0xD8,0x7F,0xD8,0x0C,0x40,				0x0C,0x40,0x0C,0x40,0x7F,0xD8,0x4C,0x5C,				0x0C,0x4C,0x0C,0x46,0x0C,0x42,0x00,0x00};/* index = 5 */const unsigned char bmp_he[32] = {0x00,0x00,0x26,0x30,0x26,0x70,0x27,0xC0,				0x3F,0xFE,0x7F,0xFE,0x66,0xC0,0x66,0x60,				0x00,0x00,0x1F,0xFC,0x10,0x30,0x10,0x30,				0x10,0x30,0x1F,0xF8,0x1F,0xF8,0x00,0x00};/* index = 6 */const unsigned char bmp_guo[32] = {0x00,0x00,0x00,0x00,0x7F,0xFE,0x60,0x04,0x69,0x34,0x69,0x34,0x69,0x34,0x6F,0xF4,0x6F,0xF4,0x69,0x74,0x69,0xF4,0x69,0x74,0x60,0x14,0x7F,0xFE,0x7F,0xFE,0x00,0x00};/* * this two chars test for new ziku.* but this data have reverse,hehe.*/const unsigned char zhong_zk[32] = {0x00,0x00,0xfc,0x08,0x08,0x08,0x08,0xff,0x08,0x08,0x08,0x08,0xfc,0x08,0x00,0x00, 0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xff,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00};/* index = 8 */const unsigned char hua_zk[32] ={0x04,0x08,0x10,0x3f,0xc0,0x40,0x08,0x08,0xfe,0x11,0x11,0x21,0x67,0x27,0x00,0x00,0x00,0x20,0x20,0xa0,0x20,0x20,0x20,0xff,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00}; /*  * test for 32X32 chars * lcd_cfg.high must set HIGH_32 * *//* index = 9 */const unsigned char hua_32[]  = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x07,0x00,0x00,0x38,0x07,0x00,0x00,0xF8,0x07,0x00,0x01,0xE0,0x07,0x00,0x03,0xE0,0x07,0x00,0x0F,0xFF,0xE7,0x00,0x1F,0xFF,0xE7,0x00,0x7F,0xFF,0xE7,0x00,0x38,0x00,0x07,0x00,0x30,0x00,0x07,0x00,0x00,0x18,0x07,0x00,0x00,0x38,0x07,0x00,0x00,0x38,0x07,0x00,0x00,0x30,0x3F,0xFE,0x7F,0xFF,0x3F,0xFE,0x7F,0xFF,0xB7,0x3C,0x7F,0xFF,0xC7,0x00,0x00,0xC1,0xC7,0x00,0x01,0xC1,0xC7,0x00,0x03,0x81,0xC7,0x00,0x03,0x81,0xC7,0x00,0x07,0x01,0xC7,0x00,0x0F,0x01,0xC7,0x00,0x1E,0x01,0xC7,0x00,0x0C,0x03,0xC7,0x00,0x04,0x0F,0xC7,0x00,0x00,0x07,0x87,0x00,0x00,0x06,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* * test for 64X64 chars * lcd_cfg.high must set HIGH_64 * index = 10  * */const unsigned char hua_64[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x1F,0x00,0x00,0x00,0x00,0x0F,0xC0,0x00,0x1F,0x00,0x00,0x00,0x00,0x1F,0xC0,0x00,0x1F,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x1F,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x1F,0x00,0x00,0x00,0x01,0xFF,0x00,0x00,0x1E,0x00,0x00,0x00,0x03,0xFC,0x00,0x00,0x1E,0x00,0x00,0x00,0x07,0xF8,0x00,0x00,0x1E,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x1E,0x00,0x00,0x00,0x3F,0xFF,0xFF,0xF8,0x1E,0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFC,0x1E,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFC,0x1E,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFC,0x1E,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFC,0x1E,0x00,0x00,0x1F,0xF8,0x00,0x00,0xFC,0x1E,0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,0x1E,0x00,0x00,0x0F,0xC0,0x00,0x00,0x00,0x1E,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x06,0x00,0x02,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x1E,0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x1E,0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x1E,0x00,0x00,0x00,0x00,0x0F,0xC0,0x00,0x1E,0x00,0x00,0x00,0x00,0x0F,0x80,0x00,0x1E,0x00,0x00,0x00,0x00,0x0F,0x80,0x0F,0x9E,0x0F,0xF8,0x00,0x00,0x1F,0x80,0x0F,0xFF,0xFF,0xF8,0x00,0x00,0x1F,0x00,0x0F,0xFF,0xFF,0xF8,0x00,0x00,0x1F,0x00,0x0F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xF8,0x1F,0xFF,0xFF,0xFF,0xE0,0x1E,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xE0,0x1E,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xE0,0x1E,0x00,0x00,0x00,0x01,0xF8,0x07,0xE0,0x1E,0x00,0x00,0x00,0x01,0xF0,0x03,0xE0,0x1E,0x00,0x00,0x00,0x01,0xF0,0x03,0xE0,0x1E,0x00,0x00,0x00,0x03,0xE0,0x03,0xE0,0x1E,0x00,0x00,0x00,0x07,0xE0,0x03,0xE0,0x1E,0x00,0x00,0x00,0x07,0xC0,0x03,0xE0,0x1E,0x00,0x00,0x00,0x0F,0x80,0x03,0xE0,0x1E,0x00,0x00,0x00,0x1F,0x80,0x03,0xE0,0x1E,0x00,0x00,0x00,0x1F,0x80,0x03,0xE0,0x1E,0x00,0x00,0x00,0x3F,0x00,0x03,0xE0,0x1E,0x00,0x00,0x00,0x7E,0x00,0x03,0xE0,0x1E,0x00,0x00,0x00,0xFE,0x00,0x03,0xE0,0x1E,0x00,0x00,0x01,0xFC,0x00,0x03,0xE0,0x1E,0x00,0x00,0x01,0xFC,0x00,0x03,0xE0,0x1E,0x00,0x00,0x01,0xF8,0x00,0x07,0xE0,0x1E,0x00,0x00,0x00,0x78,0x00,0x7F,0xE0,0x1E,0x00,0x00,0x00,0x30,0x00,0xFF,0xE0,0x1F,0x00,0x00,0x00,0x10,0x00,0x7F,0xE0,0x1F,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*  * test for 8X8 chars * lcd_cfg.high must set HIGH_8 * index = 11 * */const unsigned char hua_8[] = {0x04,0x64,0xFC,0x25,0xFF,0x4C,0x5C,0x14};/*  * test for 24X24 chars * lcd_cfg.high must set HIGH_24 * index = 12 * */const unsigned char hua_24[] = {0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0xC0,0xC0,0x03,0x80,0xC0,0x07,0x00,0xC0,0x0F,0xFC,0xC0,0x3F,0xFC,0xC0,0x78,0x00,0xC0,0x20,0x00,0xC0,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x01,0x87,0xFE,0x7F,0xF7,0xFE,0x7F,0xF8,0xC0,0x03,0x18,0xC0,0x06,0x18,0xC0,0x06,0x18,0xC0,0x0C,0x18,0xC0,0x1C,0x18,0xC0,0x38,0x18,0xC0,0x08,0x78,0xC0,0x00,0x30,0xC0,0x00,0x00,0xC0,0x00,0x00,0x00};unsigned char *bmps[] = {bmp_zhong,bmp_hua,bmp_ren,bmp_min,bmp_gong,bmp_he,bmp_guo,zhong_zk, hua_zk, hua_32, hua_64, hua_8, hua_24};               static int lcd_ioctl(struct inode *inode, struct file *file,                                                                                                                                                             		     unsigned int cmd, unsigned long arg) { 	//printk(KERN_ALERT "lcd_ioctl cmd is %d.\n",cmd); 	switch (cmd){ 	case LCD_ON: 		udelay(150); 		lcd_on(); 		break;  	case LCD_OFF: 		udelay(150);		lcd_off(); 		 		break;  	case LCD_RESET: 		udelay(150); 		lcd_init(); 		break;  	case LCD_CLEAR: 		udelay(150); 		lcd_clear_scr(); 		break; 	//default is left ward.  	case LCD_DISP_LEFT: 		udelay(150); 		//LCDWriteInst(0XA1);		lcd_set_ward(LCD_LEFT_WARD); 		break;  	case LCD_DISP_RIGHT: 		udelay(150); 		lcd_set_ward(LCD_RIGHT_WARD); 		break;		case LCD_SET_CONTRAST:		udelay(150);		lcd_set_contrast(arg);		break;	case LCD_FULL:		udelay(150);		lcd_full_scr();	 	break;	case LCD_DARKER:		udelay(150);		lcd_darker();		break;	case LCD_LIGHTER:		udelay(150);		lcd_lighter();		break;		case LCD_DRAW_BMP:{		struct lcd_dev k_lcd_dev;				if ( copy_from_user(&k_lcd_dev, (struct lcd_dev *)arg, sizeof(struct lcd_dev)) ){ 			printk("\nk:copy lcd_dev buf kernel error0.\n"); 			return -EFAULT;		} 		draw_bmp_zk(k_lcd_dev.x0,k_lcd_dev.y0,k_lcd_dev.x_cnt,k_lcd_dev.y_cnt,k_lcd_dev.buf);				break;	}		case LCD_DRAW_CHARS:{		//struct lcd_dev k_lcd_dev;		//struct lcd_dev *lcd_devp;		unsigned char font_high;	//unit line		unsigned int x,y;		unsigned int i;		unsigned int font_size;		unsigned char *pbuf;		//lcd_devp = &k_lcd_dev;		if ( copy_from_user(lcd_devp, (struct lcd_dev *)arg, sizeof(struct lcd_dev)) ){ 			printk("\nk:copy lcd_dev buf kernel error0.\n"); 			return -EFAULT;		}		x = lcd_devp->x0;		y = lcd_devp->y0;		font_high = lcd_devp->font_h / 8;		pbuf = lcd_devp->buf;		font_size = (unsigned int)(lcd_devp->font_w * lcd_devp->font_h) / 8;		if ( y > lcd_cfg.max_line){			return -EFAULT;		}		for (i = 0; i < lcd_devp->len; i++){			if ( (x + lcd_devp->font_w) > (max_col()+1) ){		 //change to next line.				if (y >= lcd_cfg.max_line){ 			//has the last line,return.					return -EFAULT;				}				x = 0;y += font_high;			}				draw_bmp_zk(x, y, lcd_devp->font_w, font_high, pbuf);			x += lcd_devp->font_w;			pbuf += font_size;		}		break;	}	/*	  this case only use for LdmChar.exe tool generate database.	*/ 	case 100:{			//need check parameter value.			unsigned int buf_size,i;			struct lcd_dev *user_lcd_devp;			struct lcd_dev k_lcd_dev;				user_lcd_devp = (struct lcd_dev *)arg;			//buf_size = lcd_devp->x_cnt * lcd_devp->y_cnt;			if ( copy_from_user(&k_lcd_dev, user_lcd_devp, sizeof(struct lcd_dev)) ){ 				printk("\nk:copy lcd_dev buf kernel error0.\n"); 				return -EFAULT;			} 			draw_bmp(k_lcd_dev.x0,k_lcd_dev.y0,k_lcd_dev.x_cnt,k_lcd_dev.y_cnt,k_lcd_dev.buf);  			break; 		}	case 101:{		unsigned char i;			struct lcd_debug lcd_d;		if ( copy_from_user(&lcd_d, (struct lcd_debug *)arg, sizeof(struct lcd_debug) )){			printk(KERN_DEBUG "copy lcd_debug error.\n");		}		//printk("\n");		for (i = 0; i <32; i++){			printk(KERN_ALERT "K:k_static_buf[%d]=0x%x\n",i,bmp_hua[i]);		};		draw_bmp(lcd_d.x0,lcd_d.y0,lcd_d.x_cnt,lcd_d.y_cnt,bmps[lcd_d.bmp_index]);		break;		} 	default: 		return -EINVAL;  	} 	return 0;  }  static int lcd_open(struct inode *inode, struct file *file) { 	//printk(KERN_ALERT "lcd open running.\n"); 	if (lcd_open_flag){ 		printk(KERN_ALERT "lcd dev had open.\n"); 		return -ENXIO; 	}else{		//lcd_init();		//lcd_clear_scr(); 		//printk(KERN_ALERT "lcd dev open success.\n");		/*		lcd_screen_buf = (unsigned char*)kmalloc(sizeof(unsigned char*)LM6063_SCR_BUF_SIZE,GFP_KERNEL); 		if (!lcd_screen_buf){			printk(KERN_ALERT "not enough memory for lcd frame buf.\n");			return -ENXIO;		*/		lcd_devp = (struct lcd_dev *)kmalloc(sizeof(struct lcd_dev), GFP_KERNEL);		if ( !lcd_devp ){			printk(KERN_ALERT "\nk: kmalloc for lcd dev fail.\n");		}		lcd_open_flag = 1; 		return 0; 	} }  static int lcd_release(struct inode *inode, struct file *file){	//if (lcd_screen_buf){	//	kfree(lcd_screen_buf);	//}	if (lcd_open_flag == 1){		if (lcd_devp){			kfree(lcd_devp);			lcd_devp = NULL;		}				lcd_open_flag = 0;	}  	//printk(KERN_ALERT "lcd dev close.\n"); 	return 0; }  /*  *	The various file operations we support.  */  static const struct file_operations lcd_ops = { 	//.read = lcd_read, 	.ioctl = lcd_ioctl, 	.open = lcd_open, 	.release = lcd_release, };  static int __lcd_init(void) { 	int ret; 	dev_t dev = 0;	 	printk(KERN_ALERT "lcd module install.\n"); 	 	ret = alloc_chrdev_region(&dev, lcd_minor, 1, "LM6063A"); 	lcd_major = MAJOR(dev); 	if (ret) { 		printk(KERN_WARNING "can't get major.\n"); 		goto alloc_chrdev_fail; 	}  	/*  don't should malloc lcd_dev memory at module install 	lcd_devp = kmalloc(sizeof(struct lcd_dev),GFP_KERNEL); 	if (!lcd_devp){ 		printk(KERN_ALERT "lcd malloc memory fail 1.\n"); 		ret = -ENOMEM; 		goto malloc_mem_fail_1; 	}		lcd_devp->buf = kmalloc(lcd_cfg.scr_buf_size,GFP_KERNEL);	if ( !lcd_devp->buf){ 		printk(KERN_ALERT "lcd malloc memory fail 0.\n"); 		ret = -ENOMEM; 		goto malloc_mem_fail_0;	}	*/	//lcd_devp->buf = lcd_screen_buf; 	//memset(lcd_devp, 0, sizeof(struct lcd_dev));	//memset(lcd_devp->buf, 0, 128*64/8/* lcd_cfg.scr_buf_size*/); 	 	lcd_cdev = cdev_alloc(); 	if (!lcd_cdev){ 		printk(KERN_ALERT "lcd alloc cdev fail.\n"); 		goto alloc_cdev_fail; 	} 	 	cdev_init(lcd_cdev,&lcd_ops); 	if (cdev_add(lcd_cdev, dev, 1)){ 		printk(KERN_ALERT "lcd add cdev fail.\n"); 		goto add_cdev_fail; 	}  	lcd_open_flag = 0;	 	printk(KERN_ALERT "lcd major is %d.\n lcd minor is %d\n",lcd_major,lcd_minor); 	//printk(KERN_ALERT "lcd dev init success.\n"); 	return 0; /* succeed */ add_cdev_fail: 	cdev_del(lcd_cdev); alloc_cdev_fail://	kfree(lcd_devp->buf);//malloc_mem_fail_0:// 	kfree(lcd_devp); //malloc_mem_fail_1: 	unregister_chrdev_region(dev,1); alloc_chrdev_fail: 	return ret; }  static void __exit __lcd_exit(void) { 	dev_t dev = MKDEV(lcd_major, lcd_minor);  	if (lcd_cdev){ 		cdev_del(lcd_cdev); 	} 	 	unregister_chrdev_region(dev,1);  	printk(KERN_ALERT "lcd module uninstall.\n"); }  module_init(__lcd_init); module_exit(__lcd_exit);  MODULE_AUTHOR("Grandchips"); MODULE_LICENSE("GPL");                                                                               

⌨️ 快捷键说明

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