Another idea: Could you run fbgrab on your ARM system?
If you can, you could run the same code on X86 and ARM, capture PNG files and compare them.
This could prove whether the problem is with the fb rendering driver, or with the linux display driver that outputs the frame buffer to your LCD.
Looks like the framebuffer is fine. So something must be programmed wrong inside the LCD controller. This is dev board for a new CPU, so now I get to have fun poking through a couple hundred LCD register settings. People that wrote u-boot must have set something wrong.
I could not get fbgrab to work. So I copied /dev/fb0 to a file and then used ffmpeg on desktop…
ffmpeg -f rawvideo -pix_fmt bgra -s 480x854 -i test2.raw test2.png
Note that I had to flip argb to bgra to allow for endian difference.
Could this be related to the problem? Maybe your LCD expects little-endian and your buffer is big endian?
Could you try flipping endianness on /dev/fb0 and see if it makes it displayed correctly on your LCD?