Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 70e84049 authored by Miguel Ojeda Sandonis's avatar Miguel Ojeda Sandonis Committed by Linus Torvalds
Browse files

[PATCH] drivers: add LCD support



Add support for auxiliary displays, the ks0108 LCD controller, the
cfag12864b LCD and adds a framebuffer device: cfag12864bfb.

- Add a "auxdisplay/" folder in "drivers/" for auxiliary display
  drivers.

- Add support for the ks0108 LCD Controller as a device driver.  (uses
  parport interface)

- Add support for the cfag12864b LCD as a device driver.  (uses ks0108
  LCD Controller driver)

- Add a framebuffer device called cfag12864bfb.  (uses cfag12864b LCD
  driver)

- Add the usual Documentation, includes, Makefiles, Kconfigs,
  MAINTAINERS, CREDITS...

- Miguel Ojeda will maintain all the stuff above.

[rdunlap@xenotime.net: workqueue fixups]
[akpm@osdl.org: kconfig fix]
Signed-off-by: default avatarMiguel Ojeda Sandonis <maxextreme@gmail.com>
Cc: Greg KH <greg@kroah.com>
Acked-by: default avatarPaulo Marques <pmarques@grupopie.com>
Cc: "Randy.Dunlap" <rdunlap@xenotime.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 81d79bec
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -2571,6 +2571,16 @@ S: Subiaco, 6008
S: Perth, Western Australia
S: Australia

N: Miguel Ojeda Sandonis
E: maxextreme@gmail.com
D: Author: Auxiliary LCD Controller driver (ks0108)
D: Author: Auxiliary LCD driver (cfag12864b)
D: Author: Auxiliary LCD framebuffer driver (cfag12864bfb)
D: Maintainer: Auxiliary display drivers tree (drivers/auxdisplay/*)
S: C/ Mieses 20, 9-B
S: Valladolid 47009
S: Spain

N: Greg Page
E: gpage@sovereign.org
D: IPX development and support
+105 −0
Original line number Diff line number Diff line
	===================================
	cfag12864b LCD Driver Documentation
	===================================

License:		GPLv2
Author & Maintainer:	Miguel Ojeda Sandonis <maxextreme@gmail.com>
Date:			2006-10-27



--------
0. INDEX
--------

	1. DRIVER INFORMATION
	2. DEVICE INFORMATION
	3. WIRING
	4. USERSPACE PROGRAMMING


---------------------
1. DRIVER INFORMATION
---------------------

This driver support one cfag12864b display at time.


---------------------
2. DEVICE INFORMATION
---------------------

Manufacturer:	Crystalfontz
Device Name:	Crystalfontz 12864b LCD Series
Device Code:	cfag12864b
Webpage:	http://www.crystalfontz.com
Device Webpage:	http://www.crystalfontz.com/products/12864b/
Type:		LCD (Liquid Crystal Display)
Width:		128
Height:		64
Colors:		2 (B/N)
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


---------
3. WIRING
---------

The cfag12864b LCD Series don't have official wiring.

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 device (/dev/fbX).

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 use the framebuffer as a file: fopen, fwrite, fclose...
Although the LCD won't get updated until the next refresh time arrives.

Also, you can mmap the framebuffer: open & mmap, munmap & close...
which is the best option for most uses.

Check Documentation/auxdisplay/cfag12864b-example.c
for a real working userspace complete program with usage examples.
+282 −0
Original line number Diff line number Diff line
/*
 *    Filename: cfag12864b-example.c
 *     Version: 0.1.0
 * Description: cfag12864b LCD userspace example program
 *     License: GPLv2
 *
 *      Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
 *        Date: 2006-10-31
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

/*
 * ------------------------
 * start of cfag12864b code
 * ------------------------
 */

#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>

#define CFAG12864B_WIDTH		(128)
#define CFAG12864B_HEIGHT		(64)
#define CFAG12864B_SIZE			(128 * 64 / 8)
#define CFAG12864B_BPB			(8)
#define CFAG12864B_ADDRESS(x, y)	((y) * CFAG12864B_WIDTH / \
					CFAG12864B_BPB + (x) / CFAG12864B_BPB)
#define CFAG12864B_BIT(n)		(((unsigned char) 1) << (n))

#undef CFAG12864B_DOCHECK
#ifdef CFAG12864B_DOCHECK
	#define CFAG12864B_CHECK(x, y)		((x) < CFAG12864B_WIDTH && \
						(y) < CFAG12864B_HEIGHT)
#else
	#define CFAG12864B_CHECK(x, y)		(1)
#endif

int cfag12864b_fd;
unsigned char * cfag12864b_mem;
unsigned char cfag12864b_buffer[CFAG12864B_SIZE];

/*
 * init a cfag12864b framebuffer device
 *
 * No error:       return = 0
 * Unable to open: return = -1
 * Unable to mmap: return = -2
 */
int cfag12864b_init(char *path)
{
	cfag12864b_fd = open(path, O_RDWR);
	if (cfag12864b_fd == -1)
		return -1;

	cfag12864b_mem = mmap(0, CFAG12864B_SIZE, PROT_READ | PROT_WRITE,
		MAP_SHARED, cfag12864b_fd, 0);
	if (cfag12864b_mem == MAP_FAILED) {
		close(cfag12864b_fd);
		return -2;
	}

	return 0;
}

/*
 * exit a cfag12864b framebuffer device
 */
void cfag12864b_exit(void)
{
	munmap(cfag12864b_mem, CFAG12864B_SIZE);
	close(cfag12864b_fd);
}

/*
 * set (x, y) pixel
 */
void cfag12864b_set(unsigned char x, unsigned char y)
{
	if (CFAG12864B_CHECK(x, y))
		cfag12864b_buffer[CFAG12864B_ADDRESS(x, y)] |=
			CFAG12864B_BIT(x % CFAG12864B_BPB);
}

/*
 * unset (x, y) pixel
 */
void cfag12864b_unset(unsigned char x, unsigned char y)
{
	if (CFAG12864B_CHECK(x, y))
		cfag12864b_buffer[CFAG12864B_ADDRESS(x, y)] &=
			~CFAG12864B_BIT(x % CFAG12864B_BPB);
}

/*
 * is set (x, y) pixel?
 *
 * Pixel off: return = 0
 * Pixel on:  return = 1
 */
unsigned char cfag12864b_isset(unsigned char x, unsigned char y)
{
	if (CFAG12864B_CHECK(x, y))
		if (cfag12864b_buffer[CFAG12864B_ADDRESS(x, y)] &
			CFAG12864B_BIT(x % CFAG12864B_BPB))
			return 1;

	return 0;
}

/*
 * not (x, y) pixel
 */
void cfag12864b_not(unsigned char x, unsigned char y)
{
	if (cfag12864b_isset(x, y))
		cfag12864b_unset(x, y);
	else
		cfag12864b_set(x, y);
}

/*
 * fill (set all pixels)
 */
void cfag12864b_fill(void)
{
	unsigned short i;

	for (i = 0; i < CFAG12864B_SIZE; i++)
		cfag12864b_buffer[i] = 0xFF;
}

/*
 * clear (unset all pixels)
 */
void cfag12864b_clear(void)
{
	unsigned short i;

	for (i = 0; i < CFAG12864B_SIZE; i++)
		cfag12864b_buffer[i] = 0;
}

/*
 * format a [128*64] matrix
 *
 * Pixel off: src[i] = 0
 * Pixel on:  src[i] > 0
 */
void cfag12864b_format(unsigned char * matrix)
{
	unsigned char i, j, n;

	for (i = 0; i < CFAG12864B_HEIGHT; i++)
	for (j = 0; j < CFAG12864B_WIDTH / CFAG12864B_BPB; j++) {
		cfag12864b_buffer[i * CFAG12864B_WIDTH / CFAG12864B_BPB +
			j] = 0;
		for (n = 0; n < CFAG12864B_BPB; n++)
			if (matrix[i * CFAG12864B_WIDTH +
				j * CFAG12864B_BPB + n])
				cfag12864b_buffer[i * CFAG12864B_WIDTH /
					CFAG12864B_BPB + j] |=
					CFAG12864B_BIT(n);
	}
}

/*
 * blit buffer to lcd
 */
void cfag12864b_blit(void)
{
	memcpy(cfag12864b_mem, cfag12864b_buffer, CFAG12864B_SIZE);
}

/*
 * ----------------------
 * end of cfag12864b code
 * ----------------------
 */

#include <stdio.h>
#include <string.h>

#define EXAMPLES	6

void example(unsigned char n)
{
	unsigned short i, j;
	unsigned char matrix[CFAG12864B_WIDTH * CFAG12864B_HEIGHT];

	if (n > EXAMPLES)
		return;

	printf("Example %i/%i - ", n, EXAMPLES);

	switch (n) {
	case 1:
		printf("Draw points setting bits");
		cfag12864b_clear();
		for (i = 0; i < CFAG12864B_WIDTH; i += 2)
			for (j = 0; j < CFAG12864B_HEIGHT; j += 2)
				cfag12864b_set(i, j);
		break;

	case 2:
		printf("Clear the LCD");
		cfag12864b_clear();
		break;

	case 3:
		printf("Draw rows formatting a [128*64] matrix");
		memset(matrix, 0, CFAG12864B_WIDTH * CFAG12864B_HEIGHT);
		for (i = 0; i < CFAG12864B_WIDTH; i++)
			for (j = 0; j < CFAG12864B_HEIGHT; j += 2)
				matrix[j * CFAG12864B_WIDTH + i] = 1;
		cfag12864b_format(matrix);
		break;

	case 4:
		printf("Fill the lcd");
		cfag12864b_fill();
		break;

	case 5:
		printf("Draw columns unsetting bits");
		for (i = 0; i < CFAG12864B_WIDTH; i += 2)
			for (j = 0; j < CFAG12864B_HEIGHT; j++)
				cfag12864b_unset(i, j);
		break;

	case 6:
		printf("Do negative not-ing all bits");
		for (i = 0; i < CFAG12864B_WIDTH; i++)
			for (j = 0; j < CFAG12864B_HEIGHT; j ++)
				cfag12864b_not(i, j);
		break;
	}

	puts(" - [Press Enter]");
}

int main(int argc, char *argv[])
{
	unsigned char n;

	if (argc != 2) {
		printf(
			"Sintax:  %s fbdev\n"
			"Usually: /dev/fb0, /dev/fb1...\n", argv[0]);
		return -1;
	}

	if (cfag12864b_init(argv[1])) {
		printf("Can't init %s fbdev\n", argv[1]);
		return -2;
	}

	for (n = 1; n <= EXAMPLES; n++) {
		example(n);
		cfag12864b_blit();
		while (getchar() != '\n');
	}

	cfag12864b_exit();

	return 0;
}
+55 −0
Original line number Diff line number Diff line
	==========================================
	ks0108 LCD Controller Driver Documentation
	==========================================

License:		GPLv2
Author & Maintainer:	Miguel Ojeda Sandonis <maxextreme@gmail.com>
Date:			2006-10-27



--------
0. INDEX
--------

	1. DRIVER INFORMATION
	2. DEVICE INFORMATION
	3. WIRING


---------------------
1. DRIVER INFORMATION
---------------------

This driver support the ks0108 LCD controller.


---------------------
2. DEVICE INFORMATION
---------------------

Manufacturer:	Samsung
Device Name:	KS0108 LCD Controller
Device Code:	ks0108
Webpage:	-
Device Webpage:	-
Type:		LCD Controller (Liquid Crystal Display Controller)
Width:		64
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


---------
3. WIRING
---------

The driver supports data parallel port wiring.

If you aren't building LCD related hardware, you should check
your LCD specific wiring information in the same folder.

For example, check Documentation/auxdisplay/cfag12864b.
+24 −0
Original line number Diff line number Diff line
@@ -635,6 +635,12 @@ W: http://people.redhat.com/sgrubb/audit/
T:	git kernel.org:/pub/scm/linux/kernel/git/dwmw2/audit-2.6.git
S:	Maintained

AUXILIARY DISPLAY DRIVERS
P:	Miguel Ojeda Sandonis
M:	maxextreme@gmail.com
L:	linux-kernel@vger.kernel.org
S:	Maintained

AVR32 ARCHITECTURE
P:	Haavard Skinnemoen
M:	hskinnemoen@atmel.com
@@ -836,6 +842,18 @@ L: linux-kernel@vger.kernel.org
L:	discuss@x86-64.org
S:	Maintained

CFAG12864B LCD DRIVER
P:	Miguel Ojeda Sandonis
M:	maxextreme@gmail.com
L:	linux-kernel@vger.kernel.org
S:	Maintained

CFAG12864BFB LCD FRAMEBUFFER DRIVER
P:	Miguel Ojeda Sandonis
M:	maxextreme@gmail.com
L:	linux-kernel@vger.kernel.org
S:	Maintained

COMMON INTERNET FILE SYSTEM (CIFS)
P:	Steve French
M:	sfrench@samba.org
@@ -1971,6 +1989,12 @@ M: davem@davemloft.net
L:	linux-kernel@vger.kernel.org
S:	Maintained

KS0108 LCD CONTROLLER DRIVER
P:	Miguel Ojeda Sandonis
M:	maxextreme@gmail.com
L:	linux-kernel@vger.kernel.org
S:	Maintained

LAPB module
L:	linux-x25@vger.kernel.org
S:	Orphan
Loading