drivers: add LCD support
Subsystems (4)
PATCH 1/1 drivers: add LCD support
Andrew, here it is the same patch without locking. Thanks you.
---
- Adds mmaping support for the cfag12864bfb.
- Exchange the wiring drawing URL to a local ASCII drawing at Documentation/auxdisplay/cfag12864b.
- Minor coding style and documentation fixes.
Documentation/auxdisplay/cfag12864b | 57 +++++++++++++++++++------- Documentation/auxdisplay/ks0108 | 14 ++---- drivers/auxdisplay/Kconfig | 7 --- drivers/auxdisplay/cfag12864b.c | 28 +++++++----- drivers/auxdisplay/cfag12864bfb.c | 30 ++++++++++++- 5 files changed, 93 insertions(+), 43 deletions(-)
miguelojeda-2.6.19-rc1-drivers-add-LCD-support-4-mmaping-and-ascii-drawing.patch
Signed-off-by Miguel Ojeda Sandonis <[email protected]>
---
Documentation/auxdisplay/cfag12864b +42 -15
@@ -4,7 +4,7 @@ License: GPLv2 Author & Maintainer: Miguel Ojeda Sandonis <[email protected]> -Date: 2006-10-11 +Date: 2006-10-27
@@ -15,7 +15,7 @@ Date: 2006-10-11 1. DRIVER INFORMATION 2. DEVICE INFORMATION 3. WIRING - 4. USER-SPACE PROGRAMMING + 4. USERSPACE PROGRAMMING ---------------------
@@ -42,7 +42,8 @@ Controller: ks0108 Controllers: 2 Pages: 8 each controller Addresses: 64 each page - +Data size: 1 byte each address +Memory size: 2 * 8 * 64 * 1 = 1024 bytes = 1 Kbyte ---------
@@ -51,25 +52,53 @@ Addresses: 64 each page The cfag12864b LCD Series don't have official wiring. -The common wiring is done to the parallel port: - -http://www.skippari.net/lcd/sekalaista/crystalfontz_cfag12864B-TMI-V.png - -You can get help at Crystalfontz and LCDInfo forums. +The common wiring is done to the parallel port as shown: +Parallel Port cfag12864b + + Name Pin# Pin# Name + +Strobe ( 1)------------------------------(17) Enable +Data 0 ( 2)------------------------------( 4) Data 0 +Data 1 ( 3)------------------------------( 5) Data 1 +Data 2 ( 4)------------------------------( 6) Data 2 +Data 3 ( 5)------------------------------( 7) Data 3 +Data 4 ( 6)------------------------------( 8) Data 4 +Data 5 ( 7)------------------------------( 9) Data 5 +Data 6 ( 8)------------------------------(10) Data 6 +Data 7 ( 9)------------------------------(11) Data 7 + (10) [+5v]---( 1) Vdd + (11) [GND]---( 2) Ground + (12) [+5v]---(14) Reset + (13) [GND]---(15) Read / Write + Line (14)------------------------------(13) Controller Select 1 + (15) + Init (16)------------------------------(12) Controller Select 2 +Select (17)------------------------------(16) Data / Instruction +Ground (18)---[GND] [+5v]---(19) LED + +Ground (19)---[GND] +Ground (20)---[GND] E A Values: +Ground (21)---[GND] [GND]---[P1]---(18) Vee · R = Resistor = 22 ohm +Ground (22)---[GND] | · P1 = Preset = 10 Kohm +Ground (23)---[GND] ---- S ------( 3) V0 · P2 = Preset = 1 Kohm +Ground (24)---[GND] | | +Ground (25)---[GND] [GND]---[P2]---[R]---(20) LED - ------------------------ 4. USERSPACE PROGRAMMING ------------------------ -The cfag12864bfb describes a framebuffer driver (/dev/fbX). +The cfag12864bfb describes a framebuffer device (/dev/fbX). -It has a size of 128 * 64 / 8 = 1024 bytes = 1 kB. +It has a size of 1024 bytes = 1 Kbyte. Each bit represents one pixel. If the bit is high, the pixel will turn on. If the pixel is low, the pixel will turn off. -You can mmap the framebuffer as usual. +You can use the framebuffer as a file: fopen, fwrite, fclose... + +Also, you can mmap the framebuffer: open & mmap, munmap & close... +which is the best option. You can use a copy of this header in your userspace programs.
@@ -79,7 +108,7 @@ You can use a copy of this header in you * Description: cfag12864b LCD Display Driver Header for user-space apps * * Author: Miguel Ojeda Sandonis <[email protected]> - * Date: 2006-10-11 + * Date: 2006-10-27 */ #ifndef _CFAG12864B_H_
@@ -87,9 +116,7 @@ You can use a copy of this header in you #define CFAG12864B_WIDTH (128) #define CFAG12864B_HEIGHT (64) -#define CFAG12864B_SIZE ((CFAG12864B_CONTROLLERS) * \ - (CFAG12864B_PAGES) * \ - (CFAG12864B_ADDRESSES)) +#define CFAG12864B_SIZE (1024) #endif // _CFAG12864B_H_ ---8<---
Documentation/auxdisplay/ks0108 +6 -8
@@ -4,7 +4,7 @@ License: GPLv2 Author & Maintainer: Miguel Ojeda Sandonis <[email protected]> -Date: 2006-10-04 +Date: 2006-10-27
@@ -39,7 +39,8 @@ Height: 64 Colors: 2 (B/N) Pages: 8 Addresses: 64 each page - +Data size: 1 byte each address +Memory size: 8 * 64 * 1 = 512 bytes ---------
@@ -48,12 +49,9 @@ Addresses: 64 each page The driver supports data parallel port wiring. -If you aren't creating a LCD related hardware, you should check -your LCD specific wiring information in the same folder, not this one. - - -Wiring example of a cfag12864b LCD which has two ks0108 controllers: +If you aren't building LCD related hardware, you should check +your LCD specific wiring information in the same folder. -http://www.skippari.net/lcd/sekalaista/crystalfontz_cfag12864B-TMI-V.png +For example, check Documentation/auxdisplay/cfag12864b. EOF
drivers/auxdisplay/cfag12864b.c +17 -11
@@ -6,7 +6,7 @@* Depends: ks0108 * * Author: Copyright (C) Miguel Ojeda Sandonis <[email protected]> -* Date: 2006-10-13 +* Date: 2006-10-26 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by
@@ -182,7 +182,7 @@ static void cfag12864b_nop(void)* cfag12864b Internal Commands */ -unsigned char *cfag12864b_cache; +static unsigned char *cfag12864b_cache;unsigned char *cfag12864b_buffer;EXPORT_SYMBOL_GPL (cfag12864b_buffer);
@@ -226,7 +226,7 @@ static void cfag12864b_update(void *arg)unsigned char c;unsigned short i, j, k, b; -if (memcmp (cfag12864b_cache, cfag12864b_buffer,CFAG12864B_SIZE )) { +if (memcmp (cfag12864b_cache, cfag12864b_buffer,CFAG12864B_SIZE )) {for (i =0 ; i <CFAG12864B_CONTROLLERS ; i++) {cfag12864b_controller (i);cfag12864b_nop ();
@@ -251,7 +251,7 @@ static void cfag12864b_update(void *arg)memcpy (cfag12864b_cache, cfag12864b_buffer,CFAG12864B_SIZE ); } -if (cfag12864b_updating) +if (cfag12864b_updating)queue_delayed_work (cfag12864b_workqueue, &cfag12864b_work,HZ / cfag12864b_rate); }
@@ -264,12 +264,18 @@ static int __init cfag12864b_init(void) {int ret = -EINVAL ; - cfag12864b_buffer =vmalloc (sizeof (unsigned char ) * -CFAG12864B_SIZE ); +if (PAGE_SIZE <CFAG12864B_SIZE ) { + printk(KERN_ERR CFAG12864B_NAME ": ERROR: " +"page size (%i) < cfag12864b size (%i)\n" , + (unsigned int)PAGE_SIZE, CFAG12864B_SIZE); + ret = -ENOMEM ; + goto none; + } + + cfag12864b_buffer = (unsigned char *)__get_free_page (GFP_KERNEL );if (cfag12864b_buffer ==NULL ) { printk(KERN_ERR CFAG12864B_NAME ": ERROR: " -"can't v-alloc buffer (%i bytes)\n" , - CFAG12864B_SIZE); + "can't get a free page\n"); ret = -ENOMEM ; goto none; }
@@ -290,7 +296,7 @@ static int __init cfag12864b_init(void)cfag12864b_on (); cfag12864b_workqueue =create_singlethread_workqueue (CFAG12864B_NAME ); -if (cfag12864b_workqueue ==NULL ) +if (cfag12864b_workqueue ==NULL ) goto cachealloced; cfag12864b_updating =1 ;
@@ -302,7 +308,7 @@ cachealloced:kfree (cfag12864b_cache); bufferalloced: -vfree (cfag12864b_buffer); +free_page ((unsigned long ) cfag12864b_buffer); none:return ret;
@@ -317,7 +323,7 @@ static void __exit cfag12864b_exit(void)cfag12864b_off ();kfree (cfag12864b_cache); -vfree (cfag12864b_buffer); +free_page ((unsigned long ) cfag12864b_buffer); }module_init (cfag12864b_init);
drivers/auxdisplay/cfag12864bfb.c +27 -3
@@ -6,7 +6,7 @@* Depends: cfag12864b * * Author: Copyright (C) Miguel Ojeda Sandonis <[email protected]> -* Date: 2006-10-13 +* Date: 2006-10-26 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by
@@ -40,7 +40,7 @@#define CFAG12864BFB_NAME "cfag12864bfb"static struct fb_fix_screeninfo cfag12864bfb_fix__initdata = { - .id ="cfag12864b" , + .id ="cfag12864b" , .type =FB_TYPE_PACKED_PIXELS , .visual =FB_VISUAL_MONO10 , .xpanstep =0 ,
@@ -66,11 +66,35 @@ static struct fb_var_screeninfo cfag1286 .vmode = FB_VMODE_NONINTERLACED, }; +static struct page *cfag12864bfb_vma_nopage (struct vm_area_struct *vma, +unsigned long address,int *type) +{ +struct page *page =virt_to_page (cfag12864b_buffer); +get_page (page); + +if (type) + *type =VM_FAULT_MINOR ; + +return page; +} + +static struct vm_operations_struct cfag12864bfb_vm_ops = { + .nopage = cfag12864bfb_vma_nopage, +}; + +static int cfag12864bfb_mmap (struct fb_info *info,struct vm_area_struct *vma) +{ + vma->vm_ops = &cfag12864bfb_vm_ops; + vma->vm_flags |=VM_RESERVED ; +return 0 ; +} +static struct fb_ops cfag12864bfb_ops = { .owner =THIS_MODULE , .fb_fillrect = cfb_fillrect, .fb_copyarea = cfb_copyarea, .fb_imageblit = cfb_imageblit, + .fb_mmap = cfag12864bfb_mmap, };static int __init cfag12864bfb_probe (struct platform_device *device)
@@ -81,7 +105,7 @@ static int __init cfag12864bfb_probe(strif (!info) goto none; - info->screen_base = (char __iomem *)cfag12864b_buffer; + info->screen_base = (char __iomem *) cfag12864b_buffer; info->screen_size =CFAG12864B_SIZE ; info->fbops = &cfag12864bfb_ops; info->fix = cfag12864bfb_fix;
drivers/auxdisplay/Kconfig +1 -6
@@ -71,12 +71,7 @@ config CFAG12864B say Y. You also need the ks0108 LCD Controller driver. For help about how to wire your LCD to the parallel port, - check this image: - - http://www.skippari.net/lcd/sekalaista/crystalfontz_cfag12864B-TMI-V.png - - Also, you can find help in Crystalfontz and LCDStudio forums. - Check Documentation/lcddisplay/cfag12864b for more information. + check Documentation/auxdisplay/cfag12864b The LCD framebuffer driver can be attached to a console. It will work fine. However, you can't attach it to the fbdev driver
Quoted 1 line · Miguel Ojeda Sandonis
Andrew, here it is the same patch without locking. Thanks you.
Last concern: did you think about cache aliasings ?
bye
Franck