📄 lm6063.c
字号:
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 + -