tutorial BPI_M64 With 5" HDMI LCD & Touchscreen how to..

Recommended Posts

Hello All


After a lot of hours and sleepless nights I was able to get this 5" LCD to work with the BPI-M64 module.


1.  Correct resolution setup + environment. 

     A. In /Boot/armbianEnv.txt set the following:

     Make sure to enter overlays= spi-add-cs1 spi-spidev  (this is for the touch panel to work)

     B.  for 180 rotation: extraargs=fbcon=rotate:2 drm_kms_helper.edid_firmware=HDMI-A-1:edid/800x480.bin video=HDMI-A-1:800x480-24@60 

          No rotation: extraargs= drm_kms_helper.edid_firmware=HDMI-A-1:edid/800x480.bin video=HDMI-A-1:800x480-24@60 

     C.  this info came from: https://askubuntu.com/questions/890231/adding-newmode-with-xrandr-800x480-60-00 


by the way if you dont want to see the console messages during boot you can add this to the armbianEnv.txt:


D. Save and close.


E. Create a directory where the .desktop file will be contained:

    sudo mkdir -p /etc/xdg/autostart

F. Create the .desktop file and make it executable:

   Let's call this file custom-screen-resolution.desktop:

   sudo nano /etc/xdg/autostart/custom-screen-resolution.desktop

The content of the file custom-screen-resolution.desktop should look as:


[Desktop Entry]
Name=Custom Screen Resolution
Exec=sh -c 'xrandr --newmode "800x480_60.00"  29.50  800 824 896 992  480 483 493 500 -hsync +vsync; xrandr --addmode HDMI-1 800x480_60.00; xrandr --output HDMI-1 --mode 800x480_60.00'


G. reboot

H.  After O/S is loaded go to settings => display  and you be able to select the 800x480 resolution.


2.  With the Touch Panel I lost some hair on my head since there were many issues to overcome.

     A. I had to solder the LCD TP_IRQ Pin (22) to unused Pin (13) since Pin 22 on the BPI-M64  didnt support GPIO to IRQ...  and diving into the sources took a lot of time to figure out why, so the easiest way is to change the Pin.

         (please have a look at the attached picture.

     B.  Also there were wrong settings in the sun50i-a64-spi-add-cs1.dtbo overly, it seems that CS1 were going to the wrong Pin ( not as the BPI_M64 page shows, it should have been going to Pin 26 - PC2  but in the overlay it did go to Pin 35- PB6) 

          I really dont know why so I had to change the DTS file to:



/ {
        compatible = "allwinner,sun50i-a64";

        fragment@0 {
                target = <&pio>;
                __overlay__ {
                        spi0_cs1: spi0_cs1 {
                                pins = "PD0";
                                function = "gpio_out";

                        spi1_cs1: spi1_cs1 {
                                pins = "PC2";
                                function = "gpio_out";

        fragment@1 {
                target = <&spi0>;
                __overlay__ {
                        pinctrl-names = "default", "default";
                        pinctrl-1 = <&spi0_cs1>;
                        cs-gpios = <0>, <&pio 3 0 0>; /* PD0 */

        fragment@2 {
                target = <&spi1>;
                __overlay__ {
                        pinctrl-names = "default", "default";
                        pinctrl-1 = <&spi1_cs1>;
                        cs-gpios = <0>, <&pio 2 2 0>; /* PC2 */


The sun50i-a64-spi-add-cs1.dts & the sun50i-a64-spi-add-cs1.dtbo are also attached.

 Just replace the sun50i-a64-spi-add-cs1.dtbo  located at /boot/dtb/allwinner/overlay with file that I have attached here.


C. The next settings I have found at post here I just copy and paste so you will have all the info in one page:


D) Download ads7846? touch driver (compatible with xpt2046)

mkdir ds7846 
cd ds7846 
wget https://sourceforge.net/p/openipmi/linux-ipmi/ci/master/tree/drivers/input/touchscreen/ads7846.c?format=raw
mv ads7846.c?format=raw ads7846.c 

E) Create a makefile (Take note that it is TABS instead of spaces before the $(MAKE))

nano Makefile
Insert the below in without the -----
obj-m := ads7846.o 
KDIR := /lib/modules/$(shell uname -r)/build 
PWD := $(shell pwd) 
    $(MAKE) -C $(KDIR) M=$(PWD) modules 
    $(MAKE) -C $(KDIR) M=$(PWD) clean 
    $(MAKE) -C $(KDIR) M=$(PWD) modules_install

F) Exit nano and run the following

cd /usr/src/linux-headers-4.19.38-sunxi64
make scripts
make modules_prepare

sudo make
sudo make install
sudo depmod

G) Download and compile and install ads7846_device

cd .. 
git clone https://github.com/notro/fbtft_tools/
cd fbtft_tools/ads7846_device 
sudo make install 
sudo depmod 

H) Load ads7846 and ads7846_device on boot

sudo nano /etc/modules-load.d/ads7846.conf 

I) Load ads7846_device options

nano /etc/modprobe.d/ads7846_device.conf 


options ads7846_device model=7846 cs=1 gpio_pendown=234 keep_vref_on=1 swap_xy=0 pressure_max=255 x_plate_ohms=150 x_min=3900 x_max=200 y_min=3900 y_max=200 busnum=1


Note: GPIO_PENDOWN relate to the GPIO of the actual Pin number 13, With my board it is 234, If you are using other module (not BPI_M64) it could be other number,  check with your module documents or do "gpio printall" in your board to see the correct Pin number.


Since I use the screen in inverted mode those settings fits my needs.


if you will use it in normal mode you might have to switch those parameters :

swap_xy=0  or 1

x_min=3900 x_max=200 y_min=3900 y_max=200


x_min=200 x_max=3900y_min=200 y_max=3900


I didnt really need it but you can install sudo apt-get install xinput-calibrator for fine tunning. (follow the instructions)



I hope that I didnt forget anything.


By the way the kernel I use is: 4.19.38-sunxi64










sun50i-a64-spi-add-cs1.dtbo sun50i-a64-spi-add-cs1.dts


Share this post

Link to post
Share on other sites