FIXED: SSD1963 controller with 7" TFT (horizontally mirrored image)

Well after doing some more research it appears that left/right direction is controlled by a pin on the LCD i/o bus.

On the actual LCD this pin is pin39 "L<>R" and this pin is connected directly to pin36 of the SSD1963 "GPIO0"

So it would appear that setting the value of GPIO0 to the opposite value that it currently is will reverse it.......

According to the specifications of the SSD1963 there are 4 commands that are to do with the GPIO and these are:

0xB8 = set_gpio_conf = Set the GPIO configuration. If the GPIO is not used for LCD, set the direction. Otherwise, they are toggled with LCD signals.
0xB9 = get_gpio_conf = Get the current GPIO configuration
0xBA = set_gpio_value = Set GPIO value for GPIO configured as output
0xBB = get_gpio_status = Read current GPIO status. If the individual GPIO was configured as input, the value is the status of the corresponding pin. Otherwise, it is the programmed value.

Now to look at the initialisation code.......

LCD_Write_COM(0xBA);
LCD_Write_DATA(0x0F); //GPIO[3:0] out 1

LCD_Write_COM(0xBB);
LCD_Write_DATA(0x07); //GPIO3=input, GPIO[2:0]=output
LCD_Write_DATA(0x01); //GPIO0 normal

0xB9 is used to read the port so that is irrelevant BUT 0xBB also appears to be to read the status....

0xB8 is used to set the port up BUT the IO code doesn't actually call this. I have tried messing with the 0xBA & 0xBB commands above but nothing seems to change. This is probably because of the lack of a command to actually set the port up.

SO......

It would appear that to fix the issue we need to set the direction of the GPIO port to OUTPUT & set the GPIO0 port to HIGH or LOW (not sure which one yet but if one doesn't work the other should!)

Now looking at the code above

LCD_Write_COM(0xBB);
LCD_Write_DATA(0x07); //GPIO3=input, GPIO[2:0]=output
LCD_Write_DATA(0x01); //GPIO0 normal

if would appear that there has been a typo and it should have been

LCD_Write_COM(0xB8);
LCD_Write_DATA(0x07); //GPIO3=input, GPIO[2:0]=output
LCD_Write_DATA(0x01); //GPIO0 normal

Well now I've done that it is STILL reversed so I just need to send the opposite value to the GPIO0 port now......