User avatar
topogigio
Posts: 38
Joined: Fri May 10, 2013 1:35 am

Re: HY28A-LCDB, ili9320

Sat May 18, 2013 5:25 pm

hi,
errata corrige...
each time you change from CS0 to CS1 if divider change you must specify before selecting CS:

bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_8);
bcm2835_spi_chipSelect(BCM2835_SPI_CS0);

some code

bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_64);
bcm2835_spi_chipSelect(BCM2835_SPI_CS1);

this is true for each parameter that change between CSes.

that's all

User avatar
topogigio
Posts: 38
Joined: Fri May 10, 2013 1:35 am

Re: HY28A-LCDB, ili9320

Thu May 23, 2013 8:26 pm

Hi to all,
with the on line help, through this forum, of notro and okin, a little bit of my work, at this url:

https://github.com/topogigio/HY28A-LCDB-Drivers

you can find the complete driver of HY28A-LCDB LCD and Touch Panel

bye

texy
Forum Moderator
Forum Moderator
Posts: 5160
Joined: Sat Mar 03, 2012 10:59 am
Location: Berkshire, England

Re: HY28A-LCDB, ili9320

Thu May 30, 2013 7:46 am

Good work on this - well done ;)
Out of interest, is the touch panel driver available seperately, independant of the screen driver?
Texy
Various male/female 40- and 26-way GPIO header for sale here ( IDEAL FOR YOUR PiZero ):
https://www.raspberrypi.org/forums/viewtopic.php?f=93&t=147682#p971555

User avatar
topogigio
Posts: 38
Joined: Fri May 10, 2013 1:35 am

Re: HY28A-LCDB, ili9320

Thu May 30, 2013 9:34 am

hi,
there is an interaction between the drivers, for example the Touch Panel doen't return video coordinate, so you must calibrate for that.
You can try to separate the Touch Panel functions to integrate in your Lcd driver, the functions begins with TP_.
There are some internal functions that you must keep, so look at functions that are called from TP_ subs.
Let me know
bye and good job

notro
Posts: 695
Joined: Tue Oct 16, 2012 6:21 pm
Location: Drammen, Norway

Re: HY28A-LCDB, ili9320

Sat Jun 08, 2013 2:00 pm

When I use @topogigio's library I get this output:

Code: Select all

other Code: 51600
This is the same as 0xC990
The ILI9320 datasheet has this to say
8.2.3. Start Oscillation (R00h)
The device code “9320”h is read out when read this register
Looking at the source code of the library, it expects 0x9320 or 0x9300

Does this mean that the controller is not an ILI9320?

The reason I'm asking, is that I'm making a framebuffer driver for this display, and I can't get rotation and the BGR bit to work.

andybiker
Posts: 15
Joined: Fri Apr 26, 2013 7:46 am

Re: HY28A-LCDB, ili9320

Sat Jun 08, 2013 6:13 pm

Hi Notro,
I'm a great fan of your work.
I've just got one of these displays to try,
there seem to be two different types of 2.8 inch display.
the spi one claims to use ILI9320 and the 16-bit parallel one uses SPFD5408B
The example code mentions the following chip IDs
#define ILI9320 0 /* 0x9320 */
#define ILI9325 1 /* 0x9325 */
#define ST7781 3 /* 0x7783 */
#define LGDP4531 4 /* 0x4531 */
#define SPFD5408B 5 /* 0x5408 */
#define R61505U 6 /* 0x1505 0x0505 */
#define HX8347A 7 /* 0x0047 */
#define LGDP4535 8 /* 0x4535 */

I can't find any correlation between these and your (our) display.
I'll try connect mine up on Monday
Cheers,
Andrew

notro
Posts: 695
Joined: Tue Oct 16, 2012 6:21 pm
Location: Drammen, Norway

Re: HY28A-LCDB, ili9320

Sat Jun 08, 2013 6:55 pm

Thanks.

This is the only reference to 0xC990 I have found: https://github.com/scottellis/lpc17xx.c ... 700.c#L292
But I haven't been able to find out which controller it is.

I have committed the driver even though it isn't finished (colors are wrong and code is messy).
@topogigio's library have the right colors though.
I need a break from this. Maybe I see more clearly when I return later.

Driver: https://github.com/notro/fbtft/blob/master/hy28afb.c

notro
Posts: 695
Joined: Tue Oct 16, 2012 6:21 pm
Location: Drammen, Norway

Re: HY28A-LCDB, ili9320

Sun Jun 09, 2013 12:14 pm

On the request of Andrew, I have written a program to read the device code. And lo and behold, it returns: 0x9320
That means the controller is an ILI9320, and I have done something wrong somewhere. Thanks Andrew!

devcode.c

Code: Select all

/*
 * Read Device code on SPI interfaced LCD Controller, with Start byte. Particularly the HY28A.
 *
 * Wire up the SPI bus: SCLK, MOSI and MISO. LCDB_CS => CE0
 * Wire up RESET to GPIO25
 *
 * SPI code taken from: https://raw.github.com/torvalds/linux/master/Documentation/spi/spidev_test.c
 *
 * GPIO code from: http://elinux.org/RPi_Low-level_peripherals#C (Dom and Gert)
 *            and: https://github.com/torvalds/linux/blob/master/drivers/gpio/gpiolib.c
 *
 */

#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
#include <sys/mman.h>


#define RESET_GPIO 25
#define SPIDEV "/dev/spidev0.0"
#define SPIMODE SPI_MODE_3
#define SPISPEED 500000


/* LCD Controller Start byte definitions */
#define SPI_START (0x70)   /* Start byte for SPI transfer */
#define SPI_RD (0x01)      /* WR bit 1 within start */
#define SPI_WR (0x00)      /* WR bit 0 within start */
#define SPI_DATA (0x02)    /* RS bit 1 within start byte */
#define SPI_INDEX (0x00)   /* RS bit 0 within start byte */


/* from include/linex/gpio.h */
#define GPIOF_DIR_OUT	(0 << 0)
#define GPIOF_DIR_IN	(1 << 0)
#define GPIOF_INIT_LOW	(0 << 1)
#define GPIOF_INIT_HIGH	(1 << 1)
#define GPIOF_IN		(GPIOF_DIR_IN)
#define GPIOF_OUT_INIT_LOW	(GPIOF_DIR_OUT | GPIOF_INIT_LOW)
#define GPIOF_OUT_INIT_HIGH	(GPIOF_DIR_OUT | GPIOF_INIT_HIGH)
int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
void gpio_free(unsigned gpio);
int gpio_direction_input(unsigned gpio);
int gpio_direction_output(unsigned gpio, int value);
void gpio_set_value(unsigned gpio, int value);

/* SPI functions */
int open_spidev(const char *device, uint8_t mode, uint32_t speed);
static void transfer(int fd, uint8_t *tx, uint8_t *rx, int len);

unsigned read_devicecode(int fd);




int main(int argc, char **argv)
{
	int rep;
	int spifd;

	gpio_request_one(RESET_GPIO, GPIOF_INIT_HIGH, "");

	/* reset lcd controller */
	gpio_set_value(RESET_GPIO, 0);
	gpio_set_value(RESET_GPIO, 1);

	spifd = open_spidev(SPIDEV, SPIMODE, SPISPEED);

	printf("\nDevice code: 0x%04X\n", read_devicecode(spifd));

	close(spifd);

	gpio_free(RESET_GPIO);

	return 0;
}


/*
 * SPI functions
 *
 */

static void pabort(const char *s)
{
	perror(s);
	abort();
}

int open_spidev(const char *device, uint8_t mode, uint32_t speed)
{
	int spifd, ret;

	spifd = open(device, O_RDWR);
	if (spifd < 0)
		pabort("can't open device");

	/*
	 * spi mode
	 */
	ret = ioctl(spifd, SPI_IOC_WR_MODE, &mode);
	if (ret == -1)
		pabort("can't set spi mode");

	ret = ioctl(spifd, SPI_IOC_RD_MODE, &mode);
	if (ret == -1)
		pabort("can't get spi mode");

	/*
	 * max speed hz
	 */
	ret = ioctl(spifd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
	if (ret == -1)
		pabort("can't set max speed hz");

	ret = ioctl(spifd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
	if (ret == -1)
		pabort("can't get max speed hz");

	return spifd;
}

void print_hex(const uint8_t *buf, int len)
{
	int i;

	for (i = 0; i < len; i++) {
//		if (!(i % 16))
//			puts("");
		printf("%.2X ", buf[i]);
	}
	puts("");
}


static void transfer(int fd, uint8_t *tx, uint8_t *rx, int len)
{
	int ret;
	struct spi_ioc_transfer tr = {
		.len = len,
	};

	printf("\n%s(len=%d):\n", __func__);

	if (tx) {
		tr.tx_buf = (unsigned long)tx;
		printf("  TX: ");
		print_hex(tx, len);
	}
	if (rx)
		tr.rx_buf = (unsigned long)rx;

	ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
	if (ret < 1)
		pabort("can't send spi message");

	if (rx) {
		printf("  RX: ");
		print_hex(rx, len);
	}
}

unsigned read_devicecode(int fd)
{
	int ret;
	uint8_t regtxbuf[16] = { SPI_START | SPI_WR | SPI_INDEX, 0, 0, };
	uint8_t txbuf[16] = { SPI_START | SPI_RD | SPI_DATA, 0, 0, 0, };
	uint8_t rxbuf[16] = {0, };

	/* Set index register 0x0000 */
	transfer(fd, regtxbuf, NULL, 3);

	/* Read register contents */
	transfer(fd, txbuf, rxbuf, 16);

	return (rxbuf[2] << 8) | rxbuf[3];
}



/*
 * 
 * Kernel gpiolib like functions 
 *
 */

//
//  How to access GPIO registers from C-code on the Raspberry-Pi
//  Example program
//  15-January-2012
//  Dom and Gert
//  Revised: 15-Feb-2013

#define PAGE_SIZE (4*1024)
#define BLOCK_SIZE (4*1024)

#define BCM2708_PERI_BASE        0x20000000
#define GPIO_BASE                (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */

// GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x) or SET_GPIO_ALT(x,y)
#define INP_GPIO(g) *(gpiop+((g)/10)) &= ~(7<<(((g)%10)*3))
#define OUT_GPIO(g) *(gpiop+((g)/10)) |=  (1<<(((g)%10)*3))
#define SET_GPIO_ALT(g,a) *(gpiop+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))

#define GPIO_SET *(gpiop+7)  // sets   bits which are 1 ignores bits which are 0
#define GPIO_CLR *(gpiop+10) // clears bits which are 1 ignores bits which are 0

// I/O access
volatile unsigned *gpiop;

unsigned gpio_initialized = 0;
void setup_io();

int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
{
	int err;

	if (!gpio_initialized)
		gpio_initialized = 1;
		setup_io();

	if (flags & GPIOF_DIR_IN)
		err = gpio_direction_input(gpio);
	else
		err = gpio_direction_output(gpio,
				(flags & GPIOF_INIT_HIGH) ? 1 : 0);

	if (err)
		goto free_gpio;

	return 0;

 free_gpio:
	gpio_free(gpio);
	return err;
}

void gpio_free(unsigned gpio)
{
	gpio_direction_input(gpio);
}

int gpio_direction_input(unsigned gpio)
{
	INP_GPIO(gpio);
	return 0;
}

int gpio_direction_output(unsigned gpio, int value)
{
	INP_GPIO(gpio);
	OUT_GPIO(gpio);
	gpio_set_value(gpio, value);
	return 0;
}

void gpio_set_value(unsigned gpio, int value)
{
	if (value)
		GPIO_SET = 1<<gpio;
	else
	   GPIO_CLR = 1<<gpio;
}


//
// Set up a memory region to access GPIO
//
void setup_io()
{
	int  mem_fd;
	void *gpio_map;

	/* open /dev/mem */
	if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) {
		printf("can't open /dev/mem \n");
		exit(-1);
	}

	/* mmap GPIO */
	gpio_map = mmap(
		NULL,             //Any adddress in our space will do
		BLOCK_SIZE,       //Map length
		PROT_READ|PROT_WRITE,// Enable reading & writting to mapped memory
		MAP_SHARED,       //Shared with other processes
		mem_fd,           //File to map
		GPIO_BASE         //Offset to GPIO peripheral
	);

	close(mem_fd); //No need to keep mem_fd open after mmap

	if (gpio_map == MAP_FAILED) {
		printf("mmap error %d\n", (int)gpio_map);//errno also set!
		exit(-1);
	}

	// Always use volatile pointer!
	gpiop = (volatile unsigned *)gpio_map;


} // setup_io

Code: Select all

gcc -o devcode devcode.c
sudo ./devcode

transfer(len=0):
  TX: 70 00 00

transfer(len=0):
  TX: 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  RX: 00 93 93 20 93 93 93 20 93 20 93 20 93 20 93 20

Device code: 0x9320

notro
Posts: 695
Joined: Tue Oct 16, 2012 6:21 pm
Location: Drammen, Norway

Re: HY28A-LCDB, ili9320

Sun Jun 09, 2013 1:44 pm

I usually do this when thing doesn't work, but not this time: Always try to go slow when things doesn't work.
The driver was running at 32MHz. Testing lower speeds reveals that reading works at 10MHz, but not at 12MHz.

So, as always, look at the datasheet:

Code: Select all

13.6.2. Serial Data Transfer Interface Timing Characteristics 

 (IOVCC= 1.653.3V and VCC=2.4~3.3V)
Item                                             | Symbol | Unit | Min
========================================================================
Serial clock high – level | Write ( received )   | tSCH   |  ns  |  40
pulse width               | Read ( transmitted ) | tSCH   |  ns  | 100
--------------------------+----------------------+--------+------+------
Serial clock low – level  | Write ( received )   | tSCL   |  ns  |  40
pulse width               | Read ( transmitted ) | tSCL   |  ns  | 100
From this we get:
SPI max write speed: 2x40ns = 12.5 MHz
SPI max read speed : 2x100ns = 5.0 MHz

We must remember that these numbers are for a lower voltage than what we are using, so the real minimum is higher than this.
But reading speed is less than half the writing speed ! (the same as with other controllers)

I should have remembered this. I have read these datasheets many times over :oops:

notro
Posts: 695
Joined: Tue Oct 16, 2012 6:21 pm
Location: Drammen, Norway

Re: HY28A-LCDB, ili9320

Sun Jun 09, 2013 3:17 pm

Finally, rotation and colors is fixed in the driver. I used the wrong register :oops:
Now I need to put the 'Start byte' into the overall FBTFT design. This is apparently a common technicue among several LCD controllers.

User avatar
topogigio
Posts: 38
Joined: Fri May 10, 2013 1:35 am

Re: HY28A-LCDB, ili9320

Sun Jun 09, 2013 3:19 pm

Yes, it's a speed reading problem.
If you need to write only you can set de divider to 8 min (in fact is the maximum speed for my 9320 chip). {
} else :) {
You must use al least the divider setting to 32.
}

So you can also set dynamically your divider ex.:

global setting
set divider to 8
....
....
set divider to 32
read some data from 9320
set divider to 8

thanx notro

User avatar
topogigio
Posts: 38
Joined: Fri May 10, 2013 1:35 am

Re: HY28A-LCDB, ili9320

Sun Jun 09, 2013 3:36 pm

notro,
can you post a video link to show the speed of the display on the road, for example using GUI?
I use the bcm2835 library, for me, clearing lcd, drawing rectangle and so on is quite slow.
So for me I think that use it as a fb results in an unuseble system.

Thanks

notro
Posts: 695
Joined: Tue Oct 16, 2012 6:21 pm
Location: Drammen, Norway

Re: HY28A-LCDB, ili9320

Sun Jun 09, 2013 6:19 pm

topogigio wrote: can you post a video link to show the speed of the display on the road, for example using GUI?
I use the bcm2835 library, for me, clearing lcd, drawing rectangle and so on is quite slow.
So for me I think that use it as a fb results in an unuseble system.
I don't have time to post a video, but I get 20fps at 32MHz. Not the best video quality, but good enough for X.

The main reason your code is slow, is because for every pixel, xy is set, and there is only one pixel per SPI transfer.
The framebuffer driver sets xy once for each frame, and sends 2048 pixels in each SPI transfer.

andybiker
Posts: 15
Joined: Fri Apr 26, 2013 7:46 am

Re: HY28A-LCDB, ili9320

Sun Jun 09, 2013 7:59 pm

Hi Nostro,
I'm glad to be of some small help!
If the speed is as you say, assuming a clock of 12Mhz, 320x240 at only 8bpp, I think this gives a max of 19 fps [and this is only the theoretical max with no overhead]
So we have a slow display which is a great shame as it is perfect size-wise for a pi.
Even slow though I think this display will look good. Ok playing video will be out but I look forward to trying it out.
I'll try connect up tomorrow and check my display-id to check mine is the same.
Thanks for all your great work,
Andrew

notro
Posts: 695
Joined: Tue Oct 16, 2012 6:21 pm
Location: Drammen, Norway

Re: HY28A-LCDB, ili9320

Sun Jun 09, 2013 8:20 pm

andybiker wrote:Hi Nostro,
If the speed is as you say, assuming a clock of 12Mhz, 320x240 at only 8bpp, I think this gives a max of 19 fps [and this is only the theoretical max with no overhead]
So we have a slow display which is a great shame as it is perfect size-wise for a pi.
As the previous post states, I got 20fps at 32MHz. It's only when reading the device code I have to go slower. And it's 16bpp.
The driver isn't in any image yet, but you can (easily) build it yourself with the current FBTFT image: https://github.com/notro/fbtft/wiki/Development
I hope I can make a new image within the next week or so.

User avatar
topogigio
Posts: 38
Joined: Fri May 10, 2013 1:35 am

Re: HY28A-LCDB, ili9320

Sun Jun 09, 2013 8:40 pm

hi notro,
so if I work in a matrix in memory and then 20 times per second transfer to LCD could be a good idea.
or using your software... :)
Thanks
Andrea

notro
Posts: 695
Joined: Tue Oct 16, 2012 6:21 pm
Location: Drammen, Norway

Re: HY28A-LCDB, ili9320

Sun Jun 09, 2013 9:00 pm

topogigio wrote: so if I work in a matrix in memory and then 20 times per second transfer to LCD could be a good idea.
You don't get the same speed from user space as from kernel space. The buffer is copied into a kernel buffer when spidev receives it.

andybiker
Posts: 15
Joined: Fri Apr 26, 2013 7:46 am

Re: HY28A-LCDB, ili9320

Mon Jun 10, 2013 8:36 pm

Notro,
Well Done!
It works very well.
A quick recompile and I have a working display.
Now I'll have to read up how to get the touch-panel working..

notro
Posts: 695
Joined: Tue Oct 16, 2012 6:21 pm
Location: Drammen, Norway

Re: HY28A-LCDB, ili9320

Mon Jun 10, 2013 9:09 pm

andybiker wrote:Notro,
Well Done!
It works very well.
A quick recompile and I have a working display.
Now I'll have to read up how to get the touch-panel working..
I have used this when testing. TP_CS => CE1, TP_IRQ => GPIO17

Code: Select all

sudo modprobe ads7846_test debug:0 cs:1 speed:2000000 model:7846 x_min:230 x_max:3850 y_min:190 y_max:3850 x_plate_ohms:60 pressure_max:255 gpio_pendown:17 keep_vref_on:1

User avatar
topogigio
Posts: 38
Joined: Fri May 10, 2013 1:35 am

Re: HY28A-LCDB, ili9320

Mon Jun 10, 2013 10:03 pm

Hi andybiker,
could you tell me how to compile, link and link to kernel to use driver as FB.
notro told me that there is a driver for touch, have you test it?
Thanks

notro
Posts: 695
Joined: Tue Oct 16, 2012 6:21 pm
Location: Drammen, Norway

Re: HY28A-LCDB, ili9320

Mon Jun 10, 2013 10:32 pm

topogigio wrote: could you tell me how to compile, link and link to kernel to use driver as FB.
Follow this guide: https://github.com/notro/fbtft/wiki/Development
Then you don't have to rebuild the kernel.
topogigio wrote: notro told me that there is a driver for touch, have you test it?
The FBTFT image contains a modified ads7846 touch driver which can be used as shown in the previous post.
Here's my cluttered notes on the matter: https://github.com/notro/fbtft/wiki/Touchpanel

andybiker
Posts: 15
Joined: Fri Apr 26, 2013 7:46 am

Re: HY28A-LCDB, ili9320

Tue Jun 11, 2013 10:54 am

Hi Notro,
Please excuse me if I have things wrong (the last time I compiled linux kernels was the early 1990s)

This line:
sudo modprobe ads7846_test debug:0 cs:1 speed:2000000 model:7846 x_min:230 x_max:3850 y_min:190 y_max:3850 x_plate_ohms:60 pressure_max:255 gpio_pendown:17 keep_vref_on:1

is not accepted.
If you change the ':' in all cases to '=' it is...
sudo modprobe ads7846_test debug=1 cs=1 speed=2000000 model=7846 x_min=200 x_max=3820 y_min=315 y_max=3824 x_plate_ohms=60 pressure_max=255 gpio_pendown=17 keep_vref_on=1 swap_xy=1
And....the touchscreen works!!
I start X (FRAMEBUFFER=/dev/fb1 startx ) and I have an almost working system.
I have the display in landscape mode so have used "swap_xy=1" on the modprobe line.
Now my question...Can you invert the Axes? The cursor moves along the X (longest) axis but is inverted on the Y(shorter)
Sorry for asking these newbie questions!
Thanks,
Andrew

notro
Posts: 695
Joined: Tue Oct 16, 2012 6:21 pm
Location: Drammen, Norway

Re: HY28A-LCDB, ili9320

Tue Jun 11, 2013 1:16 pm

andybiker wrote: This line:
sudo modprobe ads7846_test debug:0 cs:1 speed:2000000 model:7846 x_min:230 x_max:3850 y_min:190 y_max:3850 x_plate_ohms:60 pressure_max:255 gpio_pendown:17 keep_vref_on:1

is not accepted.
If you change the ':' in all cases to '=' it is...
sudo modprobe ads7846_test debug=1 cs=1 speed=2000000 model=7846 x_min=200 x_max=3820 y_min=315 y_max=3824 x_plate_ohms=60 pressure_max=255 gpio_pendown=17 keep_vref_on=1 swap_xy=1
And....the touchscreen works!!
Sorry about that. I copied it from my test script, and apparently didn't convert all the necessary characters.
andybiker wrote: Now my question...Can you invert the Axes? The cursor moves along the X (longest) axis but is inverted on the Y(shorter)
I have copied the output of my test script, and added it to the wiki: https://github.com/notro/fbtft/wiki/Touchpanel#hy28a

I really should have cleaned up that page, but there is always something more fun to do.

texy
Forum Moderator
Forum Moderator
Posts: 5160
Joined: Sat Mar 03, 2012 10:59 am
Location: Berkshire, England

Re: HY28A-LCDB, ili9320

Tue Jun 11, 2013 5:33 pm

Hi,
I can't see what the initial modprobe command is for setting up the HY28A in this thread :oops: ?

Texy
Various male/female 40- and 26-way GPIO header for sale here ( IDEAL FOR YOUR PiZero ):
https://www.raspberrypi.org/forums/viewtopic.php?f=93&t=147682#p971555

notro
Posts: 695
Joined: Tue Oct 16, 2012 6:21 pm
Location: Drammen, Norway

Re: HY28A-LCDB, ili9320

Tue Jun 11, 2013 6:45 pm

texy wrote:Hi,
I can't see what the initial modprobe command is for setting up the HY28A in this thread :oops: ?

Texy

Code: Select all

# this is the default: gpios=reset:25,led:18
sudo modprobe fbtft_device name=hy28afb
sudo modprobe hy28afb
The driver is finished now. I have just copied a Gamma curve, so maybe the colors could be made to look better.

I like this display. Being SPI, it's quite fast 19-20fps, and the touchpanel seem to be good.

Return to “Other projects”