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


Link to post
Share on other sites
Armbian is a community driven open source project. Do you like to contribute your code?

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.